一、ftp概述
1、FTP协议
FTP是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用20、21号端口,其中端口20(数据端口)用于进行数据传输,端口21(命令端口)用于接受客户端发出的相关FTP命令与参数。
2、工作模式
FTP协议有以下两种工作模式:
主动模式:FTP服务器主动向客户端发起连接请求
被动模式:FTP服务器等待客户端发起连接请求(FTP的默认工作模式)
3、ftp的三种使用模式
(1)、匿名开放模式
a、匿名开放模式的相关参数
FTP匿名开放模式的相关参数
参数 | 作用 |
anonymous_enable=YES | 允许匿名访问模式 |
anon_umask=022 | 匿名用户上传文件的umask值 |
anon_upload_enable=YES | 允许匿名用户上传文件 |
anon_mkdir_write_enable=YES | 允许匿名用户创建目录 |
anon_other_write_enable=YES | 允许匿名用户修改目录名称或删除目录 |
no_anon_password=YES | 将其设为YES指匿名用户不会查询用户密码直接登录 |
anon_root=/var/ftp/pub | 指定匿名登录后的根文件夹 |
ftp_username=ftp | 匿名用户登陆系统的账号默认为ftp,此项最好不要改 |
listen_port=8021 | 指定命令通道为8021,默认为21 |
listen_data_port=8020 | 指定数据通道为8020,默认为20 |
【注】匿名开放模式中name是anonymous,密码为空。登陆成功之后默认访问的目录是/var/ftp,此刻想要有写入权限,需要将/var/ftp 目录的所属组改为ftp,初始所属组是root,连接上来的人没有权限。
(2)、本地用户模式
FTP本地用户模式的相关参数
参数 | 作用 |
anonymous_enable=NO | 禁止匿名访问模式 |
local_enable=YES | 允许本地用户模式 |
write_enable=YES | 设置可写权限 |
local_umask=022 | 本地用户模式创建文件的umask值 |
userlist_enable=YES | 启用“禁止用户名单”,名单文件为ftpusers和user_list |
userlist_deny=YES | 开启用户作用名单文件功能 |
chroot_local_user=YES | 把本地用户限制在自己的home文件夹中,这样子登录之后就不能访问自己home之外的文件了,这样子是出于安全上的考虑 |
【注】此刻用原有的默认账户无法登陆,用正常账户就能登陆。使用本地用户登陆之后,默认访问的是该用户的家目录,所以不必再修改目录的权限,但是这些的前提都是在关闭SELinux之下。
(3)、虚拟用户模式
①创建用于进行FTP认证的用户数据库文件,奇数行为用户名,偶数行为密码。
# cd /etc/vsftpd/
# vim vuser.list
②加密虚拟用户列表
# db_load -T -t hash -f vuser.list vuser.db
②创建vsftpd服务程序用于存储文件的根目录以及虚拟用户映射的系统本地用户
由于Linux系统中的每一个文件都有所有者、所属组属性,例如使用虚拟账户“张三”新建了一个文件,但是系统中找不到账户“张三”,就会导致这个文件的权限出现错误。为此,需要再创建一个可以映射到虚拟用户的系统本地用户。简单来说,就是让虚拟用户默认登录到与之有映射关系的这个系统本地用户的家目录中,虚拟用户创建的文件的属性也都归属于这个系统本地用户,从而避免Linux系统无法处理虚拟用户所创建文件的属性权限。
为了安全起见,把这个账户设置为不能登陆服务器,避免被黑客得到去做坏事情。
# useradd -d /var/ftproot -s /sbin/nologin virtual
# chmod -Rf 755 /var/ftproot
③建立用于支持虚拟用户的PAM文件
PAM(可插拔认证模块)是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。
通俗来讲,PAM是一组安全机制的模块,系统管理员可以用来轻易地调整服务程序的认证方式,而不必对应用程序进行任何修改。PAM采取了分层设计(应用程序层、应用接口层、鉴别模块层)的思想,其结构如图所示。
④在vsftpd服务程序的主配置文件中通过pam_service_name参数将PAM认证文件的名称修改为vsftpd.vu,PAM作为应用程序层与鉴别模块层的连接纽带,可以让应用程序根据需求灵活地在自身插入所需的鉴别功能模块。当应用程序需要PAM认证时,则需要在应用程序中定义负责认证的PAM配置文件,实现所需的认证功能。
需要用到的参数如下:
利用PAM文件进行认证时使用的相关参数
参数 | 作用 |
anonymous_enable=NO | 禁止匿名开放模式 |
local_enable=YES | 允许本地用户模式 |
guest_enable=YES | 开启虚拟用户模式 |
guest_username=virtual | 指定虚拟用户账户 |
pam_service_name=vsftpd.vu | 指定PAM文件 |
allow_writeable_chroot=YES | 允许对禁锢的FTP根目录执行写入操作,而且不拒绝用户的登录请求 |
⑤为虚拟用户设置不同的权限,想要让用户A有更多的权限,读写修改,用户B只有读权限
在/var/vsftpd下建立用户权限文件目录vuser_dir,在user_dir中建立文件,以帐户名为文件名
配置文件中写入
anon_upload_enable=YES或NO
anon_mkdir_write_enable=YES或NO
anon_other_write_enable=YES或NO
并在主配置文件/etc/vsftpd/vsftpd.conf中添加:
user_config_dir=/etc/vsftpd/vusers_dir
重启vsftpd服务,并关闭SELinux,
# systemctl restart vsftpd
# setenforce 0
二、ftp常见场景搭建
(以下场景搭建均以银河麒麟V10 0711服务器系统为例演示)
1、匿名开放访问,具有上传下载删除创建权限
(用户访问ftp无需填写用户名和密码,输入IP即可访问,完全开放模式)
# yum install vsftpd -y
# cp -avx /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.bak
【注】:服务器系统的vsftpd配置文件在/etc/vsftpd/vsftpd.conf
# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES #开启匿名登录
anon_umask=022 #设置匿名用户的umask值,否则匿名登录创建新的目录或文件由于权限不足导致无法查看新建的文件
pam_service_name=vsftpd #验证方式
connect_from_port_20=YES #启用FTP数据端口的数据连接
anon_upload_enable=YES #开放匿名用户上传权限
anon_mkdir_write_enable=YES #开放匿名用户创建目录的权限
write_enable=YES #开放本地用户的写权限
anon_other_write_enable=YES #将其设为YES的话,就除了上传和创建目录外,还可以重命名,删除文件,默认是NO
# chmod -R 777 /var/ftp/pub
# systemctl restart vsftpd
【注】1、防火墙上21端口必须打开,否则登陆ftp的会提示socket错误,拒绝连接。
2、匿名登录的默认路径是:/var/ftp/
3、ftp默认上传路径是:/home/系统用户名
4、关于umask值:
umask是在linux中常见的一个东西,它其实是一个掩码。当然,也有umask这样一个命 令,它是对用户建立的文件的默认属性的定义。该 定义为:
假设umask为022,则对于一个文件夹的话,它的默认属性为 777-022=755,这也就是我 们平时建立文件夹的权限。而对于一般的文件的话,则是用 666-022=644.
umask是unix操作系统的概念,umask决定目录和文件被创建时得到的初始权限
umask = 022 时,新建的目录 权限是755,文件的权限是 644
umask = 077 时,新建的目录 权限是700,文件的权限时 600
vsftpd的local_umask和anon_umask借鉴了它
默认情况下vsftp上传之后文件的权限是600,目录权限是700
想要修改上传之后文件的权限,有两种情况:
a、如果使用vsftp的是本地用户
则要修改配置文件中的 local_umask 的值
b、 如果使用vsftp的是虚拟用户
则要修改配置文件中的 anon_umask 的值
2、本地用户模式,开放上传下载创建删除权限
# vim /etc/vsftpd/vsftpd.conf
local_enable=YES #开放本地用户登录
anonymous_enable=NO #禁止匿名用户登录,如果需要开放可设置为YES
write_enable=YES #开放写权限
local_umask=022 #设置本地用户umask
# useradd user1
# passwd user1
# systemctl restart vsftpd
【注】:1、防火墙打开21端口
2、本地用户登录默认ftp位置是该用户的家目录
3、虚拟用户模式,对指定用户进行精确权限控制
3.1、实验目标:实现在同一目录下,对admin、upload、download三个虚拟用户进行不同权限的控制,具体权限控制列表如下:
用户名 | 权限说明 |
admin | 管理员,可以上传、下载、新建文件夹、删除和更改文件和文件夹名 |
upload | 不可以下载,可以上传、新建文件夹,但不能删除文件和文件夹,不能重命名原有文件和文件夹 |
download | 只能下载,不能进行其他操作 |
【注】:以上三个虚拟用户均不允许登录系统,并且使用ftp时会被锁定在指定目录内不可进入系统其他目录。
3.2、配置vsftpd
第1步:添加一个不能登录系统的用户,用来做虚拟用户映射
# useradd -s /sbin/nologin -d /home/kylin -M kylin
# passwd kylin
第2步:创建虚拟用户列表,分别是admin、upload、download三个用户
# vim /etc/vsftpd/vu_list.txt
upload
upload@123
download
download@123
admin
admin@123
第3步:保存虚拟帐号和密码的文本文件无法被系统帐号直接调用,需要创建用于系统认证的db文件
# db_load -T -t hash -f /etc/vsftpd/vu_list.txt /etc/vsftpd/vu_list.db
# yum -y install db4 db4-devel db4-utils
# chmod 600 /etc/vsftpd/vu_list.db
第4步:配置PAM文件
由于服务器通过调用系统PAM模块来对客户端进行身份验证,因此需要修改指定的配置文件来调整认证方式。PAM模块的配置文件路径为:/etc/pam.d/,这个目录下存放只许多与用户认证有关的配置文件。
# vim /etc/pam.d/vsftpd
#%PAM-1.0
#session optional pam_keyinit.so force revoke
#auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
#auth required pam_shells.so
#auth include password-auth
#account include password-auth
#session required pam_loginuid.so
#session include password-auth
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vu_list
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vu_list
第5步:创建虚拟用户配置文件
# mkdir /etc/vsftpd/conf
# vim /etc/vsftpd/conf/admin
anon_world_readable_only=NO
local_umask=022
write_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
anon_upload_enable=YES
local_root=/home/kylin
allow_writeable_chroot=YES
# vim /etc/vsftpd/conf/upload
write_enable=YES
local_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_world_readable_only=NO
download_enable=NO
local_root=/home/kylin
allow_writeable_chroot=YES
# vim /etc/vsftpd/conf/download
anon_world_readable_only=NO
local_root=/home/kylin
allow_writeable_chroot=YES
第6步:修改vsftpd.conf文件
首先备份默认的配置文件/etc/vsftpd/vsftpd.conf,再将该文件内容删掉替换成如下内容
anonymous_enable=NO
local_enable=YES
write_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
anon_other_write_enable=NO
connect_from_port_20=YES
xferlog_file=/var/log/vsftpd.log
xferlog_enable=YES
chroot_local_user=YES
listen=YES
pam_service_name=vsftpd
guest_enable=YES
guest_username=kylin
user_config_dir=/etc/vsftpd/conf
第7步:创建ftp根目录
# mkdir /home/kylin
# chmod -R 777 /home/kylin
# systemctl restart vsftpd
【注】:1、selinux和firewalld需自行配置,可直接关闭
2、ftp主目录在/home/kylin下
3、如果使用本地的xftp连接,需要关闭被动模式,如下图