vsftpd 多用户多目录与单用户多目录

逸兴
逸兴
逸兴
57
文章
25
评论
2019-09-1613:11:572 4868字阅读16分13秒
摘要

一个ftp为多个用户提供,不同的目录存储,并使用虚拟账户统一认证。

工作中多个项目在一台服务器上 , 多个项目人员需要上传下载相关文件 , 其中还要使用最小权限 , 每个用户还要有各自的目录 , 这时候就可以使用 "虚拟用户" 来实现多用的访问权限控制。

    这里的 “虚拟用户” 并不存在于系统上,只是vsftp应用中的登录账户;这类账户通过映射一个 “系统用户” 来访问文件系统,这就要求被映射的 “系统用户” 要具有文件系统相关“读写”权限。其访问机制如下:

vsftpd 多用户多目录与单用户多目录

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-tcl

yum -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账户登录,测试 家目录,读写权限

vsftpd 多用户多目录与单用户多目录
Jerry登录测试
vsftpd 多用户多目录与单用户多目录

测试 Tom 账户

vsftpd 多用户多目录与单用户多目录
Tom 登录测试

4.0 附录 - 单个账户使用多个目录

个别情况下,如果要操作一些文件,而这些文件/目录 , 不在家目录而是在其他路径,这是或可以使用setacl 对特定文件/目录 添加 vsftp的相关权限,这时候vsftp账号有了相关权限。但是在上面的配置过程中,可以发现一个账户只能同时有一个家目录,这时怎么将没有父子关系的两个目录,联系起来?

一、可以在创建一个虚拟用户,将家目录设置为目标目录。

二、使用mount -B 将目录挂载过去

绑定目录到另一个目录上

vsftpd 多用户多目录与单用户多目录

mount -B /etc   /var/ftp/test01/etc_new

查看已挂载的设备,注意-B 挂载的,在df -h查看不到

vsftpd 多用户多目录与单用户多目录

# 将/etc 下的文件挂载到 /var/ftp/test01/etc_new 下,要先创建挂载点

# 测试

vsftpd 多用户多目录与单用户多目录

这里的mount -B 只是临时生效,如果是长期使用可以 添加 开机挂载




https://www.hugbg.com/archives/425.html
逸兴
  • 本文由 发表于 2019-09-1613:11:57
  • 除非特殊声明,本站文章均为原创,转载请务必保留本文链接
自动更新SSL证书 默认分类

自动更新SSL证书

现在免费的SSL证书只有三个月有效期,有一个博客和图床都用的ssl证书到期需要重新签发,挺麻烦的。原本想着写个脚本通过阿里云的 OpenAPI 进行证书的签发和部署,但是偶然发现了 ACME 这个项目...
推导式、生成式与生成器 基础语法

推导式、生成式与生成器

推导式 概述 Python中的推导式是一种快速、简洁的数据结构创建方式,不需要手动创建数据结构中的每一个元素,类似于给出一个规律,python会根据这个规律自动填充数据结构。支持有列表推导式、字典推导...
CVE-2024-38077 Windows RDL漏洞检测修复方法(末尾) 默认分类

CVE-2024-38077 Windows RDL漏洞检测修复方法(末尾)

一、漏洞详情 Windows Server是由微软开发的操作系统系列,专为服务器环境设计,用于管理网络、数据存储和应用程序的运行。它为企业和组织提供了稳定、可靠的服务器平台,支持各种规模的网络基础设施...
Django DRF禁用URL末尾斜杆(:) 点点滴滴

Django DRF禁用URL末尾斜杆(:)

一、关于URL末尾斜杆 比如http://127.0.0.1:8000/api/v1/register 和 http://127.0.0.1:8000/api/v1/register/, 这两个是同一...
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

评论:2   其中:访客  2   博主  0
    • root root

      人类文明从仰望星空那一刻起,就已经距离揭示宇宙奥秘仅有一步之遥了。 —《朝闻道》

      • 老司机 老司机 1

        世间哪有恋爱?压根儿是生殖冲动。 —《围城》