vsftpd (very secure ftp daemon),非常安全的FTP守护进程
文件传输协议:FTP(File Transfer Protocol);简单文件传输协议(Trivial File Transfer Protocol,TFTP)是一种基于UDP协议在客户端和服务器之间进行简单文件传输的协议。顾名思义,它提供不复杂、开销不大的文件传输服务,可将其当作FTP协议的简化版本。
一、安装
配置好yum仓库后使用yum安装
[root@localhost ~]# rpm -qa |grep vsftpd
[root@localhost ~]# dnf install vsftpd
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
Last metadata expiration check: 1 day, 22:13:43 ago on Wed 22 Sep 2021 04:13:17 PM CST.
Dependencies resolved.
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
vsftpd x86_64 3.0.3-28.el8 b 180 k
Transaction Summary
================================================================================
Install 1 Package
Total size: 180 k
Installed size: 356 k
Is this ok [y/N]: y
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : vsftpd-3.0.3-28.el8.x86_64 1/1
Running scriptlet: vsftpd-3.0.3-28.el8.x86_64 1/1
Verifying : vsftpd-3.0.3-28.el8.x86_64 1/1
Installed products updated.
Installed:
vsftpd-3.0.3-28.el8.x86_64
Complete!
二、相关配置文件
[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# ll
total 24
-rw-------. 1 root root 125 Aug 13 2018 ftpusers
-rw-------. 1 root root 361 Aug 13 2018 user_list
-rw-------. 1 root root 5098 Aug 13 2018 vsftpd.conf
-rwxr--r--. 1 root root 348 Aug 13 2018 vsftpd_conf_migrate.sh
-rw-r--r--. 1 root root 325 Sep 22 15:46 vsftpd.conf.rpmsave
[root@localhost vsftpd]# vim vsftpd.conf
一些参数
listen=[YES|NO] | 是否以独立运行的方式监听服务 |
---|---|
listen_address=IP地址 | 设置要监听的IP地址 |
listen_port=21 | 设置FTP服务的监听端口 |
download_enable=[YES|NO] | 是否允许下载文件 |
userlist_enable=[YES|NO] userlist_deny=[YES|NO] | 设置用户列表为“允许”还是“禁止”操作 |
max_clients=0 | 最大客户端连接数,0为不限制 |
max_per_ip=0 | 同一IP地址的最大连接数,0为不限制 |
anonymous_enable=[YES|NO] | 是否允许匿名用户访问 |
anon_upload_enable=[YES|NO] | 是否允许匿名用户上传文件 |
anon_umask=022 | 匿名用户上传文件的umask值 |
anon_root=/var/ftp | 匿名用户的FTP根目录 |
anon_mkdir_write_enable=[YES|NO] | 是否允许匿名用户创建目录 |
anon_other_write_enable=[YES|NO] | 是否开放匿名用户的其他写入权限(包括重命名、删除等操作权限) |
anon_max_rate=0 | 匿名用户的最大传输速率(字节/秒),0为不限制 |
local_enable=[YES|NO] | 是否允许本地用户登录FTP |
local_umask=022 | 本地用户上传文件的umask值 |
local_root=/var/ftp | 本地用户的FTP根目录 |
chroot_local_user=[YES|NO] | 是否将用户权限禁锢在FTP目录,以确保安全 |
local_max_rate=0 | 本地用户最大传输速率(字节/秒),0为不限制 |
三、配置匿名模式
前提:准备两台虚拟机,一台作为vsftpd的服务端IP:192.168.31.10,一台作为ftp的客户端IP:192.168.31.11
配置服务端
[root@localhost vsftpd]# mv vsftpd.conf vsftpd.conf.bak
[root@localhost vsftpd]# grep -v "#" /etc/vsftpd/vsftpd.conf.bak > /etc/vsftpd/vsftpd.conf
anonymous_enable=YES #开启匿名登录
anon_umask=022 #匿名用户上传文件的umask值
anon_upload_enable=YES #允许匿名用户上传文件
anon_other_write_enable=YES #允许匿名用户修改目录名称或删除目录
anon_mkdir_write_enable=YES #允许匿名用户创建目录
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
[root@localhost vsftpd]#
重启服务让配置生效,并加入开机启动项
[root@localhost vsftpd]# systemctl restart vsftpd.service
[root@localhost vsftpd]# systemctl enable vsftpd
Created symlink /etc/systemd/system/multi-user.target.wants/vsftpd.service → /usr/lib/systemd/system/vsftpd.service.
[root@localhost vsftpd]#
现在可以在客户端通过ftp命令连接到远程的FTP服务器了,在vsftpd服务程序的匿名开放认证模式下,其账户统一为anonymous,密码为空或anonymous。而且在连接FTP服务器后,默认访问的是/var/ftp目录。可以切换到该目录下的pub目录中,然后尝试创建一个新的目录文件,以检验是否拥有写入权限。
配置客户端
[root@localhost ~]# yum install ftp
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
正在解决依赖关系
--> 正在检查事务
---> 软件包 ftp.x86_64.0.0.17-67.el7 将被 安装
--> 解决依赖关系完成
依赖关系解决
==========================================================================================================================
Package 架构 版本 源 大小
==========================================================================================================================
正在安装:
ftp x86_64 0.17-67.el7 rhel7 61 k
事务概要
==========================================================================================================================
安装 1 软件包
总下载量:61 k
安装大小:96 k
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安装 : ftp-0.17-67.el7.x86_64 1/1
验证中 : ftp-0.17-67.el7.x86_64 1/1
已安装:
ftp.x86_64 0:0.17-67.el7
完毕!
通过客户端连接测试
[root@localhost ~]# ftp 192.168.31.10
Connected to 192.168.31.10 (192.168.31.10).
220 (vsFTPd 3.0.3)
Name (192.168.31.10:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/" is the current directory
ftp> dir
227 Entering Passive Mode (192,168,31,10,227,79).
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 6 Aug 12 2018 pub
226 Directory send OK.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir 111
550 Permission denied.
ftp>
在服务端修改相关权限并重新创建文件夹测试
[root@localhost vsftpd]# cat /etc/passwd |grep ftp
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin #安装vsftpd服务后系统会自动创建相关的用户
[root@localhost vsftpd]# ll -d /var/ftp/pub/
drwxr-xr-x. 2 root root 6 Aug 13 2018 /var/ftp/pub/ #该目录只有root用户有权限,所以ftp无法在该目录中创建文件夹
[root@localhost vsftpd]# chown -R ftp /var/ftp/pub/ #修改该目录的权限
[root@localhost vsftpd]# ll -d /var/ftp/pub/
drwxr-xr-x. 2 ftp root 6 Aug 13 2018 /var/ftp/pub/
[root@localhost ~]# ftp 192.168.31.10
Connected to 192.168.31.10 (192.168.31.10).
220 (vsFTPd 3.0.3)
Name (192.168.31.10:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir 333
550 Create directory operation failed. #创建失败
ftp>
检查selinux配置
[root@localhost vsftpd]# getsebool -a |grep ftp
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off #此处需设置为on
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_home_dir --> off
修改selinux策略
[root@localhost vsftpd]# setsebool -P ftpd_full_access=on
[root@localhost vsftpd]# getsebool -a |grep ftp
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> on
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_home_dir --> off
客户端重新通过ftp连接服务端测试
[root@localhost vsftpd]# ftp 192.168.31.10
Connected to 192.168.31.10 (192.168.31.10).
220 (vsFTPd 3.0.3)
Name (192.168.31.10:root): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
250 Directory successfully changed.
ftp> mkdir 111
257 "/pub/111" created
ftp>
四、配置本地用户模式
[root@localhost vsftpd]# vim vsftpd.conf
1 anonymous_enable=NO
2 local_enable=YES
3 write_enable=YES
4 local_umask=022
5 dirmessage_enable=YES
6 xferlog_enable=YES
7 connect_from_port_20=YES
8 xferlog_std_format=YES
9 listen=NO
10 listen_ipv6=YES
11 pam_service_name=vsftpd
12 userlist_enable=YES
[root@localhost vsftpd]# systemctl restart vsftpd.service
通过客户端连接测试,发现连接被拒绝
[root@localhost ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.3)
Name (192.168.10.10:root): root
530 Permission denied.
Login failed.
ftp>
在vsftpd的程序目录中有两个文件ftpusers、user_list,这两个文件是存放着一些用户名单,根据配置情况决定允许/拒绝名单里面的用户连接ftp
[root@localhost vsftpd]# ll
总用量 24
-rw-------. 1 root root 125 11月 17 2020 ftpusers
-rw-------. 1 root root 361 11月 17 2020 user_list
-rw-r--r--. 1 root root 229 9月 25 16:21 vsftpd.conf
-rw-------. 1 root root 5039 11月 17 2020 vsftpd.conf.bak
-rwxr--r--. 1 root root 348 11月 17 2020 vsftpd_conf_migrate.sh
[root@localhost vsftpd]# cat user_list
# vsftpd userlist
# If userlist_deny=NO, only allow users in this file
# If userlist_deny=YES (default), never allow users in this file, and
# do not even prompt for a password.
# Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
# for users that are denied.
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
[root@localhost vsftpd]# cat ftpusers
# Users that are not allowed to login via ftp
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
news
uucp
operator
games
nobody
1、如果想以root用户登录,可以删除这两个文件中的root用户;
2、使用不在这两个文件中的用户去登录ftp;
3、将住配置文件中的userlist_deny的参数值修改为NO(默认为YES)
现在注释掉这两个文件中的root用户然后连接测试
[root@localhost ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.3)
Name (192.168.10.10:root): root
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub
550 Failed to change directory.
ftp> pwd
257 "/root" is the current directory
ftp> pwd
257 "/root" is the current directory
ftp> cd /etc/vsftpd
250 Directory successfully changed.
ftp> pwd
257 "/etc/vsftpd" is the current directory
ftp>
五、配置虚拟用户模式
虚拟用户模式是最安全的一种认证模式,是专门创建出一个账号来登录FTP传输服务的,而且这个账号不能用于以SSH方式登录服务器。
1、安装vsftpd
dnf install vsftpd
2、创建虚拟用户并配置虚拟用户的数据库文件
[root@192 ~]# cd /etc/vsftpd/
[root@192 vsftpd]# vim vuser.list
[root@192 vsftpd]# cat vuser.list
zhangsan
123
lisi
123
[root@192 vsftpd]# db_load -T -t hash -f vuser.list vuser.db
3、创建与虚拟用户对应的本地用户并配置虚拟用户登录后访问的默认目录
[root@192 vsftpd]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@192 vsftpd]# ls -ld /var/ftproot/
drwx------. 3 virtual virtual 78 9月 25 16:24 /var/ftproot/
[root@192 vsftpd]# chmod -Rf 755 /var/ftproot/
[root@192 vsftpd]#
4、建立用于支持虚拟用户的PAM文件
[root@192 vsftpd]# vim /etc/pam.d/vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
5、配置vsftpd主配置文件,将PAM的认证文件修改为/etc/pam.d/vsftpd.vu
[root@192 vsftpd]# vim vsftpd.conf
anonymous_enable=NO #禁止匿名开放模式
local_enable=YES #允许本地用户模式
write_enable=YES
guest_enable=YES #开启虚拟用户模式
guest_username=virtual #指定虚拟用户对应的本地账户
allow_writeable_chroot=YES #允许对紧固的FTP根目录执行写入操作,而且不拒绝用户的登录请求
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd.vu #将PAM的认证文件修改为vsftpd.vu
userlist_enable=YES
6、为虚拟用户配置不同的权限
[root@192 vsftpd]# mkdir /etc/vsftpd/vuser_dir/
[root@192 vsftpd]# cd /etc/vsftpd/vuser_dir/
[root@192 vuser_dir]# touch lisi
[root@192 vuser_dir]# vim zhangsan
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
7、在主配置文件中添加user_config_dir参数,将虚拟用户的存放路径修改为/etc/vsftpd/vuser_dir/
[root@192 vuser_dir]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd.vu
userlist_enable=YES
user_config_dir=/etc/vsftpd/vuser_dir
[root@192 vuser_dir]# systemctl restart vsftpd.service
[root@192 vuser_dir]# systemctl enable vsftpd.service
Created symlink /etc/systemd/system/multi-user.target.wants/vsftpd.service → /usr/lib/systemd/system/vsftpd.service.
8、配置SELinux
[root@192 vuser_dir]# getsebool -a |grep ftp
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_home_dir --> off
[root@192 vuser_dir]# setsebool -P ftpd_full_access=on
9、连接测试
[root@192 vuser_dir]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.3)
Name (192.168.10.10:root): lisi
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir 111
550 Permission denied. #lisi这个账号无法创建文件夹
ftp> exit
221 Goodbye.
[root@192 vuser_dir]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.3)
Name (192.168.10.10:root): zhangsan
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> mkdir 111
257 "/111" created #zhangsan这个账号可以创建文件夹
六、日志
建议将日志修改为非标准模式
vim /etc/vsftpd/vsftpd.conf
xferlog_std_format=YES/NO 使用标准/非标准模式的日志,建议使用非标准模式
修改后重启vsftpd服务
日志位置/var/log目录下 xferlog 缺点标准模式的日志不够简明清晰
日志类型有两种:1,b 使用二进制的形式,2,t 使用文本形式
o指下载 i指上传 r