阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

linux下vsftpd系统虚拟帐户使用

2次阅读
没有评论

共计 2992 个字符,预计需要花费 8 分钟才能阅读完成。

一、需求
1、系统帐号和虚拟帐号

这是一个相当复杂的需求,系统上一些采集系统走的 ftp 进行采集的。历史积累下来的,最早都是直接在 OS 上创建系统帐号再 ftp 登录(shell 大部分设置为 /bin/false 或 /sbin/nologin,也部分使用的 bash 和 csh)。后来由于系统安全加固使用了 pam_tally2 模块,这就导致默认的 vsftpd 模块会调用系统认证,导致触发 pam_tally2 策略时会被锁定,影响业务采集使用。通过测试发现虚拟帐号会解决被锁定的问题 —- 这个好理解,虚拟帐户调用不涉及系统模块的调用,所以不会被锁,即使映射的主帐号被锁,也照样可以使用。

2、相对路径和绝对路径

默认使用系统帐号时,ftp 登陆时看到的是全路径,如 zabbix 帐号通过 ftp 登陆后 pwd 查看到家目录是 /home/zabbix。这就是绝对路径‘;当使用虚拟帐号时,默认指定 local_root,比如也是 /home/zabbix,虚拟帐号名为 ftptest,当使用这个帐号登陆后,pwd 查看到为 /(实际是 /home/zabbix),这就是相对路径。

3、需求

系统最终想都改造成虚拟帐号,但于涉及的帐号太多,一次性搞定显然不现实,需要一个过渡阶段,过渡过程中,需要满足如下需求:

  1. a: 系统帐号和虚拟帐号都可以登陆;
  2. b: 系统帐号登陆后,显示的是绝对路径;
  3. c: 虚拟帐号登陆后,即有绝对路径的也有相对路径的。
二、系统帐号和业务帐号共存

实现这个功能的关键是 vsftpd pam 里的配置,直接拿本地原始配置和虚拟用户配置叠加显然不行。这里的关键是 control_flag,control_flag 可以用 required 也可以用 sufficient,使用 required 需要所有内容都满足才行,当我们前两条配置虚拟用户登录验证通过后(虚拟配置在上,系统认证在下配置时),继续向下面的配置条目进行验证,验证是否是本地用户,发现不是,结果报错。

使用 Sufficient 时,如果标记为 sufficient 的模块成功并且先前没有 Required 或 sufficient 模块失败,则忽略堆栈中的所有其余模块并返回成功。

实现两者同时登陆的 /etc/pam.d/vsftpd 文件配置如下:

auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/ftpuser
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/ftpuser
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
三、相对路径和绝对路径

对于虚拟用户来说,登陆后是否为绝对路径的关系参数是 virtual_use_local_privs,当设置为 YES 时,和系统帐号权限一致,登陆后查看到的是类似于 /home/ 用户名 这样的路径(与 local_root 参数设置的一致),当设置为 NO 时,看到的 / 相对路径。

两个测试用户的配置示例如下:

linux-ou3x:~ # cat /etc/vsftpd/vsftpd_user_conf/test
guest_enable=YES
local_root=/home/snsserver
anon_world_readable_only=NO
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
guest_username=snsserver
anon_umask=022
virtual_use_local_privs=YES
linux-ou3x:~ # cat /etc/vsftpd/vsftpd_user_conf/test2
guest_enable=YES
local_root=/home/snsserver2
anon_world_readable_only=NO
write_enable=YES
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
guest_username=snsserver2
anon_umask=022
#virtual_use_local_privs=YES

vsftpd.conf 的配置如下:

linux-ou3x:~ # grep -v '^#' /etc/vsftpd.conf
dirmessage_enable=YES
ftpd_banner="Authorized users only. All activity may be monitored and reported!"
anonymous_enable=NO
anon_world_readable_only=YES
syslog_enable=YES
connect_from_port_20=YES
pam_service_name=vsftpd
listen=YES
ssl_enable=NO
pasv_min_port=30000
pasv_max_port=30010
write_enable=YES
use_localtime=YES
local_enable=YES
local_umask=022
ascii_upload_enable=YES
ascii_download_enable=YES
user_config_dir=/etc/vsftpd/vsftpd_user_conf
四、实现效果

最终效果如下:

linux 下 vsftpd 系统虚拟帐户使用

相对路径看到的 URL 后面直接是 /,绝对路径是路径信息。

五、踩过的坑
1、系统用户登陆后,无法写入自身家目录

这个是由于全局配置中使用 guest_enable=YES,如果在全局配置中又指定了 guest_username,则此时任一个系统帐号登陆后都使用的是该用户的权限,而且 pwd 看到的是相对路径。当不指定 guest_username 时,默认映射的 guest_username 是 ftp 用户。所认全局和局部参数一定要做好切分,不然使用系统帐号登陆就没有意义了。

2、虚拟用户映射多个用户

在曾经很长的一段时间,我都认为多个虚拟用户只能映射成一个系统帐号。如,test test2 映射成 www 用户,而不能实现 test 映射 www,test2 映射 nginx。显然,这种认为是错误的,同上面一样,之前由于配置的是全局配置,且在局部设置里又未设置这些参数。(如果全局和局部都设置了相同的参数,在适用到局部用户时,局部参数会覆盖全局参数)

PAM 模块使用参数 IBM 论坛相关文档。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-12-06发表,共计2992字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中