1.1 任务概述
如果采用本地帐号访问FTP服务器,会有安全风险。FTP还提供了一种虚拟帐号访问的方式。
1.2 知识导学
虚拟帐号可以看成将多个匿名帐户映射到一个本地帐号的方式。
虚拟帐号的工作原理和流程
- 创建一个本地宿主帐户和宿主目录,设置好所有者和权限。虚拟帐号要映射到它。
- 创建虚拟帐户文本,生成虚拟帐户数据库db文件,设置好权限,在pam中启用验证
- 在配置文件中,指定虚拟帐号配置目录,虚拟帐号映射本地用户、根目录等
- 在宿主目录下,创建同名的虚拟帐号子目录;
- 在虚拟帐号配置目录下,创建虚拟帐号同名的分离配置文件,针对该虚拟帐号进行匿名设置
- 启动服务,检查放火墙和SELINUX设置
1.3 任务分解
1.3.1 任务
一、创建虚拟宿主用户、主目录以及虚拟帐号的子配置目录## 虚拟用户的宿主目录
[root@w ~]# useradd -d /var/vftp -s /sbin/nologin vftp ##添加本地宿主帐号
[root@w ~]# echo 12345678 | passwd --stdin vftp ## 如果不设密码,帐号无法登录
[root@w ~]# mkdir -p /etc/vsftpd/vftp_conf ## 新建虚拟帐号独立配置文件所在的目录
二、修改主配置文件
[root@w ~]# cd /etc/vsftpd
[root@w vsftpd]# grep -v "#" vsftpd.conf.bak_0 > vsftpd.conf
[root@w vsftpd]# vim vsftpd.conf
''' 修改
anonymous_enable=NO ## 禁止匿名访问
local_enable=YES ## 启用本地帐户
write_enable=YES ## 本地用户可写
guest_enable=YES ## 启用虚拟帐户
guest_username=vftp ## 虚拟帐号映射的本地帐户
user_config_dir=/etc/vsftpd/vftp_conf ## 虚拟帐户的独立配置文件目录
virtual_use_local_privs=NO #虚拟用户等同本地用户权限还是匿名用户权限,默认NO
chroot_local_user=YES ## 将本地用户限制在主目录内
allow_writeable_chroot=YES ## 随chroot一起启用
listen=YES ## vsftpd以独立服务方式启用
local_umask=022 ## 以下是默认
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES ## 默认,数据连接接口
xferlog_std_format=YES
pam_service_name=vsftpd ## pam认证的脚本名
tcp_wrappers=YES
'''
三、设置PAM认证。
(一)创建用户文本文件
[root@w ~]# vim /etc/vsftpd/vusers ## 在配置目录中创建虚拟用户文本
vusers
''' add vir user ##奇数行是帐号,偶数行是密码
test01
12345678
test02
12345678
(二)生成虚拟帐号数据库
[root@w ~]# cd /etc/vsftpd
[root@w vsftpd]# db_load -T -t hash -f vusers vusers.db
[root@w vsftpd]# chown vftp vusers.db ##
[root@w vsftpd]# chmod 770 vusers.db ## 设置只能vuser用户和root组访问
(三)配置PAM文件,使VSFTPD能使用它
[root@w ~]# cd /etc/pam.d/ ## 切换到vsftpd的PAM认证文件
[root@w pam.d]# cp vsftpd vsftpd_bak ## 备份
[root@w pam.d]# vim vsftpd ## 将原有内容全部注释,新增内容
''' add
auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers
四、为虚拟用户创建目录和配置文件
[root@w ~]# mkdir -p /var/vftp/test01 ## 在宿主目录下创建虚拟帐号主目录
[root@w ~]# chown vftp /var/vftp/test01 -R
[root@w ~]# vim /etc/vsftpd/vftp_conf/test01 ## 为test01虚拟用户创建独立配置
'''
local_root=/var/vftp/test01
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enable=yes
anon_world_readable_only=no ##如果no,只要ftp用户有读权限即可下载。yes,则other要有r权限。
'''
五、启动服务,放行和测试
[root@w ~]# systemctl start vsftpd
[root@w ~]# firewall-cmd --list-all
[root@w ~]# setenforce 0
1.4 新增用户
参考:
[root@w ~]# cd /etc/vsftpd/vuser_conf
[root@w vuser_conf]# vim create_bash_config.sh
### 创建虚拟帐号的配置文件的脚本
#!/bin/bash
username=$1;
rm -f /etc/vsftpd/vuser_conf/$username;
touch /etc/vsftpd/vuser_conf/$username;
echo "
local_root=/var/ftp/vuser/test01
anon_upload_enable=yes
anon_mkdir_write_enable=yes
anon_other_write_enbale=yes
anon_world_readable_only=no
" >> /etc/vsftpd/vuser_conf/$username;
[root@w ~]# cd /etc/vsftpd
[root@w vsftpd]# touch vusers
[root@w vsftpd]# vim add_user.sh
### 添加用户脚本
#!/bin/bash
echo -n "please input username"
read username;
if [! $username ] then
echo "username can not empty";
exit;
fi
echo -n "please input password"
read passwd;
if [! $passwd ] then
echo "password can not empty";
exit;
fi
echo -n "save to db? y/n: ";
read re;
vuser_dir=/var/ftp/vuser
if [[ $re = 'y' || $re = 'Y']] then
echo $username >> login.txt
echo $passwd >> login.txt
db_load -T -t hash -f ./vusers ./vusers.db
mkdir -p $vuser_dir/$username;
chown vuser:vuser $vuser_dir/$username;
sh /etc/vsftpd/vuser_conf/create_bash_config.sh $username;
echo "save success!!!";
else
echo "do not save";
exit
fi
echo " show users";
cat /etc/vsftpd/vusers;
[root@w ~]# cd /etc/vsftpd
[root@w vsftpd]# chmod a+x add_user.sh