目录

vsftp 配置说明

vsftp 是 linux 下非常有名的一个 ftp 服务器程序。不过其配置稍微有点复杂。以下对其配置作简单说明。

先贴一段目前在用的配置(已把注释部分去掉了),本配置的效果有:

listen=NO
listen_ipv6=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
 
 
# 以上基本是一些默认的配置,后面的是自定义内容,详细的说明在后面。
 
 
ftpd_banner="Welcome to Gulucat FTP service."
 
utf8_filesystem=YES
 
guest_enable=YES
virtual_use_local_privs=YES
 
chroot_local_user=YES
user_sub_token=$USER
local_root=/data/ftp_home/$USER
hide_ids=YES
allow_writeable_chroot=YES
 
 
rsa_cert_file=/etc/ssl/certs/ftp_example_com.crt
rsa_private_key_file=/etc/ssl/private/ftp_example_com.key
ssl_enable=YES
force_anon_data_ssl=YES
force_anon_logins_ssl=YES
 
pasv_enable=YES
pasv_min_port=12001
pasv_max_port=12002

以下是一些细节的说明。

1. 禁用匿名用户,使用本地用户并赋于写权限

# No anonymous login 
anonymous_enable=NO 
# Let local users login 
# If you connect from the internet with local users, you should enable TLS/SSL/FTPS 
# 设定本地用户可以访问。注意:使用虚拟用户时,也要先开启此项。
local_enable=YES
# Write permissions 
write_enable=YES 

说明: 程序安装好的默认设置跟上面的设置一致,故未更改。作为一个非公共ftp,必须登录才能使用,因此需要禁止匿名访问。

2. 限制用户访问目录

2.1. 限制所有用户

chroot_local_user=YES
chroot_list_enable=NO

2.2. 限制部分用户(黑名单模式)

chroot_local_user=NO
chroot_list_enable=YES
# Create the file /etc/vsftpd.chroot_list with a list of the jailed users.
# 即所有在 /etc/vsftpd.chroot_list 中列出来的用户会被限制在固定目录中。

2.3. 仅开放部分用户(白名单模式)

chroot_local_user=YES
chroot_list_enable=YES
# Create the file /etc/vsftpd.chroot_list with a list of the "free" users.
# 即只有在 /etc/vsftpd.chroot_list 中列出来的用户不会被限制,可以自由访问目录。

说明: 由于我们目前的需求是所有(虚拟)用户的访问都要限定在特定的目录里,因此直接使用了第1种方式:限制所有用户的访问。

3. 虚拟用户相关设置

3.1. pam 认证

说到虚拟用户,不得不说 linux 的 pam 认证模块,它是通过配置的方式定义一系列的认证规则,非常灵活。pam 认证模块的详细介绍可以自行百度。

vsftpd 默认使用 pam 进行认证,以下是默认设置:

pam_service_name=vsftpd

这里的 vsftpd 是 pam 的服务名称,简单来说就是对应的配置文件名称,相应的配置路径为: /etc/pam.d/vsftpd 。(最终的配置文件名称要跟服务名称对应)

该配置文件默认是允许系统用户进行登录的。相应选项为:

@include common-account
@include common-session
@include common-auth

由于我们要使用虚拟用户,因此我们需要修改该配置文件:

# 注释掉其他选项,只留下自己的修改信息
# 使用 pam_userdb 模块进行认证,用户数据库文件为 /etc/vsftpd/access.db
auth	required	pam_userdb.so db=/etc/vsftpd/access
account	required	pam_userdb.so db=/etc/vsftpd/access
session	required	pam_loginuid.so

access.db 文件的生成方式:

# 1. 编辑账号和密码文件,格式为一行账号一行密码
vi /etc/vsftpd/access.txt
# 如以下内容定义了两个账号:ftp_user_1和ftp_user_2,密码分别为 ftp_password_1和ftp_password_2
ftp_user_1
ftp_password_1
ftp_user_2
ftp_password_2


# 2. 使用 db_load 工具生成 db 数据库文件。 db_load 工具需要安装 db-util 包。
db_load -T -t hash -f /etc/vsftpd/access.txt /etc/vsftpd/access.db

以上为虚拟账号的创建和认证

3.2. 虚拟账号相关设置

进行完以上设置后,还需要在 /etc/vsftpd.conf 的配置文件中加上一些额外设置

# 启用虚拟账号,必须开启guest
guest_enable=YES
# 虚拟账号使用本地权限
virtual_use_local_privs=YES
# 限制所有用户的访问路径(前文介绍过)
chroot_local_user=YES
# 以下两条为限制的具体路径
user_sub_token=$USER
local_root=/data/ftp_home/$USER
hide_ids=YES
# 允许写操作。(如果没有这条,客户端进行写操作时会有警告。)
allow_writeable_chroot=YES

4. 开启 SSL

# 开启 SSL 和定义证书路径
rsa_cert_file=/etc/ssl/certs/ftp_example_com.crt
rsa_private_key_file=/etc/ssl/private/ftp_example_com.key
ssl_enable=YES
 
 
# 强制匿名用户也使用 SSL。 (测试时,如果未开此选项,虚拟用户登录时未使用 SSL 方式。)
force_anon_data_ssl=YES
force_anon_logins_ssl=YES

5. 使用被动传输模式

# 使用被动传输模式,并限定端口为 12001~12002
pasv_enable=YES
pasv_min_port=12001
pasv_max_port=12002

6. 指明使用 utf8 编码进行传输

使用 filezilla 等 ftp 客户端时,默认字符集设置为自动检测,它检测服务器是否支持 utf8 ,不支持时回滚到本地编码。

使用以下设置,让服务器告诉客户端使用 utf8 字符集。

utf8_filesystem=YES