最可靠方式是组合使用/etc/sudoers白名单授权+受限shell+文件系统级控制,其中sudoers为主干;需用visudo配置绝对路径、固定参数、显式禁用高危命令,并通过Cmnd_Alias统一管理,禁用交互式shell,可选ACL加固。

限制用户只能运行特定的特权命令,核心是“只开一条缝”,而不是“关掉所有门”。最可靠、可审计、易维护的方式是组合使用 /etc/sudoers 白名单授权 + 受限 shell + 文件系统级控制,其中 sudoers 是主干,其他为加固层。
用 visudo 配置精确的命令白名单
所有修改必须通过 visudo 执行,防止语法错误导致 sudo 完全失效。规则要满足三个硬性条件:绝对路径、固定参数、显式排除高危命令。
- 写完整路径,例如
/usr/bin/systemctl restart nginx,不能简写为systemctl或漏掉/usr/bin/ - 参数不可通配,
restart *不被允许;每条重启指令需单独列出或归入Cmnd_Alias - 用
!显式禁止绕过行为,例如:opsuser ALL=(ALL) ALL, !/sbin/reboot, !/bin/systemctl reboot, !/usr/bin/shutdown - 确认规则顺序——sudoers 自上而下匹配,靠前的通用规则(如
%sudo ALL=(ALL:ALL) ALL)会覆盖后面的具体授权
用 Cmnd_Alias 统一管理多条特权命令
当授权不止一个服务操作时,定义命令别名能避免重复、提升可读性与后期维护效率。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 在
/etc/sudoers中添加别名定义:Cmnd_Alias DEPLOY_CMDS = /usr/bin/systemctl restart nginx, /usr/bin/systemctl reload haproxy, /usr/bin/journalctl -u nginx --since "1 hour ago" - 再绑定到用户或组:
%deployers ALL=(root) NOPASSWD: DEPLOY_CMDS - 该组成员执行
sudo journalctl -u nginx成功,但sudo journalctl -u mysql或sudo rm -f /var/log/nginx/*.log会被拒绝
剥夺交互式登录能力,保留非交互用途
即使权限收得再严,如果用户还能 SSH 登录并尝试各种绕过手段(如写脚本、调用 python -c),风险仍在。最干净的做法是禁用其 shell。
- 执行:
sudo usermod -s /sbin/nologin username,用户 SSH 连接后立即退出,并提示 “This account is currently not available.” - 不影响 cron、systemd --user、rsync over SSH 等非交互场景;若需支持 rsync,可用
/bin/false替代 - 恢复登录只需改回
/bin/bash,无需重设密码或重建家目录
补充一层文件级执行控制(可选但推荐)
对极敏感命令(如 /bin/rm、/usr/bin/find),可在 sudo 白名单之外,用 setfacl 进一步收紧执行权限,形成双重校验。
- 先收回全局执行权:
sudo setfacl -m u::rw-,g::r--,o::--- /bin/rm - 再仅授予明确需要的用户:
sudo setfacl -m u:admin:rwx /bin/rm - 验证:
getfacl /bin/rm应显示对应用户的user:admin:rwx条目 - 注意:目标文件系统需挂载时启用 acl 选项(检查
mount | grep "$(df /bin -P | tail -1 | awk '{print $1}')" | grep acl)

















