Linux, 应用部署

vsftpd的配置说明

FTP服务器是按照FTP协议在互联网上提供文件存储和访问服务的主机,FTP客户端则是向服务器发送连接请求,以建立数据传输链路的主机。FTP协议有下面两种工作模式:

主动模式:FTP服务器主动向客户端发起连接请求;

被动模式:FTP服务器等待客户端发起连接请求(默认工作模式);

vsftpd作为更加安全的文件传输协议服务程序,允许用户以3种认证模式登录FTP服务器

  • 匿名开放模式:是最不安全的一种认证模式,任何人都可以无须密码验证而直接登录到FTP服务器。
  • 本地用户模式:是通过Linux系统本地的账户密码信息进行认证的模式,相较于匿名开放模式更安全,而且配置起来也很简单。但是如果黑客破解了账户的信息,就可以畅通无阻地登录FTP服务器,从而完全控制整台服务器。
  • 虚拟用户模式:更安全的一种认证模式,它需要为FTP服务单独建立用户数据库文件,虚拟出用来进行密码验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的,仅供FTP服务程序进行认证使用。这样,即使黑客破解了账户信息也无法登录服务器,从而有效降低了破坏范围和影响。

vsftpd 配置文件

vsftpd 文件说明

# vsftpd 配置文件
- /etc/vsftpd/vsftpd.conf
- /etc/pam.d/vsftpd
- /etc/vsftpd/ftpusers
- /etc/vsftpd/user_list
- /etc/vsftpd/chroot_list
- /usr/sbin/vsftpd
- /var/ftp/

# vsftpd 文件作用说明
- vsftpd.conf: 核心配置文件, 由此文件衍生出其它配置文件;
- pam.d/vsftpd: 是 vsftpd 使用 PAM 模块时的相关配置文件;
- ftpusers: 是 PAM 模块 (/etc/pam.d/vsftpd) 所指定的那个无法登入的用户配置文件;
- user_list: 是 vsftpd 自定义的抵挡项目;
- chroot_list: 主要功能是可以将某些账号的使用者 chroot 在制定目录下;
- /sbin/vsftpd: vsftpd 的主要执行档;
- /var/ftp/: vsftpd 的预设匿名者登入的根目录;
  • ftpusers&user_list区别
# ftpusers 简介
- ftpusers 不受任何配制项的影响,它总是有效,它是一个黑名单;
- ftpusers 是一个禁止访问FTP的用户列表;列表中的用户不能访问FTP;
- ftpusers 是vsftpd服务在启动后已经决定的; ftpusers 文件只要存在, 则这个列表里面用户都不能访问FTP; 在 vsftpd.conf 配置中没有参数配置可以控制该文件存放;
- ftpusers: 通过限制账号(root、高权限账户)登录FTP, 防止登录账号权限过大, 不受限制下载重要文件;

# user_list 简介
- user_list是 `vsftpd.conf` 配置文件中的 userlist_enable 和 userlist_deny 两个配置相关;
- user_list文件可作为白名单文件使用, 也可作为黑名单文件使用; 具体使 `user_list` 作为白名单还是黑名单 可通过`vsftpd.conf` 配置文件中的 userlist_enable 和 userlist_deny 设置;
- 将 `vsftpd.conf` 配置文件中参数 userlist_deny 设置为 userlist_deny=NO , 那么user_list列表就变成了强制白名单;则只允许user_list文件列表内的用户访问, 拒绝其他人的访问;
- 当且仅当 `userlist_enable=YES` 时, userlist_deny配置项才有效, user_list文件才会被使用;


# 两者联系&区别
- user_list文件用户列表与ftpusers文件中用户列表格式相同;
- ftpusers和user_list没有任何关系; ftpusers文件总是生效,user_list文件是否生效取决于 vsftpd.conf 文件中userlist_enable 和 userlist_deny 选项;
  • userlist_enable&userlist_deny配置
userlist_enableuserlist_deny作用
NOYES|NOuser_list文件不生效;userlist_deny项为何值都是无效;
本地全体用户 ( 除去ftpusers中的用户 ) 都可以登入FTP;
YESYESuser_list作为黑名单使用;user_list文件中的用户都被拒绝登录FTP;
YESNOuser_list作为白名单使用;只有user_list文件中的用户都被允许登录FTP;

vsftpd.conf 参数

/etc/vsftpd/vsftpd.conf 本身就是一个挺详细的配置文件,且使用『 man 5 vsftpd.conf 』则可以得到完整的参数说明;这里依旧先对 vsftpd.conf 内的常用参数作说明。

  • 与服务器环境较相关的设定值
参数设定值默认值作用
connect_from_port_20=YES|NOYES指定FTP使用20端口进行数据传输
listen_port=2121设置FTP服务器建立连接所监听的端口
dirmessage_enable=YES|NOYES如果启动选项,第一次进入目录时,若有.message这个档案,则会出现此档案的内容,通常这个档案会放置欢迎话语,或是对该目录的说明;
message_file=.message.message设置目录消息文件,可将要显示的信息写入该文件。默认值为.message
listen=YES|NOYES设置vsftpd服务器是否以standalone模式运行,YES表示以standalone模式运行
pasv_enable=YES|NOYES是否使用PASV工作模式(被动模式)
use_localtime=YES|NONOvsftpd使用本机时间作为vsftpd时间;
默认为显示格林威治时间(GMT);
write_enable=YES|NOYES允许登陆用户有写权限;属于全局设置,默认值为YES。
connect_timeout=6060PORT 方式下服务端主动建立数据连接的超时时间,单位为秒
accept_timeout=6060服务端被动接受FTP连接的超时时间,单位为秒
data_connection_timeout=120300建立FTP数据连接的超时时间,单位为秒
idle_session_timeout=300300多长时间不对FTP服务器进行任何操作,则断开该FTP连接,单位为秒
max_clients=00vsftpd允许的最大连接数,默认值为0,表示不受限制
max_per_ip=00设置每个IP允许与FTP服务器同时建立连接的数目,默认值为0,表示不受限制
pasv_min_port=0, pasv_max_port=0pasv_min_port:0
pasv_max_port:0
在PASV工作模式下,数据连接可以使用的端口范围的最小端口,0 表示任意端口;
在PASV工作模式下,数据连接可以使用的端口范围的最大端口,0 表示任意端口;
ftpd_banner=文字说明NULL用来定义欢迎话语的字符串,而ftpd_banner 则是字符串的形式
banner_file=/path/fileNULL用来定义欢迎话语的字符串,banner_file是档案的形式
  • 与实体用户较相关的设定值
参数设定值默认值作用
guest_enable=YES|NONO启用虚拟用户
guest_username=ftpftp用来映射虚拟用户
local_enable=YES|NOYES控制是否允许本地用户登入,YES 为允许本地用户登入,NO为不允许
local_max_rate=00本地用户使用的最大传输速度,单位为B/s,0 表示不限制速度
chroot_local_user=YES|NONO用于指定用户列表文件中的用户是否允许切换到上级目录
chroot_list_enable=YES|NONO设置是否启用chroot_list_file配置项指定的用户列表文件
chroot_list_file=/etc/vsftpd.chroot_list用于指定用户列表文件, 该文件用于控制用户可以切换到用户家目录的上级目录
userlist_enable=YES|NONO是否启用vsftpd.user_list文件
userlist_deny=YES|NOYES决定vsftpd.user_list文件中的用户是否能够访问FTP服务器;
设置为YES,则vsftpd.user_list文件中的用户不允许访问FTP;
若设置为NO,则只有vsftpd.user_list文件中的用户才能访问FTP;
userlist_file=/etc/vsftpd/user_listNO控制用户访问FTP的文件,里面写着用户名称。一个用户名称一行
  • 与匿名用户登录相关的设定值
参数设定值默认值作用
anonymous_enable=YES|NOYES控制是否允许匿名用户登入,YES 为允许匿名登入,NO 为不允许
anon_world_readable_only=YES|NOYES如果设为YES,则允许匿名登入者下载可阅读的文件
anon_other_write_enable=YES|NONO允许匿名登入者拥有上传或者建立目录之外的权限;如,删除或者重命名;
anon_upload_enable=NO,则匿名用户不能上传文件,但可删除或重命名已经存在的文件;
anon_mkdir_write_enable=NO,则匿名用户不能上传或者新建文件夹,但可以删除或者重命名已经存在的文件夹;
anon_mkdir_write_enable=YES|NONO允许匿名登入者有新增目录的权限,只有在write_enable=YES时,此项才有效;
匿名用户必须要有对上层目录的写入权;
anon_upload_enable=YES|NONO允许匿名登入者有上传文件(非目录)的权限,只有在write_enable=YES时,此项才有效;
匿名用户必须要有对上层目录的写入权;
deny_email_enable=YES|NONO启动这项功能,则必须提供一个档案/etc/vsftpd/banner_emails,内容为email address;
若是使用匿名登入,则会要求输入email address;
若输入的email address 在此档案内,则不允许进入;
banned_email_file=/etc/vsftpd/banned_emails/etc/vsftpd.banned_emails用来输入email address,只有在deny_email_enable=YES时,才会使用到此文件;
若是使用匿名登入,则会要求输入email address,若输入的email address 在此档案内,则不允许进入;
no_anon_password=YES|NONO启动这项功能,则使用匿名登入时,不会询问密码
anon_max_rate=00设置匿名登入者使用的最大传输速度,单位为B/s,0 表示不限制速度
anon_umask=077077设置匿名登入者新增或上传档案时的umask 值
  • 与 vsftpd 系统安全相关的设定值
参数设定值默认值作用
ascii_download_enable=YES|NONO设置是否启用ASCII 模式下载数据
ascii_upload_enable=YES|NONO设置是否启用ASCII 模式上传数据
one_process_model=YES|NOYES每个连接一个进程,会过多的使用系统资源
tcp_wrappers=YES|NOYES设置vsftpd是否与tcp wrapper相结合来进行主机的访问控制;
启用,则vsftpd会检查/etc/hosts.allow 和/etc/hosts.deny 中的配置,来决定请求连接的主机,是否允许访问该FTP服务器;
xferlog_enable=YES|NOYES是否启用上传/下载日志记录;
启用,则上传与下载的信息将被完整纪录在xferlog_file 所定义的文件中;
xferlog_file=/var/log/xferlog/var/log/vsftpd.log设置日志文件名和路径
xferlog_std_format=YES|NONO启用,则日志文件将会写成xferlog的标准格式,如同wu-ftpd 一般
dual_log_enable=YES|NO, vsftpd_log_file=/var/log/vsftpd.log/var/log/vsftpd.log编写vsftpd样式日志文件的文件的名称;
仅当 设置了选项xferlog_enable并且未设置xferlog_std_format时, 才会写入此日志;
或,如果已设置选项dual_log_enable,则会写入;
如果设置了 syslog_enable,则不会写入此文件,而是将输出发送到系统日志;
nopriv_user=nobodyvsftpd在完全没有特权的情况下使用的用户名;
这应该是专用用户,而不是任何人
pam_service_name=vsftpd/etc/pam.d/vsftpd设置PAM使用的名称

上面这些是常见的 vsftpd 的设定参数,还有很多参数没有列出来,可以使用 man 5 vsftpd.conf 查阅。

vsftpd 认证模式

vsftpd作为更加安全的文件传输协议服务程序,允许用户以3种认证模式登录FTP服务器。

匿名开放模式:是最不安全的一种认证模式,任何人都可以无须密码验证而直接登录到FTP服务器。

本地用户模式:是通过Linux系统本地的账户密码信息进行认证的模式,相较于匿名开放模式更安全,而且配置起来也很简单。但是如果黑客破解了账户的信息,就可以畅通无阻地登录FTP服务器,从而完全控制整台服务器。

虚拟用户模式:更安全的一种认证模式,它需要为FTP服务单独建立用户数据库文件,虚拟出用来进行密码验证的账户信息,而这些账户信息在服务器系统中实际上是不存在的,仅供FTP服务程序进行认证使用。这样,即使黑客破解了账户信息也无法登录服务器,从而有效降低了破坏范围和影响。

匿名开放、本地用户、虚拟用户模式,具体使用哪一种模式直接到以下对应的过程部分配置即可;

文件路径作用
/etc/vsftpd/vsftpd.confvsftpd的核心配置文件;
/etc/vsftpd/ftpusers黑名单文件,此文件中的用户不允许访问FTP服务器;
/etc/vsftpd/user_list是黑、白名单文件,具体作为黑名单文件还是白名单文件由 vsftpd.conf 中 userlist_enable、serlist_deny 两个参数决定。

匿名开放模式

vsftpd服务程序默认关闭了匿名开放模式,匿名开放模式常用的权限参数以及作用如下所示:

参数设定值作用
anonymous_enable=YES允许匿名访问模式
anon_umask=022匿名用户上传文件的umask值
anon_upload_enable=YES允许匿名用户上传文件
anon_mkdir_write_enable=YES允许匿名用户创建目录
anon_other_write_enable=YES允许匿名用户修改目录名称或删除目录
anon_world_readable_only=YES文件的其他人必须有读的权限才允许下载
anon_root=/var/ftp匿名用户的FTP根目录
anon_max_rate=0匿名用户的最大传输速率(字节/秒),0为不限制
  • 备份 vsftp.conf 文件
$ mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
$ grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf
$ cat /etc/vsftpd/vsftpd.conf
  • 配置 vsftpd.conf 文件
$ vi vsftpd.conf
# 与匿名者有关的信息
## 支持匿名者的登入使用 FTP 功能
anonymous_enable=YES

# 与实体用户有关的设定
## 支持本地端的实体用户登入
local_enable=YES
## 允许用户上传数据 (包括文件与目录)
write_enable=YES
## 建立新目录 (755) 与文件 (644) 的权限
local_umask=022

# 与服务器环境有关的设定
## 若目录下有 .message 则会显示该文件的内容
dirmessage_enable=YES
## 启动登录文件记录,记录于 /var/log/xferlog
xferlog_enable=YES
## 支持主动式联机功能
connect_from_port_20=YES
## 支持 WuFTP 的登录档格式
xferlog_std_format=YES
## 使用 stand alone 方式启动 vsftpd
listen=YES
## 支持 PAM 模块的管理
pam_service_name=vsftpd
## 支持 /etc/vsftpd/user_list 档案内的账号登入管控
userlist_enable=YES
## 支持 TCP Wrappers 的防火墙机制
tcp_wrappers=YES

通过以上各项配置,该 vsftpd 可以达到的功能如下:

  • 可以使用 anonymous 这个匿名账号或其他实体账号 (/etc/passwd) 登入;
  • anonymous 的家目录在 /var/ftp ,且无上传权限,亦已经被 chroot 了;
  • 实体用户的家目录参考 /etc/passwd,并没有被 chroot,可前往任何有权限可进入的目录中;
  • 任何于 /etc/vsftpd/ftpusers 内存在的账号均无法使用 vsftpd (PAM);
  • 可利用 /etc/hosts.{allow|deny} 来作为基础防火墙;
  • 当客户端有任何上传/下载信息时,该信息会被纪录到 /var/log/xferlog 中;
  • 主动式联机的埠口为 port 20;
  • 使用格林威治时间 (GMT)。

本地用户模式

Linux系统本地的账户密码信息进行认证的模式,相较于匿名开放模式更安全,而且配置起来也很简单;本地用户模式常用的权限参数以及作用如下所示:

参数设定值作用
local_enable=YES允许本地用户登录FTP
local_umask=022本地用户上传文件的umask值
local_root=/var/ftp本地用户的FTP根目录
local_max_rate=0本地用户最大传输速率(字节/秒),0为不限制
write_enable=YES设置可写权限
chroot_local_user=YES将用户权限禁锢在FTP目录,以确保安全
userlist_deny=YES启用“禁止用户名单”,名单文件为ftpusers和user_list
userlist_enable=YES开启作用名单user_list文件功能
$ mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
$ grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf
$ cat /etc/vsftpd/vsftpd.conf
  • 设置SELinux域允许策略
$ getsebool -a | grep ftp
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_home_dir --> off
# 使vsftpd 具有访问ftp根目录,以及文件传输等权限
$ setsebool -P ftpd_full_access=on
  • 创建 banner.txt 文件&配置 vsftpd.conf 文件
$ touch banner.txt

$ vi vsftpd.conf
# 与匿名者有关的信息
## 取消匿名者的登入功能
anonymous_enable=NO

# 与实体用户有关的设定
## 支持本地端的实体用户登入
local_enable=YES
## 允许用户上传数据 (包括文件与目录)
write_enable=YES
## 建立新目录 (755) 与文件 (644) 的权限
local_umask=022
userlist_enable=YES
userlist_deny=YES
## 该文件必须存在 vsftpd 默认就存在该文件
userlist_file=/etc/vsftpd/user_list

# 与服务器环境有关的设定
## 使用服务器本地时间
use_localtime=YES
## 若目录下有 .message 则会显示该文件的内容
dirmessage_enable=YES
## 启动登录文件记录,记录于 /var/log/xferlog
xferlog_enable=YES
## 支持主动式联机功能
connect_from_port_20=YES
## 支持 WuFTP 的登录档格式
xferlog_std_format=YES
## 使用 stand alone 方式启动 vsftpd
listen=YES
## 支持 PAM 模块的管理
pam_service_name=vsftpd
## 支持 TCP Wrappers 的防火墙机制
tcp_wrappers=YES
## ftp登录界面的 banner 标识 该文件需存在,否则会出错
banner_file=/etc/vsftpd/banner.txt

通过以上各项配置,该 vsftpd 可以达到的功能如下:

  • 希望使用本地时间取代 GMT 时间;
  • 用户登入时显示一些欢迎讯息的信息;
  • 系统账号不可登入主机 (亦即 UID 小于 500 以下的账号);
  • 一般实体用户可以进行上传、下载、建立目录及修改档案等动作;
  • 用户新增的档案、目录之 umask 希望设定为 002;
  • 存在 user_list 和 ftpusers 文件中的用户 不可登录 FTP;
  • 其他主机设定值保留默认值即可。
  • 在以上基础再建立限制系统账号登入

针对系统账号来给予阻拦的机制,其实有两个文件;一个是 PAM 模块,另一个是 vsftpd 主动提供的, 在预设的情况下这两个文件分别是:

  • /etc/vsftpd/ftpusers: 是 /etc/pam.d/vsftpd 这个文件的参数设置所影响;
  • /etc/vsftpd/user_list: 由 vsftpd.conf 的 userlist_file 所设置;
$ vi /etc/vsftpd/user_list
root
......

$ ftp 192.168.188.68
Trying 192.168.188.68...
Connected to localhost (192.168.188.68).
hosystem FTP-banner test;
220
Name (localhost:root): student
331 Please specify the password.
Password:  <==输入密码啰在这里!
500 OOPS: cannot change directory:/home/student  # 出现该错误到问题汇总中寻找答案
Login failed.
ftp> bye
221 Goodbye.

虚拟用户模式

虚拟用户模式是这3种模式中最安全的一种认证模式,是专门创建出一个账号来登录FTP传输服务的,而且这个账号不能用于以SSH方式登录服务器;

参数设定值作用
anonymous_enable=NO禁止匿名开放模式
local_enable=YES允许本地用户模式(虚拟用户模式也是使用本地的virtual用户登录)
guest_enable=YES开启虚拟用户模式
guest_username=virtual指定虚拟用户账户
pam_service_name=vsftpd.vu指定PAM文件
allow_writeable_chroot=YES允许对禁锢的FTP根目录执行写入操作,而且不拒绝用户的登录请求
local_root=/var/market 指定虚拟用户的默认目录
anon_world_readable_only=NO关闭只读模式
write_enable=YES允许写入
anon_umask=022指定新建文件的umask
  • 备份vsftp配置文件
$ mv /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf_bak
$ grep -v "#" /etc/vsftpd/vsftpd.conf_bak > /etc/vsftpd/vsftpd.conf
$ cat /etc/vsftpd/vsftpd.conf
  • 创建用于进行FTP认证的用户数据库文件
# 创建用于进行FTP认证的用户数据库文件
# 奇数行为账户名, 偶数行为密码
# 该用户不需要
$ vi /etc/vsftpd/vuser.list
ftpuser
ftpuser123.
test
test123

原始的明文信息文件转换成数据库文件

由于明文信息既不安全,也不符合让vsftpd服务程序直接加载的格式,因此需要使用db_load命令用哈希(hash)算法将原始的明文信息文件转换成数据库文件,并且降低数据库文件的权限(避免其他人看到数据库文件的内容),然后再把原始的明文信息文件删除。

# 明文转密文
$ db_load -T -t hash -f /etc/vsftpd/vuser.list /etc/vsftpd/vuser.db

# 赋予密文文件权限
$ chmod 600 vuser.db

# 删除明文文件 不强制要求,但推荐删除
$ rm -rf vuser.list
  • 创建vsftpd服务程序用于存储文件的根目录以及用于虚拟用户映射的系统本地用户

vsftpd服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置;

由于Linux系统中的每一个文件都有所有者、所属组属性,例如使用虚拟账户“张三”新建了一个文件,但是系统中找不到账户“张三”,就会导致这个文件的权限出现错误;为此,让虚拟用户默认登录到与之有映射关系的这个系统本地用户的家目录中;

虚拟用户创建的文件的属性也都归属于这个系统本地用户,从而避免Linux系统无法处理虚拟用户所创建文件的属性权限

创建vsftpd服务程序用于存储文件的根目录以及用于虚拟用户映射的系统本地用户;

把这个系统本地用户的家目录设置为/var目录(该目录用来存放经常发生改变的数据);并且为了安全起见,将这个系统本地用户设置为不允许登录FTP服务器,这不会影响虚拟用户登录,而且还能够避免黑客通过这个系统本地用户进行登录;

# -s /sbin/nologin: 表示virtual禁止通过ssh登录
$ useradd -d /var/ftproot -s /sbin/nologin virtual
$ ls -ld /var/ftproot/
$ chmod -Rf 755 /var/ftproot/
  • 建立用于支持虚拟用户的PAM文件

新建一个用于虚拟用户认证的PAM文件vsftpd.vu,其中PAM文件内的“db=”参数为使用db_load命令生成的账户密码数据库文件的路径,但不用写数据库文件的后缀

$ vi /etc/pam.d/vsftpd.vu
auth       required     pam_userdb.so db=/etc/vsftpd/vuser
account    required     pam_userdb.so db=/etc/vsftpd/vuser
  • 在vsftpd服务程序的主配置文件中通过pam_service_name参数将PAM认证文件的名称修改为vsftpd.vu

配置文件 vsftpd.conf 中默认就带有参数pam_service_name=vsftpd,表示登录FTP服务器时是根据/etc/pam.d/vsftpd文件进行安全认证的;

$ vi /etc/vsftpd/vsftpd.conf
# 重要!!!!!!
## 禁止匿名开放模式
anonymous_enable=NO
## 允许本地用户模式
local_enable=YES
## 设置可写权限
write_enable=YES
## 开启虚拟用户模式
guest_enable=YES
## 指定虚拟用户账户
guest_username=virtual
## 允许对禁锢的FTP根目录执行写入操作,而且不拒绝用户的登录请求
allow_writeable_chroot=YES
## 指定PAM文件
pam_service_name=vsftpd.vu

# 本地用户模式创建文件的umask值
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
listen_ipv6=NO
userlist_enable=YES
# user_config_dir参数来定义这两个虚拟用户不同权限的配置文件所存放的路径
user_config_dir=/etc/vsftpd/vusers_dir
  • 为虚拟用户设置不同的权限

创建 ftpuser 和 test 两个账户;

  • ftpuser权限:上传、创建、修改、查看、删除文件;
  • test权限:只允许查看文件;
# 创建 vusers_dir 目录
$ mkdir /etc/vsftpd/vusers_dir/

# 创建 ftpuser 用户
$ vi /etc/vsftpd/vusers_dir/ftpuser
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

# 创建 test 用户
$ touch /etc/vsftpd/vusers_dir/test
  • 设置SELinux域允许策略,然后使用虚拟用户模式登录FTP服务器
$ getsebool -a | grep ftp
ftpd_anon_write --> off
ftpd_connect_all_unreserved --> off
ftpd_connect_db --> off
ftpd_full_access --> off
ftpd_use_cifs --> off
ftpd_use_fusefs --> off
ftpd_use_nfs --> off
ftpd_use_passive_mode --> off
httpd_can_connect_ftp --> off
httpd_enable_ftp_server --> off
tftp_anon_write --> off
tftp_home_dir --> off

# 使vsftpd 具有访问ftp根目录,以及文件传输等权限
$ setsebool -P ftpd_full_access=on
  • 登录
$ ftp ip
连接到 192.168.188.68。
220 (vsFTPd 3.0.2)
200 Always in UTF8 mode.
用户(192.168.188.118:(none)): test
331 Please specify the password.
密码: test
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> 

vsftpd 配置模板

vsftpd 基础模板

该配置模板,可实现 vsftpd 以下功能:

- 可以使用 anonymous 这个匿名账号或其他实体账号 (/etc/passwd) 登入;
- anonymous 的家目录在 /var/ftp ,且无上传权限,亦已经被 chroot 了;
- 实体用户的家目录参考 /etc/passwd,并没有被 chroot,可前往任何有权限可进入的目录中;
- 任何于 /etc/vsftpd/ftpusers 内存在的账号均无法使用 vsftpd (PAM);
- 可利用 /etc/hosts.{allow|deny} 来作为基础防火墙;
- 当客户端有任何上传/下载信息时,该信息会被纪录到 /var/log/xferlog 中;
- 主动式联机的埠口为 port 20;
- 使用格林威治时间 (GMT)。

配置 vsftpd.conf 文件

# 与匿名者有关的信息
anonymous_enable=YES

# 与实体用户有关的设定
local_enable=YES
write_enable=YES
local_umask=022

# 与服务器环境有关的设定
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES

vsftpd 实体限制模板

该配置模板,可实现 vsftpd 以下功能:

- 希望使用本地时间取代 GMT 时间;
- 用户登入时显示一些欢迎讯息的信息;
- 系统账号不可登入主机 (亦即 UID 小于 500 以下的账号);
- 一般实体用户可以进行上传、下载、建立目录及修改档案等动作;
- 用户新增的档案、目录之 umask 希望设定为 002;
- 存在 user_list 和 ftpusers 文件中的用户 `不可登录` FTP;
- 其他主机设定值保留默认值即可。

配置 vsftpd.conf 文件

# 与匿名者有关的信息
## 取消匿名者的登入功能
anonymous_enable=NO

# 与实体用户有关的设定
## 支持本地端的实体用户登入
local_enable=YES
## 允许用户上传数据 (包括文件与目录)
write_enable=YES
## 建立新目录 (755) 与文件 (644) 的权限
local_umask=022
userlist_enable=YES
userlist_deny=YES
## 该文件必须存在 vsftpd 默认就存在该文件
userlist_file=/etc/vsftpd/user_list

# 与服务器环境有关的设定
## 使用服务器本地时间
use_localtime=YES
## 若目录下有 .message 则会显示该文件的内容
dirmessage_enable=YES
## 启动登录文件记录,记录于 /var/log/xferlog
xferlog_enable=YES
## 支持主动式联机功能
connect_from_port_20=YES
## 支持 WuFTP 的登录档格式
xferlog_std_format=YES
## 使用 stand alone 方式启动 vsftpd
listen=YES
## 支持 PAM 模块的管理
pam_service_name=vsftpd
## 支持 TCP Wrappers 的防火墙机制
tcp_wrappers=YES

vsftpd 仅匿名登录相关设定

该配置模板,可实现 vsftpd 以下功能:

- 使用本地的时间, 而非 GMT 时间;
- 提供欢迎讯息, 说明可提供下载的信息;
- 仅开放 anonymous 的登入, 且不需要输入密码;
- 文件传输的速限为 1 Mbytes/second;
- 数据连接的过程 (不是命令通道!) 只要超过 60 秒没有响应, 就强制 Client 断线!
- 只要 anonymous 超过十分钟没有动作, 就予以断线;
- 最大同时上线人数限制为 50 人, 且同一 IP 来源最大联机数量为 5 人;
- 预设的 FTP 匿名者的根目录所在: ftp 账号的家目录。

配置 vsftpd.conf 文件

# 与匿名者有关的信息
## 支持匿名者的登入使用 FTP 功能
anonymous_enable=YES

# 与实体用户有关的设定
## 支持本地端的实体用户登入
local_enable=YES
## 允许用户上传数据 (包括文件与目录)
write_enable=YES
## 建立新目录 (755) 与文件 (644) 的权限
local_umask=022

# 与服务器环境有关的设定
## 若目录下有 .message 则会显示该文件的内容
dirmessage_enable=YES
## 启动登录文件记录,记录于 /var/log/xferlog
xferlog_enable=YES
## 支持主动式联机功能
connect_from_port_20=YES
## 支持 WuFTP 的登录档格式
xferlog_std_format=YES
## 使用 stand alone 方式启动 vsftpd
listen=YES
## 支持 PAM 模块的管理
pam_service_name=vsftpd
## 支持 /etc/vsftpd/user_list 档案内的账号登入管控
userlist_enable=YES
## 支持 TCP Wrappers 的防火墙机制
tcp_wrappers=YES

问题汇总

问题一:

问题描述:

vsftpd搭建完成后,通过cmd可以连接;通过xftp软件连接就出现无法显示远程文件夹

问题原因:

FTP协议有两种工作模式,一种是主动模式、另外一种是被动模式。搭建过程中,工作模式和xftp连接模式不一致导致。

问题解决:

  • 方式一:
将配置改成相反模式;如,主动模式就改为被动模式;被动模式就改为主动模式 
  • 方式二:
在xftp属性中选项,将连接的方式勾选项去掉

问题二:

问题描述:

在 vsftpd.conf 配置完成后,通过 systemctl start vsftpd 启动 vsftpd 服务,出现以下错误信息:

Job for vsftpd.service failed because the control process exited with error code. See "systemctl status vsftpd.service" and "journalctl -xe" for details.

通过 systemctl status vsftpd 查看错误信息:

$ systemctl status vsftpd
● vsftpd.service - Vsftpd ftp daemon
   Loaded: loaded (/usr/lib/systemd/system/vsftpd.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Wed 2022-08-24 23:35:16 CST; 20s ago
  Process: 21696 ExecStart=/usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf (code=exited, status=1/FAILURE)

Aug 24 23:35:13 node1.hos.cn systemd[1]: Starting Vsftpd ftp daemon...
Aug 24 23:35:16 node1.hos.cn systemd[1]: vsftpd.service: control process exited, code=exited status=1
Aug 24 23:35:16 node1.hos.cn systemd[1]: Failed to start Vsftpd ftp daemon.
Aug 24 23:35:16 node1.hos.cn systemd[1]: Unit vsftpd.service entered failed state.
Aug 24 23:35:16 node1.hos.cn systemd[1]: vsftpd.service failed.

问题原因:

通过 netstat -natp|grep 21 检查端口情况,发现端口可能被占用了;

问题解决:

通过 netstat -natp|grep 21 查询进程pid,通过 kill -9 pid 进行关闭;

$ netstat -natp|grep 21
tcp6       0      0 :::21                   :::*                    LISTEN      21158/vsftpd

$ kill -9 21158

问题三:

问题描述:

vsftpd搭建完成后,通过ftp连接;发现上传文件的时间都会比本地时间慢八个小时。

问题原因:

在 vsftpd.conf 文件中,没有配置使用本地时间;vsftpd.conf 默认使用格林威治时间(GMT)。

问题解决:

在 vsftpd.conf文件中,加入参数 use_localtime=YES 使用本地时间即可;

$ vi /etc/vsftpd/vsftpd.conf
......
use_localtime=YES

$ systemctl restart vsftpd

问题四:

问题描述:

在 vsftpd 搭建完成后,通过ftp命令方式连接;发现ftp连接失败,且出现以下错误信息:

$ ftp 192.168.188.68
连接到 192.168.188.68。
500 OOPS: cannot read banner file:/etc/vsftpd/welcome.txt
远程主机关闭连接。

问题原因:

在配置 vsftpd.conf 时,使用了 banner_file=/etc/vsftpd/banner.txt 参数,但是 banner.txt 文件并不存在;导致通过命令方式连接ftp时出现错误;

问题解决:

在 banner_file=/etc/vsftpd/banner.txt 指定路径下创建 banner.txt 并重启 vsftpd 服务;

$ vi /etc/vsftpd/banner.txt
hosystem FTP-banner test;

$ systemctl restart vsftpd

$ ftp 192.168.188.68
连接到 192.168.188.68;
220-hosystem FTP-banner test;
220
200 Always in UTF8 mode.

问题五:

问题描述:

在 vsftpd.conf 配置中,使用本地用户模式;发现登录FTP时,出现以下错误信息:

Connected to 192.168.188.68 (192.168.188.68).
220 (vsFTPd 3.0.2)
Name (192.168.188.68:root): root
530 Permission denied.
Login failed.
ftp> 
问题原因:
  • 原因一:user_list 和 ftpuser 共同作用限制了登录账户;
  • 原因二:登录FTP账户的 shell 被定向为/sbin/nologin
$ cat /etc/passwd
test:x:1003:1003::/var/ftproot/:/sbin/nologin

问题解决:

  • 方法一:添加 /sbin/nologin 到 /etc/shells 文件中
$ echo "/sbin/nologin" >> /etc/shells
  • 方法二:修改 /etc/pam.d/vsftpd 文件
$ vi /etc/pam.d/vsftpd
...
# 方式一: 将 auth required pam_shells.so 注释掉
#auth required pam_shells.so

# 方式二: 将 auth required pam_shells.so 修改为 auth required pam_nologin.so
auth required pam_nologin.so
...

注意事项:

1、建议关闭selinux。
2、local user 默认需要有shell登录的权限,否则无法登录ftpserver。
3、开启chroot_local_user=YES后ftp根目录需要755权限,且根目录的拥有者不能是登录人。

配置样例:

需求描述
采用 FTP 虚拟用户的方式,添加三个用户
devadm、sales、salesadm
用户访问及文件权限控制
开放匿名访问,任何用户均可下载服务器/var/ftp/soft/目录中资料
用户 devadm 可对服务器的/var/ftp/soft/目录上传、删除操作
用户 sales 可下载服务器/var/market/目录中资料
用户 salesadm 可对服务器/var/market/目录进行上传、删除操作
所有通过 FTP 上传的文件,均去除非属主位的写权限
对服务器中没有明确授权的其他目录,禁止任何用户访问
[root@T1 ftp]# grep -v "^#" /etc/vsftpd/vsftpd.conf  | grep -v "^$"
anonymous_enable=YES
local_enable=YES
write_enable=YES
local_umask=022
anon_umask=022
guest_enable=YES
guest_username=test1
anon_upload_enable=YES
anon_mkdir_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
anon_root=/var/ftp/soft
listen=YES
listen_ipv6=NO
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES
allow_writeable_chroot=YES
user_config_dir=/etc/vsftpd/vusers_dir
max_clients=150
max_per_ip=5
[root@T1 ftp]# grep -v "^#" /etc/pam.d/vsftpd 
auth       required     pam_userdb.so db=/etc/vsftpd/vusers
account    required     pam_userdb.so db=/etc/vsftpd/vusers
[root@T1 ftp]# grep -v "^#" /etc/vsftpd/vusers_dir/*
devadm:anon_mkdir_write_enable=yes
devadm:anon_other_write_enable=yes
devadm:write_enable=yes
devadm:anon_umask=022
devadm:local_root=/var/ftp/soft

sales:anon_world_readable_only=NO
sales:anon_umask=022
sales:local_root=/var/market
sales:anon_max_rate=100000

salesadm:anon_umask=022
salesadm:local_root=/var/market
salesadm:anon_mkdir_write_enable=yes
salesadm:anon_other_write_enable=yes
salesadm:write_enable=yes
salesadm:anon_max_rate=200000
[root@T1 ftp]# cat /etc/passwd | grep test1
test1:x:1000:1002::/home/test1:/sbin/nologin
[root@T1 ftp]# ll ../market -d
drwxrwxrwx 2 root root 45 Oct 30 18:43 ../market
[root@T1 ftp]# ll
total 0
drwxr-xr-x 2 test1 root 24 Oct 31 09:43 /var/ftp/soft

Leave a Reply