菜单
本页目录

6 FTP 文件服务器

生产需求:
        有多部门的公共存储空间,有每个独立的私有存储空间
        ftp协议:vsftpd软件
        公共存储空间
                匿名登录,匿名用户有:ftp、anonymous
                匿名的家目录:	/var/ftp
                Windows可以利用资源管理器访问到公共存储空间,看似没有账号密码
                #建议创建独立的数据存储目录:
                                1)	允许其他人有w权限(文件系统权限)
                                2)	修改配置文件实现功能权限

				上传				  upload
                创建目录			 mkdir
                删除&重命名		 	other
                

注意:vsftp服务器(需要双重验证,保证服务安全)
        私有存储空间
                本地登录
                本地登录家目录		~
                
               
ftp缺陷:不支持再服务器本身修改,需先下载,改了再上传
				解决:利用第三方工具(filezilla),并未解决本质
#服务端配置vsftpd服务
[root@localhost ~]# yum -y install vsftpd
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# cd /var/ftp
[root@localhost ftp]# ls
pub
[root@localhost ftp]# mkdir ./user1
[root@localhost ftp]# ls
pub  user1
[root@localhost ftp]# ls
pub  user1


#客户端配置ftp
[root@localhost ~]# yum -y install ftp
[root@localhost ~]# ftp 192.168.18.201
Connected to 192.168.18.201 (192.168.18.201).
220 (vsFTPd 3.0.2)
Name (192.168.18.201:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 
ftp> 
ftp> ls						
227 Entering Passive Mode (192,168,18,201,64,246).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0               6 Oct 30  2018 pub
226 Directory send OK.
ftp> ls
227 Entering Passive Mode (192,168,18,201,169,150).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0               6 Oct 30  2018 pub
drwxr-xr-x    2 0        0               6 Oct 16 11:06 user1
226 Directory send OK.
ftp> 

1) VSFTP(文件共享服务)

使用FTP(文件传输协议)

用20端口数据传输(主动模式下)

用21端口收发命令(命令传输)

2) 软件运行模式

(1)主动模式

(PORT)server用20端口数据传输,客户端使用port命令后得到的随机端口,告诉服务端,进行数据传输

image-20221025113745683

(2)被动模式

(Passive)server用随机端口,client用PASV命令得到随机端口,告诉server,进行数据传输

image-20221025113757682

注意:

被动模式中,开放的随机端口是:21和大于1023,设置防火墙时,需要可以放行

3) 安全特性

    普通用户执行vsftp程序,降低了权限
    执行较高权限时,需要上层程序许可
    大多数命令为交互式
    有chroot功能,限制固定家目录

4)VSFTP连接类型

控制连接(持续连接)——》TCP	21		   ——》	收发FTP命令

数据连接(按需连接)——》TCP	20		   ——》上传下载数据

数据连接(按需链接)——》TCP	随机端口	——》上传下载数据

5)VSFTP传输模式

模式过程切换
Binary模式(二进制模式)不处理任何数据bin
ASCII模式自适应,对数据格式处理ascii

6) vsftp软件信息

        服务端软件名:	vsftpd
        客户端软件名:	ftp
        服务名:vsftpd
        端口号:20、21、指定范围内随机端口号
        配置文件:	/etc/vsftpd/vsftpd.conf
        命令:	
        		ls		查目录下所有文件或目录
                put			上传
                get			下载
                lcd			切换本地当前路径
                mkdir		创建目录
                delete		删除文件
                rmdir		删除目录
                rename		改名

7)用户验证身份机制:

7.1)匿名用户登录方式:

用户名:ftp、anonymous

家目录:/var/ftp/

权限格式解释
上传权限anon_upload_enable=YES允许匿名用户上传
创建目录anon_mkdir_write_enable=YES允许匿名用户创建目录
其他权限anon_other_write_enable=YES删除、改名、覆盖等权限
默认umaskanon_umask=022匿名用户上传文件权限的默认掩码值
启用anonymous_enable=YES启用匿名访问
家目录anon_root=/var/ftp匿名用户访问的家目录
传输速率anon_max_rate=0限制匿名用户传输速率,0表示不限制

a) FTP命令中报错信息:

permission	denied					 # 配置文件的问题

could	not。。。或failed。。。		# 目录权限的问题

b)注意

    1.用来登录匿名的用户不止ftp、还有anonymous,所以需要设置其他人具有的权限
    2.为什么需要具有r权限
        因为数据传输需要打开文件,将文件内容转化为二进制,通过二进制传输,再二进制转化为文件。

7.1.1)实验:匿名用户登录

使用匿名用户登录ftp客户端,并能够对共享目录有上传、创建目录、删除、改名、覆盖等权限

#server端
[root@localhost ~]# yum -y install vsftpd >/dev/null				#服务端安装vsftpd
[root@localhost ~]# mkdir /var/ftp/upload							
[root@localhost ~]# setfacl -m u:ftp:rwx /var/ftp/upload/			#设置目录权限
[root@localhost ~]# getfacl /var/ftp/upload/
getfacl: Removing leading '/' from absolute path names
# file: var/ftp/upload/
# owner: root
# group: root
user::rwx
user:ftp:rwx
group::r-x
mask::rwx
other::r-x

[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf 					#设置vsftpd的配置文件,修改匿名用户相关配置
[root@localhost ~]# grep "^anon" /etc/vsftpd/vsftpd.conf
anonymous_enable=YES										#允许匿名用户访问
anon_umask=022												#设置匿名用户默认掩码值
anon_upload_enable=YES										#允许匿名用户上传
anon_mkdir_write_enable=YES									#允许匿名用户创建目录
anon_other_write_enable=YES									#允许匿名用户删除、改名、覆盖等
[root@localhost ~]# systemctl restart vsftpd				#重启服务
[root@localhost ~]# tail -n 1 /var/ftp/upload/vimrc 		#测试客户端未覆盖文件前最后一行
let &guicursor = &guicursor . ",a:blinkon0"			
[root@localhost ~]# tail -n 1 /var/ftp/upload/vimrc 		#客户端覆盖vimrc文件后,检查最后一行
set nu

#client端
[root@localhost ~]# yum -y install ftp >/dev/null				#客户端安装ftp
[root@localhost ~]# ftp 192.168.18.201							#客户端连接

ftp> pwd
257 "/"
ftp> ls
227 Entering Passive Mode (192,168,18,201,227,142).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0               6 Oct 30  2018 pub
drwxrwxr-x    2 0        0               6 Oct 24 12:24 upload
226 Directory send OK.
ftp> cd upload
250 Directory successfully changed.
ftp> mkdir asd
257 "/upload/asd" created									#成功创建目录
ftp> put 
anaconda-ks.cfg  .bash_logout     .bashrc          .config/         ifcfg-ens33      .viminfo         
.bash_history    .bash_profile    .cache/          .cshrc           .tcshrc          
ftp> put anaconda-ks.cfg 									#上传文件成功					
local: anaconda-ks.cfg remote: anaconda-ks.cfg
227 Entering Passive Mode (192,168,18,201,82,109).
150 Ok to send data.
226 Transfer complete.
1289 bytes sent in 0.00685 secs (188.04 Kbytes/sec)
ftp> lcd /etc/											#切换本地的目录,方便上传不同路径下的文件
Local directory now /etc
ftp> put vimrc											#第一次上传vimrc
local: vimrc remote: vimrc
227 Entering Passive Mode (192,168,18,201,180,76).
150 Ok to send data.
226 Transfer complete.
1982 bytes sent in 0.000502 secs (3948.21 Kbytes/sec)
ftp> put vimrc											#修改vimrc文件后再次上传(最后一行添加set nu)
local: vimrc remote: vimrc
227 Entering Passive Mode (192,168,18,201,206,126).
150 Ok to send data.
226 Transfer complete.
1989 bytes sent in 7.7e-05 secs (25831.17 Kbytes/sec)

ftp> ls
227 Entering Passive Mode (192,168,18,201,247,243).
150 Here comes the directory listing.
-rw-r--r--    1 14       50           1289 Oct 24 12:28 anaconda-ks.cfg
drwxr-xr-x    2 14       50              6 Oct 24 12:28 asd
-rw-r--r--    1 14       50           1989 Oct 24 12:30 vimrc
226 Directory send OK.
ftp> rename anaconda-ks.cfg ks.cfg								#改名
350 Ready for RNTO.
250 Rename successful.
ftp> ls
227 Entering Passive Mode (192,168,18,201,48,235).
150 Here comes the directory listing.
drwxr-xr-x    2 14       50              6 Oct 24 12:28 asd
-rw-r--r--    1 14       50           1289 Oct 24 12:28 ks.cfg
-rw-r--r--    1 14       50           1989 Oct 24 12:30 vimrc
226 Directory send OK.
ftp> rmdir asd													#删除目录
250 Remove directory operation successful.
ftp> delete vimrc 												#删除文件
250 Delete operation successful.
ftp> delete ks.cfg											
250 Delete operation successful.	
ftp> 221 Goodbye.					#ctrl+D退出
[root@localhost ~]# 

7.1.2)测试

ftp下载后的文件权限由什么决定
    可能:
    		1)由上传时具有的权限决定
            2)下载时,由当前目录所决定

结论:由匿名用户登录前的身份决定,下载时的身份所决定

[root@localhost ~]# ll
总用量 16
-rw-------. 1 root root 1289 10月 14 02:55 anaconda-ks.cfg
lrwxrwxrwx. 1 root root   42 10月 14 03:01 ifcfg-ens33 -> /etc/sysconfig/network-scripts/ifcfg-ens33
-rw-r--r--  1 root root    5 10月 25 09:24 test
-rw-r--r--  1 yq1  yq1     4 10月 25 09:23 test1
-rw-r--r--  1 yq2  yq2     4 10月 25 09:24 test2
[root@localhost ~]# cp -a  ./test* /home/yq1/ 
[root@localhost ~]# cp -a  ./test* /home/yq2/ 
[root@localhost ~]# ll /tmp
总用量 4
-rwx------. 1 root root 836 10月 14 02:55 ks-script-tXRQyc
drwx------  3 root root  17 10月 25 09:13 systemd-private-fa7d49f42a4d42f9957dd4c16fdbb86c-chronyd.service-logW8p
drwx------  2 root root   6 10月 25 09:13 vmware-root_6594-969522774
-rw-------. 1 root root   0 10月 14 02:49 yum.log

[root@localhost ~]# su - yq1
[yq1@localhost ~]$ ftp 192.168.18.201
Connected to 192.168.18.201 (192.168.18.201).
220 (vsFTPd 3.0.2)
Name (192.168.18.201:yq1): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,18,201,225,169).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0               6 Oct 30  2018 pub
drwxrwxr-x    2 0        0               6 Oct 25 01:20 upload
226 Directory send OK.
ftp> cd upload
250 Directory successfully changed.
ftp> put test1
local: test1 remote: test1
227 Entering Passive Mode (192,168,18,201,101,206).
150 Ok to send data.
226 Transfer complete.
4 bytes sent in 7.3e-05 secs (54.79 Kbytes/sec)
ftp> put test2
local: test2 remote: test2
227 Entering Passive Mode (192,168,18,201,160,104).
150 Ok to send data.
226 Transfer complete.
4 bytes sent in 7.5e-05 secs (53.33 Kbytes/sec)
ftp> ls
227 Entering Passive Mode (192,168,18,201,254,134).
150 Here comes the directory listing.
-rw-r--r--    1 14       50              4 Oct 25 01:26 test1
-rw-r--r--    1 14       50              4 Oct 25 01:26 test2
226 Directory send OK.
ftp> lcd /tmp
Local directory now /tmp
ftp> get test1
local: test1 remote: test1
227 Entering Passive Mode (192,168,18,201,21,227).
150 Opening BINARY mode data connection for test1 (4 bytes).
226 Transfer complete.
4 bytes received in 0.00058 secs (6.90 Kbytes/sec)
ftp> get test2
local: test2 remote: test2
227 Entering Passive Mode (192,168,18,201,80,244).
150 Opening BINARY mode data connection for test2 (4 bytes).
226 Transfer complete.
4 bytes received in 0.000296 secs (13.51 Kbytes/sec)
ftp> 221 Goodbye.
[yq1@localhost ~]$ ls
test  test1  test2
[yq1@localhost ~]$ cd /tmp
[yq1@localhost tmp]$ ll															#采用yq1用户下载到/tmp中,所有者、所属组都为yq1
总用量 12
-rwx------. 1 root root 836 10月 14 02:55 ks-script-tXRQyc
drwx------  3 root root  17 10月 25 09:13 systemd-private-fa7d49f42a4d42f9957dd4c16fdbb86c-chronyd.service-logW8p
-rw-rw-r--  1 yq1  yq1    4 10月 25 09:27 test1
-rw-rw-r--  1 yq1  yq1    4 10月 25 09:27 test2
drwx------  2 root root   6 10月 25 09:13 vmware-root_6594-969522774
-rw-------. 1 root root   0 10月 14 02:49 yum.log
[yq1@localhost tmp]$
[root@localhost ~]# rm -rf /tmp/*
[root@localhost ~]# ls /tmp
[root@localhost ~]# su - yq2
上一次登录:二 10月 25 09:29:24 CST 2022pts/0 上
[yq2@localhost ~]$ ls
test  test1  test2
[yq2@localhost ~]$ ftp 192.168.18.201
Connected to 192.168.18.201 (192.168.18.201).
220 (vsFTPd 3.0.2)
Name (192.168.18.201:yq2): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,18,201,201,239).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0               6 Oct 30  2018 pub
drwxrwxr-x    2 0        0              32 Oct 25 01:26 upload
226 Directory send OK.
ftp> cd upload
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,18,201,210,131).
150 Here comes the directory listing.
-rw-r--r--    1 14       50              4 Oct 25 01:26 test1
-rw-r--r--    1 14       50              4 Oct 25 01:26 test2
226 Directory send OK.
ftp> 
ftp> put test
local: test remote: test
227 Entering Passive Mode (192,168,18,201,182,76).
150 Ok to send data.
226 Transfer complete.
5 bytes sent in 0.00023 secs (21.74 Kbytes/sec)
ftp> put test1
local: test1 remote: test1
227 Entering Passive Mode (192,168,18,201,88,134).
150 Ok to send data.
226 Transfer complete.
4 bytes sent in 0.000667 secs (6.00 Kbytes/sec)
ftp> put test2
local: test2 remote: test2
227 Entering Passive Mode (192,168,18,201,239,93).
150 Ok to send data.
226 Transfer complete.
4 bytes sent in 5.3e-05 secs (75.47 Kbytes/sec)
ftp> lcd /tmp
Local directory now /tmp
ftp> get test
local: test remote: test
227 Entering Passive Mode (192,168,18,201,187,219).
150 Opening BINARY mode data connection for test (5 bytes).
226 Transfer complete.
5 bytes received in 2.5e-05 secs (200.00 Kbytes/sec)
ftp> get test1
local: test1 remote: test1
227 Entering Passive Mode (192,168,18,201,61,191).
150 Opening BINARY mode data connection for test1 (4 bytes).
226 Transfer complete.
4 bytes received in 2.9e-05 secs (137.93 Kbytes/sec)
ftp> get test2
local: test2 remote: test2
227 Entering Passive Mode (192,168,18,201,199,30).
150 Opening BINARY mode data connection for test2 (4 bytes).
226 Transfer complete.
4 bytes received in 3.4e-05 secs (117.65 Kbytes/sec)
ftp> 221 Goodbye.
[yq2@localhost ~]$ ftp 192.168.18.20^C
[yq2@localhost ~]$ ls -l /tmp															#采用yq2用户下载到/tmp中,所有者、所属组都为yq2
总用量 12
-rw-rw-r-- 1 yq2 yq2 5 10月 25 09:30 test
-rw-rw-r-- 1 yq2 yq2 4 10月 25 09:30 test1
-rw-rw-r-- 1 yq2 yq2 4 10月 25 09:30 test2

7.2)本地用户登录方式

使用linux创建的普通用户中的账号密码,登录ftp客户端,权限相对于匿名用户最大

配置文件对于本地用户的选项格式:(/etc/vsftpd/vsftpd.conf)

格式解释
local_enable=YES允许本地用户登录
local_umask=022本地用户默认umask值
chroot_local_user=YES允许本地用户进行切换根
allow_writeable_chroot=YES忽略安全性警告
local_max_rate=0限制本地用户传输速率,0表示不限制
chroot_list_enable=YES开启白名单
chroot_list_file=/etc/vsftpd/chroot_list指定白名单路径
ftp_banner=Welocome....登录提示
userlist_enable=YES & userlist_deny=YES黑名单
userlist_enable=YES & userlist_deny=NO白名单

7.2.1)实验

1)使用本地用户登录ftp
Linux创建普通用户,设置账号密码

注意:
		1.创建本地用户不能登录Linux
                useradd	-s	/sbin/nologin		指定用户shell类型,使其不能登录系统
                useradd	-r		1)创建时没有家目录
                                2)	创建的用户UID范围为系统用户范围(1-999)
                                
		2.将/sbin/nologin	追加到/etc/shells
				echo "/sbin/nologin"	>>	/etc/shells

限制本地用切根

主要格式解释
chroot_local_user=YES将用户禁锢在主目录
allow_writeable_chroot=YES忽略安全性警告
#服务端
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf 			#修改本地用户登录相关格式
[root@localhost ~]# egrep "^local|^chroot|^allow" /etc/vsftpd/vsftpd.conf
local_enable=YES				#允许本地登录
local_umask=022					#本地用默认掩码值
chroot_local_user=YES			#将本地用户禁用再主目录
allow_writeable_chroot=YES		#忽略安全性警告
local_max_rate=0				#限制本地用户传输速率,0表示不限制
[root@localhost ~]# useradd yq1 && echo "123" |passwd --stdin yq1		#创建用户
更改用户 yq1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]# 
[root@localhost ~]# systemctl restart vsftpd					#重启服务

客户端登录成功

image-20221024205804326

2)限制不同本地用户登录
超级黑名单:/etc/vsftpd/ftpusers
					写入哪个用户,哪个用户就不能登录;保存即生效,不需要重启服务

名单:/etc/vsftpd/user_list
			白名单:userlist_enable=YES	&	userlist_deny=NO
			黑名单:userlist_enable=YES	&	userlist_deny=YES	(默认)

注意:超级黑名单优先级最高

#服务端,限制yq2用户登录
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf 
[root@localhost ~]# grep "^userlist" /etc/vsftpd/vsftpd.conf 			#编写黑名单格式,让/etc/vsftpd/user_list成为黑名单
userlist_enable=YES														#默认只有这一行也行
userlist_deny=YES
[root@localhost ~]# vim /etc/vsftpd/user_list			
[root@localhost ~]# tail -n1 /etc/vsftpd/user_list 						#将yq2加入配置文件黑名单
yq2
[root@localhost ~]# useradd yq2 && echo "123" |passwd --stdin yq2
更改用户 yq2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@localhost ~]# systemctl restart vsftpd

客户端,yq2登录失败

image-20221024210248310

3)被动模式下,限定数据传输的随机端口范围
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=35000
#服务端,设置被动模式下,限制随机端口范围
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf 
[root@localhost ~]# grep "^pasv" /etc/vsftpd/vsftpd.conf 
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=35000
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# 
[root@localhost ~]# netstat -anpt					#检查服务器发送数据的端口
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      6890/sshd           
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      7043/master         
tcp        0      0 192.168.18.201:22       192.168.18.3:3294       ESTABLISHED 7164/sshd: root@pts 
tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           
tcp6       0      0 :::21                   :::*                    LISTEN      7592/vsftpd         
tcp6       0      0 :::22                   :::*                    LISTEN      6890/sshd           
tcp6       0      0 ::1:25                  :::*                    LISTEN      7043/master         
tcp6       0      0 192.168.18.201:34078    :::*                    LISTEN      7601/vsftpd         
tcp6       0      0 192.168.18.201:21       192.168.18.202:54844    ESTABLISHED 7601/vsftpd         
tcp6       0      0 192.168.18.201:34694    192.168.18.202:36978    TIME_WAIT   -                   
tcp6       0      0 192.168.18.201:21       192.168.18.202:54842    TIME_WAIT   -                   
tcp6  4409104      0 192.168.18.201:34078    192.168.18.202:35462    ESTABLISHED 7603/vsftpd				#这个是
#客户端
[root@localhost ~]# dd if=/dev/zero of=./aa1 bs=1G count=2			#创建指定大小文件
记录了2+0 的读入
记录了2+0 的写出
2147483648字节(2.1 GB)已复制,59.8782 秒,35.9 MB/秒

[root@localhost ~]# ftp 192.168.18.201							#匿名用户登录
Connected to 192.168.18.201 (192.168.18.201).
220 (vsFTPd 3.0.2)
Name (192.168.18.201:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.

ftp> cd upload
250 Directory successfully changed.
ftp> put aa1												#上传aa1文件,并区服务端检查传输端口
local: aa1 remote: aa1
227 Entering Passive Mode (192,168,18,201,133,30).
150 Ok to send data.
226 Transfer complete.
2147483648 bytes sent in 20.4 secs (105436.81 Kbytes/sec)
ftp> 

注意:/etc/vsftpd/vsftpd.conf格式问题

在vsftpd配置文件中,选项结尾处,不得加空格、制表符等特殊符号(否则服务启动将会报错)

7.3)虚拟用户验证

匿名和本地验证的共同缺陷:	选项时公用的,一旦设置,所有用户都生效,没办法针对性设置

需求:		需要每个用户由自己的家目录,并且有自己独立的权限(虚拟用户能实现)

虚拟用户:	不再借助Linux账户;自行创建数据库文件,保存账号密码
            1.每个虚拟用户有自己的独立配置文件
            2.未虚拟用户创建Linux映射用户,作为权限绑定关系
            3.减少本地用户的曝光率

7.3.1)实验步骤

(1)创建数据库
创建数据库模板(单行写账号,双行写密码)
[root@localhost ~]# vim	/etc/vsftpd/users/user_list

将模板转化为数据库文件
[root@localhost ~]# db_load	-T -t hash -f user_list user.db
更改模板和数据库文件权限为600


(2)创建映射用户
[root@localhost ~]# useradd	-s /sbin/nologin virtual				#默认目录在/home/virtual
[root@localhost ~]# echo "/sbin/nologin" >> /etc/shells


(3)PAM认证、添加虚拟用户支持
拓展:/etc/pam.d/	目录记录了密码指向位置
        1.注释掉原本的vsftpd
        [root@localhost ~]# mv	/etc/pam.d/vsftpd	/etc/pam.d/vsftpd.bak

        2.重新创建,并写入	/etc/pam.d/vsftpd			(最后会自动补齐	.db	后缀	最后不写后缀)
        auth		required			pam_userdb.so		db=/etc/vsftpd/users/user
        account		required			pam_userdb.so		db=/etc/vsftpd/users/user

        3.修改vsftpd.conf主配置文件,开启虚拟用户
        pam_service_name=vsftpd								# 相对路径指向 /etc/pam.d/ 目录下的密码指向文件
        guest_enable=YES									# 开启虚拟用户使用
        guest_username=virtual								# 虚拟用户映射到Linux的virtual用户
        user_config_dir=/etc/vsftpd/conf.d/					# 指向每个虚拟用户的配置文件目录
        allow_writeable_chroot=YES							# 忽略安全性警告


(4)为每个用户设置配置文件
权限相关,每个用户单独设置
        1、虚拟用户配置文件内容:
        anon_upload_enable=YES							# 允许上传
        anon_umask=022									# 设置默认掩码值,与下载权限相关
        anon_mkdir_write_enable=YES						# 允许创建目录
        anon_other_write_enable=YES						# 允许其他写权限(删除、改名、覆盖)
        local_root=/home/virtual/laosong				# 指定虚拟用户的家目录(区别于匿名用户,只能指向映射用户家目录下的子目录)

        2、在映射用户下创建虚拟用户家目录

        3、更改虚拟用户家目录权限,所有者所属组权限为virtual
        注意:给映射用户的家目录改权限

        4、其他人加上r和x权限:
        chmod 	o+r    映射用户家目录
        chmod	o+x	   映射用户家目录

测试:采用filezilla第三方工具

[root@localhost ~]# yum -y install vsftpd >/dev/null
[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# ls
ftpusers  user_list  vsftpd.conf  vsftpd_conf_migrate.sh
[root@localhost vsftpd]# mkdir ./users
[root@localhost vsftpd]# vim /etc/vsftpd/users/user_list						#建立数据库模板
[root@localhost vsftpd]# cat /etc/vsftpd/users/user_list
zhangsan
123
lisi
123
laowang
123
laosong
123
[root@localhost vsftpd]# db_load -T -t hash -f /etc/vsftpd/users/user_list /etc/vsftpd/users/user.db		#将数据库模板转化为数据库文件:
[root@localhost vsftpd]# cd users/
[root@localhost users]# ls -l
总用量 16
-rw-r--r-- 1 root root 12288 10月 25 18:45 user.db
-rw-r--r-- 1 root root    46 10月 25 17:45 user_list
[root@localhost users]# chmod 600 ./*											#修改两个数据库文件权限
[root@localhost users]# ls -l
总用量 16
-rw------- 1 root root 12288 10月 25 18:45 user.db
-rw------- 1 root root    46 10月 25 17:45 user_list
[root@localhost users]# useradd -s /sbin/nologin virtual 						#创建映射用户
[root@localhost users]# echo "/sbin/nologin" >> /etc/shells
[root@localhost users]# cd /etc/pam.d/
[root@localhost pam.d]# mv vsftpd vsftpd.bak									#注释之前的vsftpd密码指向
[root@localhost pam.d]# vim vsftpd												#新建vsftpd密码指向
[root@localhost pam.d]# cat vsftpd
auth	required	pam_userdb.so	db=/etc/vsftpd/users/user
account	required	pam_userdb.so	db=/etc/vsftpd/users/user
[root@localhost pam.d]# vim /etc/vsftpd/vsftpd.conf 							#在vsftpd.conf配置文件中添加ssl加密模块
[root@localhost pam.d]# tail -n 6 /etc/vsftpd/vsftpd.conf
#以下是虚拟用户相关
pam_service_name=vsftpd						#相对路径/etc/pam.d目录中,vsftpd的密码指向文件
guest_enable=YES							#开启虚拟用户登录
guest_username=virtual						#映射用户指向virtual
user_config_dir=/etc/vsftpd/conf.d/			#所有虚拟用户的权限配置文件目录
allow_writeable_chroot=YES					#忽略安全性警告
[root@localhost pam.d]# mkdir /etc/vsftpd/conf.d/						#创建虚拟用户的配置文件目录,卡中存放每个虚拟用户的相关权限配置文件
[root@localhost pam.d]# cd /etc/vsftpd/conf.d/
[root@localhost conf.d]# ls
[root@localhost conf.d]# vim zhangsan									#给zhangsan、lisi、laowang、laosong用户分别设置不同的权限
[root@localhost conf.d]# cat zhangsan > lisi
[root@localhost conf.d]# vim lisi 
[root@localhost conf.d]# cat lisi > laowang
[root@localhost conf.d]# vim laowang
[root@localhost conf.d]# cat laowang > laosong
[root@localhost conf.d]# vim laosong
[root@localhost conf.d]# echo "local_root=/home/virtual/zhangsan" >> zhangsan
[root@localhost conf.d]# echo "local_root=/home/virtual/lisi" >> lisi
[root@localhost conf.d]# echo "local_root=/home/virtual/laowang" >> laowang
[root@localhost conf.d]# echo "local_root=/home/virtual/laosong" >> laosong
[root@localhost conf.d]# ls
laosong  laowang  lisi  zhangsan
[root@localhost conf.d]# cat laowang
anon_upload_enable=YES				
anon_umask=022
anon_mkdir_write_enable=YES
local_root=/home/virtual/laowang
[root@localhost conf.d]# cat laosong
anon_upload_enable=YES				#允许上传
anon_umask=022						#设置默认掩码值,和下载权限相关
anon_mkdir_write_enable=YES			#允许创建目录
anon_other_write_enable=YES			#允许删除、改名、覆盖
local_root=/home/virtual/laosong	#锁定家目录
[root@localhost conf.d]# cat zhangsan 
anon_upload_enable=YES
local_root=/home/virtual/zhangsan
[root@localhost conf.d]# cat lisi 
anon_upload_enable=YES
anon_umask=022
local_root=/home/virtual/lisi
[root@localhost conf.d]# ls /home/virtual/							#给每个虚拟用户创建家目录,只能在映射用户家目录下创建子目录
[root@localhost conf.d]# mkdir /home/virtual/zhangsan
[root@localhost conf.d]# mkdir /home/virtual/lisi
[root@localhost conf.d]# mkdir /home/virtual/laowang
[root@localhost conf.d]# mkdir /home/virtual/laosong
[root@localhost conf.d]# chown virtual:virtual /home/virtual/*
[root@localhost conf.d]# ls -ld /home/virtual/*							#修改所有虚拟用户权限,所有者所属组为virtual
drwxr-xr-x 2 virtual virtual 6 10月 25 18:54 /home/virtual/laosong
drwxr-xr-x 2 virtual virtual 6 10月 25 18:54 /home/virtual/laowang
drwxr-xr-x 2 virtual virtual 6 10月 25 18:54 /home/virtual/lisi
drwxr-xr-x 2 virtual virtual 6 10月 25 18:54 /home/virtual/zhangsan
[root@localhost conf.d]# chmod o+r /home/virtual/						#修改virtual家目录权限,其他人由r、x权限
[root@localhost conf.d]# chmod o+x /home/virtual/
[root@localhost conf.d]# ls -ld /home/virtual/
drwx---r-x 6 virtual virtual 120 10月 25 18:54 /home/virtual/
[root@localhost conf.d]# systemctl restart vsftpd						#重启服务

测试:分别使用不同虚拟用户登录,检查各自权限(上传、下载、创建目录、删除、改名、覆盖)

image-20221025191249640

7.4)openssl+vsftpd加密验证方式

拓展:tcpdump抓包(软件名:tcpdump)

命令:
		tcpdump	-i	ens33	-nn	-X	-vv	tcp	port	21	and	ip	host	来源ip
			-i				#监听的网卡
			-n				#数字显示
			-nn				#端口显示数字、否则显示端口服务名
			-X				#输出包头部数据,以16进制和ASCII两种方式同时输出
			-vv				#显示详细,v越多越详细

7.4.1)实现加密前提

检查openssl						rpm		-qa	|	openssl
判断vsftpd支持poenssl				ldd	/usr/sbin/vsftpd		|grep		libssl

7.4.2)实验 生成加密

/etc/vsftpd/ 中创建ssl 目录,存放证书

/etc/vsftpd/	中创建ssl	目录,存放证书

1.建立私钥,生成rsa密钥
$ openssl		genrsa		-out		vsftpd.key		1024

2.根据密钥创建证书(只有申请者信息)
$ openssl	req		-new		-key		vsftpd.key		-out		vsftpd.csr

3.使用CA服务器签发证书,设置证书有效期等信息
$ openssl	x509	-req	-days	365	-sha256	-in	vsftpd.csr	-singkey	vsftpd.key	-out	vsftpd.crt

4.修改/etc/vsftpd/vsftpd.conf(添加)
ssl_enable=YES												#启用ssl认证
ssl_tlsv1=YES												#支持的版本
ssl_sslv2=YES
ssl_sslv3=YES
allow_anon_ssl=YES											#允许匿名用户和虚拟用户加密
force_anon_logins_ssl=YES									#登录时强制加密
force_anon_data_ssl=YES										#数据传输时强制加密
rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt					#证书位置
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key				#密钥位置

5.重启服务
用filezilla测试(只能filezilla第三方工具能接受证书)
[root@localhost vsftpd]# ls
conf.d  ftpusers  user_list  users  vsftpd.conf  vsftpd_conf_migrate.sh
[root@localhost vsftpd]# mkdir /etc/vsftpd/ssl										#创建目录放证书文件
[root@localhost vsftpd]# ls
conf.d  ftpusers  ssl  user_list  users  vsftpd.conf  vsftpd_conf_migrate.sh
[root@localhost vsftpd]# cd ssl
[root@localhost ssl]# openssl genrsa -out vsftpd.key 1024							#建立私钥、生成rsa密钥
Generating RSA private key, 1024 bit long modulus
...............++++++
....++++++
e is 65537 (0x10001)
[root@localhost ssl]# ls
vsftpd.key
[root@localhost ssl]# openssl req -new -key vsftpd.key -out vsftpd.csr				#根据密钥创建证书(只有申请者信息)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN				#国家
State or Province Name (full name) []:BJ			#省份
Locality Name (eg, city) [Default City]:BJ			#城市
Organization Name (eg, company) [Default Company Ltd]:XXHF		#公司
Organizational Unit Name (eg, section) []:XXHF					#单位
Common Name (eg, your name or your server's hostname) []:ftp.yq.com		#名称
Email Address []:ftp.yq.com												#邮箱

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:							#不设置密码
An optional company name []:

#签发证书、设置证书有效期等信息
[root@localhost ssl]# openssl x509 -req -days 365 -sha256 -in vsftpd.csr -signkey vsftpd.key -out vsftpd.crt	
Signature ok
subject=/C=CN/ST=BJ/L=BJ/O=XXHF/OU=XXHF/CN=ftp.yq.com/emailAddress=ftp.yq.com
Getting Private key
[root@localhost ssl]# vim /etc/vsftpd/vsftpd.conf 						#修改vsftpd.conf配置文件,添加ssl模块
[root@localhost ssl]# tail -n 10 /etc/vsftpd/vsftpd.conf			
#以下是ssl加密相关
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
allow_anon_ssl=YES
force_anon_logins_ssl=YES
force_anon_data_ssl=YES
rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key
[root@localhost ssl]# systemctl restart vsftpd					#重启服务

测试:通过tcpdump抓包,分别对ssl加密前、加密后进行抓包,通过过滤方式查看

#未开启ssl加密、开启ssl加密分别执行下面命令,并将输出结果分别保存到	x.txt	y.txt
[root@localhost ~]# tcpdump -i ens33 -nn -X -vv tcp port 21 and ip host 192.168.18.3
#验证
[root@localhost ~]# grep -i "use" x.txt								#未开启ssl加密,用户登录时,能抓取到明文账号密码
	530 Please login with USER and PASS.
	530 Please login with USER and PASS.
	USER laosong
	0x0020:  5018 1009 634a 0000 5553 4552 206c 616f  P...cJ..USER.lao
[root@localhost ~]# grep -i "pass" x.txt
	530 Please login with USER and PASS.
	0x0040:  4552 2061 6e64 2050 4153 532e 0d0a       ER.and.PASS...
	530 Please login with USER and PASS.
	0x0040:  4552 2061 6e64 2050 4153 532e 0d0a       ER.and.PASS...
	331 Please specify the password.
	PASS 123
	0x0020:  5018 1009 6b7d 0000 5041 5353 2031 3233  P...k}..PASS.123
	227 Entering Passive Mode (192,168,18,201,55,82).
	0x0030:  7269 6e67 2050 6173 7369 7665 204d 6f64  ring.Passive.Mod
[root@localhost ~]# grep -i "pass" y.txt									#开启ssl加密后,无法抓取到明文账号密码
[root@localhost ~]# grep -i "use" y.txt