
要真正切断 root 的直接操作路径、消除可追溯的操作痕迹,单靠禁用 SSH 登录或改 shell 并不够——攻击者或误操作者仍可能通过 su、本地 TTY、甚至某些服务残留权限绕过。联合使用 pam_securetty 与 sudoers 是一种纵深防御策略:前者从登录源头掐断 root 在非可信终端的认证入口,后者从权限执行层强制所有提权行为必须经由指定普通用户、全程留痕、不可绕过。
一、用 pam_securetty 锁死 root 的所有登录通道
关键不是“禁止远程”,而是让 root 连本地虚拟控制台(tty1–tty6)和伪终端(pts/0 等)都无法启动交互会话。这需要两步闭环配置:
- 确保
/etc/pam.d/login和/etc/pam.d/sshd中都启用该模块:auth [user_unknown=ignore success=ok default=bad] pam_securetty.so - 清空并锁定
/etc/securetty文件:sudo cp /etc/securetty /etc/securetty.bak && sudo truncate -s 0 /etc/securetty && sudo chmod 600 /etc/securetty
注意:Anolis 8/CentOS 8+ 默认不加载该模块到 sshd,必须手动添加;Debian/Ubuntu 则默认只在 login 中生效,需额外补全 sshd 配置。
二、在 sudoers 中彻底剥离 root 的隐式权限
目标是让任何命令都不再以 root 身份“自然发生”。即使有人拿到 root 密码或密钥,也无法通过 su - 或 sudo su 获得干净 shell。操作要点:
- 禁用
root用户自身调用sudo的能力:
在/etc/sudoers中显式拒绝:root ALL=(ALL:ALL) !ALL(放在所有其他规则之前) - 为管理用户设置最小必要权限,并禁用 shell 获取:
admin ALL=(ALL) NOPASSWD: /usr/bin/systemctl *, /usr/bin/journalctl *, /usr/bin/tail /var/log/*
同时加限制:Defaults admin !shell_noop, !env_reset, requiretty(强制必须有 TTY,防后台静默提权) - 彻底封堵
su对 root 的访问:
编辑/etc/pam.d/su,注释掉pam_rootok.so行,仅保留:auth [success=ignore default=die] pam_wheel.so group=wheel use_uid
再确保 root 不在wheel组:sudo gpasswd -d root wheel
三、验证与痕迹清理机制
配置生效后,root 已无法建立任何交互式会话,所有提权动作都必须经由 sudo 记录。但还需主动消除历史痕迹:
- 检查并清空 root 的 bash 历史:
sudo -u root truncate -s 0 ~/.bash_history
并在/root/.bashrc中加入:unset HISTFILE - 确认所有日志写入点受控:
sudo grep -r "root.*sudo" /var/log/secure* /var/log/auth.log* 2>/dev/null
应只看到普通用户执行 sudo 的记录,无 root 自身调用痕迹 - 测试关键绕过路径是否失效:
ssh root@localhost→ 拒绝su -(普通用户下)→ 权限拒绝sudo -i(非 wheel 用户)→ 拒绝sudo cat /etc/shadow(未授权命令)→ 拒绝
这套组合不追求“完全不可逆”,而是让每一次 root 级操作都必须经过明确身份、明确命令、明确时间的日志链条。没有静默通道,就没有隐藏痕迹的空间。

















