Linux禁用高危命令须在sudo层面精准阻断,核心是白名单授权+绝对路径+黑名单排除,需用visudo编辑sudoers,按顺序配置禁止规则、Cmnd_Alias集中管理、noexec/requiretty加固,并严格验证与日志审计。

在 Linux 系统中,禁用高危命令不能靠删文件、改别名或禁用用户,而是要在 sudo 层面做精准阻断——核心是“白名单授权 + 绝对路径 + 黑名单排除”,且规则顺序和语法必须严谨。
用 sudoers 做命令级禁止(最常用)
这是第一道防线,直接在 /etc/sudoers 或 /etc/sudoers.d/ 下配置,但必须用 visudo 编辑,防止语法错误导致 sudo 完全失效。
- 禁止命令必须写完整绝对路径,例如
!/bin/rm、!/sbin/mkfs,写成rm或mkfs无效 - 规则按从上到下匹配,禁止行必须放在通用授权规则之前,否则会被跳过
- 示例(放在 visudo 靠前位置):
deploy ALL=(ALL) NOPASSWD: /usr/bin/journalctl, /bin/ls, !/bin/rm, !/sbin/mkfs, !/bin/dd, !/usr/bin/python3 -c *
用 Cmnd_Alias 集中管理黑名单(更安全)
避免逐条写 ! 规则出错,适合多人多角色环境。先定义高危命令集合,再统一禁用:
- 在 sudoers 中添加:
Cmnd_Alias ESCAPE_CMDS = /bin/bash, /bin/sh, /bin/su, /usr/bin/python3 -c *, /usr/bin/perl -e *, /usr/bin/find * -exec sh \; - 再绑定给用户组:
%ops ALL=(root) NOPASSWD: SVC_CTRL, LOG_VIEW<br>%ops ALL=(ALL) !ESCAPE_CMDS
- 这样既保留业务所需命令,又确保所有逃逸路径被全局拦截
配合 noexec 和 requiretty 加固(防绕过)
仅禁路径还不够,sudo 自身参数和执行环境也可能被利用:
- 在 sudoers 文件顶部(visudo 打开后第一段)加入:
Defaults noexec<br>Defaults requiretty<br>Defaults !env_reset
-
noexec可阻止 exec 类逃逸(如less调用 shell),但会禁用man、vi等;若需保留,可改为显式禁用具体危险子命令 -
requiretty强制操作来自真实终端,阻断 cron、webshell 等非交互提权场景
验证与审计不可少
配完不验证等于没配:
- 用目标用户执行
sudo -l,确认只列出预期命令,无意外授权 - 手动测试:如
sudo rm -rf /tmp/test应返回 “command not allowed” - 启用日志:
Defaults logfile="/var/log/sudo.log",并加log_subcmds记录完整参数 - 检查 /var/log/auth.log 或 /var/log/secure,确认拒绝行为有记录











