在 CentOS 7.x 环境下使用 vsftpd 搭建 ftp 服务器、配置 SSL 并使用虚拟账号访问。
1. 基本说明
FTP 提供了三种访问方式:匿名访问、本地用户(Local User)访问,以及虚拟用户(Virtual User)访问。
本地用户就是服务器本地的用户,即可通过 SSH 远程登录服务器的用户。虚拟用户则是仅用于 FTP 服务的用户,而非真实的 Linux 用户(但是需要与一个本地用户进行绑定)。
本文内容为:
- 创建一个用于绑定虚拟用户的本地账户 (myFtp),但该用户无法通过 SSH 登录服务器。
- 启用 vsftpd 服务并完成配置。
- 定义一个虚拟用户 (myVirtualUser), 使用者可在 FTP 客户端中用该用户进行登录。
- 配置 TLS 加密传输。
- 设置防火墙
FTP 客户端使用 fileZilla 进行访问。
2. 创建本地用户
创建用户名为 “myFtp” 的账户,禁止其通过 shell 登录,并将 home 设置为 /data/vsftpd/
。
需要注意的是,在 myFtp 的 home 目录下,需要手动为虚拟用户 myVirtualUser 创建根目录(以及设置文件所有权)
1 | sudo useradd -s /usr/sbin/nologin -d /data/vsftpd myFtp |
3. 安装 vsftpd
基本思路为,由 vsftpd (Very Secure File Transfer Protocol Deamon) 提供 FTP 服务,由 PAM 完成账号验证。使用自签名的 RSA 证书实现 SSL 访问。
1 | # 更新 yum packages (可选) |
4. 修改 vsftpd.conf
vsftpd 配置文件的位置:/etc/vsftpd/vsftpd.conf
1 | # 备份原配置文件 |
5. 设置 pam 验证
1 | # 定义虚拟用户的账号与密码(第一行为 account, 第二行为明文 password,可以同时定义多个用户), |
在 vsfptd.conf
配置文件中,pam_service_name=vsftpd.virtual
指定了 FTP 使用 Linux PAM 进行鉴权。鉴权方式由 vsftpd.virtual
文件配置,该文件位于目录 /etc/pam.d/
。
而 /etc/pam.d/vsftpd.virtual
文件中指定的 pam_userdb.so db=/etc/vsftpd/ftp_users
则指向通过 db_load 生成的 db 文件。
一个安全问题:
以上通过组合命令的方式将账号密码写入到 /tmp/ftp_users.txt 后,该记录会留在 history 中,由于是个人服务器,因此可以直接使用 history -c
清空历史记录,否则该账号密码仍可通过 history
查看,因此推荐使用 vim 编辑的方式。
6. chroot
chroot 可以修改登录用户的根目录,即将用户的访问限制在指定范围,起到”囚禁”的效果。
以上 vsfptd.conf 配置中,定义了不同 FTP 匿名用户登录后只能访问各自的目录,根据以上的配置,myVirtualUser 的访问范围将限制在 /data/vsftpd/myVirtualUser/
, 如果有另一个虚拟用户 vUser2, 则登录后只能访问 /data/vsftpd/vUser2/
(注意在虚拟用户登录前,必须先创建该目录并通过 chown
保证用户 myFtp 对目录有所需权限)。
除此之外,可以配置 vsftpd.conf local_root=/data/vsftpd/
,去掉 $USER
变量,使得所有虚拟用户登录后都被限制在 /data/vsftpd
中,则无需创建相应的目录并修改所有权。
7. 配置 TLS
1 | # 安装 openssl, 已安装可跳过 |
8. 配置防火墙
在云服务器的控制台中设置允许外部对 990, 53000-53010 端口的访问。
或通过 firewalld
在服务器内部进行配置:
1 | sudo firewall-cmd --zone=public --add-port=990/tcp --permanent |