## 一、VSFTP 概述
### FTP 简介
- **FTP**:File Transfer Protocol(文件传输协议),用于Internet上的文件双向传输。
- **安全性**:FTP传输数据为明文,存在安全隐患。
### VSFTP 介绍
- **全称**:Very Secure FTP
- **作用**:解决FTP传输安全性问题的类Unix系统FTP服务器软件。
## 二、安全特性
- **运行者权限**:一般为普通用户,降低进程权限。
- **命令整合**:ftp所需命令基本整合到vsftp中。
- ==用?打开命令提示==
- ==delete 删除==
- ==rename 重命名==
- ==ls 列出文件==
- ==pwd 当前所在的绝对路径==
- ==mkdir 创建文件==
- ==get 拉取文件==
- ==put 推送文件==
- ==lcd 切换目录==
- **chroot功能**:改变用户根目录,限制用户活动范围。
## 三、VSFTP 连接类型
### 命令连接
- **TCP 21**:用于发送FTP命令。
### 数据连接
- **TCP 20**:Port模式下用于数据传输。
- **TCP 随机端口**:Passive模式下用于数据传输。
## 四、VSFTP 工作模式
### ==Port 主动模式==
- **流程**:客户端与服务器的TCP 21端口建立连接,客户端通过PORT命令指定数据接收端口,服务器通过TCP 20端口连接客户端指定端口发送数据。
- **缺点**:主动模式需考虑客户端防火墙配置。
![[Pasted image 20240918192950.png]]
### ==Passive 被动模式==
- **流程**:客户端与服务器的TCP 21端口建立连接,客户端发送Pasv命令,服务器打开一个临时端口(>1023)并通知客户端连接此端口传输数据。
- **优点**:更安全,需设置防火墙放行端口。被动模式客户端无需关注防火墙设置,使用方便。服务器端需要管理员配置端口放行策略。
- **注意** 被动模式的端口号范围建议缩小至具体数值。开放端口过多会增加服务器被攻击的风险。![[Pasted image 20240918193005.png]]
- **选择被动的原因?**
主动模式下,客户端开启特定端口等待服务器连接,因防火墙设置导致连接失败。被动模式则由服务器主动连接客户端,避免了因防火墙拦截而导致的连接问题。(考虑了客户端用户不了解服务原理)
## 五、VSFTP 传输模式
### Binary 模式 (推荐用这个)
- **用途**:不进行任何处理,适合可执行文件、压缩文件、图片等。
### ASCII 模式
- **用途**:自动适应目标系统文本结束符,如回车符。
### ps 文件传输过程
- ==文件从硬盘读取到内存成为活动文件后,需要转化为二进制进行网络传输。数据在网络中传输时,会使用OSI 7层模型进行封装,形成数据包或数据帧。文件从二进制还原成文件后,需要从内存写入到磁盘上,最终用户可见==
- ==文件传输权限: 有r权限并且r权限赋予其他人才有下载权限==
- ==在ftp中你用哪个用户,你的家目录就是你的根目录==
- 在ftp>提示符下输入ascii即转换到ACSII方式,输入bin,即转换到Binary方式
## 六、VSFTP 软件信息
### 服务端软件
- **名称**:vsftpd
- **配置文件**:`/etc/vsftpd/vsftpd.conf` `/etc/vsftpd/ftpusers(超级黑名单,修改后不需要重新重启服务)
- **端口号**:20、21、指定范围内随机端口
### 客户端软件
- **名称**:ftp
### 服务名
- **名称**:vsftpd
## 七、登录验证方式
### ==匿名用户验证==
- **账号**:ftp或anonymous
- **密码**:无
- **工作目录**:`/var/ftp`
- **适合范围**:开放性资源共享
- **注意**:==匿名用户的默认权限受到严格限制。权限不足时,不允许下载文件。上传、创建目录、删除文件等操作不可行。匿名登录验证无需账号(需输入ftp)和密码。==
### 本地用户验证
- **账号**:本地用户(/etc/passwd)
- **密码**:用户密码(/etc/shadow)
- **工作目录**:登录用户的宿主目录
- **适合范围**:非开放性资源的共享
### ==虚拟用户验证==
- **用途**:代替本地用户,减少本地用户曝光率。
- **映射用户**:为虚拟用户提供工作目录和权限控制。
- **适合范围**:非开放性资源的共享
## 八、VSFTP 实验部署
### 匿名用户验证实验
1. **实验准备:匿名权限控制**
``` shell
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/秒)
```
2. ==**实验需求与流程**==
- 实现可以上传
``` shell
vim /etc/vsftpd/vsftpd.conf
anon_upload_enable=YES #允许上传文件
mkdir /var/ftp/upload #在/var/ftp/下创建上传目录
chmod 777 /var/ftp/upload #修改上传目录的权限或所有者,让匿名用户有写入权限
echo "xxxxx" > /var/ftp/upload/a.txt
#客户端切换/var/ftp/upload目录下就可以put了
```
- 实现创建目录和文件其他操作
``` shell
vim /etc/vsftpd/vsftpd.conf
anon_mkdir_write_enable=YES #允许创建目录
anon_other_write_enable=YES #删除文件、文件改名、文件覆盖
#客户端切换/var/ftp/upload目录下就可以了
```
- 用户进入某个文件夹时,弹出相应的说明(了解)
在对应目录下创建 .message 文件,并写入相应内容
确认dirmessage_enable=YES是否启用
尝试却换目录查看效果(同一次登录仅提示一次
- 实现上传的文件可下载
``` shell
vim /etc/vsftpd/vsftpd.conf
anon_umask=022 / chmod o+r ./abc.txt
```
### 本地用户验证实验
1. **实验准备:本地用户权限控制**
``` shell
local_enable=YES #是否启用本地系统用户
local_umask=022 #本地用户所上传文件的权限掩码
chroot_local_user=YES #是否将用户的家目录当做根目录
allow_writeable_chroot=YES#忽略安全性警告{centos7中需要添加此选项}
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更高,即时生效
```
2. ==**实验需求与流程**==
- 服务端需要创建用户并设置密码(所创建的用户,不需要登录操作系统,仅用来登录VSFTP)
``` shell
useradd -s /sbin/nologin username
echo "/sbin/nologin" >> /etc/shells
```
- 将所有用户禁锢在自己的家目录下
``` shell
vim /etc/vsftpd/vsftpd.conf
chroot_local_user=YES #是否将用户的家目录当做根目录
allow_writeable_chroot=YES #忽略安全性警告{centos7中需要添加此选项}
```
- 配置文件:/etc/vsftpd/ftpusers超级黑名单
- 修改被动模式数据传输使用端口
``` shell
vim /etc/vsftpd/vsftpd.conf
pasv_enable=YES
pasv_min_port=30000
pasv_max_port=35000
```
### ==虚拟用户验证实验==
* **实验准备
* 原理:虚拟用户创建后会保存到数据库,用户登录后与Linux用户进行映射,即虚拟用户借用映射用户来上传下载文件等功能
* 虚拟用户:软件登录和身份验证 ,虚拟用户由数据库命令生成 数据库文件:里面包含着账号密码
* 映射用户:登录后借用映射用户进行文件管理
![[Pasted image 20240919184852.png]]
1.**实验需求与流程**
1. **建立FTP虚拟用户数据库**
- 创建用户数据库文件并转换格式。
2. **配置虚拟用户映射和PAM认证**
- 创建映射用户。
- 修改PAM认证配置文件。
3. **修改vsftpd.conf支持虚拟用户**
- 启用`guest_enable`和`guest_username`。
4. **为每个虚拟用户创建独立配置文件**
- 设置相应权限和文件操作权限。
2.**完整命令**:
``` shell
yum -y install vsftpd
#创建被代理的账号信息,填写用户密码并更改成数据库文件
cd /etc/vsftpd
vim vsftpd.user
lsy
123
lsy2
123
db_load -T -t hash -f vsftpd.user vsftpd.db
cat vsftpd.db
chmod 600 vsftpd.user vsftpd.db
#创建映射用户(可将虚拟用户的家目录设置为指定的共享目录)
useradd -d /var/ftproot -s /sbin/nologin virtual
echo "/sbin/nologin" >> /etc/shells
#更改vsftpd的认证方式
cp -a /etc/pam.d/vsftpd /etc/pam.d/vsftpd.vir
vim /etc/pam.d/vsftpd.vir
#认证 需要 模块 数据文件路径,省略最后的.db(清空原来内容,添加下面两行)注意这里不能写后缀(因为这里会自动补齐)
auth required pam_userdb.so db=/etc/vsftpd/vsftpd
account required pam_userdb.so db=/etc/vsftpd/vsftpd
#更改主配置文件
vim /etc/vsftpd/vsftpd.conf
chroot_local_user=YES
allow_writeable_chroot=YES
pam_service_name=vsftpd.vir #修改 上面是把用户的家目录设置成根目录
guest_enable=YES
guest_username=virtual
user_config_dir=/etc/vsftpd/dir
#每个用户单独设置某一个权限
cd /etc/vsftpd/
mkdir dir
cd dir
vim lsy
anon_upload_enable=YES
anon_umask=022
local_root=/var/ftproot/lsy
cp -a lsy lsy2
vim lsy2
anon_upload_enable=YES
anon_umask=022
local_root=/var/ftproot/lsy2
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
#创建虚拟用户家目录,修改虚拟用户家目录所有者所属组为映射用户,修改映射用户其他人权限,给rx,让虚拟用户有权限
cd /var/ftproot/
mkdir lsy
mkdir lsy2
chown -R virtual.virtual *
chmod -R o+rx *
systemctl enable --now vsftpd
```
3.**命令解释**:
``` shell
vim vsftpd.user
注:该文件名可以随便定义,文件内容格式:奇数行用户,偶数行密码
db_load -T -t hash -f vsftpd.user vsftpd.db
#将用户密码的存放文本转化为数据库类型,并使用hash加密
chmod 600 vsftpd.db
#修改文件权限为600,保证其安全性
useradd -d /var/ftproot -s /sbin/nologin virtual
#/var/ftproot 存放数据的区域建议存数据请建立一个独立的分区
#创建virtual 用户作为ftp的虚拟用户的映射用户
vim /etc/shells
/sbin/nologin
#仅需要在centos 7中添加此选项 #/etc/pam.d保存身份验证相关的配置文件
cp –a /etc/pam.d/vsftpd /etc/pam.d/vsftpd.vir
#使用模板生成自己的认证配置文件,方便一会调用
修改:
pam_service_name=vsftpd.vir
添加:
guest_enable=YES #guest迎宾用户: 当资源要全部全部人使用就用迎宾用户,个人使用就用普通用户
guest_username=virtual
user_config_dir=/etc/vsftpd/dir
vim lsy2 添加
anon_upload_enable=YES #允许上传文件
anon_mkdir_write_enable=YES #允许创建目录
anon_upload_enable=YES #允许上传文件(为了覆盖开启的)
anon_other_write_enable=YES #允许重名和删除文件、覆盖
```
![[Pasted image 20240919205155.png]]
## 九、安全扩展 - SSL/TLS 加密验证
### SSL加密传输:生成密钥和证书
- **证书**:包含申请人和颁发者信息,公钥
- 密钥:CA服务器(服务器厂商)
![[Pasted image 20240918191259.png]]
### ==配置SSL加密生成自签名证书实验==
1.**实验需求与流程**
- 查看是否安装了openssl和支持openssl ldd /usr/sbin/vsftpd | grep libssl
- 生成加密信息的密钥和证书文件
- 修改主配置文件/etc/vsftpd/vsftpd.conf
- 重新启动服务和测试
2.**完整命令**:
``` shell
yum -y install vsftpd
systemctl start vsftpd
useradd lsy passwd lsy #创建ftp用户(这个用户可以是匿名或虚拟用户)
cd /etc/ssl/certs/
chmod 500 ./ #给这个目录权限
openssl genrsa -out vsftpd.key 1024 #建立服务器私钥,生成RSA密钥
openssl req -new -key vsftpd.key -out vsftpd.csr #需要依次输入国家,地区,城市,组织,组织单位,Email等信息。最重要的是有一个common name,可以写你的名字或者域名。如果为了https申请,这个必须和域名吻合,否则会引发浏览器警报。生成的csr文件交给CA签名后形成服务端自己的证书
openssl x509 -req -days 365 -sha256 -in vsftpd.csr -signkey vsftpd.key -out vsftpd.crt #使用CA服务器签发证书,设置证书的有效期等信息
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
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
systemctl restart vsftpd #重新启动命令
tcpdump -i ens33 -nn -X -vv tcp port 21 and ip host 192.168.90.101 #对ftp服务器进行抓包
#用filezlla登录ftp服务器
#把抓包信息保存在a.txt
cat /root/a.txt | grep "lsy" #没有过滤出用户信息,说明加密成功
```
- 生成加密信息的密钥和证书文件的过程中,需要执行哪些具体步骤? 建立服务器私钥,创建服务端自己的证书,使用自签名证书
- 主配置文件`/etc/vsftpd/vsftpd.conf`时,为了启用SSL加密连接,需要添加或修改哪些参数?
``` shell
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格式的密钥
```
- ==注意1:生成完秘钥和证书文件后,将本目录{/etc/ssl/certs/}的权限修 改为500.原因是如果文件权限太大操作系统会任务这个文件不适合作为身份验证相关的配置文件==
- ==注意2:在实验环境中可以用命令生成测试,在生产环境中必须要在https证书厂商注册(否则浏览器不识别)==
用filezlla登录ftp服务器
![[Pasted image 20240918212907.png]]
## 十、==命令和问题扩展==
- **创建账户权限不同的原因**:
- 如果用户UID大于199并且用户名与组名相同,则使用002。若用户UID大于199但用户名与组名不同,则使用022。
![[Pasted image 20240918213133.png]]
- **扩展命令**:
- man 5(级别) 配置文件 查看配置文件的帮助文档
``` shell
cd /etc/vsftpd
man 5 vsftpd.conf
```
- !sys 找最近一次以sys开头的命令
- yum info 软件 查看软件详细信息
- chmod 04755 0表示后面数字是八进制 4表示suid
- /etc/shells 保存解析登录的shell类型
- 使用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 #产生更详细的输出
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类