网络服务-VSFTP
区别 | samba | ftp |
---|---|---|
登陆方式 | samba借用了linux的用户,但密码是独立创建的 | ftp借用了linux的账号及密码 |
修改方式 | samba支持在客户端直接修改 | ftp不支持在客户端直接修改,需要先下载到客户端,修改完后,再上传覆盖掉服务器端的版本 |
1. VSFTP概述
FTP 是File Transfer Protocol(文件传输协议)的英文简称,用于Internet上的文件的双向传输。使用 FTP 来传输时,是具有一定程度的危险性, 因为数据在因特网上面是完全没有受到保护的明文传输方式!
VSFTP是一个基于GPL发布的类Unix系统上使用的FTP服务器软件,它的全称是Very Secure FTP,从名称定义上基本可以看出,这是为了解决ftp传输安全性问题的。
1.1 安全特性
\1. vsftp程序的运行者一般是普通用户,降低了相对应进程的权限,提高了安全性
\2. 任何需要执行较高权限的指令都需要上层程序许可
\3. ftp所需要使用的绝大多数命令都被整合到了vsftp中,基本不需要系统额外提供命令
\4. 拥有chroot功能,可以改变用户的根目录,限制用户只能在自己的家目录
2. VSFTP连接类型
控制连接(持续连接) TCP 21(命令信道) 用户收发FTP命令
数据连接(按需连接) TCP 20(数据信道) 用于上传下载数据
数据连接(按需连接) TCP 随机(数据信道) 用于上传下载数据
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DXZl8HFs-1658156751411)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20220506162550279.png)]
3. VSFTP工作模式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IvEnzkCE-1658156751412)(file:///C:\Users\86152\AppData\Local\Temp\ksohtml4376\wps1.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n40Fr10m-1658156751413)(file:///C:\Users\86152\AppData\Local\Temp\ksohtml4376\wps2.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XMh6y30d-1658156751413)(file:///C:\Users\86152\AppData\Local\Temp\ksohtml4376\wps3.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ePv9knv8-1658156751414)(file:///C:\Users\86152\AppData\Local\Temp\ksohtml4376\wps4.png)]
注意:由于VSFTP的被动模式是随机端口进行数据传输,所以在设置防火墙时需要刻意放行。
FTP的两种模式主动模式所使用的端口是20和21端口,而被动模式中,默认开放的是大于1023的端口和21端口,相比而言被动模式更加安全,但是如果只是简单的文件共享,不考虑安全性则可以直接选用主动模式。其次被动模式还有一个非常麻烦的地方,由于需要开放大量的端口,在使用防火墙进行端口过滤及保护时就异常麻烦,一般使用被动模式时都会选定一个端口范围作为被动模式所需端口。
注意:VSFTP默认两种模式都支持,最终决定使用哪种模式很多时候取决于所使用的的FTP客户端工具,当然也可以在服务器端的配置文件禁止掉某一种模式,强行使用另外一种。
4. VSFTP传输模式
**Binary模式:**不对数据进行任何处理,适合进行可执行文件、压缩文件、图片等
ASCII模式: 进行文本传输时,自动适应目标操作系统的结束符,如回车符等
Linux的红帽发行版中VSFTP默认采用的是Binary模式,这样能保证绝大多数文件传输后能正常使用
切换方式:在ftp>提示符下输入ascii即转换到ACSII方式,输入bin,即转换到Binary方式。
5. VSFTP软件信息
**服务端软件名:**vsftpd
**客户端软件名:**ftp
**服务名:**vsftpd
**端口号:**20、21、指定范围内随机端口
配置文件:/etc/vsftpd/vsftpd.conf
6. 登录验证方式
- 匿名用户验证:
用户账号名称:ftp或anonymous
用户账号密码:无密码
工作目录:/var/ftp
默认权限:默认可下载不可上传,上传权限由两部分组成(主配置文件和文件系统)
- 本地用户验证:
用户账号名称:本地用户(/etc/passwd)
用户账号密码:用户密码(/etc/shadow)
工作目录:登录用户的宿主目录
权限:最大权限(drwx------)
- 虚拟(virtual)用户验证:
\1. 创建虚拟用户用来代替本地用户,减少本地用户曝光率
\2. 使用本地用户作为虚拟用户的映射用户,为虚拟用户提供工作目录和权限控制
\3. 能够设置严格的权限(为每一个用户生成单独的配置文件)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WMNzzTy6-1658156751414)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20220506162646145.png)]
7. VSFTP实验部署
注:先关闭服务器和客户机上的防火墙和SELinux
\1. 关闭防火墙 systemctl stop firewalld
\2. 临时清空防火墙规则 iptables -F
\3. 查看SELinux状态 getenforce
\4. 临时关闭SELinux setenforce 0
\5. 永久关闭SELinux "sed -i ‘7s/enable/disabled/’ /etc/
7.1. 匿名用户验证实验:
匿名权限控制:
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/秒)
用户:ftp或anonymous
家目录:/var/ftp
权限:软件:配置文件没有写权限,匿名默认不允许写数据
文件系统:没权限,目录属于root用户,其他人没有w权限
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L9szAJWj-1658156751415)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20220506160815555.png)]
实验需求与流程:
注意:在客户端登录后,默认情况下是可以下载的,但不能上传
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rfAiyJjh-1658156751416)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20220506160843614.png)]
\1. 实现可以上传
a. anon_upload_enable=YES
#上传权限 put + 文件名
b. 在/var/ftp/下创建上传目录./abc/
c. 修改上传目录的权限或所有者,让匿名用户有写入权限
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yqgMNb35-1658156751416)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20220506161249538.png)]
\2. 实现创建目录和文件其他操作
a.anon_mkdir_write_enable=YES
#允许创建目录 mkdir + 目录名
b.anon_other_write_enable=YES
#删除文件、文件改名、文件覆盖 delete 、put
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hSFFKbAP-1658156751417)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20220506161135753.png)]
\3. 用户进入某个文件夹时,弹出相应的说明用于提示用户
a. 在对应目录下创建 .message 文件,并写入相应内容
b. 确认dirmessage_enable=YES
是否启用
c. 尝试更换目录查看效果(同一次登录仅提示一次)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rHCwj3bJ-1658156751418)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20220506161544260.png)]
\4. 实现上传的文件可下载
默认情况下开放上传权限后,上传的文件是无法被下载的,因为文件的其他人位置没有r权限
设置anon_umask=022
,可以让上传的文件其他人位置拥有r权限,然后才能被其他人下载
7.2. 本地用户验证实验:
本地用户权限控制:
-
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更高,即时生效
实验需求与流程:
\1. 服务端需要创建用户并设置密码(所创建的用户,不需要登录操作系统,仅用来登录vsftp
useradd -s /sbin/nologin laowang
centos7版本需要在 /etc/shells 文件中添加 /sbin/nologin
将用户设置为不可登录的shell类型防止一下情况发生:使用用户身份直接登录服务器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0ryk9Ydm-1658156751418)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20220506162123771.png)]
\2. 将所有用户禁锢在自己的家目录下
注:默认没有禁锢用户时,客户端登录后可以随意切换目录,查看文件所在位置和文件名
chroot_local_user=YES
#开启用户家目录限制,限制所有用户不能随便切换目录
\3. 将部分用户禁锢在自己的家目录下
chroot_list_enable=YES
#开启白名单功能,允许白名单中的用户随意切换目录
chroot_list_file=/etc/vsftpd/chroot_list
#白名单文件所在位置(需自己创建)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b2GWV7t8-1658156751419)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20220506162317936.png)]
\4. 配置文件:/etc/vsftpd/ftpusers
所有写入此文件内的用户名都不允许登录ftp,立刻生效。
\5. 修改被动模式数据传输使用端口
将以下代码写入配置文件/etc/vsftp/vsftp.conf
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=30999
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SNYSssZI-1658156751419)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20220506170229564.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zId2lyq6-1658156751420)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20220506183110902.png)]
7.3. 虚拟用户验证实验
实验一、ftp的虚拟用户模式
身份认证使用的是人为创建的独立的用户和密码,保存在专门的数据库文件中 #无需创建大量Linux用户。
为虚拟用户绑定一个Linux用户,让虚拟用户借助Linux用户的身份进行文件的存储,被借用的Linux用户称之为映射用户。
为每一个虚拟用户设置权限是不能使用文件系统来实现的,转为使用配置文件的选项来实现,为每一个虚拟用户创建独立的配置文件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GzTq4kdE-1658156751420)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20220506162837324.png)]
- \1. 建立FTP的虚拟用户的用户数据库文件(在/etc/vsftpd)
mkdir vsf_user touch ./vsf_user/vsftpd.user
#该文件名可以随便定义,文件内容格式:奇数行用户,偶数行密码
db_load -T -t hash -f vsftpd.user vsftpd.db
#将用户密码的存放文本转化为数据库类型,并使用hash加密
chmod 600 vsftpd.db
#修改文件权限为600,保证其安全性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yZMN2ywd-1658156751421)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20220506164557256.png)]
- \2. 创建FTP虚拟用户的映射用户,并指定其用户家目录
useradd -d /var/ftproot -s /sbin/nologin laowang
#创建laowang用户作为ftp的虚拟用户的映射用户
- \3. 建立支持虚拟用户的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
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OzOyz2wC-1658156751421)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20220506185412885.png)]
在vsftpd.conf文件中添加支持配置
修改:pam_service_name=vsftpd
添加:
guest_enable=YES
guest_username=virtual
user_config_dir=/etc/vsftpd/dir
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dXuLVjfm-1658156751422)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20220506185950779.png)]
- \4. 为虚拟用户建立独立的配置文件,启动服务并测试
注:做虚拟用户配置文件设置时,将主配置文件中自定义的匿名用户相关设置注释掉。
用户可以上传:
anon_upload_enable=YES
#允许上传文件
用户可以创建目录或文件:
anon_mkdir_write_enable=YES
#允许创建目录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-30BGLF7i-1658156751422)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20220506191219870.png)]
用户可以修改文件名:
anon_upload_enable=YES
#允许上传文件(为了覆盖开启的)
anon_other_write_enable=YES
#允许重名和删除文件、覆盖
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xm0HN7CW-1658156751423)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20220506192122839.png)]
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
local_root=/var/ftproot/user1
allow_writeable_chroot=YES
local_root=/var/vftp/a1
注:给映射用户的家目录 设置 o+r 让虚拟用户有读权限。
7.4.openssl+vsftpd 加密验证方式:
实验二、ftp的加密登录认证和传输
注:sshd服务的配置文件中,注释掉的是默认生效的
由客户端生成密钥对文件,并将公钥文件上传到服务器的指定目录下,修改指定名称:ssh-keygen –t rsa –b 1024 & ssh-copy-id user@ip
需要在服务器端开启密钥对登录认证模式(默认是开启的)
拓展:使用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 #产生更详细的输出
- \1. 查看是否安装了openssl
rpm -q openssl
- \2. 查看vsftpd 是否支持openssl
ldd /usr/sbin/vsftpd | grep libssl
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BhdQTB7P-1658156751423)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20220506233331847.png)]
- \3. 生成加密信息的秘钥和证书文件
位置:/etc/ssl/certs/
a. openssl genrsa -out vsftpd.key 1024
#建立服务器私钥,生成RSA密钥
b. openssl req -new -key vsftpd.key -out vsftpd.csr
#需要依次输入国家,地区,城市,组织,组织单位,Email等信息。最重要的是有一个common name,可以写你的名字或者域名。如果为了https申请,这个必须和域名吻合,否则会引发浏览器警报。生成的csr文件交给CA签名后形成服务端自己的证书
c. openssl x509 -req -days 365 -sha256 -in vsftpd.csr -signkey vsftpd.key -out vsftpd.crt
#使用CA服务器签发证书,设置证书的有效期等信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-goAXm6jW-1658156751424)(C:\Users\86152\AppData\Roaming\Typora\typora-user-images\image-20220506233430939.png)]
注意1:生成完秘钥和证书文件后,将本目录{/etc/ssl/certs/}的权限修改为500.
注意2:在实验环境中可以用命令生成测试,在生产环境中必须要在https证书厂商注册(否则浏览器不识别)
- \4. 修改主配置文件/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/vsftpd/ssl/vsftpd.crt #rsa格式的证书
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key #rsa格式的密钥
注:密钥文件要在配置文件中单独声明(写入配置文件时,注释要单独一行,否则会报错)
- \5. 重启服务
service vsftpd restart
- \6. 测试(使用第三方客户端连接)
FileZilla-FTP(第三方客户端工具)
连接测试时选择:
服务器类型:显式 TLS/SSL
ssl=YES #匿名登录和传输时强制使用ssl
force_local_logins_ssl=YES
force_local_data_ssl=YES #本地登录和传输时强制使用ssl
rsa_cert_file=/etc/vsftpd/ssl/vsftpd.crt #rsa格式的证书
rsa_private_key_file=/etc/vsftpd/ssl/vsftpd.key #rsa格式的密钥
<font color='red'>**注:密钥文件要在配置文件中单独声明(写入配置文件时,注释要单独一行,否则会报错)**</font>
- \5. **重启服务**
`service vsftpd restart`
- \6. **测试(使用第三方客户端连接)**
FileZilla-FTP(第三方客户端工具)
连接测试时选择:
服务器类型:显式 TLS/SSL
登录类型: 一般或匿名