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命令后得到的随机端口,告诉服务端,进行数据传输

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

注意:
被动模式中,开放的随机端口是: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 | 删除、改名、覆盖等权限 |
| 默认umask | anon_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 #重启服务
客户端登录成功

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登录失败

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 #重启服务
测试:分别使用不同虚拟用户登录,检查各自权限(上传、下载、创建目录、删除、改名、覆盖)

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