
应优先使用 sudo 而非 su - 切换 root,配合禁用 root 密码、限制 sudo 命令范围、chattr 设置文件不可变属性、高危命令 alias 拦截、etckeeper 自动备份等多重防护机制。
sudo 代替直接切 root
直接 su - 切到 root 后,所有命令都以最高权限运行,一个误删、路径写错或通配符没加引号,就可能清空 /usr 或覆盖 /etc。而 sudo 强制显式声明要提权的命令,天然带“确认感”。
实操建议:
root 密码:sudo passwd -l root,彻底关闭直接登录 root 的通道sudo 组,但限制可执行命令范围,例如在 /etc/sudoers.d/deploy 中写:%deploy ALL=(ALL) /usr/bin/systemctl start nginx, /usr/bin/systemctl reload nginx
sudo -i(带环境的交互式 s
sudo command 单行执行chattr +a 或 +i)像 /etc/passwd、/etc/shadow、/boot/grub2/grub.cfg 这类文件,不是靠权限位能防住的——只要你是 root 或有 sudo 权限,rm -f 照样能删。得用文件系统级属性。
实操建议:
/var/log/secure),用 sudo chattr +a /var/log/secure,禁止删除和覆盖,只允许 append
/etc/fstab),用 sudo chattr +i /etc/fstab,连 root 也无法修改或删除,修改前必须先 chattr -i
+i 属性下,vim 保存会失败(它实际是删旧建新),改配置得先临时移除属性,操作完立刻加回alias 覆盖高危命令很多人习惯敲 rm -rf *,但当前目录一旦是 / 或 /home 就全完了。与其靠人记,不如让 shell 主动拦截。
实操建议:
~/.bashrc 或 /etc/skel/.bashrc 中加别名:alias rm='rm -I'(大写 I,删多个文件时强制确认)rm:alias rm='echo "Use: rm -I or sudo rm -f. Aborting." >&2; false'
cp 和 mv:alias cp='cp -i'、alias mv='mv -i',避免静默覆盖etckeeper 或简单 preexec 钩子)不是所有修改都能靠 chattr 挡住,比如你确实需要改 /etc/nginx/nginx.conf。这时候,自动留一份快照比事后从备份恢复快得多。
实操建议:
etckeeper(Debian/Ubuntu 自带,RHEL/CentOS 需 yum install etckeeper),它用 git 自动 commit /etc 变更,每次 apt install 或手动改配置都会触发记录preexec 函数钩住每次命令执行前动作,在 .bashrc 中加一段逻辑:检测命令是否含 vi、vim、nano 且参数是 /etc/ 下文件,就自动生成 .bak 时间戳副本rm -rf / 全完最易被忽略的一点:所有这些机制都依赖用户登录后加载的 shell 配置。如果有人绕过 ssh 直接进单用户模式,或用 Live CD 挂载根分区,那 sudo 规则、alias、etckeeper 全部失效。物理/宿主机层面的访问控制,才是最后一道防线。