RHEL 平台基于 vsftpd 服务搭建 FTP 服务
本文参考刘遄老师的 Linux 就该这么学撰写.
FTP
- FTP: File Transfer Protocol, 文件传输协议
- FTP使用:
- 20 端口: 数据端口
- 21 端口: 命令端口
- 两种工作模式:
- 主动模式: FTP 服务器主动向客户端发起连接请求
- 被动模式: FTP 服务器等待客户端发起连接请求 (FTP 的默认工作模式)
- vsftpd (very secure FTP daemon, 非常安全的 FTP 守护进程), Linux 的 FTP 程序.
配置 vsftpd 服务
关闭防火墙
iptables -F
service iptables save
安装 vsftpd
在 RHEL 或 CentOS 中, 使用 yum 直接安装:
yum install -y vsftpd
vsftpd 有三种认证模式:
- 匿名开放模式: 可以通过匿名用户(anonymous) 登录到 FTP 服务器.
- 本地用户模式: 通过 Linux 系统本地账户密码进行认证.
- 虚拟用户模式: 为 FTP 服务单独建立用户数据库文件, 虚拟出用户进行认证, 这些用户并不是服务器用户.
安装 ftp
ftp 是一个简单的 ftp 客户端, 使用 yum
安装他:
yum install -y ftp
匿名开放模式
匿名开放模式的方式最简单, 可以适用于简单的使用场景, 可以使用防火墙来提供基本的安全.
参数 | 作用 |
---|---|
anonymous_enable=YES | 允许匿名访问模式 |
anon_umask=022 | 匿名用户上传文件的 umask 值 |
anon_upload_enable=YES | 允许匿名用户上传文件 |
anon_mkdir_write_enable=YES | 允许匿名用户创建目录 |
anon_other_write_enable=YES | 允许匿名用户修改目录名称或删除目录 |
允许匿名用户修改目录名称或删除目录是很危险的权限.
修改完配置文件后, 需要重启 vsftpd
服务:
systemctl restart vsftpd
无法上传文件?
我们可以使用 ftp 命令登录 ftp 服务器, 可以成功登录:
在开启了上面的参数后, 我们应当能够创建创建文件, 我们可以尝试一下 mkdir a
但是却失败了, 我们想一下可能是什么原因:
- 文件夹的权限问题
- SELinux 的防护
文件夹权限问题
我们先查看一下文件夹的权限:
在 /var/ftp
路径下, 有一个 pub
文件夹, 我们看到它是属于 root
的, 而且其他人只有 rx
权限.
我们修改一下所属用户:
chown -R ftp pub
这下我们登录进去之后再次尝试, 你会发现还是会碰到创建失败的问题.
可能还是 SELinux 的问题
如果你开启了 GUI, 可以看到 SELinux 报警:
说明是 SELinux 的问题.
我们可以先查看一下 SELinux 关于 ftp 的 bool 值:
我们可以看到这些 bool 值都是 off 的状态.
通过查阅资料, 需要 ftpd_full_access
设置为 yes 才行:
setsebool -P ftpd_full_access=off
这样就可以使用匿名用户上传文件了.
本地用户模式
参数 | 作用 |
---|---|
anonymous_enable=NO | 禁用匿名访问模式 |
local_enable=YES | 允许本地用户模式 |
write_enable=YES | 设置可写权限 |
local_umask=022 | 本地用户模式创建文件的 umask 值 |
userlist_enable=YES | 启用 "禁止用户名单", 名单文件为 ftpusers 和 user_list |
userlist_deny=YES | 如果为 NO, 只允许 user_list 文件中的用户登录, 如果为 YES, 则禁止 user_list 文件中的用户登录 |
需要注意的是在 ftpusers 和 user_list 中的禁止用上列表.
注意 SELinux 的设置
虚拟用户模式
创建用户 FTP 认证的用户数据库文件
- 创建用户文件, 奇数行位用户名, 偶数行为密码.例如, 创建
/etc/vsftpd/vuser.list
文件, 中写入用户名和密码. - 使用 db_load 创建加密文件:
db_load -T -t hash -f vuser.list vuser.db
- 修改文件权限
chmod 600 vuser.db
- 删除明文文件.
创建用于映射虚拟用户的系统本地用户
useradd -d /var/ftproot -s /sbin/nologin virtual
创建名叫 virtual
的用户, shell 设置为 /sbin/nologin
, home 设置为 /var/ftprooot
.
创建 ftp 目录
mkdir /var/ftproot
chown -R virtual:virtual /var/ftproot/
chmod -R 755 /var/ftproot/
创建支持虚拟用户的 PAM 文件
vim /etc/pam.d/vsftpd.vu
# 写入:
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
注意, 写入时, 不写 .db 后缀
修改 vsftpd 配置文件
参数 | 作用 |
---|---|
anonymous_enable=NO | 禁用匿名模式 |
local_enable=YES | 允许本地用户模式 |
guest_enable=YES | 允许虚拟用户模式 |
guest_username=virtual | 指定虚拟用户账户 |
pam_service_name=vsftpd.vu | 指定 PAM 文件 |
allow_writeable_chroot=YES | 允许对禁锢的FTP根目录执行写入操作, 而且不拒绝用户的登录请求 |
为不同用户设置不同的权限
- 创建文件夹, 保存权限文件
mkdir /etc/vsftpd/vuser_dir
- 为用户创建文件:
touch zhangsan
touch lisi
- 修改配置文件 (这里我试了一下, 按照上面的配置, 如果不写下面的话默认是有写入和创建目录权限的)
vim zhangsan
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
到此, 我们已经完成了通过虚拟用户的 FTP 服务器的搭建, 对于不同的用户, 我们有不同的权限, 我们用客户端使用 zhangsan 账户登录进去之后, 可以上传文件, 修改文件名, 删除文件等, 而使用 lisi 账户, 就无法修改文件名或删除文件.
我们推荐使用虚拟用户进行 FTP 服务的搭建, 因为这样的安全性更高.