1.1 任务概述

如果采用本地帐号访问FTP服务器,会有安全风险。FTP还提供了一种虚拟帐号访问的方式。

1.2 知识导学

虚拟帐号可以看成将多个匿名帐户映射到一个本地帐号的方式。

虚拟帐号的工作原理和流程

  1. 创建一个本地宿主帐户和宿主目录,设置好所有者和权限。虚拟帐号要映射到它。
  2. 创建虚拟帐户文本,生成虚拟帐户数据库db文件,设置好权限,在pam中启用验证
  3. 在配置文件中,指定虚拟帐号配置目录,虚拟帐号映射本地用户、根目录等
  4. 在宿主目录下,创建同名的虚拟帐号子目录;
  5. 在虚拟帐号配置目录下,创建虚拟帐号同名的分离配置文件,针对该虚拟帐号进行匿名设置
  6. 启动服务,检查放火墙和SELINUX设置

    1.3 任务分解

    1.3.1 任务

    一、创建虚拟宿主用户、主目录以及虚拟帐号的子配置目录
    1. ## 虚拟用户的宿主目录
    2. [root@w ~]# useradd -d /var/vftp -s /sbin/nologin vftp ##添加本地宿主帐号
    3. [root@w ~]# echo 12345678 | passwd --stdin vftp ## 如果不设密码,帐号无法登录
    4. [root@w ~]# mkdir -p /etc/vsftpd/vftp_conf ## 新建虚拟帐号独立配置文件所在的目录

二、修改主配置文件

  1. [root@w ~]# cd /etc/vsftpd
  2. [root@w vsftpd]# grep -v "#" vsftpd.conf.bak_0 > vsftpd.conf
  3. [root@w vsftpd]# vim vsftpd.conf
  4. ''' 修改
  5. anonymous_enable=NO ## 禁止匿名访问
  6. local_enable=YES ## 启用本地帐户
  7. write_enable=YES ## 本地用户可写
  8. guest_enable=YES ## 启用虚拟帐户
  9. guest_username=vftp ## 虚拟帐号映射的本地帐户
  10. user_config_dir=/etc/vsftpd/vftp_conf ## 虚拟帐户的独立配置文件目录
  11. virtual_use_local_privs=NO #虚拟用户等同本地用户权限还是匿名用户权限,默认NO
  12. chroot_local_user=YES ## 将本地用户限制在主目录内
  13. allow_writeable_chroot=YES ## 随chroot一起启用
  14. listen=YES ## vsftpd以独立服务方式启用
  15. local_umask=022 ## 以下是默认
  16. dirmessage_enable=YES
  17. xferlog_enable=YES
  18. connect_from_port_20=YES ## 默认,数据连接接口
  19. xferlog_std_format=YES
  20. pam_service_name=vsftpd ## pam认证的脚本名
  21. tcp_wrappers=YES
  22. '''

三、设置PAM认证。

(一)创建用户文本文件

  1. [root@w ~]# vim /etc/vsftpd/vusers ## 在配置目录中创建虚拟用户文本
  2. vusers
  3. ''' add vir user ##奇数行是帐号,偶数行是密码
  4. test01
  5. 12345678
  6. test02
  7. 12345678

(二)生成虚拟帐号数据库

  1. [root@w ~]# cd /etc/vsftpd
  2. [root@w vsftpd]# db_load -T -t hash -f vusers vusers.db
  3. [root@w vsftpd]# chown vftp vusers.db ##
  4. [root@w vsftpd]# chmod 770 vusers.db ## 设置只能vuser用户和root组访问

(三)配置PAM文件,使VSFTPD能使用它

  1. [root@w ~]# cd /etc/pam.d/ ## 切换到vsftpd的PAM认证文件
  2. [root@w pam.d]# cp vsftpd vsftpd_bak ## 备份
  3. [root@w pam.d]# vim vsftpd ## 将原有内容全部注释,新增内容
  4. ''' add
  5. auth required pam_userdb.so db=/etc/vsftpd/vusers
  6. account required pam_userdb.so db=/etc/vsftpd/vusers

四、为虚拟用户创建目录和配置文件

  1. [root@w ~]# mkdir -p /var/vftp/test01 ## 在宿主目录下创建虚拟帐号主目录
  2. [root@w ~]# chown vftp /var/vftp/test01 -R
  3. [root@w ~]# vim /etc/vsftpd/vftp_conf/test01 ## 为test01虚拟用户创建独立配置
  4. '''
  5. local_root=/var/vftp/test01
  6. anon_upload_enable=yes
  7. anon_mkdir_write_enable=yes
  8. anon_other_write_enable=yes
  9. anon_world_readable_only=no ##如果no,只要ftp用户有读权限即可下载。yes,则other要有r权限。
  10. '''

五、启动服务,放行和测试

  1. [root@w ~]# systemctl start vsftpd
  2. [root@w ~]# firewall-cmd --list-all
  3. [root@w ~]# setenforce 0

1.4 新增用户

参考:

  1. [root@w ~]# cd /etc/vsftpd/vuser_conf
  2. [root@w vuser_conf]# vim create_bash_config.sh
  3. ### 创建虚拟帐号的配置文件的脚本
  4. #!/bin/bash
  5. username=$1;
  6. rm -f /etc/vsftpd/vuser_conf/$username;
  7. touch /etc/vsftpd/vuser_conf/$username;
  8. echo "
  9. local_root=/var/ftp/vuser/test01
  10. anon_upload_enable=yes
  11. anon_mkdir_write_enable=yes
  12. anon_other_write_enbale=yes
  13. anon_world_readable_only=no
  14. " >> /etc/vsftpd/vuser_conf/$username;
  15. [root@w ~]# cd /etc/vsftpd
  16. [root@w vsftpd]# touch vusers
  17. [root@w vsftpd]# vim add_user.sh
  18. ### 添加用户脚本
  19. #!/bin/bash
  20. echo -n "please input username"
  21. read username;
  22. if [! $username ] then
  23. echo "username can not empty";
  24. exit;
  25. fi
  26. echo -n "please input password"
  27. read passwd;
  28. if [! $passwd ] then
  29. echo "password can not empty";
  30. exit;
  31. fi
  32. echo -n "save to db? y/n: ";
  33. read re;
  34. vuser_dir=/var/ftp/vuser
  35. if [[ $re = 'y' || $re = 'Y']] then
  36. echo $username >> login.txt
  37. echo $passwd >> login.txt
  38. db_load -T -t hash -f ./vusers ./vusers.db
  39. mkdir -p $vuser_dir/$username;
  40. chown vuser:vuser $vuser_dir/$username;
  41. sh /etc/vsftpd/vuser_conf/create_bash_config.sh $username;
  42. echo "save success!!!";
  43. else
  44. echo "do not save";
  45. exit
  46. fi
  47. echo " show users";
  48. cat /etc/vsftpd/vusers;
  49. [root@w ~]# cd /etc/vsftpd
  50. [root@w vsftpd]# chmod a+x add_user.sh