草庐IT

VSFTP服务简介

Liang_GaRy 2024-06-15 原文

网络服务之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]# 
	#到这里实验就结束了;

有关VSFTP服务简介的更多相关文章

  1. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  4. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  5. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  6. ruby-on-rails - 在 Rails 中调试生产服务器 - 2

    您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除

  7. HBase Region 简介和建议数量&大小 - 2

    Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile

  8. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

  9. ruby - Rails 开发服务器、PDFKit 和多线程 - 2

    我有一个使用PDFKit呈现网页的pdf版本的Rails应用程序。我使用Thin作为开发服务器。问题是当我处于开发模式时。当我使用“bundleexecrailss”启动我的服务器并尝试呈现任何PDF时,整个过程会陷入僵局,因为当您呈现PDF时,会向服务器请求一些额外的资源,如图像和css,看起来只有一个线程.如何配置Rails开发服务器以运行多个工作线程?非常感谢。 最佳答案 我找到的最简单的解决方案是unicorn.geminstallunicorn创建一个unicorn.conf:worker_processes3然后使用它:

  10. ruby - Dropbox 类似 git 的服务——没有 rsync 和 inotify - 2

    关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec

随机推荐