vsftpd 操作手册-完整版

vsftpd

目录
- ftp 简介
- vsftpd 简介
- vsftpd 安装&卸载
- vsftpd 配置文件
- vsftpd 认证模板
- vsftpd 配置模板

目录详解
- ftp 简介: 简单介绍 ftp 协议;
- vsftpd 简介: 介绍 vsftpd & 为什么使用vsftpd;
- vsftpd 安装&卸载: vsftpd安装&卸载;
- vsftpd 配置文件: 主要介绍与 vsftpd 相关的配置文件信息;
- vsftpd 认证模板: 在服务器上如何配置&使用 vsftpd 服务 (若想直接使用,则直接看该部分);
- vsftpd 配置模板: 常使用的 vsftpd.conf 配置模板, 可快速配置 vsftpd.conf ;

一般来讲,人们将计算机联网的首要目的就是获取资料,而文件传输是一种非常重要的获取资料的方式。

FTP是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用20、21号端口,其中端口20用于进行数据传输,端口21用于接受客户端发出的相关FTP命令与参数。

FTP服务器普遍部署于内网中,具有容易搭建、方便管理的特点,有些FTP客户端工具还可以支持文件的多点下载以及断点续传技术。

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

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

由于FTP、HTTP、Telnet等协议的数据都是使用明文进行传输的,因此从设计上就是不可靠的。

为了满足以密文方式传输文件的需求,发明了vsftpd服务程序。

vsftpd(very secure ftp daemon,非常安全的FTP守护进程)是一款运行在Linux操作系统上的FTP服务程序,不仅完全开源而且免费。此外,它还具有很高的安全性、传输速度,以及支持虚拟用户验证等其他FTP服务程序不具备的特点。在不影响使用的前提下,管理者可以自行决定客户端是采用匿名开放、本地用户还是虚拟用户的验证方式来登录vsftpd服务器。这样即便黑客拿到了虚拟用户的账号密码,也不见得能成功登录vsftpd服务器。

vsftpd 是为了建构一个安全为主的 FTP 服务器, vsftpd 针对操作系统的 程序的权限 (privilege) 概念来设计;

vsftpd 也支持 chroot 功能,chroot 顾名思义就是 change root directory 的意思,root 指的是根目录而非系统管理员;chroot可以将用户的某个特定的目录变成根目录(家目录),所以与该目录没有关系的其他目录就不会被访问了;

vsftpd 这个服务的启动者身份为一般用户,所以对于 Linux 系统的权限较低,对于 Linux 系统的危害就相对的减低了;

绝大部分 ftp 会使用到的额外指令功能 (dir, ls, cd …) 都已经被整合到 vsftpd 主程序当中了,因此理论上 vsftpd 不需要使用到额外的系统提供的指令,所以在 chroot 的情况下,vsftpd 不但可以顺利运作,且不需要额外功能对于系统来说也比较安全;

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

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

  • 查看vsftpd

查看 vsftpd 是否已经安装
$ rpm -qa|grep vsftpd
  • vsftpd 安装
通过 yum 安装 vsftpd
$ yum install vsftpd -y
  • vsftpd 卸载
查看 vsftpd 信息
$ rpm -qa|grep vsftpd
vsftpd-3.0.2-29.el7_9.x86_64

通过 rpm -e 卸载 vsftpd
$ rpm -e vsftpd-3.0.2-29.el7_9.x86_64
出现以下消息 则手动删除 vsftpd 配置信息
warning: /etc/vsftpd/vsftpd.conf saved as /etc/vsftpd/vsftpd.conf.rpmsave
warning: /etc/vsftpd/user_list saved as /etc/vsftpd/user_list.rpmsave
warning: /etc/vsftpd/ftpusers saved as /etc/vsftpd/ftpusers.rpmsave

删除 vsftpd 配置文件
$ rm -rf /etc/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;
- ftpusers 是vsftpd服务在启动后已经决定的; ftpusers 文件只要存在, 则这个列表里面用户都不能访问FTP; 在 vsftpd.conf 配置中没有参数配置可以控制该文件存放;
- ftpusers: 是一个禁止访问FTP的用户列表;
- 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配置

本地全体用户 ( 除去ftpusers中的用户 ) 都可以登入FTP; YES YES user_list作为黑名单使用;user_list文件中的用户都被拒绝登录FTP; YES NO user_list作为白名单使用;只有user_list文件中的用户都被允许登录FTP;

结论:

  • 当 userlist_enable=NO 时 user_list列表不生效,列表内和列表外的用户都可登录;
  • 当 userlist_enable=YES,userlist_deny=YES 时user_list列表内的用户不可以登录,列表外用户可登录;
  • 当 userlist_enable=YES , userlist_deny=NO 时user_list 只允许列表以外的用户登录,并且必需是以命令行的方式;

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

  • 与服务器环境较相关的设定值

参数设定值 默认值 作用 connect_from_port_20=YES|NO YES 指定FTP使用20端口进行数据传输 listen_port=21 21 设置FTP服务器建立连接所监听的端口 dirmessage_enable=YES|NO YES 如果启动选项,第一次进入目录时,若有.message这个档案,则会出现此档案的内容,通常这个档案会放置欢迎话语,或是对该目录的说明; message_file=.message .message 设置目录消息文件,可将要显示的信息写入该文件。默认值为.message listen=YES|NO YES 设置vsftpd服务器是否以standalone模式运行 pasv_enable=YES|NO YES 是否使用PASV工作模式(被动莫模式) use_localtime=YES|NO NO vsftpd使用本机时间作为vsftpd时间;

默认为显示格林威治时间(GMT); write_enable=YES|NO YES 允许登陆用户有写权限;属于全局设置,默认值为YES。 connect_timeout=60 60 PORT 方式下建立数据连接的超时时间,单位为秒 accept_timeout=60 60 建立FTP连接的超时时间,单位为秒 data_connection_timeout=120 300 建立FTP数据连接的超时时间,单位为秒 idle_session_timeout=300 300 多长时间不对FTP服务器进行任何操作,则断开该FTP连接,单位为秒 max_clients=0 0 vsftpd允许的最大连接数,默认值为0,表示不受限制 max_per_ip=0 0 设置每个IP允许与FTP服务器同时建立连接的数目,默认值为0,表示不受限制 pasv_min_port=0, pasv_max_port=0 pasv_min_port:0

pasv_max_port:0 在PASV工作模式下,数据连接可以使用的端口范围的最小端口,0 表示任意端口;

在PASV工作模式下,数据连接可以使用的端口范围的最大端口,0 表示任意端口; ftpd_banner=文字说明 NULL 用来定义欢迎话语的字符串,而ftpd_banner 则是字符串的形式 banner_file=/path/file NULL 用来定义欢迎话语的字符串,banner_file是档案的形式

  • 与实体用户较相关的设定值

参数设定值 默认值 作用 guest_enable=YES|NO NO 启用虚拟用户 guest_username=ftp ftp 用来映射虚拟用户 local_enable=YES|NO YES 控制是否允许本地用户登入,YES 为允许本地用户登入,NO为不允许 local_max_rate=0 0 本地用户使用的最大传输速度,单位为B/s,0 表示不限制速度 chroot_local_user=YES|NO NO 用于指定用户列表文件中的用户是否允许切换到上级目录 chroot_list_enable=YES|NO NO 设置是否启用chroot_list_file配置项指定的用户列表文件 chroot_list_file=/etc/vsftpd.chroot_list 用于指定用户列表文件, 该文件用于控制用户可以切换到用户家目录的上级目录 userlist_enable=YES|NO NO 是否启用vsftpd.user_list文件 userlist_deny=YES|NO YES 决定vsftpd.user_list文件中的用户是否能够访问FTP服务器;

设置为YES,则vsftpd.user_list文件中的用户不允许访问FTP;

若设置为NO,则只有vsftpd.user_list文件中的用户才能访问FTP; userlist_file=/etc/vsftpd/user_list NO 控制用户访问FTP的文件,里面写着用户名称。一个用户名称一行

  • 与匿名用户登录相关的设定值

参数设定值 默认值 作用 anonymous_enable=YES|NO YES 控制是否允许匿名用户登入,YES 为允许匿名登入,NO 为不允许 anon_world_readable_only=YES|NO YES 如果设为YES,则允许匿名登入者下载可阅读的文件 anon_other_write_enable=YES|NO NO 允许匿名登入者拥有上传或者建立目录之外的权限;如,删除或者重命名;

anon_upload_enable=NO,则匿名用户不能上传文件,但可删除或重命名已经存在的文件;

anon_mkdir_write_enable=NO,则匿名用户不能上传或者新建文件夹,但可以删除或者重命名已经存在的文件夹; anon_mkdir_write_enable=YES|NO NO 允许匿名登入者有新增目录的权限,只有在write_enable=YES时,此项才有效;

匿名用户必须要有对上层目录的写入权; anon_upload_enable=YES|NO NO 允许匿名登入者有上传文件(非目录)的权限,只有在write_enable=YES时,此项才有效;

匿名用户必须要有对上层目录的写入权; deny_email_enable=YES|NO NO 启动这项功能,则必须提供一个档案/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|NO NO 启动这项功能,则使用匿名登入时,不会询问密码 anon_max_rate=0 0 设置匿名登入者使用的最大传输速度,单位为B/s,0 表示不限制速度 anon_umask=077 077 设置匿名登入者新增或上传档案时的umask 值

  • 与 vsftpd 系统安全相关的设定值

参数设定值 默认值 作用 ascii_download_enable=YES|NO NO 设置是否启用ASCII 模式下载数据 ascii_upload_enable=YES|NO NO 设置是否启用ASCII 模式上传数据 one_process_model=YES|NO YES tcp_wrappers=YES|NO YES 设置vsftpd是否与tcp wrapper相结合来进行主机的访问控制;

启用,则vsftpd会检查

中的配置,来决定请求连接的主机,是否允许访问该FTP服务器; xferlog_enable=YES|NO YES 是否启用上传/下载日志记录;

启用,则上传与下载的信息将被完整纪录在xferlog_file 所定义的文件中; xferlog_file=/var/log/xferlog /var/log/vsftpd.log 设置日志文件名和路径 xferlog_std_format=YES|NO NO 启用,则日志文件将会写成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=nobody vsftpd在完全没有特权的情况下使用的用户名;

这应该是专用用户,而不是任何人 pam_service_name=vsftpd /etc/pam.d/vsftpd 设置PAM使用的名称

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

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

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

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

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

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

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

两个参数决定。

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文件功能

  • 备份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
  • 设置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:   bye
221 Goodbye.

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

参数设定值 作用 anonymous_enable=NO 禁止匿名开放模式 local_enable=YES 允许本地用户模式 guest_enable=YES 开启虚拟用户模式 guest_username=virtual 指定虚拟用户账户 pam_service_name=vsftpd.vu 指定PAM文件 allow_writeable_chroot=YES 允许对禁锢的FTP根目录执行写入操作,而且不拒绝用户的登录请求

  • 备份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
test
  • 原始的明文信息文件转换成数据库文件

由于明文信息既不安全,也不符合让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
  • 为虚拟用户设置不同的权限

创建 ftpusertest 两个账户;

  • 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 以下功能:

- 可以使用 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 以下功能:

- 希望使用本地时间取代 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 以下功能:

- 使用本地的时间, 而非 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
...

参考文档

Original: https://www.cnblogs.com/HOsystem/p/16629572.html
Author: HOsystem
Title: vsftpd 操作手册-完整版

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/607102/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Spring MVC处理日期字符串参数自动转换成后台Date类型

    当前台提交日期字符串到后台时,以字符串形式传输,若后台接收时采用Date类型,则会报格式转换错误的异常. 方式一: 将 @DateTimeFormat(pattern = &amp…

    Linux 2023年6月14日
    087
  • Google Drive, Onedrive, Dropbox green check marks missing; 修复 google 硬盘,同步符号错误

    最近使用google 硬盘的时候,Windows平台总是出现安装后文件夹不能显示同步符号,而mac平台就无上述错误; 我查了一下资料,发现是因为系统安装的同步软件有点多,Windo…

    Linux 2023年6月13日
    092
  • 嵌入式软件开发之程序架构设计-任务调度

    1 前言 在嵌入式MCU软件开发过程中,程序任务调度架构的搭建尤为重要,直接关系到该程序能支持多少功能(随着功能越多系统响应能力越弱,好的任务调度架构能够在保持相同的系统响应能力前…

    Linux 2023年6月7日
    0108
  • LeetCode-349. 两个数组的交集

    题目来源 题目详情 给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1: 输入: n…

    Linux 2023年6月7日
    066
  • Python Django构建简易CMDB

    前言 本文仅是对以前写的小示例进行一次梳理和代码优化,由于本人菜鸟一枚,前端,系统运维知识只知皮毛,后端python也没有实际开发经验,在开发过程中也没有考虑堡垒机等一系列服务器的…

    Linux 2023年6月7日
    0121
  • 性能测试—性能监控

    性能测试中,首先需要确定需求 测什么?怎么测?达到什么标准?。确定好性能测试的需要之后选择性能测试工具,jmeter或者LoadRunner。 分析是否需要分布式压测,如果需要分布…

    Linux 2023年6月8日
    060
  • docker:打包node+npm+pm2运行环境镜像

    最近公司有一个外包项目需要在不能连外网的情况下部署node项目到甲方公司内部。直接使用node官网的安装包可以获得node运行环境,但像pm2这种工具要离线装就会比较费劲,所以最终…

    Linux 2023年6月13日
    087
  • Github访问加速

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月8日
    073
  • Centos下使用containerd管理容器:5分钟从docker转型到containerd

    一.系统环境 二.前言 三.containerd 四.部署containerd 4.1 安装containerd 4.2 containerd配置文件 4.3 配置containe…

    Linux 2023年6月7日
    0144
  • 《Redis开发与运维》——(九)哨兵(脑图)

    posted @2021-01-09 15:09 雪山上的蒲公英 阅读(181 ) 评论() 编辑 / 返回顶部代码 / Original: https://www.cnblogs…

    Linux 2023年5月28日
    097
  • phpcms如何在前台文章列表前显示所属类别名称

    最近做单位网站模版遇到的问题,欲实现的效果: 但是phpcms中自带的文章列表标签没有这个功能,数据库中文章表中也只有类别id的字段,因此不能通过简单的{$r[catname]}读…

    Linux 2023年6月13日
    087
  • BKT的胡测题解:第一套第一题parts

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/Grharris/p/11530239.htmlAuth…

    Linux 2023年6月6日
    082
  • 正态分布

    用来计算连续变量的发生率,说的很抽象,简单说就是单独拿出来没什么太大用,但并不是说这个没什么用,相反这个太重要了,这玩意能让你看清世界的真相 先看个图,像这样的线性就是正太分布 正…

    Linux 2023年6月6日
    0103
  • 利用numpy实现list降维

    python读取数据库得到的事一个类似二维数组的list,有时候需要降维操作,numpy提供一个很有用的函数,可以直接使用 import numpy as np a = np.ar…

    Linux 2023年6月14日
    0107
  • vim的使用

    1、概述: Vim 是从 vi 发展出来的一个文本编辑器。具有代码补全、编译及错误跳转等功能 2、vim编辑器的常用命令: 图源:https://vimsky.com/articl…

    Linux 2023年5月27日
    0118
  • ThinkPHP5 远程命令执行漏洞

    一、ThinkPHP介绍 轻量级框架,内部OOP和面向过程代码都存在,是国人自己开发的框架。ThinkPHP是一个快速、兼容而且简单的轻量级国产PHP开发框架,诞生于2006年初,…

    Linux 2023年6月14日
    068
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球