最小权限管理本质是按需、可控、可审计地开放高危命令能力,而非简单禁用;通过setfacl实现用户级精准执行控制、rbash+path构建命令白名单、sudoers参数级锁定、capability与systemd沙箱替代root。

最小权限管理对系统核心二进制命令(如 /bin/rm、/usr/bin/shutdown、/usr/bin/vi 等)做权限收缩,本质是**不让用户直接执行这些高危命令,而是按需、可控、可审计地开放能力**。不是简单删掉或 chmod 000,而是通过多层机制实现“能用但不能乱用”。
用 setfacl 实现用户级精准执行控制
核心命令是普通文件,限制执行即限制其 x 权限。标准 chmod 只能分“所有者/组/其他”,而 setfacl 支持为指定用户单独授权:
- 先收回默认执行权:
sudo setfacl -m u::rw-,g::r--,o::--- /bin/rm(所有者可读写但不执行,组和其他人无执行权) - 再显式放行可信用户:
sudo setfacl -m u:backup:rx /bin/rmsudo setfacl -m u:deploy:r-x /bin/systemctl - 验证结果:
getfacl /bin/rm应显示类似user:backup:r-x的条目 - 注意:文件系统需挂载时启用
acl选项(mount | grep "$(df /bin -P | awk '{print $1}')" | grep acl)
用 rbash + 自定义 PATH 构建命令白名单
适用于外包、监控、只读运维等角色,目标是“只能运行 ps/top/journalctl,其余一律禁止”:
- 将用户 shell 设为受限 shell:
sudo usermod -s /bin/rbash ops-user - 创建专属命令目录:
sudo mkdir /opt/ops-bin - 仅放入软链接:
sudo ln -s /usr/bin/ps /opt/ops-bin/ps,sudo ln -s /usr/bin/top /opt/ops-bin/top - 重设该用户的
PATH:echo 'export PATH="/opt/ops-bin:/usr/bin:/bin"' | sudo tee -a /home/ops-user/.bashrc - 确保
/home/ops-user/.bashrc被 rbash 加载,且禁止修改 PATH 或 cd 到非授权目录
用 sudoers 实现命令级参数锁定与上下文约束
对需临时提权的场景,避免给 /bin/bash 或通配符路径,而是精确到带参数的完整命令:
- 只允许重启 nginx:
%webadmin ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx - 禁止绕过:
%webadmin ALL=(root) !/bin/sh, !/bin/bash, !/usr/bin/python3 -c, !/usr/bin/perl -e - 限定日志路径:
%logreader ALL=(root) /usr/bin/tail -n 100 /var/log/nginx/*.log(末尾*允许,但不能出现在路径中间) - 强制审计:
Defaults logfile="/var/log/sudo.log", log_input, log_output, requiretty
用 capability 和 systemd 沙箱替代 root 执行依赖
很多命令看似必须 root,实则只需某项能力。用 Linux capability 替代全权 root 更安全:
- 让非 root 用户绑定 80 端口:
sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/myapp - 在 systemd service 文件中禁用提权可能:
NoNewPrivileges=true - 启用沙箱防护:
ProtectSystem=strict(/usr /etc /boot 只读)、ProtectHome=true、PrivateTmp=true - 移除高危 capability:
CapabilityBoundingSet=~CAP_SYS_ADMIN CAP_SYS_PTRACE










