centos7搭建 Vsftpd 服务。

安装服务端程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost ~]# yum install vsftpd
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分输出信息………………
================================================================================
Installing:
vsftpd x86_64 3.0.2-9.el7 rhel 166 k
Transaction Summary
================================================================================
Install 1 Package
vsftpd.x86_64 0:3.0.2-9.el7
Complete!

[root@linuxprobe ~]# yum install ftp
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分输出信息………………
Install 1 Package
ftp.x86_64 0:0.17-66.el7
Complete!
关闭本机防火墙和禁用selinux
1
2
3
[root@localhost ~]# systemctl stop firewalld && systemctl disable firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
配置 FTP 服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 程序的主配置文件为/etc/vsftpd/vsftpd.conf
[root@localhost ~]# cat /etc/vsftpd/vsftpd.conf
anonymous_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
tcp_wrappers=YES
配置文件

CentOS7 中的配置文件位置

1
2
3
4
主配置文件:/etc/vsftpd/vsftpd.conf
配置文件目录:/etc/vsftpd/*.conf
服务启动脚本:/etc/rc.d/init.d/vsftpd
用户认证配置文件:/etc/pam.d/vsftpd
共享目录
1
2
3
匿名用户(映射为ftp用户)共享资源位置:/var/ftp
系统用户通过ftp访问的资源的位置:用户自己的家目录
虚拟用户通过ftp访问的资源的位置:给虚拟用户指定的映射成为的系统用户的家目录
通用基础配置
1
2
3
4
5
6
7
8
9
listen=[YES|NO]         #是否以独立运行的方式监听服务
listen_address=IP地址 #设置要监听的 IP 地址
listen_port=21 #设置 FTP 服务的监听端口
download_enable=[YES|NO] #是否允许下载文件
max_clients=0 #最大客户端连接数,0 为不限制
max_per_ip=0 #同一 IP 地址的最大连接数,0 为不限制
chown_uploads=[YES|NO] #是否允许改变上传文件的属主
chown_username=whoever #改变上传文件的属主为 whoever
pam_service_name=vsftpd #让 vsftpd 使用 pam 完成用户认证,使用的文件为/etc/pam.d/vsftpd
匿名用户的配置
1
2
3
4
5
6
7
anonymous_enable=[YES|NO]      #是否允许匿名用户访问
anon_upload_enable=[YES|NO] #是否允许匿名用户上传文件
anon_mkdir_write_enable=[YES|NO] #是否允许匿名用户创建目录
anon_other_write_enable=[YES|NO] #是否开放匿名用户的其他写入权限(包括重命名、删除等操作权限)
anon_umask=022 #匿名用户上传文件的 umask 值
anon_root=/var/ftp #匿名用户的 FTP 根目录
anon_max_rate=0 #匿名用户的最大传输速率(字节/秒),0 为不限制
系统用户的配置
1
2
3
4
5
6
7
8
9
10
11
anonymous_enable=NO    #禁止匿名访问模式
local_enable=[YES|NO] #是否允许本地用户登录 FTP
write_enable=[YES|NO] #是否开放本地用户的其他写入权限
local_umask=022 #本地用户上传文件的 umask 值
local_root=/var/ftp #本地用户的 FTP 根目录
local_max_rate=0 #本地用户最大传输速率(字节/秒),0 为不限制
userlist_enable=[YES|NO] #开启用户作用名单文件功能
userlist_deny=[YES|NO] #启用禁止用户名单,名单文件为 ftpusers 和/etc/vsftpd/user_list
chroot_local_user=[YES|NO] #是否将用户权限禁锢在 FTP 家目录中,以确保安全
chroot_list_enable=[YES|NO] #禁锢文件中指定的 FTP 本地用户于其家目录中
chroot_list_file=/etc/vsftpd/chroot_list #指定禁锢文件位置,需要和 chroot_list_enable 一同开启
日志功能
1
2
3
xferlog_enable=[YES|NO]    #是否开启 FTP 日志功能
xferlog_std_format=[YES|NO] #是否以标准格式保持日志
xferlog_file=/var/log/xferlog #指定保存日志的文件名称,需要一同开启

vsftpd 认证模式

vsftpd 作为更加安全的文件传输的服务程序,允许用户以三种认证模式登录到 FTP 服务器上。

  • 匿名开放模式

    • 匿名开放模式是一种最不安全的认证模式,任何人都可以无需密码验证而直接登录到FTP服务器。这种模式一般用来访问不重要的公开文件,在生产环境中尽量不要存放重要文件,不建议在生产环境中如此行事。
  • 本地用户模式

    • 本地用户模式是通过Linux系统本地的账户密码信息进行认证的模式,相较于匿名开放模式更安全,而且配置起来相对简单。但是如果被黑客破解了账户的信息,就可以畅通无阻地登录FTP服务器,从而完全控制整台服务器。
  • 虚拟用户模式

    • 虚拟用户模式是这三种模式中最安全的一种认证模式,它需要为FTP服务单独建立用户数据库文件,虚拟出用来进行口令验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的,仅供FTP服务程序进行认证使用。这样,即使黑客破解了账户信息也无法登录服务器,从而有效降低了破坏范围和影响。

匿名访问模式

vsftpd 服务程序默认开启了匿名开放模式,我们需要做的就是开放匿名用户的上传、下载文件的权限,以及让匿名用户创建、删除、更名文件的权限。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# 匿名访问模式主配置文件
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_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
tcp_wrappers=YES
# 重启服务
[root@localhost ~]# systemctl restart vsftpd

# 服务程序加入到开机启动项中,以保证服务器在重启后依然能够正常提供传输服务
[root@localhost ~]# systemctl enable vsftpd
ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service
# 在vsftpd服务程序的匿名开放认证模式下,其账户统一为anonymous,密码为空
# 连接到FTP服务器后,默认访问的是/var/ftp目录,我们可以在其中进行创建、删除等操作
[root@localhost ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.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 files
550 Permission denied.
# 系统显示拒绝创建目录,这是为什么呢?
# 查看该目录的权限得知,只有root管理员才有写入权限,开放ftp用户权限(该账户在系统中已经存在)
[root@localhost ~]# ls -ld /var/ftp/pub
drwxr-xr-x. 3 root root 16 Jul 13 14:38 /var/ftp/pub

[root@localhost ~]# chown -Rf ftp /var/ftp/pub
[root@localhost ~]# ls -ld /var/ftp/pub
drwxr-xr-x. 3 ftp root 16 Jul 13 14:38 /var/ftp/pub

[root@linuxprobe ~]# ftp 192.168.10.10
………………省略部分输出信息………………
ftp> mkdir files
257 "/pub/files" created
ftp> rename files database
350 Ready for RNTO.
250 Rename successful.
ftp> exit
221 Goodbye.

本地用户模式

如果之前用的是匿名开放模式,现在就可以将它关了,然后开启本地用户模式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# 本地用户模式主配置文件
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO

local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
connect_from_port_20=YES
listen=NO
listen_ipv6=YES

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
xferlog_enable=YES
xferlog_std_format=YES
# 同样需要重启服务和开机自启动
[root@localhost ~]# systemctl restart vsftpd

# 服务程序加入到开机启动项中,以保证服务器在重启后依然能够正常提供传输服务
[root@localhost ~]# systemctl enable vsftpd
ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service
# 现在已经完全可以本地用户的身份登录FTP服务器了,但是使用root无法登陆
[root@localhost ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): root
530 Permission denied.
Login failed.
ftp>

# 这是因为,为了系统的安全,默认禁止root等用户登录FTP服务被系统拒绝访问
# 因为vsftpd服务程序所在的目录中,默认存放着两个名为用户名单的文件,ftpusers和user_list
# 在ftpusers和user_list两个用户文件中将root用户删除就可以登录了
[root@localhost ~]# cat /etc/vsftpd/user_list
root
bin
daemon

[root@localhost ~]# cat /etc/vsftpd/ftpusers
root
bin
daemon
# 在采用本地用户模式登录FTP服务器后,默认访问的是该用户的家目录,因此不存在写入权限不足的情况
# 如果不关闭SELinux,则需要再次开启SELinux域中对FTP服务的允许策略
[root@localhost ~]# setsebool -P ftpd_full_access=on

# 即可以使用系统用户进行FTP服务的登录了
[root@localhost ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
Name (192.168.10.10:root): escape
331 Please specify the password.
Password:此处输入该用户的密码
230 Login successful.
Remote system type is UNIX.

虚拟用户模式(文本文件)

认证模式:vsftpd + pam + file

  • 第一步:创建用于进行 FTP 认证的用户数据库文件

    • 这里使用文本文件进行用户认证
    • 数据库文件中奇数行为账户名,偶数行为密码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 编辑虚拟用户文件
[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# vim vuser.list
aimo1
aimo@2021
aimo2
aimo@2021
# 明文信息既不安全,也不符合让vsftpd服务程序直接加载的格式
# 因此需要使用db_load命令用哈希算法将原始的明文信息文件转换成数据库文件
# 降低数据库文件的权限,然后再把原始的明文信息文件删除
[root@localhost vsftpd]# db_load -T -t hash -f vuser.list vuser.db
[root@localhost vsftpd]# file vuser.db
vuser.db: Berkeley DB (Hash, version 9, native byte-order)

[root@localhost vsftpd]# chmod 600 vuser.db
  • 第二步:创建 vsftpd 服务程序用于存储文件的根目录以及虚拟用户映射的系统本地用户

    • FTP服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置
    • 可以把这个系统本地用户的家目录设置为/var目录并设置不允许登录FTP服务器
1
2
3
4
5
6
[root@localhost ~]# useradd -d /var/ftproot -s /sbin/nologin virtual

[root@localhost ~]# ls -ld /var/ftproot/
drwx------. 3 virtual virtual 74 Jul 14 17:50 /var/ftproot/

[root@localhost ~]# chmod -Rf 755 /var/ftproot/
  • 第三步:建立支持虚拟用户的 PAM 认证文件

    • PAM是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开
    • PAM是可插拔认证模块,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式
1
2
3
4
5
6
# 新建一个用于虚拟用户认证的PAM文件vsftpd.vu
# PAM文件内的db=参数为使用db_load命令生成的账户密码数据库文件的路径,但不用写数据库文件的后缀

[root@localhost ~]# vim /etc/pam.d/vsftpd.vu
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
  • 第四步:在 vsftpd.conf 文件中添加支持配置

    • 在vsftpd服务程序的主配置文件中默认就带有参数pam_service_name=vsftpd
    • 表示登录FTP服务器时是根据/etc/pam.d/vsftpd文件进行安全认证的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 我们要做的就是把vsftpd主配置文件中原有的PAM认证文件vsftpd修改为新建的vsftpd.vu文件即可
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
pam_service_name=vsftpd.vu
user_config_dir=/etc/vsftpd/vusers_dir

local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=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
userlist_enable=YES
tcp_wrappers=YES
  • 第五步:为虚拟用户设置不同的权限

    • 只需新建一个目录,在里面分别创建两个以aimo1和aimo2命名的文件
    • 在每个文件中,对用户分别进行配置,达到管理不用用户权限的效果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost ~]# mkdir /etc/vsftpd/vusers_dir/
[root@localhost ~]# cd /etc/vsftpd/vusers_dir/

[root@localhost vusers_dir]# touch aimo1 aimo2

[root@localhost vusers_dir]# vim aimo1
local_root=/usr/local/vsftpd/aimo1 #设置虚拟用户目录
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

[root@localhost vusers_dir]# vim aimo2
local_root=/usr/local/vsftpd/aimo2
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
  • 第六步:使用虚拟 FTP 用户访问测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[root@localhost ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
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 files
550 Permission denied.
ftp> exit
221 Goodbye.
[root@localhost ~]# ftp 192.168.10.10
Connected to 192.168.10.10 (192.168.10.10).
220 (vsFTPd 3.0.2)
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 files
257 "/files" created
ftp> rename files database
350 Ready for RNTO.
250 Rename successful.
ftp> rmdir database
250 Remove directory operation successful.
ftp> exit
221 Goodbye.

最后重启vsftpd服务

1
[root@localhost ~]# systemctl restart vsftpd