Ubuntu Server 22.04 创建具备全系统只读权限备份用户的问题求助
你好,我来帮你梳理下当前遇到的问题,以及可行的解决方案~
首先,你遇到的核心问题是:通过/etc/security/capability.conf配置的cap_dac_read_search能力并没有实际生效,所以backup-user依然无法访问那些对“其他用户”没有读权限的目录(比如/var/log/apache2,权限是drwxr-x--- root adm)。从你提供的capsh --print输出也能看出来,backup-user的Current能力集是空的,说明预期的能力并没有被赋予。
为什么能力配置没生效?
/etc/security/capability.conf的配置是通过PAM(Pluggable Authentication Modules)模块生效的,默认情况下Ubuntu可能没有在会话加载中启用pam_cap.so模块,导致用户登录时不会读取这个配置文件并赋予相应能力。
解决步骤
1. 启用PAM的capability模块
编辑PAM的通用会话配置文件:
sudo nano /etc/pam.d/common-session
在文件末尾添加一行:
session required pam_cap.so
保存并退出。如果你的备份用户仅通过SSH/SFTP登录,也可以只在/etc/pam.d/sshd中添加这一行,这样只会对SSH会话生效。
2. 重新登录验证能力
断开当前backup-user的SSH连接,或者执行su - backup-user重新登录(注意必须是带-的登录式shell,才能加载PAM会话配置)。
再次执行capsh --print,如果配置生效,你会看到Current行包含cap_dac_read_search,类似这样:
Current: =cap_dac_read_search+ep
3. 测试访问权限
现在尝试访问之前无法进入的目录:
cd /var/log/apache2
应该可以正常进入并读取其中的文件了。cap_dac_read_search能力已经足够让用户绕过文件系统的读/搜索权限检查,不需要cap_dac_override(后者是用于修改文件权限的,备份场景完全不需要)。
备选方案:如果能力配置依然有问题
如果上述方法没生效,还有两种替代思路:
加入相关用户组:对于特定目录(比如
/var/log下的很多目录属于adm组),可以把backup-user加入adm组:sudo usermod -aG adm backup-user但这种方法只能覆盖部分目录,无法实现全系统只读。
使用文件ACL:给全系统的文件和目录添加
backup-user的只读ACL:# 给所有目录添加读和执行权限 sudo find / -type d -not -path "/proc/*" -not -path "/sys/*" -not -path "/dev/*" -exec setfacl -m u:backup-user:rx {} \; # 给所有文件添加读权限 sudo find / -type f -not -path "/proc/*" -not -path "/sys/*" -not -path "/dev/*" -exec setfacl -m u:backup-user:r {} \;注意要排除
/proc、/sys、/dev这些虚拟文件系统,避免执行出错。这种方法的缺点是后续新建的文件/目录不会自动继承ACL,需要额外配置默认ACL。
额外小提示
你创建用户时设置-d /把家目录设为根目录,其实可以改成/home/backup-user更符合常规习惯,不过这对权限没有影响。如果只需要用户通过SFTP备份,不需要交互式shell,可以修改用户的登录shell为/usr/sbin/nologin:
sudo usermod -s /usr/sbin/nologin backup-user
备注:内容来源于stack exchange,提问作者Cintya

