linux网络服务[VSFTP安全文件传输协议]——————虚拟用户验证实验、抓取ftp明文数据包、openssl+vsftpd 加密验证原理、以及加密验证过程

文章目录

  • 1.虚拟用户验证实验
  • 2.openssl+vsftpd 加密验证方式
    • 2.1 抓取没有加密的数据包
    • 2.2 openssl+vsftpd加密验证原理
    • 2.3 加密验证过程

1.虚拟用户验证实验

虚拟用户需要人为创建用户和密码,来代替匿名用户和本地账户。

映射用户(真实)只是为了给虚拟用户一个登录目录。

linux网络服务[VSFTP安全文件传输协议]——————虚拟用户验证实验、抓取ftp明文数据包、openssl+vsftpd 加密验证原理、以及加密验证过程_第1张图片

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.

总结:

  • 虚拟用户验证,需要先建立虚拟用户文件。
  • 然后加密称为用户数据库,给予600权限。
  • 建立新的登录验证.pam文件。
  • 将新的登录验证.pam文件在主配置文件中声明,并且允许与你用户登录,写入映射用户,以及虚拟用户配置文件所在目录。
  • 创建虚拟用户配置文件目录,在其下以虚拟用户名建立关联配置文件。
  • 首先取消主配置文件中匿名用户的相关配置,才能使虚拟用户配置文件中的配置生效。
  • 最后记得将映射用的家目录添加,其他人可读选项,以供虚拟用户使用。

2.openssl+vsftpd 加密验证方式

ftp的传输协议还是使用明文传输的,不论使用哪一种传输方式,所有的数据依然是使用明文的方式进行传输的。

这就造成了安全隐患,将数据包截获,例如账户密码,其他的人登录到服务器上。

2.1 抓取没有加密的数据包

使用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> 

这就默认以明文的方式传输的协议,不安全。

2.2 openssl+vsftpd加密验证原理

专门找一个服务器做证书服务器,他可以产生密钥文件、证书文件、签字后的证书文件。

  • 密钥文件:私钥文件(可以解开大的,所以可以接客设计后的小的。)
  • 证书文件:公钥文件(大的)
  • 签字后的证书:先有证书----->签字后的证书(加密工具)。(通过大的进行设计生成小的。)

这个服务器生成的内容,他会验证权威性,表示证书没有问题。

linux网络服务[VSFTP安全文件传输协议]——————虚拟用户验证实验、抓取ftp明文数据包、openssl+vsftpd 加密验证原理、以及加密验证过程_第2张图片
http与https加密与这个是一模一样的。

2.3 加密验证过程

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时,就会直接得到签字证书,要求加密传输。

你可能感兴趣的:(网络,linux,运维,ftp,vsftpd,centos)