FTP协议模型:参考《Linux基础及应用教程(基于CentOS7)第2版》
用户接口(UI):提供了一个用户接口并使用客户端协议解释器的服务
客户端协议解释器(CPI):向远程服务器协议机发送命令并且驱动客户数据传输过程
服务端协议解释器(SPI):响应客户协议机发出的命令并驱动服务器端数据传输过程
客户端数据传输协议(CDTP):负责完成和服务器数据传输过程及客户端本地文件系统的通信
服务端数据传输协议(SDTP):负责完成和客户数据传输过程及服务器端文件系统的通信
FTP会话存在有两个独立的TCP连接
由CPI和SPI使用的,被称作控制连接(control connection)
由CDTP和SDTP使用的,被称作数据连接(data connection)
- 控制连接主要用来传送在实际通信过程中需要执行的FTP命令以及命令的响应。
- 控制连接只需要很小的网络带宽。
- FTP服务器监听端口号21来等待控制连接建立请求。
- 控制连接建立以后并不立即建立数据连接,而是服务器通过一定的方式来验证客户的身份,以决定是否可以建立数据传输。
- 数据连接是等到要目录列表、传输文件时才临时建立的, 并且每次客户端使用不同的端口号来建立数据连接。 一旦数据传输完毕,就中断这条临时的数据连接。
- 在FTP连接期间,控制连接始终保持通畅的连接状态。 在数据连接存在期间内,控制连接肯定是存在的; 一旦控制连接断开,数据连接会自动关闭。
FTP的数据传输模式
主动传输模式 (Active FTP)
- FTP的数据连接和控制连接的方向是相反的。 也就是说,是服务器向客户端发起一个用于数据传输的连接。 客户端的连接端口是由服务器端和客户端通过协商确定的。
- FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接, 然后开放N+1号端口进行监听,并向服务器发出PORT N+1命令。
- 服务器接收到命令后,会用其本地的FTP数据端口(通常是20) 来连接客户端指定的端口N+1,进行数据传输。
被动传输模式 (Passive FTP)
- FTP的数据连接和控制连接的方向是一致的。 也就是说,是客户端向服务器发起一个用于数据传输的连接。 客户端的连接端口是发起这个数据连接请求时使用的端口号。
- FTP客户端随机开启一个大于1024的端口N向服务器的21号端口发起连接, 同时会开启N+1号端口。然后向服务器发送PASV命令,通知服务器自己处于被动模式。
- 服务器收到命令后,会开放一个大于1024的端口P进行监听,然后用PORT P 命令通知客户端,自己的数据端口是P。 客户端收到命令后,会通过N+1号端后连接服务器的端口P, 然后在两个端口之间进行数据传输。
- 被动模式的FTP通常用在处于防火墙之后的FTP客户访问外界FTP服务器的情况。
安装:yum install vsftpd
因为iptables禁止ftp协议的端口号,清空iptables的默认策略
iptables -F
service iptables save
vsftp的配置文件:/etc/vsftpd/vdftpd.conf
先把配置文件备份一下
mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
去掉注释
grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf
vsftpd 服务程序常用的参数以及作用
vsftpd服务程序:
用户可以以三种认证模式登录到FTP服务器上
匿名开放模式:是一种最不安全的认证模式,任何人都可以无需密码验证而直接登录
到 FTP 服务器。
若FTP服务器提供匿名访问功能,则匿名用户可以通过输入账号(anonmous或ftp) 和口令(用户自己的E-Mail地址)来进行登录。 当匿名用户登录系统后,其登录目录为匿名FTP服务器的根目录(/var/ftp)。
本地用户模式:是通过 Linux 系统本地的账户密码信息进行认证的模式,相较于匿名
开放模式更安全,而且配置起来也很简单。但是如果被黑客破解了账户的信息,就可
以畅通无阻地登录 FTP 服务器,从而完全控制整台服务器。
虚拟用户模式:是这三种模式中最安全的一种认证模式,它需要为 FTP 服务单独
建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些账户信息在
服务器系统中实际上是不存在的,仅供 FTP 服务程序进行认证使用。这样,即使
黑客破解了账户信息也无法登录服务器,从而有效降低了破坏范围和影响。
安装这ftp 客户端工具:yum install ftp
匿名开放模式
可以向匿名用户开放的权限参数以及作用
在生产环境中或者在 RHCSA、RHCE、 RHCA 认证考试中一定要把配置过的服务程序加入到开机启动项中
systemctl restart vsftpd
systemctl enable vsftpd
在 vsftpd 服务程序的匿名开放认证模式下,其账户统一为 anonymous,密码为空。而且在连接到 FTP 服务器后,默
认访问的是/var/ftp 目录。
登入后,不能访问,是权限问题
在 vsftpd 服务程序的匿名开放认证模式下,默认访问的是/var/ftp 目录。查看该目录的权限得知,只有 root 管理员才有写入权限。
将目录的所有者身份改成系统账户 ftp 即可(该账户在系统中已经存在)
chown -Rf ftp /var/ftp/pub
改了权限还是不能访问,创建目录,SELinux问题
getsebool -a | grep ftp
发现:ftpd_full_access --> off
setsebool -P ftpd_full_access=on 在设置时使用-P 参数让修改过的策略永久生效,确保在服务器重启后依然能够顺利写入文件。
本地用户模式:
本地用户模式使用的权限参数以及作用
在使用 root 管理员登录后,系统提示错误信息
在我们输入 root 管理员的密码之前,就已经被系统拒绝访问了。这是因为 vsftpd 服务
程序所在的目录中默认存放着两个名为“用户名单”的文件(ftpusers 和 user_list)
vsftpd 服务程序目录中的这两个文件也有类似的功能—只要里面写有某位用户的名字,就不再允许这位用户登录到 FTP
服务器上。
cat /etc/vsftpd/user_list
cat /etc/vsftpd/ftpusers
只需按照上面的提示删除掉 root 用户名即可。我们也可以选择 ftpusers 和 user_list 文件中没有的一个普通用户尝
试登录 FTP 服务器
在采用本地用户模式登录 FTP 服务器后,默认访问的是该用户的家目录,也就是说,访
问的是/home/linuxprobe 目录。而且该目录的默认所有者、所属组都是该用户自己,因此不存
在写入权限不足的情况。但是当前的操作仍然被拒绝,是因为我们刚才将虚拟机系统还原到
最初的状态了。为此,需要再次开启 SELinux 域中对 FTP 服务的允许策略:
setsebool -P ftpd_full_access=on
虚拟用户模式
1.创建用于进行 FTP 认证的用户数据库文件,其中奇数行为账户名,偶数行为密
码。例如,我们分别创建出 zhangsan 和 lisi 两个用户,密码均为 redhat
cd /etc/vsftpd
vim vuser.list
zhangsan
redhat
lisi
redhat
明文信息既不安全,也不符合让 vsftpd 服务程序直接加载的格式,因此需要使
用 db_load 命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件,并且降低
数据库文件的权限(避免其他人看到数据库文件的内容),然后再把原始的明文信息文件
删除。
db_load -T -t hash -f vuser.list vuser.db
2.创建 vsftpd 服务程序用于存储文件的根目录以及虚拟用户映射的系统本地
用户。 FTP 服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置。
需要再创建一个可以映射到虚拟用户的系统本地用户。简单来说,就是让虚拟用户默认登录
到与之有映射关系的这个系统本地用户的家目录中,虚拟用户创建的文件的属性也都归属于
这个系统本地用户,从而避免 Linux 系统无法处理虚拟用户所创建文件的属性权限。
useradd -d /var/ftproot -s /sbin/nologin virtual
chmod -Rf 755 /var/ftproot/
3.建立用于支持虚拟用户的 PAM 文件。
PAM(可插拔认证模块)是一种认证机制,通过一些动态链接库和统一的 API 把系统提
供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式
新建一个用于虚拟用户认证的 PAM 文件 vsftpd.vu,其中 PAM 文件内的“ db=”参数为
使用 db_load 命令生成的账户密码数据库文件的路径,但不用写数据库文件的后缀:
vim /etc/pam.d/vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
4.在 vsftpd 服务程序的主配置文件中通过 pam_service_name 参数将 PAM 认证
文件的名称修改为 vsftpd.vu, PAM 作为应用程序层与鉴别模块层的连接纽带,可以让应用程
序根据需求灵活地在自身插入所需的鉴别功能模块。当应用程序需要 PAM 认证时,则需要在
应用程序中定义负责认证的 PAM 配置文件,实现所需的认证功能。
利用 PAM 文件进行认证时使用的参数以及作用
5.为虚拟用户设置不同的权限。
允许张三上传、创建、修改、查看、删除文件,只允许李四查看文件。这可以通过 vsftpd 服务程序来实现。只需新
建一个目录,在里面分别创建两个以 zhangsan 和 lisi 命名的文件,其中在名为 zhangsan 的文件中写入允许的相关权限(使用匿名用户的参数)
mkdir /etc/vsftpd/vusers_dir/
cd /etc/vsftpd/vusers_dir/
touch lisi
vim zhangsan
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
然后再次修改 vsftpd 主配置文件,通过添加 user_config_dir 参数来定义这两个虚拟用户
不同权限的配置文件所存放的路径。
vim /etc/vsftpd/vsftpd.conf
加入:user_config_dir=/etc/vsftpd/vusers_dir
systemctl restart vsftpd
systemctl enable vsftpd
6.设置 SELinux 域允许策略,然后使用虚拟用户模式登录 FTP 服务器
getsebool -a | grep ftp
ftpd_full_access –> off
setsebool -P ftpd_full_access=on