虚拟用户需要人为创建用户和密码,来代替匿名用户和本地账户。
映射用户(真实)只是为了给虚拟用户一个登录目录。
1)服务器建立虚拟用户密码文件:
[root@vsftpd-server ~]# vim /etc/vsftpd/vsftpd.user
a1 # 奇数行为用户
123456 # 偶数行为密码
a2
123456
a3
123456
2)用户密码文件转化为数据库:
[root@vsftpd-server ~]# db_load -T -t hash -f /etc/vsftpd/vsftpd.user /etc/vsftpd/vsftpd.db
[root@vsftpd-server ~]# ll /etc/vsftpd/
total 40
-rw-r--r-- 1 root root 4 Aug 21 11:56 chroot_list
-rw------- 1 root root 131 Aug 21 14:29 ftpusers
-rw------- 1 root root 361 Jun 23 2016 user_list
-rw------- 1 root root 5150 Aug 21 14:35 vsftpd.conf
-rwxr--r-- 1 root root 338 Jun 23 2016 vsftpd_conf_migrate.sh
-rw-r--r-- 1 root root 12288 Aug 21 14:58 vsftpd.db # 登录之后用来验证的数据库文件,加密之后会大很多
-rw-r--r-- 1 root root 30 Aug 21 14:55 vsftpd.user
3)修改数据库权限,vsftp的要求:
[root@vsftpd-server ~]# cd /etc/vsftpd/
[root@vsftpd-server vsftpd]# chmod 600 vsftpd.db # 更改权限成功
[root@vsftpd-server vsftpd]# ll vsftpd.db
-rw------- 1 root root 12288 Aug 21 14:58 vsftpd.db #
4)创建映射用户,并指定他的用户目录:
[root@vsftpd-server vsftpd]# useradd -d /var/ftproot -s /sbin/nologin virtual
# 用户目录是/var/ftproot,之后的所有虚拟用户的登录目录就是这个目录。
5)建立支持虚拟用户的PAM(登录)认证文件,添加虚拟用户支持:
[root@vsftpd-server vsftpd]# cd /etc/pam.d/
[root@vsftpd-server pam.d]# ls
atd gdm-launch-environment pluto smartcard-auth su-l
chfn gdm-password polkit-1 smartcard-auth-ac system-auth
chsh gdm-pin postlogin smtp system-auth-ac
config-util gdm-smartcard postlogin-ac smtp.postfix systemd-user
crond liveinst ppp sshd vlock
cups login remote su vmtoolsd
fingerprint-auth other rhn_register subscription-manager vsftpd # 默认登录文件
fingerprint-auth-ac passwd runuser subscription-manager-gui xserver
gdm-autologin password-auth runuser-l sudo
gdm-fingerprint password-auth-ac setup sudo-i
[root@vsftpd-server pam.d]# vim vsftpd.pam # 新建一个
auth required pam_userdb.so db=/etc/vsftpd/vsftpd # 调用了数据库文件
account required pam_userdb.so db=/etc/vsftpd/vsftpd
6)修改主配置文件中:
[root@vsftpd-server ~]# vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.pam # 修改用户登录文件
guest_enable=YES # 允许虚拟用户登录
guest_username=virtual # 映射用户
user_config_dir=/etc/vsftpd/dir # 虚拟用户的配置文件目录
7)建立虚拟用户的配置目录:
[root@vsftpd-server ~]# cd /etc/vsftpd
[root@vsftpd-server vsftpd]# mkdir dir
[root@vsftpd-server vsftpd]# ls
chroot_list dir ftpusers user_list vsftpd.conf vsftpd_conf_migrate.sh vsftpd.db vsftpd.user
8)取消匿名用户的相关设置(虚拟用户与匿名用户使用相同的参数,所以如果要设定虚拟用户,取消主配置文件中关于匿名用户的配置,子虚拟用户配置文件才有作用)
9)设置虚拟用户a1配置文件:
[root@vsftpd-server ~]# cd /etc/vsftpd/dir/
[root@vsftpd-server dir]# vim a1 # 配置文件名就是用户名
anon_upload_enable=YES # 能上传文件
:wq
10)设置虚拟用户a2配置文件:
[root@vsftpd-server ~]# cd /etc/vsftpd/dir/
[root@vsftpd-server dir]# vim a2
anon_mkdir_write_enable=YES # 能建立目录
11)设置虚拟用户a3配置文件:
[root@vsftpd-server dir]# vim a3
anon_upload_enable=YES # 能上传
anon_other_write_enable=YES # 能删除,覆盖,重名
12)给予映射用的家目录o+r权限,让虚拟用户可以查看:
[root@vsftpd-server ~]# ls -ld /var/ftproot/
drwx------ 3 virtual virtual 78 Aug 21 15:40 /var/ftproot/
[root@vsftpd-server ~]# chmod o+r /var/ftproot/
[root@vsftpd-server ~]# ls -ld /var/ftproot/
drwx---r-- 3 virtual virtual 78 Aug 21 15:40 /var/ftproot/
13)服务端重启vsftpd服务:
[root@vsftpd-server ftp]# systemctl restart vsftpd
14)使用a1用户测试,上传文件:
[root@client ~]# ftp 172.25.5.10
Connected to 172.25.5.10 (172.25.5.10).
220 (vsFTPd 3.0.2)
Name (172.25.5.10:root): a1
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 (172,25,5,10,134,149).
150 Here comes the directory listing.
226 Directory send OK.
ftp> put initial-setup-ks.cfg
local: initial-setup-ks.cfg remote: initial-setup-ks.cfg
227 Entering Passive Mode (172,25,5,10,129,28).
150 Ok to send data.
226 Transfer complete.
2143 bytes sent in 0.000719 secs (2980.53 Kbytes/sec) # 上传文件成功
15)使用a2用户测试,允许建立目录:
[root@client ~]# ftp 172.25.5.10
Connected to 172.25.5.10 (172.25.5.10).
220 (vsFTPd 3.0.2)
Name (172.25.5.10:root): a2
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 (172,25,5,10,121,121).
150 Here comes the directory listing.
-rw-r--r-- 1 1004 1004 2143 Aug 21 08:09 initial-setup-ks.cfg
226 Directory send OK.
ftp> mkdir a2dir # 建立目录
257 "/a2dir" created
ftp> ls
227 Entering Passive Mode (172,25,5,10,135,230).
150 Here comes the directory listing.
drwxr-xr-x 2 1004 1004 6 Aug 21 08:10 a2dir # 建立目录成功
-rw-r--r-- 1 1004 1004 2143 Aug 21 08:09 initial-setup-ks.cfg
226 Directory send OK.
16)使用a3用户测试,重命名文件:
[root@client ~]# ftp 172.25.5.10
Connected to 172.25.5.10 (172.25.5.10).
220 (vsFTPd 3.0.2)
Name (172.25.5.10:root): a3
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 (172,25,5,10,135,245).
150 Here comes the directory listing.
drwxr-xr-x 2 1004 1004 6 Aug 21 08:10 a2dir
-rw-r--r-- 1 1004 1004 2143 Aug 21 08:09 initial-setup-ks.cfg
226 Directory send OK.
ftp> rename initial-setup-ks.cfg isa3 # 重命名文件成功
350 Ready for RNTO.
250 Rename successful.
ftp> ls
227 Entering Passive Mode (172,25,5,10,122,110).
150 Here comes the directory listing.
drwxr-xr-x 2 1004 1004 6 Aug 21 08:10 a2dir
-rw-r--r-- 1 1004 1004 2143 Aug 21 08:09 isa3
226 Directory send OK.
总结:
ftp的传输协议还是使用明文传输的,不论使用哪一种传输方式,所有的数据依然是使用明文的方式进行传输的。
这就造成了安全隐患,将数据包截获,例如账户密码,其他的人登录到服务器上。
使用tcpdump工具进行指定端口抓包,抓取ftp登录过程中的数据包:
tcpdump
-i :指定监听哪一个网卡的数据包
-n :指定捕获到的信息以什么样形式来显示,对地址以数字的方式显示,否则以主机名的方式显示。
-nn : 除了地址以外,将端口也以数字方式显示
-X :输出包的头部信息,以16进制和ASCII的形式显示
-vv :产生更详细的信息,对抓取数据包显示多少内容
port:监听哪一个端口
ip host:监听哪一个ip地址(客户端地址)
and:逻辑与
1)让服务器开始监听(监听到了用户名和密码,是明文的):
[root@vsftpd-server ~]# tcpdump -i ens3 -nn -X -vv port 21 and ip host 172.25.5.1
tcpdump: listening on ens3, link-type EN10MB (Ethernet), capture size 65535 bytes
…………………………
172.25.5.1.45398 > 172.25.5.10.21: Flags [P.], cksum 0xbd2a (correct), seq 1:10, ack 21, win 229, options [nop,nop,TS val 7774307 ecr 7771254], length 9
0x0000: 4510 003d 29cc 4000 4006 aea1 ac19 0501 E..=).@.@.......
0x0010: ac19 050a b156 0015 0a55 a2e6 1cee aeef .....V...U......
0x0020: 8018 00e5 bd2a 0000 0101 080a 0076 a063 .....*.......v.c
0x0030: 0076 9476 5553 4552 2061 310d 0a .v.vUSER.a1.. # 用户名
16:41:42.613217 IP (tos 0x0, ttl 64, id 15024, offset 0, flags [DF], proto TCP (6), length 52)
…………………………
16:41:45.044840 IP (tos 0x10, ttl 64, id 10702, offset 0, flags [DF], proto TCP (6), length 65)
172.25.5.1.45398 > 172.25.5.10.21: Flags [P.], cksum 0x2a1e (correct), seq 10:23, ack 55, win 229, options [nop,nop,TS val 7776739 ecr 7776684], length 13
0x0000: 4510 0041 29ce 4000 4006 ae9b ac19 0501 E..A).@.@.......
0x0010: ac19 050a b156 0015 0a55 a2ef 1cee af11 .....V...U......
0x0020: 8018 00e5 2a1e 0000 0101 080a 0076 a9e3 ....*........v..
0x0030: 0076 a9ac 5041 5353 2031 3233 3435 360d .v..PASS.123456. # 用户密码
0x0040: 0a .
16:41:45.048435 IP (tos 0x0, ttl 64, id 15026, offset 0, flags [DF], proto TCP (6), length 75)
2)客户端的登录操作:
[root@client ~]# ftp 172.25.5.10
Connected to 172.25.5.10 (172.25.5.10).
220 (vsFTPd 3.0.2)
Name (172.25.5.10:root): a1 # 使用a1用户
331 Please specify the password.
Password: # 密码
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
这就默认以明文的方式传输的协议,不安全。
专门找一个服务器做证书服务器,他可以产生密钥文件、证书文件、签字后的证书文件。
这个服务器生成的内容,他会验证权威性,表示证书没有问题。
1)查看服务器端是否安装openssl(已安装):
[root@vsftpd-server ~]# rpm -qa | grep openssl
openssl-1.0.1e-60.el7.x86_64 # 已经安装
openssl-libs-1.0.1e-60.el7.x86_64
2)查看vsftp是否支持openssl(支持):
[root@vsftpd-server ~]# ldd /usr/sbin/vsftpd | grep libssl
libssl.so.10 => /lib64/libssl.so.10 (0x00007ffa85d38000) #
3)生成密钥和证书文件的默认位置:
[root@vsftpd-server ~]# cd /etc/ssl/certs/
[root@vsftpd-server certs]# ls
ca-bundle.crt ca-bundle.trust.crt make-dummy-cert Makefile renew-dummy-cert
4)生成密钥文件(rsa加密方式,2048加密长度的密钥文件vsftpd.key):
[root@vsftpd-server certs]# openssl genrsa -out vsftpd.key 2048
Generating RSA private key, 2048 bit long modulus
.....+++
..........+++
e is 65537 (0x10001)
5)通过密钥文件生成证书文件:
[root@vsftpd-server certs]# 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) []:XA
Locality Name (eg, city) [Default City]:XA
Organization Name (eg, company) [Default Company Ltd]:song
Organizational Unit Name (eg, section) []:jiami
Common Name (eg, your name or your server's hostname) []:daisy.song # 域名或名称
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: # 不要加密,如果加密,就会每次申请都要输入密码
An optional company name []:
6)通过证书文件颁发签字后的证书(x509颁发证书,有效期365天,加密方式sha,256长度,使用证书vsftpd.csr,使用密钥vsftpd.key,生成签字证书vsftpd.crt):
[root@vsftpd-server certs]# openssl x509 -req -days 365 -sha256 -in vsftpd.csr -signkey vsftpd.key -out vsftpd.crt
Signature ok
subject=/C=CN/ST=XA/L=XA/O=song/OU=jiami/CN=daisy.song
Getting Private key
[root@vsftpd-server certs]# ls -l vsftpd.*
-rw-r--r-- 1 root root 1168 Aug 21 17:34 vsftpd.crt
-rw-r--r-- 1 root root 989 Aug 21 17:30 vsftpd.csr
-rw-r--r-- 1 root root 1675 Aug 21 17:25 vsftpd.key
7)修改证书目录权限为500(只能查看,不能建文件删除文件)
[root@vsftpd-server certs]# chmod 500 .
[root@vsftpd-server certs]# ll /etc/ssl/certs
lrwxrwxrwx. 1 root root 16 May 14 10:25 /etc/ssl/certs -> ../pki/tls/certs
[root@vsftpd-server certs]# ll -d /etc/pki/tls/certs
dr-x------. 2 root root 171 Aug 21 17:34 /etc/pki/tls/certs
8)修改vsftp服务器主配置文件:
ssl_enable=YES | 启用ssl认证 |
---|---|
ssl_tlsv1=YES、ssl_sslv2=YES、ssl_sslv2=YES | 三个版本的ssl都支持 |
allow_anon_ssl=YES | 允许匿名用户(虚拟用户)使用ssl |
force_anon_logins_ssl=YES | 强制要求匿名用户登录都使用ssl |
force_anon_data_ssl=YES | 强制要求匿名用户传输时都使用ssl |
force_local_logins_ssl=YES | 强制要求本地用户登录都使用ssl |
force_local_data_ssl=YES | 强制要求本地用户传输时都使用ssl |
rsa_cert_file=/etc/ssl/certs/vsftpd.crt | rsa签字后的证书 |
rsa_private_key_file=/etc/ssl/certs/vsftpd.key | rsa格式的密钥文件 |
[root@vsftpd-server ~]# vim /etc/vsftpd/vsftpd.conf
# 写入主配置文件
ssl_enable=YES
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv2=YES
allow_anon_ssl=YES
force_anon_logins_ssl=YES
force_anon_data_ssl=YES
force_local_logins_ssl=YES
force_local_data_ssl=YES
rsa_cert_file=/etc/ssl/certs/vsftpd.crt
rsa_private_key_file=/etc/ssl/certs/vsftpd.key
9)服务端重启vsftpd服务:
[root@vsftpd-server ftp]# systemctl restart vsftpd
这样再访问ftp时,就会直接得到签字证书,要求加密传输。