redhat 8中vsftpd服务安装及部署

开心一刻

       薪夜被盗
       小偷知时节,
       当天刚发薪。
       随窗潜入夜,
       盗物细无声!

写在前面

       最近学习linux课程,学习了配置vsftpd服务,并且学习了vsftpd服务程序的三种认证模式(匿名开放模式、本地用户模式、虚拟用户模式),趁着在学习过程中的热乎劲,写一篇博客记录一下,并将配置过程中的一些错误也记录下来。

vsftpd服务安装以及常用参数

在redhat 8中已经使用dnf安装软件包了(yum仍可使用,实际上就是dnf的一个软连接),所以我这里使用dnf安装vsftpd。

dnf install -y vsftpd ftp

vsftpd服务的配置文件在/etc/vsftpd/vsftpd.conf中,其中的一些常用参数记录如下:

参数 作用
listen=[YES|NO] 是否以独立运行的方式监听服务
listen_address=IP地址 设置要监听的IP地址
listen_port=21 设置FTP服务的监听端口
download_enable=[YES|NO] 是否允许下载文件
userlist_enable=[YES|NO]
userlist_deny=[YES|NO]
设置用户列表为“允许”还是“禁止”操作
max_clients=0 最大客户端连接数,0为不限制
max_per_ip=0 同一IP地址的最大连接数,0为不限制
anonymous_enable=[YES|NO] 是否允许匿名用户访问
anon_upload_enable=[YES|NO] 是否允许匿名用户上传文件
anon_umask=022 匿名用户上传文件的umask值
anon_root=/var/ftp 匿名用户的FTP根目录
anon_mkdir_write_enable=[YES|NO] 是否允许匿名用户创建目录
anon_other_write_enable=[YES|NO] 是否开放匿名用户的其他写入权限(包括重命名、删除等操作权限)
anon_max_rate=0 匿名用户的最大传输速率(字节/秒),0为不限制
local_enable=[YES|NO] 是否允许本地用户登录FTP
local_umask=022 本地用户上传文件的umask值
local_root=/var/ftp 本地用户的FTP根目录
chroot_local_user=[YES|NO] 是否将用户权限禁锢在FTP目录,以确保安全
local_max_rate=0 本地用户最大传输速率(字节/秒),0为不限制

vsftpd中三种认证模式

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

匿名开放模式:是一种最不安全的认证模式,任何人都可以无需密码验证而直接登录到FTP服务器。默认所在目录为/var/ftp

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

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

匿名开放模式

在redhat8中,vsftpd程序默认没有开启匿名开放模式,我们需要手动开启,并设置匿名用户的上传、下载文件的权限,以及让匿名用户创建、删除、更改文件名的权限。需要注意的是,针对匿名用户开放的权限会带来潜在的风险。我觉得匿名开放模式的使用场景就是在企业内网或是学校内网中使用,并且存放一些非重要文件,例如学生使用ftp交实验作业。
匿名开放模式中权限参数说明以及作用

参数 作用
anonymous_enable=YES 允许匿名访问模式
anon_umask=022 匿名用户上传文件的umask值
anon_upload_enable=YES 允许匿名用户上传文件
anon_mkdir_write_enable=YES 允许匿名用户创建目录
anon_other_write_enable=YES 允许匿名用户修改目录名称或删除目录
  1. 修改配置文件为:
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_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=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
  1. 开启目录的写权限,否则仅配置配置文件仍然不能创建目录
# 增加 other 的写权限即可,不要修改/var/ftp的目录权限,否则ftp登录后报错。
chmod -Rf o+w /var/ftp/pub
  1. 开始相关SeLinux域策略
[root@localhost ~]# getsebool -a | grep ftp
ftp_home_dir --> off
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
sftpd_anon_write --> off
sftpd_enable_homedirs --> off
sftpd_full_access --> off
sftpd_write_ssh_home --> off
tftp_anon_write --> off
tftp_home_dir --> off

开启命令如下:

setsebool -P ftpd_full_access on
  1. 重启vsftpd服务程序,如果需要重启生效,需将vsftpd服务加入到开机启动项中,参考以下代码。
systemctl restart vsftpd
systemctl enable vsftpd

本地用户模式

redhat8 vsftpd服务默认开启的就是本地用户模式。相较于匿名开放模式,本地用户模式更加安全,而且配置起来比较简单。
匿名开放模式中权限参数说明以及作用

参数 作用
anonymous_enable=NO 禁止匿名访问模式
local_enable=YES 允许本地用户模式
write_enable=YES 设置可写权限
local_umask=022 本地用户模式创建文件的umask值
userlist_deny=YES 启用“禁止用户名单”,名单文件为ftpusers和user_list
userlist_enable=YES 开启用户作用名单文件功能
  1. 修改配置文件为:
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
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=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
  1. 开放SELinux域策略
    开启命令如下:
setsebool -P ftpd_full_access on

特别说明:在本地用户模式下,vsftpd服务程序为了保证服务器的安全性而默认禁止了root管理员和大多数系统用户的登陆行为,这样可以有效地避免黑客通过FTP对root管理员密码进行暴力破解。具体禁止用户名单在/etc/vsftpd/user_list和/etc/vsftpd/ftpusers中

虚拟用户模式

虚拟用户模式时三种模式中最安全的一中认证模式。当然,因为安全性较之于前面两种模式有了提升,所以配置流程会稍微复杂一些。

  1. 创建用于FTP认证的用户数据库文件。其中奇数行为账户名,偶数行为密码。例如,我们分别创建zhangsan和lisi两个用户,密码均为redhat:
[root@localhost ~]# cd /etc/vsftpd/
[root@localhost vsftpd]# vim vuser.list
zhangsan
redhat
lisi
redhat
  1. 创建vsftpd服务程序用于存储文件的根目录以及虚拟用户映射的系统本地用户。FTP服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置。

由于Linux系统中的每一个文件都有所有者、所属组属性,例如使用虚拟账户“张三”新建了一个文件,但是系统中找不到账户“张三”,就会导致这个文件的权限出现错误。为此,需要再创建一个可以映射到虚拟用户的系统本地用户。简单来说,就是让虚拟用户默认登录到与之有映射关系的这个系统本地用户的家目录中,虚拟用户创建的文件的属性也都归属于这个系统本地用户,从而避免Linux系统无法处理虚拟用户所创建文件的属性权限。

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

[root@localhost ~]# useradd -d /var/ftproot -s /sbin/nologin virtual
[root@localhost ~]# ls -ld /var/ftproot/
drwx------. 3 virtual virtual 74 Jul 14 17:50 /var/ftproot/
[root@localhost ~]# chmod -Rf 755 /var/ftproot/
  1. 建立用于支持虚拟用户的PAM文件。

PAM(可插拔认证模块)是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。

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

[root@localhost ~]# vim /etc/pam.d/vsftpd.vu
auth       required     pam_userdb.so db=/etc/vsftpd/vuser
account    required     pam_userdb.so db=/etc/vsftpd/vuser
  1. 在vsftpd服务程序的主配置文件中通过pam_service_name参数将PAM认证文件的名称修改为vsftpd.vu,PAM作为应用程序层与鉴别模块层的连接纽带,可以让应用程序根据需求灵活地在自身插入所需的鉴别功能模块。当应用程序需要PAM认证时,则需要在应用程序中定义负责认证的PAM配置文件,实现所需的认证功能。

例如,在vsftpd服务程序的主配置文件中默认就带有参数pam_service_name=vsftpd,表示登录FTP服务器时是根据/etc/pam.d/vsftpd文件进行安全认证的。现在我们要做的就是把vsftpd主配置文件中原有的PAM认证文件vsftpd修改为新建的vsftpd.vu文件即可。该操作中用到的参数以及作用如下表所示。

参数 作用
anonymous_enable=NO 禁止匿名开放模式
local_enable=YES 允许本地用户模式
guest_enable=YES 开启虚拟用户模式
guest_username=virtual 指定虚拟用户账户
pam_service_name=vsftpd.vu 指定PAM文件
allow_writeable_chroot=YES 允许对禁锢的FTP根目录执行写入操作,而且不拒绝用户的登录请求
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd.vu
userlist_enable=YES
  1. 为虚拟用户设置不同的权限。

虽然账户zhangsan和lisi都是用于vsftpd服务程序认证的虚拟账户,但是我们依然想对这两人进行区别对待。比如,允许张三上传、创建、修改、查看、删除文件,只允许李四查看文件。这可以通过vsftpd服务程序来实现。只需新建一个目录,在里面分别创建两个以zhangsan和lisi命名的文件,其中在名为zhangsan的文件中写入允许的相关权限(使用匿名用户的参数):

[root@localhost ~]# mkdir /etc/vsftpd/vusers_dir/
[root@localhost ~]# cd /etc/vsftpd/vusers_dir/
[root@localhost vusers_dir]# touch lisi
[root@localhost vusers_dir]# vim zhangsan
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES

然后再次修改vsftpd主配置文件,通过添加user_config_dir参数来定义这两个虚拟用户不同权限的配置文件所存放的路径。为了让修改后的参数立即生效,需要重启vsftpd服务程序并将该服务添加到开机启动项中:

[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
guest_enable=YES
guest_username=virtual
allow_writeable_chroot=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd.vu
userlist_enable=YES
tcp_wrappers=YES
user_config_dir=/etc/vsftpd/vusers_dir
[root@localhost ~]# systemctl restart vsftpd
[root@localhost ~]# systemctl enable vsftpd
 ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service
  1. 设置SELinux域允许策略,然后使用虚拟用户模式登录FTP服务器。
setsebool -P ftpd_full_access on

结语

       这篇博文只是简单配置了vsftpd服务三种模式,实际上配置参数中还有很多参数可以设置,大家在生产环境中一定要根据真实需求来灵活配置参数,已达到自己最需要的效果。_

文中都是我个人的理解,如有错误的地方欢迎下方评论告诉我,我及时更正,大家共同进步

原文地址:https://www.cnblogs.com/xingyu666/p/14265425.html