# Vsftp 服务实践

# 一、VSFTP 概述

FTP 是 File Transfer Protocol(文件传输协议)的英文简称,用于 Internet 上的文件的双向传输。使用 FTP 来传输时,是具有一定程度的危险性, 因为数据在因特网上面是完全没有受到保护的明文传输方式。

VSFTP 是一个基于 GPL 发布的类 Unix 系统上使用的 FTP 服务器软件,它的全称是 Very Secure FTP,从名称定义上基本可以看出,这是为了解决 ftp 传输安全性问题的。

# 二、VSFTP 工作模式

# 2.1 Port 模式

FTP 客户端首先和服务器的 TCP 21 端口建立连接,用来发送命令,客户端需要接收数据的时候在这个通道上发送 PORT 命令。PORT 命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的 TCP 20 端口连接至客户端的指定端口发送数据。FTP server 必须和客户端建立一个新的连接用来传送数据。

1.jpg

# 2.2 Passive 模式

FTP 客户端首先和服务器的 TCP 21 端口建立连接,用来建立控制通道发送命令,但建立连接后客户端发送 Pasv 命令。服务器收到 Pasv 命令后,打开一个临时端口(端口大于 1023 小于 65535)并且通知客户端在这个端口上传送数据的请求,客户端连接 FTP 服务器的临时端口,然后 FTP 服务器将通过这个端口传输数据。

2.jpg

# 三、VSFTP 部署

#1. 安装 vsftp
[root@vsftp ~]# yum install vsftpd -y
[root@vsftp ~]# systemctl start vsftpd && systemctl enable vsftpd
#2.vsftp 相关文件
[root@vsftp ~]# ll /etc/vsftpd/
-rw------- 1 root root  125 Jun 10  2021 ftpusers       #黑名单
-rw------- 1 root root  361 Jun 10  2021 user_list      #默认为黑名单,如将 userlist_deny=NO 则为白名单
-rw------- 1 root root 5116 Jun 10  2021 vsftpd.conf    #主配置文件
-rwxr--r-- 1 root root  338 Jun 10  2021 vsftpd_conf_migrate.sh
#3. 验证 vsftp 明文传输,tcpdump 抓包可以看到密码
[root@vsftp ~]# useradd xuyong
[root@vsftp ~]# echo "123456" | passwd --stdin xuyong
[root@vsftp ~]# tcpdump -i eth0 -nnX port 21
15:05:40.187871 IP 192.168.40.1.54319 > 192.168.40.50.21: Flags [P.], seq 1:14, ack 21, win 1023, length 13: FTP: USER xuyong  #用户名
	0x0000:  4500 0035 36d8 4000 8006 f266 c0a8 2801  E..56.@....f..(.
	0x0010:  c0a8 2832 d42f 0015 b46e 2af8 bd8d d6ef  ..(2./...n*.....
	0x0020:  5018 03ff 8100 0000 5553 4552 2078 7579  P.......USER.xuy
	0x0030:  6f6e 670d 0a                             ong..
15:05:40.188149 IP 192.168.40.1.54319 > 192.168.40.50.21: Flags [P.], seq 14:27, ack 55, win 1023, length 13: FTP: PASS 123456  #密码
	0x0000:  4500 0035 36db 4000 8006 f263 c0a8 2801  E..56.@....c..(.
	0x0010:  c0a8 2832 d42f 0015 b46e 2b05 bd8d d711  ..(2./...n+.....
	0x0020:  5018 03ff 27a9 0000 5041 5353 2031 3233  P...'...PASS.123
	0x0030:  3435 360d 0a                             456..

# 四、登录验证方式

1. 匿名用户验证:

  • 用户账号名称:ftp 或 anonymous
  • 用户账号密码:无密码
  • 工作目录:/var/ftp
  • 默认权限:默认可下载不可上传,上传权限由两部分组成(主配置文件和文件系统)

2. 本地用户验证:

  • 用户账号名称:本地用户(/etc/passwd)
  • 用户账号密码:用户密码(/etc/shadow)
  • 工作目录:登录用户的家目录
  • 权限:最大权限(drwx------)

3. 虚拟(virtual)用户验证:

  • 创建虚拟用户用来代替本地用户,减少本地用户曝光率
  • 使用本地用户作为虚拟用户的映射用户,为虚拟用户提供工作目录和权限控制
  • 能够设置严格的权限(为每一个用户生成单独的配置文件)

# 五、VSFTP 配置文件详解

# 5.1 VSFTP 默认配置文件
  • 允许匿名用户和本地用户登陆。anonymous_enable=YES 、local_enable=YES
  • 匿名用户使用的登陆名为 ftp 或 anonymous,口令为空;匿名用户不能离开匿名用户家目录 /var/ftp,且只能下载不能上传。
  • 本地用户的登录名为本地用户名,口令为此本地用户的口令;本地用户可以在自 己家目录中进行读写操作;本地用户可以离开自家目录切换至有权限访问的其他目录,并在权限允许的情况下进行上传 / 下载。write_enable=YES
  • 写在文件 /etc/vsftpd.ftpusers 中的本地用户禁止登陆。
[root@vsftp ~]#  egrep -v "^#|^$" /etc/vsftpd/vsftpd.conf 
anonymous_enable=YES         #允许匿名用户登录
local_enable=YES             #允许本地用户登录
write_enable=YES             #允许本地用户上传
local_umask=022              #umask 权限,上传默认文件权限 644,默认目录权限 755
dirmessage_enable=YES        #用户进入目录时,显示 message 文件中信息
xferlog_enable=YES           #激活记录日志
connect_from_port_20=YES     #主动模式数据传输端口
xferlog_std_format=YES       #使用标准的 ftp 日志格式
listen=NO					 #允许被监听
listen_ipv6=YES              #允许被监听
pam_service_name=vsftpd      #开启 pam 认证
userlist_enable=YES          #用户登入限制
tcp_wrappers=YES             #主机访问控制模式
# 5.2 常用全局配置
# 5.2.1 匿名用户(anonymous)设置
anonymous_enable=YES         
#控制是否允许匿名用户登入,YES 为允许匿名登入,NO 为不允许。默认值为 YES。
write_enable=YES             
#是否允许登陆用户有写权限。属于全局设置,默认值为 YES。
no_anon_password=NO          
#若是启动这项功能,则使用匿名登入时,不会询问密码。默认值为 NO。
ftp_username=ftp             
#定义匿名登入的使用者名称。默认值为 ftp。
anon_root=/var/ftp          
#使用匿名登入时,所登入的目录。默认值为 /var/ftp。注意 ftp 目录不能是 777 的权限属性,即匿名用户的家目录不能有 777 的权限。
anon_upload_enable=NO        
#如果设为 YES,则允许匿名登入者有上传文件(非目录)的权限,只有在 write_enable=YES 时,此项才有效。当然,匿名用户必须要有对上层目录的写入权。默认值为 NO。
anon_world_readable_only=YES 
#如果设为 YES,则允许匿名登入者下载可阅读的档案(可以下载到本机阅读,不能直接在 FTP 服务器中打开阅读)。默认值为 YES。
anon_mkdir_write_enable=NO   
#如果设为 YES,则允许匿名登入者有新增目录的权限,只有在 write_enable=YES 时,此项才有效。当然,匿名用户必须要有对上层目录的写入权。默认值为 NO。
anon_other_write_enable=NO   
#如果设为 YES,则允许匿名登入者更多于上传或者建立目录之外的权限,譬如删除或者重命名。(如果 anon_upload_enable=NO,则匿名用户不能上传文件,但可以删除或者重命名已经存在的文件;如果 anon_mkdir_write_enable=NO,则匿名用户不能上传或者新建文件夹,但可以删除或者重命名已经存在的文件夹。)默认值为 NO。
chown_uploads=NO            
#设置是否改变匿名用户上传文件(非目录)的属主。默认值为 NO。
chown_username=username     
#设置匿名用户上传文件(非目录)的属主名。建议不要设置为 root。
anon_umask=077             
#设置匿名登入者新增或上传档案时的 umask 值。默认值为 077,则新建档案的对应权限为 700。
deny_email_enable=NO        
#若是启动这项功能,则必须提供一个档案 /etc/vsftpd/banner_emails,内容为 email address。若是使用匿名登入,则会要求输入 email address,若输入的 email address 在此档案内,则不允许进入。默认值为 NO。
banned_email_file=/etc/vsftpd/banner_emails
#此文件用来输入 email address,只有在 deny_email_enable=YES 时,才会使用到此档案。若是使用匿名登入,则会要求输入 email address,若输入的 email address 在此档案内,则不允许进入。
# 5.2.2 本地用户设置
local_enable=YES/NO(YES)
#控制是否允许本地用户登入,YES 为允许本地用户登入,NO 为不允许。默认值为 YES。
local_root=/home/username
#当本地用户登入时,将被更换到定义的目录下。默认值为各用户的家目录。
write_enable=YES/NO(YES)
#是否允许登陆用户有写权限。属于全局设置,默认值为 YES。
local_umask=022
#本地用户新增档案时的 umask 值。默认值为 077。
file_open_mode=0755
#本地用户上传档案后的档案权限,与 chmod 所使用的数值相同。默认值为 0666。
# 5.2.3 欢迎语设置
dirmessage_enable=YES/NO(YES)
#如果启动这个选项,那么使用者第一次进入一个目录时,会检查该目录下是否有.message 这个档案,如果有,则会出现此档案的内容,通常这个档案会放置欢迎话语,或是对该目录的说明。默认值为开启。
message_file=.message
#设置目录消息文件,可将要显示的信息写入该文件。默认值为.message。
banner_file=/etc/vsftpd/banner
#当使用者登入时,会显示此设定所在的档案内容,通常为欢迎话语或是说明。默认值为无。如果欢迎信息较多,则使用该配置项。
ftpd_banner=Welcome to BOB's FTP server
#这里用来定义欢迎话语的字符串,banner_file 是档案的形式,而 ftpd_banner 则是字符串的形式。预设为无。
# 5.2.4 控制用户是否允许切换到上级目录

在默认配置下,本地用户登入 FTP 后可以使用 cd 命令切换到其他目录,这样会对系统带来安全隐患。可以通过以下三条配置文件来控制用户切换目录。

chroot_list_enable=NO                     #设置是否启用 chroot_list_file 配置项指定的用户列表文件。默认值为 NO
chroot_list_file=/etc/vsftpd.chroot_list  #用于指定用户列表文件,该文件用于控制哪些用户可以切换到用户家目录的上级目录
chroot_local_user=NO                      #用于指定用户列表文件中的用户是否允许切换到上级目录。默认值为 NO

通过搭配能实现以下几种效果:

  • 当 chroot_list_enable=YES,chroot_local_user=YES 时,在 /etc/vsftpd.chroot_list 文件中列出的用户,可以切换到其他目录;未在文件中列出的用户,不能切换到其他目录。
  • 当 chroot_list_enable=YES,chroot_local_user=NO 时,在 /etc/vsftpd.chroot_list 文件中列出的用户,不能切换到其他目录;未在文件中列出的用户,可以切换到其他目录。
  • 当 chroot_list_enable=NO,chroot_local_user=YES 时,所有的用户均不能切换到其他目录。
  • 当 chroot_list_enable=NO,chroot_local_user=NO 时,所有的用户均可以切换到其他目录。
# 5.2.5 数据传输模式设置

FTP 在传输数据时,可以使用二进制方式,也可以使用 ASCII 模式来上传或下载数据。

ascii_upload_enable=YES/NO(NO)
#设置是否启用 ASCII 模式上传数据。默认值为 NO。
ascii_download_enable=YES/NO(NO)
#设置是否启用 ASCII 模式下载数据。默认值为 NO。
# 5.2.6 访问控制设置

两种控制方式:一种控制主机访问,另一种控制用户访问。

1、控制主机访问:

tcp_wrappers=YES/NO(YES)
#设置 vsftpd 是否与 tcp wrapper 相结合来进行主机的访问控制。默认值为 YES。如果启用,则 vsftpd 服务器会检查 /etc/hosts.allow 和 /etc/hosts.deny 中的设置,来决定请求连接的主机,是否允许访问该 FTP 服务器。这两个文件可以起到简易的防火墙功能。比如:若要仅允许 192.168.0.1—192.168.0.254 的用户可以连接 FTP 服务器,则在 /etc/hosts.allow 文件中添加以下内容:
vsftpd:192.168.0. :allow
all:all :deny

2、控制用户访问

对于用户的访问控制可以通过 /etc 目录下的 vsftpd.user_list 和 ftpusers 文件来实现。

userlist_file=/etc/vsftpd.user_list
#控制用户访问 FTP 的文件,里面写着用户名称。一个用户名称一行。
userlist_enable=YES/NO(NO)
#是否启用 vsftpd.user_list 文件。
userlist_deny=YES/NO(YES)
#决定 vsftpd.user_list 文件中的用户是否能够访问 FTP 服务器。若设置为 YES,则 vsftpd.user_list 文件中的用户不允许访问 FTP,若设置为 NO,则只有 vsftpd.user_list 文件中的用户才能访问 FTP。/etc/vsftpd/ftpusers 文件专门用于定义不允许访问 FTP 服务器的用户列表(注意:如果 userlist_enable=YES,userlist_deny=NO, 此时如果在 vsftpd.user_list 和 ftpusers 中都有某个用户时,那么这个用户是不能够访问 FTP 的,即 ftpusers 的优先级要高)。默认情况下 vsftpd.user_list 和 ftpusers,这两个文件已经预设置了一些不允许访问 FTP 服务器的系统内部账户。如果系统没有这两个文件,那么新建这两个文件,将用户添加进去即可。
# 5.2.7 访问速率设置
anon_max_rate=0                   #设置匿名登入者使用的最大传输速度,单位为 B/s,0 表示不限制速度。默认值为 0
local_max_rate=0                  #本地用户使用的最大传输速度,单位为 B/s,0 表示不限制速度。预设值为 0。
# 5.2.8 超时时间设置
accept_timeout=60                 #被动模式设置建立 FTP 连接的超时时间,单位为秒。默认值为 60
connect_timeout=60                #PORT 主动模式下建立数据连接的超时时间,单位为秒。默认值为 60
data_connection_timeout=120       #设置建立 FTP 数据连接的超时时间,单位为秒。默认值为 120
idle_session_timeout=300          #设置多长时间不对 FTP 服务器进行任何操作,则断开该 FTP 连接,默认值为 300 秒
# 5.2.9 日志文件设置
xferlog_enable= YES/NO(YES)
#是否启用上传 / 下载日志记录。如果启用,则上传与下载的信息将被完整纪录在 xferlog_file 所定义的档案中。预设为开启。
xferlog_file=/var/log/vsftpd.log
#设置日志文件名和路径,默认值为 /var/log/vsftpd.log。
xferlog_std_format=YES/NO(NO)
#如果启用,则日志文件将会写成 xferlog 的标准格式,如同 wu-ftpd 一般。默认值为关闭。
log_ftp_protocol=YES|NO(NO)
#如果启用此选项,所有的 FTP 请求和响应都会被记录到日志中,默认日志文件在 /var/log/vsftpd.log。启用此选项时,xferlog_std_format 不能被激活。这个选项有助于调试。默认值为 NO。
# 5.2.10 FTP 工作模式与端口设置

FTP 有两种工作方式:PORT FTP(主动模式)和 PASV FTP(被动模式)

listen_port=21
#设置 FTP 服务器建立连接所监听的端口,默认值为 21。
connect_from_port_20=YES/NO
#指定 FTP 使用 20 端口进行数据传输,默认值为 YES。
ftp_data_port=20
#设置在 PORT 方式下,FTP 数据连接使用的端口,默认值为 20。
pasv_enable=YES/NO(YES)
#若设置为 YES,则使用 PASV 被动模式;若设置为 NO,则使用 PORT 模式。默认值为 YES,即使用 PASV 被动模式。
pasv_max_port=24800
#在 PASV 工作模式下,数据连接可以使用的端口范围的最大端口,0 表示任意端口。默认值为 0。
pasv_min_port=24500
#在 PASV 工作模式下,数据连接可以使用的端口范围的最小端口,0 表示任意端口。默认值为 0。
# 5.2.11 与连接相关的设置
listen=YES/NO(YES)
#设置 vsftpd 服务器是否以 standalone 模式运行。以 standalone 模式运行是一种较好的方式,此时 listen 必须设置为 YES,此为默认值。建议不要更改,有很多与服务器运行相关的配置命令,需要在此模式下才有效。若设置为 NO,则 vsftpd 不是以独立的服务运行,要受到 xinetd 服务的管控,功能上会受到限制。
max_clients=0
#设置 vsftpd 允许的最大连接数,默认值为 0,表示不受限制。若设置为 100 时,则同时允许有 100 连接,超出的将被拒绝。只有在 standalone 模式运行才有效。
max_per_ip=0
#设置每个 IP 允许与 FTP 服务器同时建立连接的数目。默认值为 0,表示不受限制。只有在 standalone 模式运行才有效。
listen_address=IP 地址
#设置 FTP 服务器在指定的 IP 地址上侦听用户的 FTP 请求。若不设置,则对服务器绑定的所有 IP 地址进行侦听。只有在 standalone 模式运行才有效。
setproctitle_enable=YES/NO(NO)
#设置每个与 FTP 服务器的连接,是否以不同的进程表现出来。默认值为 NO,此时使用 ps aux |grep ftp 只会有一个 vsftpd 的进程。若设置为 YES,则每个连接都会有一个 vsftpd 的进程。
# 5.2.12 虚拟用户设置

虚拟用户使用 PAM 认证方式。

pam_service_name=vsftpd
#设置 PAM 使用的名称,默认值为 /etc/pam.d/vsftpd。
guest_enable= YES/NO(NO)
#启用虚拟用户。默认值为 NO。
guest_username=ftp
#这里用来映射虚拟用户。默认值为 ftp。
virtual_use_local_privs=YES/NO(NO)
#当该参数激活(YES)时,虚拟用户使用与本地用户相同的权限。当此参数关闭(NO)时,虚拟用户使用与匿名用户相同的权限。默认情况下此参数是关闭的(NO)。
# 5.2.13 定义用户配置文件

在 vsftpd 中,可以通过定义用户配置文件来实现不同的用户使用不同的配置。

user_config_dir=/etc/vsftpd/userconf
#设置用户配置文件所在的目录。当设置了该配置项后,用户登陆服务器后,系统就会到 /etc/vsftpd/userconf 目录下,读取与当前用户名相同的文件,并根据文件中的配置命令,对当前用户进行更进一步的配置。

例如:定义 user_config_dir=/etc/vsftpd/userconf,且主机上有使用者 test1,test2,那么我们就在 user_config_dir 的目录新增文件名为 test1 和 test2 两个文件。若是 test1 登入,则会读取 user_config_dir 下的 test1 这个档案内的设定。默认值为无。利用用户配置文件,可以实现对不同用户进行访问速度的控制,在各用户配置文件中定义 local_max_rate=XX,即可。

# 六、VSFTP 匿名用户访问

#1. 注释中带 * 为修改项或增加项 
[root@vsftp ~]# egrep -v "^#|^$" /etc/vsftpd/vsftpd.conf 
anonymous_enable=YES         #允许匿名用户登录       ***
local_enable=YES             #允许本地用户登录
write_enable=YES             #允许本地用户上传
local_umask=022              #umask 权限,上传文件权限默认 644,目录 755
anon_upload_enable=YES       #允许匿名用户上传       ***
anon_mkdir_write_enable=YES  #允许匿名用户新建目录   ***
anon_other_write_enable=YES  #允许匿名用户删除或上传 ***
dirmessage_enable=YES        #用户进入目录时,显示 message 文件中信息
xferlog_enable=YES           #激活记录日志
connect_from_port_20=YES     #主动模式数据传输端口
xferlog_std_format=YES       #使用标准的 ftp 日志格式
listen=NO					 #允许被监听
listen_ipv6=YES              #允许被监听
pam_service_name=vsftpd      #开启 pam 认证
userlist_enable=YES          #用户登入限制
tcp_wrappers=YES             #主机访问控制模式
#2. 匿名用户访问路径
[root@vsftp ~]# systemctl restat vsftpd
[root@vsftp ~]# cd /var/ftp/
#3. 此时 ftp 无法上传文件,因为匿名登录为系统用户 ftp,对 /var/ftp/pub 目录没有写入权限
[root@vsftp ~]# ll /var/ftp/pub -d
drwxr-xr-x 3 root root 30 Nov  4 23:05 /var/ftp/
[root@vsftp ~]# chown ftp /var/ftp/pub

# 七、VSFTP 系统用户访问

# 7.1 VSFTP 配置文件
[root@vsftp ~]# egrep -v "^#|^$" /etc/vsftpd/vsftpd.conf 
anonymous_enable=YES         #允许匿名用户登录       
local_enable=YES             #允许本地用户登录
write_enable=YES             #允许本地用户上传
local_umask=022              #umask 权限,上传文件权限默认 644,目录 755
dirmessage_enable=YES        #用户进入目录时,显示 message 文件中信息
xferlog_enable=YES           #激活记录日志
connect_from_port_20=YES     #主动模式数据传输端口
xferlog_std_format=YES       #使用标准的 ftp 日志格式
listen=NO					 #允许被监听
listen_ipv6=YES              #允许被监听
pam_service_name=vsftpd      #开启 pam 认证
userlist_enable=YES          #用户登入限制
tcp_wrappers=YES             #主机访问控制模式
# 7.2 新建系统用户
[root@vsftp ~]# useradd xuyong
[root@vsftp ~]# passwd zhangshan
[root@vsftp ~]# useradd xuyong
[root@vsftp ~]# echo "123456" | passwd --stdin zhangshan
[root@vsftp ~]# userdel -d zhangsan
# 7.3 VSFTP 基本配置

vsftp 登录路径默认为用户家目录,可以通过修改配置文件自定义主目录,修改后所有用户登录的工作目录都是该路径 /share_home。

local_root=/share_home      #当本地用户登入时,将被更换到定义的目录下。默认值为各用户的家目录。	
local_max_rate=0            #限制最大传输速率 (字节 / 秒)

此时用户登录后没有写入权限,原因为虽然 VSFTP 服务开启了写权限,但是 /share_home 目录属主属组为 root,用户没有目录写权限。

[root@vsftp ~]# groupadd caiwu
[root@vsftp ~]# id xuyong
uid=1000(xuyong) gid=1000(xuyong) groups=1000(xuyong)
[root@vsftp ~]# gpasswd -a xuyong caiwu    #已存在用户加入到 caiwu 组
[root@vsftp ~]# id xuyong
uid=1000(xuyong) gid=1000(xuyong) groups=1000(xuyong),1003(caiwu)
[root@vsftp ~]# mkdir /share_home
[root@vsftp ~]# ll /share_home/ -d
drwxr-xr-x 2 root root 6 Nov  5 09:59 /share_home/
[root@manager ~]# chown root.caiwu /share_home/
[root@vsftp ~]# chmod 775 /share_home
[root@vsftp ~]# ll /share_home/ -d
drwxrwxr-x 2 root caiwu 6 Jun 22 16:39 /share_home/
# 7.4 限制登录用户切换家目录

1、限制所有登录用户切换家目录

从 2.3.5 之后,vsftpd 增强了安全检查,如果用户被限定在了其主目录下,则该用户的主目录不能再具有写权限了!如果检查发现还有写权限,就会报该错误。

chroot_local_user=YES                
allow_writeable_chroot=YES
#开启用户限制在家目录 (只开启以上行,把所有用户都限制在用户家目录中)

2、仅允许写入 /etc/vsftpd/chroot_list 文件中的用户可以切换目录,其他用户都限制在用户主目录

chroot_local_user=YES                
allow_writeable_chroot=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list  
#开启以上 4 行,写入 /etc/vsftpd/chroot_list 文件中的用户可以切换目录,其他用户都限制在用户主目录
[root@vsftp ~]# vim /etc/vsftpd/chroot_list
xuyong
[root@vsftp ~]# systemctl restart vsftpd
# 7.5 VSFTP 用户访问控制

1、配置文件

[root@manager ~]# ll /etc/vsftpd/
total 36
-rw------- 1 root root   125 Jun 10  2021 ftpusers         #黑名单
-rw------- 1 root root   361 Jun 10  2021 user_list        #默认为黑名单,如将 userlist_deny=NO 则为白名单,仅允许该配置文件中用户可以访问

2、将用户 xuyong 加入 user_list 文件中后默认为黑名单,不能登入 vsftp 服务器

[root@manager ~]# cat /etc/vsftpd/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
xuyong              #用户加入黑名单

3、通过修改配置文件 /etc/vsftpd/vsftpd.conf,仅写入 /etc/vsftpd/user_list 中的用户可以访问 vsftp 服务器,其他用户不可以访问。此时该文件为白名单。

userlist_enable=YES                 #开启用户访问控制,默认开启状态
userlist_deny=NO                    #开启白名单功能
Userlist_file=/etc/vsftpd/user_list

# 八、VSFTP 虚拟用户访问

# 8.1 创建虚拟用户口令文件
[root@vsftp ~]# cat /etc/vsftpd/vusers 
xuyong    #用户名
123456    #密码
zhaomin
123456
zhangwuji
123456
# 8.2 生成虚拟用户已口令认证文件
#1. 安装口令认证命令
[root@vsftp ~]# yum install db4-utils -y
 
#2. 生成 Vsftpd 虚拟用户数据库认证文件,
[root@vsftp ~]# db_load -T -t hash -f /etc/vsftpd/vusers /etc/vsftpd/vusers.db
[root@vsftp ~]# chmod 700 /etc/vsftpd/vusers.db
[root@vsftp ~]# ll /etc/vsftpd/vusers.db 
-rw-r--r-- 1 root root 12288 Jun 22 20:41 /etc/vsftpd/vusers.db
# 8.3 编辑 VSFTP 的 PAM 认证文件
#配置 PAM 认证文件,/etc/pam.d/vsftpd 行尾加入如下两行,其余行注释掉,此时系统本地用户无法登入
[root@vsftp ~]# cat /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     pam_userdb.so  db=/etc/vsftpd/vusers
account    required     pam_userdb.so  db=/etc/vsftpd/vusers
# 8.4 建立本地映射用户并设置宿主目录权限
  • 所有 Vsftpd 虚拟用户需要映射到一个系统用户,该系统用户不需要密码,也不需要登录,主要用于虚拟用户映射使用;
  • 用户名必须和下一步配置文件中一致;
[root@vsftp ~]# useradd -d /home/vftproot -s /sbin/nologin vuser
[root@vsftp ~]# chmod 755 /home/vftproot
[root@vsftp ~]# ll /home/vftproot -d
drwxr-xr-x 2 vuser vuser 62 Jun 22 20:58 /home/vftproot
# 8.5 修改配置文件
[root@vsftp ~]# vim /etc/vsftpd/vsftpd.conf 
...
guest_enable=YES              #开启虚拟用户
guest_username=vuser          #FTP 虚拟用户对应的系统用户
pam_service_name=vsftpd       #PAM 认证文件(默认存在)
# 8.6 重启 VSFTP 服务并测试
  • 此时虚拟用户可以登录、查看、下载,不能上传
  • 默认上传文件的位置是虚拟用户的家目录
  • 权限使用的是匿名用户权限进行管理
[root@vsftp ~]# systemctl restart vsftpd
#验证并测试,此时虚拟用户可以登录、查看、下载,不能上传报错
[root@vsftp vftproot]# pwd
/home/vftproot
[root@vsftp vftproot]# ls
a.txt

1.jpg

# 8.7 调整虚拟用户权限
  • 给虚拟用户设定权限,允许所有虚拟用上传
  • 关闭匿名用户登录,更加安全(不影响虚拟用户登录)
[root@vsftp ~]# vim /etc/vsftpd/vsftpd.conf 
anonymous_enable=NO          #允许匿名用户登录       ***
anon_upload_enable=YES       #允许匿名用户上传       ***
anon_mkdir_write_enable=YES  #允许匿名用户新建目录    ***
anon_other_write_enable=YES  #允许匿名用户删除或上传  ***
[root@vsftp vftproot]# systemctl restart vsftpd

2.jpg

# 8.8 单独定义虚拟用户权限

为每个虚拟用户建立自己的配置文件,每个虚拟用户都有自己的共享目录,并单独定义权限;

#1. 修改配置文件,指定保存虚拟用户配置文件的目录
[root@vsftp ~]# vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_dir       #指定保存虚拟用户配置文件的目录
#2. 建立目录
[root@vsftp ~]# mkdir /etc/vsftpd/vusers_dir
#3. 为每个虚拟用户建立配置文件,配置文件名称与虚拟用户一致,系统会读取与当前用户名相同的配置文件
[root@vsftp ~]# vim /etc/vsftpd/vusers_dir/xuyong
anon_upload_enable=YES       #允许匿名用户上传       ***
anon_mkdir_write_enable=YES  #允许匿名用户新建目录    ***
anon_other_write_enable=YES  #允许匿名用户删除       ***
local_root=/data/xuyong      #xuyong 指定独立的上传目录
[root@vsftp ~]# vim /etc/vsftpd/vusers_dir/zhangwuji
anon_upload_enable=YES       #允许匿名用户上传       ***
anon_mkdir_write_enable=YES  #允许匿名用户新建目录    ***
anon_other_write_enable=NO   #允许匿名用户删除       ***
local_root=/data/zhangwuji   #zhangwuji 指定独立的上传目录
[root@vsftp ~]# vim /etc/vsftpd/vusers_dir/zhaomin
anon_upload_enable=YES       #允许匿名用户上传       ***
anon_mkdir_write_enable=NO   #允许匿名用户新建目录    ***
anon_other_write_enable=NO   #允许匿名用户删除       ***
local_root=/data/zhaomin     #zhaomin 指定独立的上传目录
#4. 新建上传目录并配置虚拟用户系统权限
[root@vsftp ~]# mkdir /data/xuyong
[root@vsftp ~]# mkdir /data/zhangwuji
[root@vsftp ~]# mkdir /data/zhaomin
[root@vsftp ~]# chown vuser:vuser /data/xuyong
[root@vsftp ~]# chown vuser:vuser /data/zhangwuji
[root@vsftp ~]# chown vuser:vuser /data/zhaomi
#5. 重启服务验证并测试
[root@vsftp vftproot]# systemctl restart vsftpd
  • 用户 xuyong 可以登录、查看、下载,删除、创建目录和文件、上传
  • 用户 zhangwuji 可以登录、查看、下载、创建目录和文件,上传,无法删除
  • 用户 zhangwuji 可以登录、查看、下载、上传,无法删除、创建目录和文件

# 九、项目实战

# 9.1 公司 FTP 服务器需求
  1. 每位员工有独立的目录,可上传、可读、可写、可删除权限,但目录本身员工不可删除
  2. 每位员工拥有独立根目录,在自己目录下可见公司共享目录 public_share(只读)
  3. 部门内部员工可见部门共享目录_caiwu_share(读写)
  4. 禁锢虚拟用户的主目录,同时禁止访问除主目录之外的目录
  5. 开启日志记录登录、上传、下载、删除信息

1.png

# 9.2 VSFTP 部署
[root@vsftp ~]# yum install vsftpd -y
[root@vsftp ~]# systemctl start vsftpd && systemctl enable vsftpd
[root@vsftp ~]# netstat -lntp|grep vsftpd
tcp6       0      0 :::21                   :::*                    LISTEN      973/vsftpd
# 9.3 配置虚拟用户访问
#1. 创建虚拟用户口令文件
[root@vsftp ~]# cat /etc/vsftpd/vusers 
xuyong
123456
zhaomin
123456
zhangwuji
123456
#2. 生成虚拟用户已口令认证文件
[root@vsftp ~]# yum install db4-utils -y
[root@vsftp ~]# db_load -T -t hash -f /etc/vsftpd/vusers /etc/vsftpd/vusers.db
[root@vsftp ~]# ll /etc/vsftpd/vusers.db
-rw-r--r-- 1 root root 12288 Jun 23 13:54 /etc/vsftpd/vusers.db
#3. 配置 PAM 认证文件,/etc/pam.d/vsftpd 行尾加入如下两行,其余行注释掉,此时系统本地用户无法登入
[root@vsftp ~]# cat /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     pam_userdb.so  db=/etc/vsftpd/vusers
account    required     pam_userdb.so  db=/etc/vsftpd/vusers
#4. 建立本地映射用户并设置宿主目录权限
[root@vsftp ~]# useradd -d /home/vftproot -s /sbin/nologin vuser
[root@vsftp ~]# chmod 755 /home/vftproot
[root@vsftp ~]# ll /home/vftproot -d
drwxr-xr-x 2 vuser vuser 62 Jun 23 13:55 /home/vftproot
#5. 修改配置文件
[root@vsftp ~]# vim /etc/vsftpd/vsftpd.conf 
anonymous_enable=NO
...
chroot_local_user=YES         #开启用户限制在家目录
allow_writeable_chroot=YES
...
guest_enable=YES              #开启虚拟用户
guest_username=vuser          #FTP 虚拟用户对应的系统用户
pam_service_name=vsftpd       #PAM 认证文件(默认存在)
#6. 修改配置文件,指定保存虚拟用户配置文件的目录
[root@vsftp ~]# vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_dir       #指定保存虚拟用户配置文件的目录
#7. 建立目录
[root@vsftp ~]# mkdir /etc/vsftpd/vusers_dir
#8. 为每个虚拟用户建立配置文件,配置文件名称与虚拟用户一致,系统会读取与当前用户名相同的配置文件
###anon_upload_enable=YES         #允许匿名用户上传       
###anon_mkdir_write_enable=YES    #允许匿名用户新建目录    
###anon_other_write_enable=YES    #允许匿名用户删除      
###local_root=/data/IT/xuyong     #xuyong 指定独立的上传目录
[root@vsftp vusers_dir]# cat /etc/vsftpd/vusers_dir/xuyong 
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/data/it/xuyong
[root@vsftp vusers_dir]# cat /etc/vsftpd/vusers_dir/zhangwuji 
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/data/caiwu/zhangwuji
[root@vsftp vusers_dir]# cat /etc/vsftpd/vusers_dir/zhaomin 
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/data/caiwu/zhaomin
#10. 新建上传目录并配置虚拟用户系统权限
[root@vsftp ~]# mkdir -p /data/it/xuyong
[root@vsftp ~]# mkdir -p /data/caiwu/zhangwuji
[root@vsftp ~]# mkdir -p /data/caiwu/zhaomin
[root@vsftp ~]# chown vuser:vuser /data/it/xuyong
[root@vsftp ~]# chown vuser:vuser /data/caiwu/zhangwuji
[root@vsftp ~]# chown vuser:vuser /data/caiwu/zhaomin
#11. 重启服务验证并测试
[root@vsftp vftproot]# systemctl restart vsftpd
# 9.4 配置公共目录共享

因为 1 个虚拟用户只可以配置 1 个目录,故需要通过 mount -B 来实现目录共享

#1. 创建公共目录
mkdir -p /data/public_share
mkdir -p /data/caiwu/caiwu_share
mkdir -p /data/it/it_share
mkdir -p /data/caiwu/zhangwuji/caiwu_share
mkdir -p /data/caiwu/zhangwuji/public_share
mkdir -p /data/caiwu/zhaomin/caiwu_share
mkdir -p /data/caiwu/zhaomin/public_share
mkdir -p /data/it/xuyong/it_share
mkdir -p /data/it/xuyong/public_share
#2. 使用 mount -B -o rw,ro 来将公共目录、日志目录挂载至个人根目录。
mount -B -o rw /data/caiwu/caiwu_share /data/caiwu/zhangwuji/caiwu_share
mount -B -o ro /data/public_share /data/caiwu/zhangwuji/public_share 
mount -B -o rw /data/caiwu/caiwu_share /data/caiwu/zhaomin/caiwu_share
mount -B -o ro /data/public_share /data/caiwu/zhaomin/public_share 
mount -B -o rw /data/it/it_share /data/it/xuyong/it_share
mount -B -o ro /data/public_share /data/it/xuyong/public_share 
#3. 为部门共享配置虚拟用户系统权限
chown vuser:vuser /data/caiwu/caiwu_share
chown vuser:vuser /data/it/it_share
#4. 配置自动挂载
[root@vsftp ~]# vim /etc/rc.local
追加内容如下:
mount -B -o rw /data/caiwu/caiwu_share /data/caiwu/zhangwuji/caiwu_share
mount -B -o ro /data/public_share /data/caiwu/zhangwuji/public_share 
mount -B -o rw /data/caiwu/caiwu_share /data/caiwu/zhaomin/caiwu_share
mount -B -o ro /data/public_share /data/caiwu/zhaomin/public_share 
mount -B -o rw /data/it/it_share /data/it/xuyong/it_share
mount -B -o ro /data/public_share /data/it/xuyong/public_share
此文章已被阅读次数:正在加载...更新于

请我喝[茶]~( ̄▽ ̄)~*

Xu Yong 微信支付

微信支付

Xu Yong 支付宝

支付宝