Vsftpd服务的部署及优化
什么是FTP
文件传输协议(英语:File Transfer Protocol,缩写:FTP),互联网中最老牌的文件传输协议.
与http相似可也用于文件的发送和接受.
实验环境部署
FTP
相关软件分为发送端和接收端,本文需要分别对服务器和客户端机器进行部署(当然实际上在同一台机器上也可以实现,我也是这么做的).
##双端安装
dnf search ftp
dnf install vsftpd lftp -y
##防火墙增加ftp允许规则并检查
firewall-cmd --permanent --add-service=ftp
systemctl restart firewalld.service
##临时关闭SELinux
vim /etc/selinux/config
此时你发现你无法使用匿名用户登录FTP
服务器,因为主配置文件中默认是不允许这样的.
Vsftpd
是FTP
的一种服务端版本,其基本信息如下.
服务名称 vsftpd.service
配置目录 /etc/vsftpd
主配置文件 /etc/vsftpd/vsftpd.conf
默认发布目录 /var/ftp
报错信息 | 报错含义 |
---|---|
550 | 程序本身拒绝 |
553 | 文件系统权限限制 |
500 | 权限过大 |
530 | 认证失败 |
FTP
以其安全性著称,当发布目录本身的权限过大时会被认为不安全,同样会出现500
报错而不允许使用.
主配置文件参数
匿名用户访问与权限控制
通过修改Vsftpd的主配置文件我们可以达成我们想要的效果开关,如匿名用户的权限设置/本地用户的权限设置等等.
##修改主配置文件中匿名用户相关的参数后重启服务
vim /etc/vsftpd/vsftpd.conf
systemctl restart vsftpd
##重新进行匿名登陆并查看状态
lftp 172.25.254.136
##能够查看目录下内容,登陆成功
lftp 172.25.254.136:~> ls
drwxr-xr-x 2 0 0 6 Feb 17 2020 pub
##修改匿名登陆文件目录的权限和所有组
chmod 775 /var/ftp/pub/
chgrp ftp /var/ftp/pub/
修改Pub目录权限的原因
当FTP主发布目录本身的权限过大时会被认为不安全,出现500
报错禁止相关操作,因此我们需要对实际存储文件的pub
目录进行权限修改.
匿名用户登录的操作默认由本地用户ftp
完成,因此ftp
用户必须拥有对pub
目录的操作权限,设置目录所有组为ftp
,设置目录权限为775即可.
本地用户的访问
用于登陆FTP
服务器的用户必须有密码,没有密码的用户无法用于登录.
write_enable
控制的是FTP
服务器的写权限,当设置为不可写后不仅是本地用户不能上传文件,匿名用户同样也无法上传文件.
ftpusers
和user_list
都是用户控制的黑名单,被加入黑名单的用户无法登陆FTP
服务器.前者为永久黑名单,后者为临时用户黑名单,前者的优先级更高.
但如果设置了userlist_deny
为NO
,则user_list
名单的功能变成了白名单,只有加入名单中的用户可以登陆FTP
服务器.
如果一个用户同时出现在了ftpusers
和白名单模式的user_list
中时,他依旧无法登陆,因为永久黑名单ftpusers
的优先级更高.
本地用户登陆时,默认登陆到自己的家目录中.但仍可以通过cd
跳转到上级目录.从系统安全性角度这显然是极不安全的.通过设置相关参数可以将本地用户锁定在自己的家目录中.
##将本地家目录中的用户写权限去除,避免FTP因目录权限过大拒绝操作
chmod u-w /home/*
##锁定用户到自己的家目录中
chroot_local_user=YES
执行以上操作后,用户登陆到FTP
服务器后只能在自己的家目录中,而无法跳转到上级目录.
其他常用参数
匿名用户上传文件权限的设定中,所设定的anon_umask
为保留权限,根据保留权限可以推导出目录权限和文件权限.而匿名用户上传文件的用户身份中chown_upload_mode
则直接设置了上传文件的权限,两者需要进行区分记忆.
当设置chown_upload_mode
后,所上传文件的权限不由anon_umask
设置.
max_clients
设置了最大登陆数量,当到达最大连接数量时后续的客户端无法再接入此FTP
服务器进行操作.
匿名用户的上传速率的限制同样可以在服务端配置中进行设置,设置后进行上传时速度会逐渐稳定到所设置的速率,相关参数为anon_max_rate
.
##限制匿名用户上传速率为100M
anon_max_rate=102400
该参数可以通过上传大文件时观察速率变化来检测.
##生成2G大的大文件用于测试
dd if=/dev/zero of=/mnt/bigfile bs=1M count=2000
du -sh /mnt/bigfile
##进行上传操作
lftp 172.25.254.136
put /mnt/bigfile
有时我们可能需要有的用户能够跳转到上级目录而用的用户不能.这种区分用户权限的行为可以通过chroot_list
相关参数来实现,具体方法与user_list
类似.
chroot_local_user=NO ##不锁定用户目录
chroot_list_enable=YES ##开启黑名单功能
chroot_list_file=/etc/vsftpd/chroot_list
开启后,在chroot_list
名单中的用户都被锁定到自己的家目录,不再其中的用户则不受影响.
但如果反过来操作,chroot_list
名单也可以作为白名单使用.
chroot_local_user=YES ##锁定用户目录
chroot_list_enable=YES ##开启名单功能,这时变为白名单
chroot_list_file=/etc/vsftpd/chroot_list
- 值得注意的是,
chroot_list
文件默认不存在,需要字自行创建
同样,也可以对虚拟用户分别设置其家目录和权限
##创建虚拟用户并创建认证文件
vim /etc/vsftpd/virt_users
db_load -T -t hash -f /etc/vsftpd/virt_users /etc/vsftpd/virt_users.db
##编写认证规则并启用
vim virt_user
vim /etc/vsftpd/vsftpd.conf
systemctl restart vsftpd
##在服务端创建用于实验的虚拟用户的家目录,UserFile用于方便ls辨识
mkdir -p /FTP/User{1,2}/pub
touch /FTP/User1/User1File
touch /FTP/User2/User2File
##修改虚拟家目录的权限,使得ftp用户有权限对其进行擦作
chgrp ftp /FTP/User{1,2}/pub
chmod 0775 /FTP/User{1,2}/pub
##对配置设置进行验证
lftp 172.25.254.136 -u User1
lftp 172.25.254.136 -u User2
同样,我们也可以单打对虚拟用户分开进行权限设定,实现不同的虚拟用户拥有不同权限.
- 首先关闭匿名用户的全局设置
- 开启虚拟用户配置目录并指定目录
- 创建与用户名对应的配置文件并编写具体配置项
##创建虚拟用户配置目录并对User1虚拟用户赋予上传权限
[root@Node1 ~]# vim /etc/vsftpd/vsftpd.conf
[root@Node1 ~]# cd /etc/vsftpd/
[root@Node1 vsftpd]# ls
ftpusers virt_users vsftpd.conf
user_list virt_users.db vsftpd_conf_migrate.sh
[root@Node1 vsftpd]# mkdir userconfdir
[root@Node1 vsftpd]# cd userconfdir/
[root@Node1 userconfdir]# vim User1
[root@Node1 userconfdir]# cat User1
anon_upload_enable=YES
##对个别用户进行权限设置的验证
lftp 172.25.254.136 -u User1
Password:
lftp User1@172.25.254.136:~> cd pub/
lftp User1@172.25.254.136:/pub> put /etc/passwd
2703 bytes transferred
lftp User1@172.25.254.136:/pub> ls
-rw-r--r-- 1 1001 50 2703 Feb 22 06:20 passwd
lftp User1@172.25.254.136:/pub> exit
lftp 172.25.254.136 -u User2
Password:
lftp User2@172.25.254.136:~> ls
-rw-r--r-- 1 0 0 0 Feb 22 06:09 User2File
drwxrwxr-x 2 0 50 6 Feb 22 06:08 pub
lftp User2@172.25.254.136:/> cd pub/
lftp User2@172.25.254.136:/pub> put /etc/passwd
put: /etc/passwd: Access failed: 550 Permission denied. (passwd)
lftp User2@172.25.254.136:/pub> exit
主配置文件使用参数汇总
anonymous_enable=YES 允许使用匿名用户登录
anon_root=/Testir 修改匿名用户默认登陆目录
anon_upload_enable=YES 允许匿名用户上传
anon_mkdir_write_enable=YES 允许匿名用户创建目录
anon_world_readable_only=NO 是否允许匿名用户下载不可读的文件,NO时允许
anon_other_write_enable=YES 允许匿名用户删除和重命名
anon_umask=022 设置匿名用户上传保留权限为022
chown_uploads=YES 允许修改匿名用户上传文件的用户身份
chown_username=Test 使身份为Test用户
chown_upload_mode=0644 修改文件权限为0644
local_enable=YES 可以使用本地用户登录
write_enable=YES FTP服务器是否可写
lacal_umask=022 设置本地用户上传文件的保留权限为022
userlist_enable=YES 开启名单机制
userlist_deny=NO 黑名单变为白名单
pam_service_name=virt_user 设置虚拟用户登陆验证规则
guest_enable=YES 是否允许虚拟用户登录
guest_username=ftp 登陆的虚拟用户使用ftp用户身份
local_root=/FTP/$USER 使用$USER变量设置虚拟用户的独立家目录
user_sub_token=$USER 告诉系统$USER是变量而不是字符串
user_config_dir=/etc/vsftpd/userconfidir 设定用户配置目录的路径