最小特权原则在运维中是持续闭环管理过程,需实施一人一账号禁用root远程登录、sudo命令级白名单授权、服务启动即降权运行、文件归属与权限精准匹配,并配合日志审计和定期验证。

最小特权原则在运维中不是设完权限就完事,而是让每个操作主体——人、服务、脚本——只触碰它真正需要的那一小块系统。
用户账户:一人一角色,root 必须离线
禁用 root 远程登录是第一道硬门槛。修改 /etc/ssh/sshd_config 中的 PermitRootLogin no,再执行 sudo systemctl restart sshd;同时锁定 root 密码:sudo passwd -l root。运维人员不共享账号,按职责建独立用户:比如 ops(日常巡检)、deployer(发布)、backup(备份),全部使用 /usr/sbin/nologin 或 /bin/bash 按需指定,禁止默认 shell 交互能力。
sudo 授权:命令级白名单,拒绝模糊匹配
不写 ALL=(ALL) ALL,也不用通配符路径。用 visudo 编辑 /etc/sudoers 或 /etc/sudoers.d/ 下的独立文件,每条授权必须明确三要素:谁、以谁身份、执行哪条绝对路径命令。例如:
- deployer ALL=(www-data) NOPASSWD: /usr/bin/systemctl reload nginx
- backup ALL=(root) NOPASSWD: /usr/bin/rsync -a --delete /var/www/ /backup/
同时显式禁止危险行为:Defaults:deployer !/bin/sh, !/usr/bin/perl, !/usr/bin/vi;启用留痕:Defaults logfile="/var/log/sudo.log",并确保该日志文件权限为 600、属主 root。
服务进程:启动即降权,不靠“启动后切换”
服务不该以 root 启动再 drop 权限,而应从第一行进程就运行在低权上下文中。Nginx 在 nginx.conf 顶部设 user www-data;;MySQL 在 /etc/my.cnf 中设 user = mysql;systemd 服务则在 unit 文件里写死:
- User=nginx
- Group=nginx
- ProtectSystem=strict(/usr、/boot、/etc 只读)
- ProtectHome=true(屏蔽 /home 和 /root)
- NoNewPrivileges=true(禁止 execve 提权)
绑定 80/443 端口不用 root,改用 capability:CapabilityBoundingSet=CAP_NET_BIND_SERVICE。
文件与目录:归属比数字更重要
权限数字只是结果,关键是属主、属组是否匹配实际使用逻辑。Web 根目录 /var/www/html 应属 www-data:www-data,目录 755、文件 644;上传目录 /var/www/uploads 设为 750,属组 www-data,再将可信维护用户加入该组;敏感文件如 /etc/shadow、/etc/sudoers 必须 600 或 640,且禁止 world-writable;SSH 私钥一律 chmod 600 ~/.ssh/id_rsa;关键配置可加不可变属性:chattr +i /boot/grub2/grub.cfg(更新内核前需临时移除)。











