11.2 Vsftpd服务程序

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

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

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

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

ftp是Linux系统中以命令行界面的方式来管理FTP传输服务的客户端工具。我们首先手动安装这个ftp客户端工具,以便在后续实验中查看结果。

  1. [root@linuxprobe ~]# yum install ftp
  2. Loaded plugins: langpacks, product-id, subscription-manager
  3. ………………省略部分输出信息………………
  4. Installing:
  5. ftp x86_64 0.17-66.el7 rhel 61 k
  6. Transaction Summary
  7. ================================================================================
  8. Install 1 Package
  9. Total download size: 61 k
  10. Installed size: 96 k
  11. Is this ok [y/d/N]: y
  12. Downloading packages:
  13. Running transaction check
  14. Running transaction test
  15. Transaction test succeeded
  16. Running transaction
  17. Installing : ftp-0.17-66.el7.x86_64 1/1
  18. Verifying : ftp-0.17-66.el7.x86_64 1/1
  19. Installed:
  20. ftp.x86_64 0:0.17-66.el7
  21. Complete!

11.2.1 匿名访问模式

前文提到,在vsftpd服务程序中,匿名开放模式是最不安全的一种认证模式。任何人都可以无需密码验证而直接登录到FTP服务器。这种模式一般用来访问不重要的公开文件(在生产环境中尽量不要存放重要文件)。当然,如果采用第8章中介绍的防火墙管理工具(如Tcp_wrappers服务程序)将vsftpd服务程序允许访问的主机范围设置为企业内网,也可以提供基本的安全性。

vsftpd服务程序默认开启了匿名开放模式,我们需要做的就是开放匿名用户的上传、下载文件的权限,以及让匿名用户创建、删除、更名文件的权限。需要注意的是,针对匿名用户放开这些权限会带来潜在危险,我们只是为了在Linux系统中练习配置vsftpd服务程序而放开了这些权限,不建议在生产环境中如此行事。表11-2罗列了可以向匿名用户开放的权限参数以及作用。

表11-2 可以向匿名用户开放的权限参数以及作用

参数作用
anonymous_enable=YES允许匿名访问模式
anon_umask=022匿名用户上传文件的umask值
anon_upload_enable=YES允许匿名用户上传文件
anon_mkdir_write_enable=YES允许匿名用户创建目录
anon_other_write_enable=YES允许匿名用户修改目录名称或删除目录
  1. [root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
  2. 1 anonymous_enable=YES
  3. 2 anon_umask=022
  4. 3 anon_upload_enable=YES
  5. 4 anon_mkdir_write_enable=YES
  6. 5 anon_other_write_enable=YES
  7. 6 local_enable=YES
  8. 7 write_enable=YES
  9. 8 local_umask=022
  10. 9 dirmessage_enable=YES
  11. 10 xferlog_enable=YES
  12. 11 connect_from_port_20=YES
  13. 12 xferlog_std_format=YES
  14. 13 listen=NO
  15. 14 listen_ipv6=YES
  16. 15 pam_service_name=vsftpd
  17. 16 userlist_enable=YES
  18. 17 tcp_wrappers=YES

在vsftpd服务程序的主配置文件中正确填写参数,然后保存并退出。还需要重启vsftpd服务程序,让新的配置参数生效。在此需要提醒各位读者,在生产环境中或者在RHCSA、RHCERHCA认证考试中一定要把配置过的服务程序加入到开机启动项中,以保证服务器在重启后依然能够正常提供传输服务:

  1. [root@linuxprobe ~]# systemctl restart vsftpd
  2. [root@linuxprobe ~]# systemctl enable vsftpd
  3. ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service

现在就可以在客户端执行ftp命令连接到远程的FTP服务器了。在vsftpd服务程序的匿名开放认证模式下,其账户统一为anonymous,密码为空。而且在连接到FTP服务器后,默认访问的是/var/ftp目录。我们可以切换到该目录下的pub目录中,然后尝试创建一个新的目录文件,以检验是否拥有写入权限:

  1. [root@linuxprobe ~]# ftp 192.168.10.10
  2. Connected to 192.168.10.10 (192.168.10.10).
  3. 220 (vsFTPd 3.0.2)
  4. Name (192.168.10.10:root): anonymous
  5. 331 Please specify the password.
  6. Password:此处敲击回车即可
  7. 230 Login successful.
  8. Remote system type is UNIX.
  9. Using binary mode to transfer files.
  10. ftp> cd pub
  11. 250 Directory successfully changed.
  12. ftp> mkdir files
  13. 550 Permission denied.

系统显示拒绝创建目录!我们明明在前面清空了iptables防火墙策略,而且也在vsftpd服务程序的主配置文件中添加了允许匿名用户创建目录和写入文件的权限啊。建议大家先不要着急往下看,而是自己思考一下这个问题的解决办法,以锻炼您的Linux系统排错能力。

前文提到,在vsftpd服务程序的匿名开放认证模式下,默认访问的是/var/ftp目录。查看该目录的权限得知,只有root管理员才有写入权限。怪不得系统会拒绝操作呢!下面将目录的所有者身份改成系统账户ftp即可(该账户在系统中已经存在),这样应该可以了吧:

  1. [root@linuxprobe ~]# ls -ld /var/ftp/pub
  2. drwxr-xr-x. 3 root root 16 Jul 13 14:38 /var/ftp/pub
  3. [root@linuxprobe ~]# chown -Rf ftp /var/ftp/pub
  4. [root@linuxprobe ~]# ls -ld /var/ftp/pub
  5. drwxr-xr-x. 3 ftp root 16 Jul 13 14:38 /var/ftp/pub
  6. [root@linuxprobe ~]# ftp 192.168.10.10
  7. Connected to 192.168.10.10 (192.168.10.10).
  8. 220 (vsFTPd 3.0.2)
  9. Name (192.168.10.10:root): anonymous
  10. 331 Please specify the password.
  11. Password:此处敲击回车即可
  12. 230 Login successful.
  13. Remote system type is UNIX.
  14. Using binary mode to transfer files.
  15. ftp> cd pub
  16. 250 Directory successfully changed.
  17. ftp> mkdir files
  18. 550 Create directory operation failed.

系统再次报错!尽管我们在使用ftp命令登入FTP服务器后,再创建目录时系统依然提示操作失败,但是报错信息却发生了变化。在没有写入权限时,系统提示“权限拒绝”(Permission denied)所以刘遄老师怀疑是权限的问题。但现在系统提示“创建目录的操作失败”(Create directory operation failed),想必各位读者也应该意识到是SELinux服务在“捣乱”了吧。

下面使用getsebool命令查看与FTP相关的SELinux域策略都有哪些:

  1. [root@linuxprobe ~]# getsebool -a | grep ftp
  2. ftp_home_dir --> off
  3. ftpd_anon_write --> off
  4. ftpd_connect_all_unreserved --> off
  5. ftpd_connect_db --> off
  6. ftpd_full_access --> off
  7. ftpd_use_cifs --> off
  8. ftpd_use_fusefs --> off
  9. ftpd_use_nfs --> off
  10. ftpd_use_passive_mode --> off
  11. httpd_can_connect_ftp --> off
  12. httpd_enable_ftp_server --> off
  13. sftpd_anon_write --> off
  14. sftpd_enable_homedirs --> off
  15. sftpd_full_access --> off
  16. sftpd_write_ssh_home --> off
  17. tftp_anon_write --> off
  18. tftp_home_dir --> off

我们可以根据经验(需要长期培养,别无它法)和策略的名称判断出是ftpd_full_access—> off策略规则导致了操作失败。接下来修改该策略规则,并且在设置时使用-P参数让修改过的策略永久生效,确保在服务器重启后依然能够顺利写入文件。

  1. [root@linuxprobe ~]# setsebool -P ftpd_full_access=on

再次提醒各位读者,在进行下一次实验之前,一定记得将虚拟机还原到最初始的状态,以免多个实验相互产生冲突。

现在便可以顺利执行文件创建、修改及删除等操作了。

  1. [root@linuxprobe ~]# ftp 192.168.10.10
  2. Connected to 192.168.10.10 (192.168.10.10).
  3. 220 (vsFTPd 3.0.2)
  4. Name (192.168.10.10:root): anonymous
  5. 331 Please specify the password.
  6. Password:此处敲击回车即可
  7. 230 Login successful.
  8. Remote system type is UNIX.
  9. Using binary mode to transfer files.
  10. ftp> cd pub
  11. 250 Directory successfully changed.
  12. ftp> mkdir files
  13. 257 "/pub/files" created
  14. ftp> rename files database
  15. 350 Ready for RNTO.
  16. 250 Rename successful.
  17. ftp> rmdir database
  18. 250 Remove directory operation successful.
  19. ftp> exit
  20. 221 Goodbye.

11.2.2 本地用户模式

相较于匿名开放模式,本地用户模式要更安全,而且配置起来也很简单。如果大家之前用的是匿名开放模式,现在就可以将它关了,然后开启本地用户模式。针对本地用户模式的权限参数以及作用如表11-3所示。

表11-3 本地用户模式使用的权限参数以及作用

参数作用
anonymous_enable=NO禁止匿名访问模式
local_enable=YES允许本地用户模式
write_enable=YES设置可写权限
local_umask=022本地用户模式创建文件的umask值
userlist_deny=YES启用“禁止用户名单”,名单文件为ftpusers和user_list
userlist_enable=YES开启用户作用名单文件功能
  1. [root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
  2. 1 anonymous_enable=NO
  3. 2 local_enable=YES
  4. 3 write_enable=YES
  5. 4 local_umask=022
  6. 5 dirmessage_enable=YES
  7. 6 xferlog_enable=YES
  8. 7 connect_from_port_20=YES
  9. 8 xferlog_std_format=YES
  10. 9 listen=NO
  11. 10 listen_ipv6=YES
  12. 11 pam_service_name=vsftpd
  13. 12 userlist_enable=YES
  14. 13 tcp_wrappers=YES

在vsftpd服务程序的主配置文件中正确填写参数,然后保存并退出。还需要重启vsftpd服务程序,让新的配置参数生效。在执行完上一个实验后还原了虚拟机的读者,还需要将配置好的服务添加到开机启动项中,以便在系统重启自后依然可以正常使用vsftpd服务。

  1. [root@linuxprobe ~]# systemctl restart vsftpd
  2. [root@linuxprobe ~]# systemctl enable vsftpd
  3. ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service

按理来讲,现在已经完全可以本地用户的身份登录FTP服务器了。但是在使用root管理员登录后,系统提示如下的错误信息:

  1. [root@linuxprobe ~]# ftp 192.168.10.10
  2. Connected to 192.168.10.10 (192.168.10.10).
  3. 220 (vsFTPd 3.0.2)
  4. Name (192.168.10.10:root): root
  5. 530 Permission denied.
  6. Login failed.
  7. ftp>

可见,在我们输入root管理员的密码之前,就已经被系统拒绝访问了。这是因为vsftpd服务程序所在的目录中默认存放着两个名为“用户名单”的文件(ftpusers和user_list)。不知道大家是否已看过一部日本电影“死亡笔记”(刘遄老师在上学期间的最爱),里面就提到有一个黑色封皮的小本子,只要将别人的名字写进去,这人就会挂掉。vsftpd服务程序目录中的这两个文件也有类似的功能—只要里面写有某位用户的名字,就不再允许这位用户登录到FTP服务器上。

  1. [root@linuxprobe ~]# cat /etc/vsftpd/user_list
  2. 1 # vsftpd userlist
  3. 2 # If userlist_deny=NO, only allow users in this file
  4. 3 # If userlist_deny=YES (default), never allow users in this file, and
  5. 4 # do not even prompt for a password.
  6. 5 # Note that the default vsftpd pam config also checks /etc/vsftpd/ftpusers
  7. 6 # for users that are denied.
  8. 7 root
  9. 8 bin
  10. 9 daemon
  11. 10 adm
  12. 11 lp
  13. 12 sync
  14. 13 shutdown
  15. 14 halt
  16. 15 mail
  17. 16 news
  18. 17 uucp
  19. 18 operator
  20. 19 games
  21. 20 nobody
  22. [root@linuxprobe ~]# cat /etc/vsftpd/ftpusers
  23. # Users that are not allowed to login via ftp
  24. 1 root
  25. 2 bin
  26. 3 daemon
  27. 4 adm
  28. 5 lp
  29. 6 sync
  30. 7 shutdown
  31. 8 halt
  32. 9 mail
  33. 10 news
  34. 11 uucp
  35. 12 operator
  36. 13 games
  37. 14 nobody

果然如此!vsftpd服务程序为了保证服务器的安全性而默认禁止了root管理员和大多数系统用户的登录行为,这样可以有效地避免黑客通过FTP服务对root管理员密码进行暴力破解。如果您确认在生产环境中使用root管理员不会对系统安全产生影响,只需按照上面的提示删除掉root用户名即可。我们也可以选择ftpusers和user_list文件中没有的一个普通用户尝试登录FTP服务器:

  1. [root@linuxprobe ~]# ftp 192.168.10.10
  2. Connected to 192.168.10.10 (192.168.10.10).
  3. 220 (vsFTPd 3.0.2)
  4. Name (192.168.10.10:root): linuxprobe
  5. 331 Please specify the password.
  6. Password:此处输入该用户的密码
  7. 230 Login successful.
  8. Remote system type is UNIX.
  9. Using binary mode to transfer files.
  10. ftp> mkdir files
  11. 550 Create directory operation failed.

在采用本地用户模式登录FTP服务器后,默认访问的是该用户的家目录,也就是说,访问的是/home/linuxprobe目录。而且该目录的默认所有者、所属组都是该用户自己,因此不存在写入权限不足的情况。但是当前的操作仍然被拒绝,是因为我们刚才将虚拟机系统还原到最初的状态了。为此,需要再次开启SELinux域中对FTP服务的允许策略:

  1. [root@linuxprobe ~]# getsebool -a | grep ftp
  2. ftp_home_dir --> off
  3. ftpd_anon_write --> off
  4. ftpd_connect_all_unreserved --> off
  5. ftpd_connect_db --> off
  6. ftpd_full_access --> off
  7. ftpd_use_cifs --> off
  8. ftpd_use_fusefs --> off
  9. ftpd_use_nfs --> off
  10. ftpd_use_passive_mode --> off
  11. httpd_can_connect_ftp --> off
  12. httpd_enable_ftp_server --> off
  13. sftpd_anon_write --> off
  14. sftpd_enable_homedirs --> off
  15. sftpd_full_access --> off
  16. sftpd_write_ssh_home --> off
  17. tftp_anon_write --> off
  18. tftp_home_dir --> off
  19. [root@linuxprobe ~]# setsebool -P ftpd_full_access=on

刘遄老师再啰嗦几句。在实验课程和生产环境中设置SELinux域策略时,一定记得添加-P参数,否则服务器在重启后就会按照原有的策略进行控制,从而导致配置过的服务无法使用。

在配置妥当后再使用本地用户尝试登录下FTP服务器,分别执行文件的创建、重命名及删除等命令。操作均成功!

  1. [root@linuxprobe ~]# ftp 192.168.10.10
  2. Connected to 192.168.10.10 (192.168.10.10).
  3. 220 (vsFTPd 3.0.2)
  4. Name (192.168.10.10:root): linuxprobe
  5. 331 Please specify the password.
  6. Password:此处输入该用户的密码
  7. 230 Login successful.
  8. Remote system type is UNIX.
  9. Using binary mode to transfer files.
  10. ftp> mkdir files
  11. 257 "/home/linuxprobe/files" created
  12. ftp> rename files database
  13. 350 Ready for RNTO.
  14. 250 Rename successful.
  15. ftp> rmdir database
  16. 250 Remove directory operation successful.
  17. ftp> exit
  18. 221 Goodbye.

请注意:当您完成本实验后请还原虚拟机快照再进行下一个实验,否则可能导致配置文件冲突而报错。

11.2.3 虚拟用户模式

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

第1步:创建用于进行FTP认证的用户数据库文件,其中奇数行为账户名,偶数行为密码。例如,我们分别创建出zhangsan和lisi两个用户,密码均为redhat:

  1. [root@linuxprobe ~]# cd /etc/vsftpd/
  2. [root@linuxprobe vsftpd]# vim vuser.list
  3. zhangsan
  4. redhat
  5. lisi
  6. redhat

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

  1. [root@linuxprobe vsftpd]# db_load -T -t hash -f vuser.list vuser.db
  2. [root@linuxprobe vsftpd]# file vuser.db
  3. vuser.db: Berkeley DB (Hash, version 9, native byte-order)
  4. [root@linuxprobe vsftpd]# chmod 600 vuser.db
  5. [root@linuxprobe vsftpd]# rm -f vuser.list

第2步:创建vsftpd服务程序用于存储文件的根目录以及虚拟用户映射的系统本地用户。FTP服务用于存储文件的根目录指的是,当虚拟用户登录后所访问的默认位置。

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

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

  1. [root@linuxprobe ~]# useradd -d /var/ftproot -s /sbin/nologin virtual
  2. [root@linuxprobe ~]# ls -ld /var/ftproot/
  3. drwx------. 3 virtual virtual 74 Jul 14 17:50 /var/ftproot/
  4. [root@linuxprobe ~]# chmod -Rf 755 /var/ftproot/

第3步:建立用于支持虚拟用户的PAM文件。

PAM(可插拔认证模块)是一种认证机制,通过一些动态链接库和统一的API把系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活调整服务程序的不同认证方式。要想把PAM功能和作用完全讲透,至少要一个章节的篇幅才可以(对该主题感兴趣的读者敬请关注本书的进阶篇,里面会详细讲解PAM)。

通俗来讲,PAM是一组安全机制的模块,系统管理员可以用来轻易地调整服务程序的认证方式,而不必对应用程序进行任何修改。PAM采取了分层设计(应用程序层、应用接口层、鉴别模块层)的思想,其结构如图11-2所示。

PAM认证机制的体系图

图11-2 PAM的分层设计结构

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

  1. [root@linuxprobe ~]# vim /etc/pam.d/vsftpd.vu
  2. auth required pam_userdb.so db=/etc/vsftpd/vuser
  3. account required pam_userdb.so db=/etc/vsftpd/vuser

第4步:在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文件即可。该操作中用到的参数以及作用如表11-4所示。

表11-4 利用PAM文件进行认证时使用的参数以及作用

参数作用
anonymous_enable=NO禁止匿名开放模式
local_enable=YES允许本地用户模式
guest_enable=YES开启虚拟用户模式
guest_username=virtual指定虚拟用户账户
pam_service_name=vsftpd.vu指定PAM文件
allow_writeable_chroot=YES允许对禁锢的FTP根目录执行写入操作,而且不拒绝用户的登录请求
  1. [root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
  2. 1 anonymous_enable=NO
  3. 2 local_enable=YES
  4. 3 guest_enable=YES
  5. 4 guest_username=virtual
  6. 5 allow_writeable_chroot=YES
  7. 6 write_enable=YES
  8. 7 local_umask=022
  9. 8 dirmessage_enable=YES
  10. 9 xferlog_enable=YES
  11. 10 connect_from_port_20=YES
  12. 11 xferlog_std_format=YES
  13. 12 listen=NO
  14. 13 listen_ipv6=YES
  15. 14 pam_service_name=vsftpd.vu
  16. 15 userlist_enable=YES
  17. 16 tcp_wrappers=YES

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

  1. [root@linuxprobe ~]# mkdir /etc/vsftpd/vusers_dir/
  2. [root@linuxprobe ~]# cd /etc/vsftpd/vusers_dir/
  3. [root@linuxprobe vusers_dir]# touch lisi
  4. [root@linuxprobe vusers_dir]# vim zhangsan
  5. anon_upload_enable=YES
  6. anon_mkdir_write_enable=YES
  7. anon_other_write_enable=YES

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

  1. [root@linuxprobe ~]# vim /etc/vsftpd/vsftpd.conf
  2. anonymous_enable=NO
  3. local_enable=YES
  4. guest_enable=YES
  5. guest_username=virtual
  6. allow_writeable_chroot=YES
  7. write_enable=YES
  8. local_umask=022
  9. dirmessage_enable=YES
  10. xferlog_enable=YES
  11. connect_from_port_20=YES
  12. xferlog_std_format=YES
  13. listen=NO
  14. listen_ipv6=YES
  15. pam_service_name=vsftpd.vu
  16. userlist_enable=YES
  17. tcp_wrappers=YES
  18. user_config_dir=/etc/vsftpd/vusers_dir
  19. [root@linuxprobe ~]# systemctl restart vsftpd
  20. [root@linuxprobe ~]# systemctl enable vsftpd
  21. ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service

第6步:设置SELinux域允许策略,然后使用虚拟用户模式登录FTP服务器。相信大家可以猜到,SELinux会继续来捣乱。所以,先按照前面实验中的步骤开启SELinux域的允许策略,以免再次出现操作失败的情况:

  1. [root@linuxprobe ~]# getsebool -a | grep ftp
  2. ftp_home_dir –> off
  3. ftpd_anon_write –> off
  4. ftpd_connect_all_unreserved –> off
  5. ftpd_connect_db –> off
  6. ftpd_full_access –> off
  7. ftpd_use_cifs –> off
  8. ftpd_use_fusefs –> off
  9. ftpd_use_nfs –> off
  10. ftpd_use_passive_mode –> off
  11. httpd_can_connect_ftp –> off
  12. httpd_enable_ftp_server –> off
  13. sftpd_anon_write –> off
  14. sftpd_enable_homedirs –> off
  15. sftpd_full_access –> off
  16. sftpd_write_ssh_home –> off
  17. tftp_anon_write –> off
  18. tftp_home_dir –> off
  19. [root@linuxprobe ~]# setsebool -P ftpd_full_access=on

此时,不但可以使用虚拟用户模式成功登录到FTP服务器,还可以分别使用账户zhangsan和lisi来检验他们的权限。当然,读者在生产环境中一定要根据真实需求来灵活配置参数,不要照搬这里的实验操作。

  1. [root@linuxprobe ~]# ftp 192.168.10.10
  2. Connected to 192.168.10.10 (192.168.10.10).
  3. 220 (vsFTPd 3.0.2)
  4. Name (192.168.10.10:root): lisi
  5. 331 Please specify the password.
  6. Password:此处输入虚拟用户的密码
  7. 230 Login successful.
  8. Remote system type is UNIX.
  9. Using binary mode to transfer files.
  10. ftp> mkdir files
  11. 550 Permission denied.
  12. ftp> exit
  13. 221 Goodbye.
  14. [root@linuxprobe ~]# ftp 192.168.10.10
  15. Connected to 192.168.10.10 (192.168.10.10).
  16. 220 (vsFTPd 3.0.2)
  17. Name (192.168.10.10:root): zhangsan
  18. 331 Please specify the password.
  19. Password:此处输入虚拟用户的密码
  20. 230 Login successful.
  21. Remote system type is UNIX.
  22. Using binary mode to transfer files.
  23. ftp> mkdir files
  24. 257 "/files" created
  25. ftp> rename files database
  26. 350 Ready for RNTO.
  27. 250 Rename successful.
  28. ftp> rmdir database
  29. 250 Remove directory operation successful.
  30. ftp> exit
  31. 221 Goodbye.