虚拟用户模式
最后咱们要学习的虚拟用户模式是一种相比较来说最为安全的验证方式,需要为FTP传输服务单独建立用户数据库文件,虚拟出用来口令验证的帐户信息,这些帐号是在服务器系统中不存在的,仅供FTP传输服务做验证使用,因此这样即便骇客破解出了帐号口令密码后也无法登录到咱们的服务器主机上面,有效的降低了破坏范围和影响。所以只要在配置妥当合理的情况下,虚拟用户模式要比前两种验证方式更加的安全,同时配置的流程也稍微会复杂一些。详情请关注《linux就该这么学》。
操作方法
- 01
创建用于进行FTP验证的帐号密码数据库文件,单数行为账户名,偶数行为密码,例如咱们分别创建出张三和李四两个用户,密码均为redhat: [root@linuxprobe ~]# cd /etc/vsftpd/ [root@linuxprobe vsftpd]# vim vuser.list zhangsan redhat lisi redhat 但明文信息既不安全,也不能让vsftpd服务程序直接读取,咱们还需要使用db_load命令用HASH算法将这个原始的明文信息文件转换成数据库文件,并且出于安全起见,咱们再把数据库文件权限调小一些,然后再把原始的明文信息文件删除掉。 [root@linuxprobe vsftpd]# db_load -T -t hash -f vuser.list vuser.db [root@linuxprobe vsftpd]# file vuser.db vuser.db: Berkeley DB (Hash, version 9, native byte-order) [root@linuxprobe vsftpd]# chmod 600 vuser.db [root@linuxprobe vsftpd]# rm -f vuser.list
- 02
创建用于FTP服务存储文件的根目录以及虚拟用户映射的系统本地用户,FTP服务存储文件的根目录指的是当虚拟用户登陆后默认所在的位置,但咱们Linux系统中的每一个文件都是有所有者和所有组属性的,例如咱们用张三帐户创建了一个新文件,但是张三这个用户在系统中是找不到的,就会导致Linux系统中这个文件权限出现错误,因此咱们还需要再创建一个用来让虚拟用户映射的系统本地用户,简单来说就是让虚拟用户默认登陆到这个本地用户的家目录中,创建的文件属性也都归属于这个本地用户,避免本地Linux系统无法处理这种虚拟用户创建的文件属性权限。咱们为了方便管理FTP资料,可以将这个用于虚拟用户映射的系统本地用户的家目录设置到/var目录中(因为该目录是用来存放经常发生改变的数据),并且为了安全起见把这个系统本地用户的终端设置成不允许登陆,这不会影响虚拟用户的使用,还可以有效避免骇客通过该用户登陆到服务器主机上面。 [root@linuxprobe ~]# useradd -d /var/ftproot -s /sbin/nologin virtual [root@linuxprobe ~]# ls -ld /var/ftproot/ drwx------. 3 virtual virtual 74 Jul 14 17:50 /var/ftproot/ [root@linuxprobe ~]# chmod -Rf 755 /var/ftproot/
- 03
建立用于支持虚拟用户的PAM认证文件,PAM可插拔认证模块(Pluggable Authentication Modules)是一种认证机制,通过一些动态链接库和统一的API将系统提供的服务与认证方式分开,使得系统管理员可以根据需求灵活的调整服务程序的不同认证方式。要想把PAM功能和作用讲透至少要一个章节的篇幅才可以,所以有兴趣的同学们可以看一下《Linux就该这么学》的进阶篇书籍,里面会给大家详细的讲解到,通俗来讲PAM是一组安全机制的模块(插件),让系统管理员可以轻易的调整服务程序的认证方式,而可以不必对应用程序做任何的修改,易用性很强。PAM采取了分层设计的思想——应用程序层、应用接口层、鉴别模块层,如图11-2所示: 新建一个用于虚拟用户验证的PAM文件替换掉原始的PAM文件,其中PAM文件内的db=参数为刚刚用db_load生成出的账户密码数据库文件的路径,但不用写后缀: [root@linuxprobe ~]# vim /etc/pam.d/vsftpd.vu auth required pam_userdb.so db=/etc/vsftpd/vuser account required pam_userdb.so db=/etc/vsftpd/vuser
- 04
在vsftpd服务程序主配置文件中修改PAM支持文件,PAM API作为应用程序层与鉴别模块层的连接纽带,让应用程序可以根据需求灵活的在其中插入所需的鉴别功能模块,当应用程序需要PAM认证时,一般在应用程序中定义负责其认证的PAM配置文件,真正灵活的实现了认证功能。例如在vsftpd服务程序主配置文件中默认就写有参数pam_service_name=vsftpd,表示登录FTP服务器时是根据/etc/pam.d/vsftpd的文件内容进行安全认证的,咱们现在需要做的就是把vsftpd主配置文件中原先的PAM认证文件vsftpd修改成咱们自建的vsftpd.vu即可。 [root@linuxprobe ~]# 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
- 05
为虚拟用户设置不同的权限,虽然张三和李四两个帐户都是咱们用于FTP服务验证的虚拟帐户,但也想在他们之间区别对待,比如只允许张三用户能够上传、创建、修改、查看、删除文件,而李四只能查看文件,这其实也是可以让vsftpd服务程序实现的,咱们只需要新建一个目录,在里面分别创建两个以张三和李四命名的文件,其中在张三命名的文件中写入相关允许的权限(使用匿名用户的参数): [root@linuxprobe ~]# mkdir /etc/vsftpd/vusers_dir/ [root@linuxprobe ~]# cd /etc/vsftpd/vusers_dir/ [root@linuxprobe vusers_dir]# touch lisi [root@linuxprobe vusers_dir]# vim zhangsan anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES 然后再次修改下vsftpd主配置文件,添加user_config_dir参数来定义这两个虚拟用户不同权限的配置文件所存放的路径即可,为了让刚刚配置的服务程序新参数立即生效,咱们需要将vsftpd再来重新启动一下,并加入到开机启动项中: [root@linuxprobe ~]# 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@linuxprobe ~]# systemctl restart vsftpd [root@linuxprobe ~]# systemctl enable vsftpd ln -s '/usr/lib/systemd/system/vsftpd.service' '/etc/systemd/system/multi-user.target.wants/vsftpd.service
- 06
设置SELinux域允许策略后尝试使用虚拟用户模式登陆FTP服务器,同学们有了刚刚两个验证模式的配置经验后一定能猜到SELinux会继续来“捣乱”,所以先按照刚刚的步骤开启SELinux域的允许策略吧,以免再次出现类似创建目录的操作失败的操作: [root@linuxprobe ~]# 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 [root@linuxprobe ~]# setsebool -P ftpd_full_access=on 此处咱们不仅能够使用虚拟用户模式登陆到FTP服务器中了,还可以分别使用张三和李四用户检验下他们不同的权限,有没有特别好玩呢~当然读者们在工作中要学会灵活的搭配参数,不要完全按照实验操作而脱离客户需求。 [root@linuxprobe ~]# ftp 192.168.10.10 Connected to 192.168.10.10 (192.168.10.10). 220 (vsFTPd 3.0.2) Name (192.168.10.10:root): lisi 331 Please specify the password. Password:此处输入虚拟用户的密码 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> mkdir files 550 Permission denied. ftp> exit 221 Goodbye. [root@linuxprobe ~]# ftp 192.168.10.10 Connected to 192.168.10.10 (192.168.10.10). 220 (vsFTPd 3.0.2) Name (192.168.10.10:root): zhangsan 331 Please specify the password. Password:此处输入虚拟用户的密码 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> mkdir files 257 "/files" created ftp> rename files database 350 Ready for RNTO. 250 Rename successful. ftp> rmdir database 250 Remove directory operation successful. ftp> exit 221 Goodbye.