RHEL 平台基于 vsftpd 服务搭建 FTP 服务

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 服务器, 可以成功登录:

《RHEL 平台基于 vsftpd 服务搭建 FTP 服务》 image-20181024101330239

在开启了上面的参数后, 我们应当能够创建创建文件, 我们可以尝试一下 mkdir a

《RHEL 平台基于 vsftpd 服务搭建 FTP 服务》 image-20181024101422486

但是却失败了, 我们想一下可能是什么原因:

  1. 文件夹的权限问题
  2. SELinux 的防护
文件夹权限问题

我们先查看一下文件夹的权限:

《RHEL 平台基于 vsftpd 服务搭建 FTP 服务》 image-20181024101606491

/var/ftp 路径下, 有一个 pub 文件夹, 我们看到它是属于 root 的, 而且其他人只有 rx 权限.

我们修改一下所属用户:

chown -R ftp pub

《RHEL 平台基于 vsftpd 服务搭建 FTP 服务》 image-20181024101733063

这下我们登录进去之后再次尝试, 你会发现还是会碰到创建失败的问题.

可能还是 SELinux 的问题

如果你开启了 GUI, 可以看到 SELinux 报警:

《RHEL 平台基于 vsftpd 服务搭建 FTP 服务》 image-20181024102217211

说明是 SELinux 的问题.

我们可以先查看一下 SELinux 关于 ftp 的 bool 值:

《RHEL 平台基于 vsftpd 服务搭建 FTP 服务》 image-20181024101911104

我们可以看到这些 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 认证的用户数据库文件

  1. 创建用户文件, 奇数行位用户名, 偶数行为密码.例如, 创建 /etc/vsftpd/vuser.list 文件, 中写入用户名和密码.
  2. 使用 db_load 创建加密文件: db_load -T -t hash -f vuser.list vuser.db
  3. 修改文件权限 chmod 600 vuser.db
  4. 删除明文文件.

创建用于映射虚拟用户的系统本地用户

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根目录执行写入操作, 而且不拒绝用户的登录请求

为不同用户设置不同的权限

  1. 创建文件夹, 保存权限文件 mkdir /etc/vsftpd/vuser_dir
  2. 为用户创建文件: touch zhangsan touch lisi
  3. 修改配置文件 (这里我试了一下, 按照上面的配置, 如果不写下面的话默认是有写入和创建目录权限的)
vim zhangsan
anon_upload_enable=YES
anon_mkdir_write_enable=YES 
anon_other_write_enable=YES

到此, 我们已经完成了通过虚拟用户的 FTP 服务器的搭建, 对于不同的用户, 我们有不同的权限, 我们用客户端使用 zhangsan 账户登录进去之后, 可以上传文件, 修改文件名, 删除文件等, 而使用 lisi 账户, 就无法修改文件名或删除文件.

我们推荐使用虚拟用户进行 FTP 服务的搭建, 因为这样的安全性更高.

    原文作者:mlya
    原文地址: https://www.jianshu.com/p/229fb627ddf2
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞