网络服务之vsftp

1、vsftp概述

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

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

安全特性

  • vsftp 程序的运行者一般是普通用户,降低了相对应进程的权限,提高了安全性
  • 任何需要执行较高权限的指令都需要上层程序许可
  • ftp 所需要使用的绝大多数命令都被整合到了 vsftp 中,基本不需要系统额外提供命令
  • 拥有 chroot 功能,可以改变用户的根目录,限制用户只能在自己的家目录

vsftp连接类型

  • 控制连接(持续连接) → TCP 21(命令信道) → 用户收发FTP命令
  • 数据连接(按需连接) → TCP 20(数据信道) → 用于上传下载数据

vsftp工作模式

  • 主动模式(port):
    • FTP 客户端首先和服务器的 TCP 21 端口建立连接;用来发送命令,
    • 客户端需要接收数据的时候在这个通道上发送 PORT 命令。PORT 命令包含了客户端用什么端口接收数据。
    • 在传送数据的时候,服务器端通过自己的 TCP 20 端口连接至客户端的指定端口发送数据。
    • FTP server 必须和客户端建立一个新的连接用来传送数据。
  • 被动模式(passive):
    • FTP 客户端首先和服务器的 TCP 21 端口建立连接,用来建立控制通道发送命令,
    • 但建立连接后客户端发送 Pasv 命令。
    • 服务器收到 Pasv 命令后,打开一个临时端口(端口大于 1023小于 65535)并且通知客户端在这个端口上传送数据的请求;
    • 客户端连接 FTP 服务器的临时端口,然后 FTP 服务器将通过这个端口传输数据。.
    • 注意:由于VSFTP的被动模式是随机端口进行数据传输,所以在设置防火墙时需要刻意放行–>这里一定要放心vsftp的服务。

VSFTP 传输模式

  • Binary模式:不对数据进行任何处理,适合进行可执行文件、压缩文件、图片等
  • ASCII模式:进行文本传输时,自动适应目标操作系统的结束符,如回车符等
  • Linux的红帽发行版中VSFTP默认采用的是Binary模式,这样能保证绝大多数文件传输后能正常使用
  • 切换方式:在ftp>提示符下输入ascii即转换到ACSII方式,输入bin,即转换到Binary方式。

VSFTP 软件信息

  • 服务端软件名:vsftpd
  • 客户端软件名:ftp
  • 服务名:vsftpd
  • 端口号:20、21、指定范围内随机端口
  • 配置文件:/etc/vsftpd/vsftpd.conf

登录验证方式

  • 匿名用户验证:
    • 用户账号名称:ftp或anonymous
    • 用户账号密码:无密码
    • 工作目录:/var/ftp
    • 默认权限:默认可下载不可上传,上传权限由两部分组成(主配置文件和文件系统)
  • 本地用户验证:
    • 用户账号名称:本地用户(/etc/passwd)
    • 用户账号密码:用户密码(/etc/shadow)
    • 工作目录:登录用户的宿主目录
    • 权限:最大权限(drwx------)

虚拟(virtual)用户验证:

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

三种登陆模式

客户端----->匿名用户登录---->匿名账号:ftp或者是anonymous 密码是空密码
							默认的家目录:/var/ftp/目录下

客户端----->本地用户登录---->本地登录涉及到:普通用户和普通用户的家目录
							/etc/passwd
							/etc/shadow文件

客户端----->虚拟用户登录---->这个是最复杂的;
						需要人为创建,生成数据库文件;
						找一个系统用户作为虚拟用户的映射用户,借助系统用户的家目录作为默认的登陆点,/home下的其中一个用户名
						每一个虚拟用户的权限都可以单独指定的

2、匿名用户验证实验

匿名用户的权限控制

anonymous_enable=YES 		#启用匿名访问
anon_umask=022 				#匿名用户所上传文件的权限掩码
anon_root=/var/ftp 			#匿名用户的 FTP 根目录
anon_upload_enable=YES 		#允许上传文件
anon_mkdir_write_enable=YES #允许创建目录
anon_other_write_enable=YES #开放其他写入权(删除、覆盖、重命名)
anon_max_rate=0 			#限制最大传输速率(0 为不限速,单位:bytes/秒)

实验要求

注意:在客户端登录后,默认情况下是可以下载的,但不能上传

实现可以上传:

  • anon_upload_enable=YES
  • 在/var/ftp/下创建上传目录
  • 修改上传目录的权限或所有者,让匿名用户有写入权限

实现创建目录和文件其他操作

  • anon_mkdir_write_enable=YES #允许创建目录
  • anon_other_write_enable=YES #删除文件、文件改名、文件覆盖

用户进入某个文件夹时,弹出相应的说明

  • 在对应目录下创建 .message 文件,并写入相应内容
  • 确认dirmessage_enable=YES是否启用
  • 尝试却换目录查看效果(同一次登录仅提示一次)

实现上传的文件可下载

  • 默认情况下开放上传权限后,上传的文件是无法被下载的,因为文件的其他人位置没有r权限;
  • 设置anon_umask=022,可以让上传的文件其他人位置拥有r权限,然后才能被其他人下载

整个实验的过程:

#首先,所有的实验都必须要关闭selinux和firewalld
[root@node0 ~]# systemctl stop firewalld
[root@node0 ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@node0 ~]# setenforce 0


#首先安装以下vsftpd服务-->lftp和ftp都是用于连接vsftpd的
[root@node0 ~]# yum -y install vsftpd ftp lftp

#设置开机自启动
[root@node0 ~]# systemctl start vsftpd
[root@node0 ~]# systemctl enable vsftpd 

#尝试匿名用户登录--->用到另外一台服务器来登陆验证
[root@Node1 ~]# ftp 192.168.75.130
Connected to 192.168.75.130 (192.168.75.130).
220 (vsFTPd 3.0.2)
Name (192.168.75.130:root): ftp			#用户名: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,75,130,224,69).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0               6 Oct 30  2018 pub
226 Directory send OK.

#这里匿名用户默认的家目录就是/var/ftp/目录下
ftp> pwd
257 "/"

#回到服务器创建一下文件验证家目录的位置
[root@node0 ftp]# mkdir upload
[root@node0 ftp]# ls
pub  upload

#客户端查看也能看到upload目录
ftp> ls
227 Entering Passive Mode (192,168,75,130,195,24).
150 Here comes the directory listing.
drwxr-xr-x    2 0        0               6 Oct 30  2018 pub
drwxr-xr-x    2 0        0               6 Nov 08 10:34 upload
226 Directory send OK.

#用客户端直接尝试下载看看是否成功--->这里明显发现出现了550的报错信息
ftp> get upload
local: upload remote: upload
227 Entering Passive Mode (192,168,75,130,59,121).
550 Failed to open file.

#再次使用客户端上传文件看看--->发现也是失败的;
local: /root/client.txt remote: /root/client.txt
/root/client.txt: not a plain file.
ftp> 


#如果需要实现-->服务器端则要配置相对应的配置文件
[root@node0 ftp]# vim /etc/vsftpd/vsftpd.conf 
	#这几行都是新增添加的
anon_upload_enable=YES				#允许匿名用户上传
anon_mkdir_write_enable=YES			#允许匿名用户创建
anon_other_write_enable=YES			#允许匿名用户删除、修改、覆盖文件

#这里重启一下服务
[root@node0 ftp]# systemctl restart vsftpd


#匿名用户的上传、修改、删除除了受到vsftpd的制约,还得收到文件本身的权限制约
	#因此匿名用户如果想要上传下载的时候,建议是单独给到一个目录;不要把默认的/var/ftp目录权限放的很大
[root@node0 ftp]# ls -ld . upload/
drwxr-xr-x 4 root root 31 118 18:34 .
drwxr-xr-x 2 root root  6 118 18:34 upload/
[root@node0 ftp]# ls -ld . upload/
drwxr-xr-x 4 root root 31 118 18:34 .
drwxrwxrwx 2 root root  6 118 18:34 upload/

#用客户端再次验证;
[root@Node1 ~]# ftp 192.168.75.130
	#进入到目录
ftp> cd upload
250 Directory successfully changed.
ftp> get haha.txt ---->#这里可以成功下载
local: haha.txt remote: haha.txt
227 Entering Passive Mode (192,168,75,130,139,67).
150 Opening BINARY mode data connection for haha.txt (0 bytes).
226 Transfer complete.

#尝试一下改名
ftp> rename haha.txt hh.txt
350 Ready for RNTO.
250 Rename successful.
ftp> ls
227 Entering Passive Mode (192,168,75,130,141,1).
150 Here comes the directory listing.
-rw-r--r--    1 0        0               0 Nov 08 10:51 hh.txt
226 Directory send OK.

#如果想要进入到一个文件夹的时候,有提示信息
	1)在默认的目录下创建.message文件,编写内容
	2)vsftpd配置文件需要打开此功能dirmessage_enable=YES
	3)同一次的登陆只会显示一次的效果
#服务器配置
	#首先编写一下欢迎信息
[root@node0 upload]# vim  /var/ftp/upload/.message
LiangJiaWei is a goodboy
	#修改一下配置文件
[root@node0 upload]# vim /etc/vsftpd/vsftpd.conf 
............
dirmessage_enable=YES

#最后客户验证
[root@Node1 ~]# ftp 192.168.75.130
Connected to 192.168.75.130 (192.168.75.130).
220 (vsFTPd 3.0.2)
Name (192.168.75.130: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-LiangJiaWei is a goodboy
250 Directory successfully changed.

3、本地用户验证实验

本地用户权限控制:

local_enable=YES 			#是否启用本地系统用户
local_umask=022 			#本地用户所上传文件的权限掩码
local_root=/var/ftp 		#设置本地用户的 FTP 根目录
chroot_local_user=YES 		#是否将用户禁锢在主目录
local_max_rate=0 			#限制最大传输速率
ftpd_banner=Welcome to blah FTP service #用户登录时显示的欢迎信息
userlist_enable=YES & userlist_deny=YES
		#禁止/etc/vsftpd/user_list 文件中出现的用户名登录 FTP
userlist_enable=YES & userlist_deny=NO
		#仅允许/etc/vsftpd/user_list 文件中出现的用户名登录 FTP
配置文件:ftpusers 
		#禁止/etc/vsftpd/ftpusers 文件中出现的用户名登录 FTP,权限比 user_list 更高,即时生效

实验需求与流程:

  • 服务端需要创建用户并设置密码(所创建的用户,不需要登录操作系统,仅用来登录VSFTP)
    • useradd -s /sbin/nologin username
  • 将所有用户禁锢在自己的家目录下
    • 注:默认没有禁锢用户时,客户端登录后可以随意切换目录,查看文件所在位置和文件名
    • chroot_local_user=YES #开启用户家目录限制,限制所有用户不能随便切换目录
  • 将部分用户禁锢在自己的家目录下
    • chroot_list_enable=YES #开启白名单功能,允许白名单中的用户随意切换目录
    • chroot_list_file=/etc/vsftpd/chroot_list #白名单文件所在位置(需自己创建)
  • 配置文件:/etc/vsftpd/ftpusers
    • 所有写入此文件内的用户名都不允许登录ftp,立刻生效。
  • 修改被动模式数据传输使用端口
    • pasv_enable=YES
    • pasv_min_port=30000
    • pasv_max_port=35000

实验过程:

#创建一个用于vsftpd的本地账户
[root@node0 ~]# useradd -s /sbin/nologin zhangsan
[root@node0 ~]# echo 1 | passwd --stdin zhangsan
更改用户 zhangsan 的密码 。
passwd:所有的身份验证令牌已经成功更新。

#这样子尝试登陆-->本地用户登录--->这里发现直接被拒绝登陆
[root@Node1 ~]# ftp 192.168.75.130
Connected to 192.168.75.130 (192.168.75.130).
220 (vsFTPd 3.0.2)
Name (192.168.75.130:root): zhangsan
331 Please specify the password.
Password:
530 Login incorrect.
Login failed.

#排错:--->具体的原因不明白;但是这么做能够实现本地用户登录
#然后修改一下/etc/pam.d/vsftpd这个文件的选项
[root@node0 ~]# vim /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

#普通用户登录后-->发现权限过大,可以随意切换目录
ftp> cd /etc/
250 Directory successfully changed.
ftp> ls

#这里就有一些限制的措施
	1)把用户紧固在自己的家目录下;chroot_local_user=YES
	2)可以分权,限制部分用户限制在自己的家目录;chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list	#这个文件需要自己创建;
	3)/etc/vsftpd/ftpusers这个文件下的用户都不能登录的
	4)修改一下被动模式传输使用的端口
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=35000

#修改一下配置文件
[root@node0 ~]# vim /etc/vsftpd/vsftpd.conf
.............
local_enable=YES
chroot_loacal_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list
allow_writeable_chroot=YES
.................
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=35000

#这里要创建一个chroot_list的文件并且写入内容-->不然会报错,导致无法启动
[root@node0 ~]# touch /etc/vsftpd/chroot_list
[root@node0 ~]# chown ftp. /etc/vsftpd/chroot_list 
[root@node0 ~]# vim /etc/vsftpd/chroot_list 
zhangsan

#重启服务查看
[root@node0 ~]# systemctl restart vsftpd

#为了区别功能,我们再次创建一个lisi的账户
[root@node0 ~]# useradd lisi
[root@node0 ~]# echo 1 | passwd --stdin lisi
更改用户 lisi 的密码 。
passwd:所有的身份验证令牌已经成功更新。

#使用客户端--->查看
	#登陆李四用户-->发现无法查看除了自己家目录的信息
[root@Node1 ~]# ftp 192.168.75.130
Connected to 192.168.75.130 (192.168.75.130).
220 (vsFTPd 3.0.2)
Name (192.168.75.130:root): lisi
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,75,130,118,181).
150 Here comes the directory listing.
226 Directory send OK.
ftp> cd /etc/
550 Failed to change directory.

	#登陆张三查看--------->这里已经证明了张三是随意切换的
[root@Node1 ~]# ftp 192.168.75.130
Connected to 192.168.75.130 (192.168.75.130).
220 (vsFTPd 3.0.2)
Name (192.168.75.130:root): zhangsan
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd /etc/
250 Directory successfully changed.
ftp> ls
227 Entering Passive Mode (192,168,75,130,128,85).
150 Here comes the directory listing.
-rw-r--r--    1 0        0            5090 Oct 30  2018 DIR_COLORS
-rw-r--r--    1 0        0            5725 Oct 30  2018 DIR_COLORS.256co

#查看一下端口-->
[root@node0 ~]# netstat -antlup 
........
tcp6       0      0 192.168.75.130:21       192.168.75.131:35990    ESTABLISHED 7519/vsftpd 

4、虚拟用户实验

虚拟用户的对比图:

FTP_client--->FTP_server
				/etc/pam.d/vsftpd
								匿名用户:/etc/passwd
								本地用户:/etc/passwd和/etc/shadow
                /etc/pam.d/vsftpd.pam
                				虚拟的用户
                				执行创建
                				用户、密码文件
  • 建立 FTP 的虚拟用户的用户数据库文件(在/etc/vsftpd)
    • vim vsftpd.user(注:该文件名可以随便定义,文件内容格式:奇数行用户,偶数行密码)
    • db_load -T -t hash -f vsftpd.user vsftpd.db #将用户密码的存放文本转化为数据库类型,并使用 hash 加密
    • chmod 600 vsftpd.db #修改文件权限为 600,保证其安全性
  • 创建 FTP 虚拟用户的映射用户,并制定其用户家目录
    • useradd -d /var/ftproot -s /sbin/nologin virtual #创建 virtual 用户作为 ftp 的虚拟用户的映射用户
  • 建立支持虚拟用户的 PAM 认证文件,添加虚拟用户支持
	#使用模板生成自己的认证配置文件,方便一会调用
cp –a /etc/pam.d/vsftpd /etc/pam.d/vsftpd.pam

	#编辑新生成的文件 vsftpd.pam (清空原来内容,添加下列两行) 
auth required pam_userdb.so db=/etc/vsftpd/vsftpd
account required pam_userdb.so db=/etc/vsftpd/vsftpd

#在 vsftpd.conf 文件中添加支持配置 修改:
pam_service_name=vsftpd.pam
	#添加:
guest_enable=YES
guest_username=virtual
user_config_dir=/etc/vsftpd/dir
  • 为虚拟用户建立独立的配置文件,启动服务并测试
    • 注:做虚拟用户配置文件设置时,将主配置文件中自定义的匿名用户相关设置注释掉。
	#用户可以上传: 
anon_upload_enable=YES #允许上传文件
	#用户可以创建目录或文件: 
anon_mkdir_write_enable=YES #允许创建目录
	#用户可以修改文件名: 
anon_upload_enable=YES #允许上传文件(为了覆盖开启的)
anon_other_write_enable=YES #允许重名和删除文件、覆盖
	#注:给映射用户的家目录 设置 o+r 让虚拟用户有读权限。

实验过程

#首先,建立虚拟用户的数据库文件
	#这里需要注意:奇数行是名字,偶数行是密码
[root@node0 ~]# vim /etc/vsftpd/vsftpd.user
liangjiawei01
123456
liangjiawei02
123456
liangjiawei03
123456

#然后把用户的数据库文件转化成db文件,并且hash加密
[root@node0 ~]# db_load -T -t hash -f /etc/vsftpd/vsftpd.user  /etc/vsftpd/vsftpd.db

#一定要把这个文件的权限改成600
[root@node0 ~]# chmod 600 /etc/vsftpd/vsftpd.db 

#创建虚拟用户登录的家目录-->这个也是虚拟用户的映射用户
[root@node0 ~]# useradd  -s /sbin/nologin virtual
	#让虚拟用户的家目录有读权限
[root@node0 ~]# chmod o+r /home/virtual/
[root@node0 ~]# 

#建立一份虚拟用户的pam认证文件;
[root@node0 ~]# cp -a /etc/pam.d/vsftpd /etc/pam.d/vsftpd.pam
	#然后修改一下pam认证文件的内容
[root@node0 ~]# vim /etc/pam.d/vsftpd.pam 
#%PAM-1.
auth    required        pam_userdb.so   db=/etc/vsftpd/vsftpd
account required        pam_userdb.so   db=/etc/vsftpd/vsftpd


#去到配置文件conf中添加支持的配置
[root@node0 ~]# vim /etc/vsftpd/vsftpd.conf
pam_service_name=vsftpd.pam		#这一行要修改
guest_enable=YES				#下面这些直接添加新得字段
guest_username=virtual
user_config_dir=/etc/vsftpd/dir
..........

#创建指定的虚拟用户的配置文件
[root@node0 ~]#  mkdir /etc/vsftpd/dir
	#注:做虚拟用户配置文件设置时,将主配置文件中自定义的匿名用户相关设置注释掉。
	#指定01可以上传文件
[root@node0 ~]# vim /etc/vsftpd/dir/liangjiawei0.conf
anon_upload_enable=YES
	#指定02可以创建
[root@node0 ~]# vim /etc/vsftpd/dir/liangjiawei02.conf
anon_mkdir_write_enable=YES
	#指定03可以上传和下载
[root@node0 ~]# vim /etc/vsftpd/dir/liangjiawei03.conf
anon_upload_enable=YES
anon_other_write_enable=YES

#重启验证
[root@node0 ~]# systemctl restart vsftpd
[root@node0 ~]# 

#客户端用虚拟用户登录
[root@Node1 ~]# ftp 192.168.75.130
Connected to 192.168.75.130 (192.168.75.130).
220 (vsFTPd 3.0.2)
Name (192.168.75.130:root): liangjiawei01
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
	#到这里实验就成功了

4、optenssh+vsftpd加密实验

实验的思路:

拓展:使用tcpdump 工具进行指定端口抓包,抓取ftp登录过程中的数据包

#格式:
tcpdump -i eth0 -nn -X -vv tcp port 21 and ip host 来源ip
	#参数解析:
-i 		#interface:指定tcpdump需要监听的接口
-n 		#对地址以数字方式显式,否则显式为主机名
-nn 	#除了-n的作用外,还把端口显示为数值,否则显示端口服务名
-X 		#输出包的头部数据,会以16进制和ASCII两种方式同时输出	
-vv 	#产生更详细的输出

例子说明问题:

#首先安装一下tcpdump工具
[root@node0 ~]# yum -y install tcpdump

#验证一下做包工具-->这里可以明显看出,咋们的密码和用户名都是能够被抓取的
[root@node0 ~]# tcpdump -i ens32 -nn -X -vv tcp port 21 and ip host 192.168.75.31 
tcpdump: listening on ens32, link-type EN10MB (Ethernet), capture size 262144 bytes

	#然后使用客户端登陆
[root@Node1 ~]# ftp 192.168.75.130
Connected to 192.168.75.130 (192.168.75.130).
220 (vsFTPd 3.0.2)
Name (192.168.75.130:root): liangjiawei01
331 Please specify the password.
Password:
  • 查看是否安装了 openssl
    • rpm -q openssl
  • 查看 vsftpd 是否支持 openssl
    • ldd /usr/sbin/vsftpd | grep libssl
  • 生成加密信息的秘钥和证书文件
    • 位置:/etc/ssl/certs/
#建立服务器私钥,生成 RSA 密钥
	openssl genrsa -out vsftpd.key 1024
	
#需要依次输入国家,地区,城市,组织,组织单位,Email 等信息。最重要的是有一个 common name,
	#可以写你的名字或者域名。如果为了 https 申请,这个必须和域名吻合,否则会引发浏览器警报。
	#生成的 csr 文件交给 CA 签名后形成服务端自己的证书
	openssl req -new -key vsftpd.key -out vsftpd.csr

#使用 CA 服务器签发证书,设置证书的有效期等信息
	#注意 1:生成完秘钥和证书文件后,将本目录{/etc/ssl/certs/}的权限修改为 500. 
	#注意 2:在实验环境中可以用命令生成测试,在生产环境中必须要在 https 证书厂商注册(否则浏览器不识别)
	openssl x509 -req -days 365 -sha256 -in vsftpd.csr -signkey vsftpd.key -out vsftpd.crt
  • 修改主配置文件/etc/vsftpd/vsftpd.conf
ssl_enable=YES
#启用 ssl 认证
ssl_tlsv1=YES
ssl_sslv2=YES
ssl_sslv3=YES
#开启 tlsv1、sslv2、sslv3 都支持
allow_anon_ssl=YES
#允许匿名用户{虚拟用户}
force_anon_logins_ssl=YES
force_anon_data_ssl=YES
#匿名登录和传输时强制使用 ssl
force_local_logins_ssl=YES
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格式的密钥
注:密钥文件要在配置文件中单独声明(写入配置文件时,注释要单独一行,否则会报错)

实验过程:

#查看一下是否安装了openssl
[root@node0 ~]# rpm -q openssl
openssl-1.0.2k-16.el7.x86_64

#再查看vsftpd是否支持openssl
[root@node0 ~]# ldd /usr/sbin/vsftpd | grep libssl
	libssl.so.10 => /lib64/libssl.so.10 (0x00007fdde32cc000)

#去到生成的加密信息的密钥和证书文件
[root@node0 certs]# chmod 500 /etc/ssl/certs/
[root@node0 ~]# cd /etc/ssl/certs/
[root@node0 certs]# 
	#生成服务器私钥、生成RSA密钥
[root@node0 certs]# openssl  genrsa -out vsftpd.key 1024
Generating RSA private key, 1024 bit long modulus
.........................................................................++++++
....++++++
e is 65537 (0x10001)

	#然后在生成证书文件
需要依次输入
国家,
地区,
城市,
组织,
组织单位,
Email 等信息
最重要的是有一个 common name,
		可以写你的名字或者域名。如果为了 https 申请,这个必须和域名吻合,否则会引发浏览器警报。生成的 csr 文件交给 CA 签名后形成服务端自己的证书
[root@node0 certs]# openssl  genrsa -out vsftpd.key 1024
Generating RSA private key, 1024 bit long modulus
.........................................................................++++++
....++++++
e is 65537 (0x10001)
[root@node0 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) []:GD
Locality Name (eg, city) [Default City]:GZ
Organization Name (eg, company) [Default Company Ltd]:NS
Organizational Unit Name (eg, section) []:YK
Common Name (eg, your name or your server's hostname) []:YKKJ
Email Address []:123456@qq.com

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

	#最后使用CA服务器签发证书
[root@node0 certs]# openssl  x509 -req -days 365 -sha256 -in vsftpd.csr -signkey vsftpd.key -out vsftpd.crt
Signature ok
subject=/C=CN/ST=GD/L=GZ/O=NS/OU=YK/CN=YKKJ/emailAddress=123456@qq.com
Getting Private key

	#这里要注意两个问题
注意 1:生成完秘钥和证书文件后,将本目录{/etc/ssl/certs/}的权限修改为 500. 
注意 2:在实验环境中可以用命令生成测试,在生产环境中必须要在 https 证书厂商注册(否则浏览器不识别)

#这里准备好了之后可以修改配置文件
[root@node0 certs]# vim /etc/vsftpd/vsftpd.conf
............
	#添加一下几个内容
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/ssl/certs/vsftpd.crt
rsa_private_key_file=/etc/ssl/certs/vsftpd.key

#重启服务验证即可
[root@node0 certs]# systemctl restart vsftpd
[root@node0 certs]# 
	#到这里实验就结束了;
Logo

更多推荐