工作中多个项目在一台服务器上 , 多个项目人员需要上传下载相关文件 , 其中还要使用最小权限 , 每个用户还要有各自的目录 , 这时候就可以使用 "虚拟用户" 来实现多用的访问权限控制。
这里的 “虚拟用户” 并不存在于系统上,只是vsftp应用中的登录账户;这类账户通过映射一个 “系统用户” 来访问文件系统,这就要求被映射的 “系统用户” 要具有文件系统相关“读写”权限。其访问机制如下:
2.0 部署vsftpd
2.0.1 安装依赖
[root@lastack vsftpd]# vim virtusers
# 系统环境
[root@lastack ~]# uname -a
Linux lastack.example 3.10.0-957.21.3.el7.x86_64 #1 SMP Tue Jun 18 16:35:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@lastack ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@lastack ~]#
# 这里使用pam认证,安装相应模块,用db_load 生产虚拟账户数据文件
yum -y install pam pam-devel db4 db4-tclyum -y install vsftpd
# 测试环境:
创建两个目录/var/ftp/{test01,test02}, 以及两个虚拟用户Tom,和Jerry, 映射到系统用户vsftp上, Tom 的家目录为test01, Jerry的家目录为test02, 两个账号仅有对家目录的读写权限。
mkdir -p /var/ftp/{test01,test02}
useradd vsftp -s /sbin/nologin
chown -R vsftp.vsftp /var/ftp
2.0.2 配置虚拟用户
# 创建虚拟账户文件
注意:这里的文件内容是 一行用户名,一行密码
[root@lastack vsftpd]# vim virtusers
[root@lastack vsftpd]# cat virtusers
Tom
tompass
Jerry
jerrypass
[root@lastack vsftpd]#
# 将这两个账户,添加到白名单(后面vsftpd.conf中有设置)
[root@lastack vsftpd]# vim user_list
[root@lastack vsftpd]#
[root@lastack vsftpd]# cat user_list
Tom
Jerry
[root@lastack vsftpd]#
然后生成数据文件
[root@lastack ~]# db_load -T -t hash -f /etc/vsftpd/virtusers /etc/vsftpd/virtusers.db
[root@lastack ~]# ll /etc/vsftpd/virtusers.db
-rw-r--r-- 1 root root 12288 Sep 16 15:42 /etc/vsftpd/virtusers.db
[root@lastack ~]#
# 配置PAM 认证文件
[root@lastack ~]# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd-`date +%F`.bak
# 注释掉原来的配置,不然虚拟用户无法登录,添加下面两行:
[root@lastack ~]# cat /etc/pam.d/vsftpd
#%PAM-1.0
#session optional pam_keyinit.so force revoke
#auth required pam_listfile.so item=user sense=deny file=/etc/vsftpd/ftpusers onerr=succeed
#auth required pam_shells.so
#auth include password-auth
#account include password-auth
#session required pam_loginuid.so
#session include password-auth
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/virtusers
[root@lastack ~]#
# 后面vsftpd.conf中要同步修改使用pam认证
pam_service_name=vsftpd
auth指进行用户账户口令验证;
accout指对用户帐户有哪些权限哪些限制进行验证。
sufficient表示充分条件,如果在这里通过了验证,那么就不用经过剩下的验证步骤了,如果没有通过的话,也不会立刻退出,因为sufficient的失败不决定整个验证的失败,意味着用户还必须将经历剩下来的验证审核。
而/lib/security/pam_userdb.so表示调用pam_userdb.so这个库函数进行。
最后的db=/etc/vsftpd/virtusers则指定了调用数据进行验证。关于PAM认证问题,可参考 https://www.infoq.cn/article/linux-pam-one/ 的系类文章
2.0.3 配置vsftpd
[root@lastack ~]# cp /etc/pam.d/vsftpd /etc/pam.d/vsftpd-`date +%F`.bak
# 注释掉原来的配置,不然虚拟用户无法登录,添加下面两行:
cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf-`date +%F`.bak
cat >/etc/vsftpd/vsftpd.conf<<EOF
anonymous_enable=NO
# 设成YES,则允许匿名用户登录
local_enable=YES
# 全局设置,是否容许登录(无论是匿名用户还是本地用户,若要登录话,就要开启他)
# 默认情况下所有系统用户都可以登录到ftp服务器,若只 希望对一小部分系统用户开放ftp服务,则需要开放用户列表控制相关配置项,其中主要包括 userlist_enable,userlist_deny
write_enable=YES
# 全局设置,是否容许写入(无论是匿名用户还是本地用户,若要启用上传权限的话,就要开启他)
local_umask=022
# 设定上传后文件的权限掩码,文件644,文件夹755
# 默认情况下,虚拟用户登录后被默认当作“匿名用户” 来处理,以降低用户权限,因此会设置auto_mask 而非 local_mask, 下面会设置映射的“宿主账户”。
xferlog_enable=YES
# 开启日志记录
xferlog_file=/etc/vsftpd/vsftpd.log
# 日志路径
xferlog_std_format=YES
#使用标准格式
connect_from_port_20=YES
#使用标准的20端口来连接ftp
idle_session_timeout=600
# 空闲连接超时
connect_timeout=60
# PROT模式连接超时
data_connection_timeout=120
# 数据传输超时
listen=YES
# 启动监听,绑定到listen_port指定的端口
userlist_enable=YES
userlist_deny=no
# 这两项,只允许userlist_file文件中记录的ftp用户能登录vsftp服务,其他的ftp用户都不可以登录,就是前面添加的白名单
# 同理配置userlist_enable=yes,userlist_deny=yes后,除了userlist_file文件中记录的ftp用户不能登录vsftp服务以外,其他的ftp用户都可以登录
userlist_file=/etc/vsftpd/user_list
tcp_wrappers=YES
# 设置vsftpd是否与tcp wrapper相结合来进行主机的访问控制。默认值为YES。如果启用,则vsftpd服务器会检查/etc/hosts.allow 和/etc/hosts.deny 中的设置,来决定请求连接的主机,配置:vsftpd:x.x.x.x
guest_enable=YES
# 启用虚拟用户
# guest_username=vsftp
# 映射到系统用户vsftp,将这个配置到单个虚拟用户配置文件,实现映射不同的宿主账户
pam_service_name=vsftpd
# 定义PAM 所使用的名称,预设为vsftpd,指向db_load的文件
user_config_dir=/etc/vsftpd/user_config_dir
# 这个目录里面存放,每个账号的配置文件
allow_writeable_chroot=YES
# 绕过可写加检查,不然会有,500 OOPS: vsftpd: refusing to run with writable root inside chroot() 报错
EOF
2.0.4 虚拟账号配置
# 创建 虚拟账号 配置目录,就是vsftpd.conf 中的user_config_dir
,这个目录下面,存放各个虚拟账号的单独配置
mkdir /etc/vsftpd/user_config_dir
# 以账号名称,做文件名
[root@lastack ~]# cat /etc/vsftpd/user_config_dir/Tom
local_root=/var/ftp/test01
# 设置用户家目录,多个用户,多个目录
write_enable=YES
anon_umask=022
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
guest_username=vsftp
# 指定这个虚拟账户要映射的系统账户
[root@lastack ~]#
[root@lastack ~]# cat /etc/vsftpd/user_config_dir/Jerry
local_root=/var/ftp/test02
# 设置用户家目录,多个用户,多个目录
write_enable=YES
anon_umask=022
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
guest_username=vsftp
# 指定这个虚拟账户要映射的系统账户
[root@lastack ~]#
# 创建测试文件
touch /var/ftp/test01/Tom
touch /var/ftp/test02/Jerry
# 修改文件权限
chown -R vsftp.vsftp /var/ftp/*
3.0 测试多用户,多目录
# 先使用Jerry账户登录,测试 家目录,读写权限
测试 Tom 账户
4.0 附录 - 单个账户使用多个目录
个别情况下,如果要操作一些文件,而这些文件/目录 , 不在家目录而是在其他路径,这是或可以使用setacl 对特定文件/目录 添加 vsftp的相关权限,这时候vsftp账号有了相关权限。但是在上面的配置过程中,可以发现一个账户只能同时有一个家目录,这时怎么将没有父子关系的两个目录,联系起来?
一、可以在创建一个虚拟用户,将家目录设置为目标目录。
二、使用mount -B 将目录挂载过去
绑定目录到另一个目录上
mount -B /etc /var/ftp/test01/etc_new
查看已挂载的设备,注意-B 挂载的,在df -h查看不到
# 将/etc 下的文件挂载到 /var/ftp/test01/etc_new 下,要先创建挂载点
# 测试
这里的mount -B 只是临时生效,如果是长期使用可以 添加 开机挂载
https://www.hugbg.com/archives/425.html
2019-10-10 1:36 下午 1F
人类文明从仰望星空那一刻起,就已经距离揭示宇宙奥秘仅有一步之遥了。 —《朝闻道》
2019-10-11 5:30 下午 2F
世间哪有恋爱?压根儿是生殖冲动。 —《围城》