深色模式
最小权限原则:按需授权与及时回收
摘要:最小权限就是"只给完成工作所必需的权限,用完立刻收回"。本文给出 Linux 上账号、sudo、文件权限三层的落地命令与一套可执行的复核流程。这是通用安全实践,具体合规要求请以你所在组织的制度为准。
适用环境
bash
cat /etc/os-release
command -v sudo && sudo --version | head -1
getent passwd | wc -l
ls /etc/sudoers.d/1
2
3
4
2
3
4
操作步骤
1. 建专用运维账号,不共用 root
bash
useradd -m -s /bin/bash ops_zhang
passwd ops_zhang # 或走密钥登录,见 SSH 加固
usermod -aG wheel ops_zhang # CentOS/RHEL;Debian 系为 sudo 组
id ops_zhang1
2
3
4
2
3
4
2. 用 sudoers.d 精确授权,别给 ALL
bash
# 文件名建议用账号名,便于回收
cat >/etc/sudoers.d/ops_zhang <<'EOF'
ops_zhang ALL=(root) NOPASSWD: /bin/systemctl restart nginx, \
/bin/systemctl status nginx, \
/usr/bin/journalctl -u nginx *
EOF
chmod 0440 /etc/sudoers.d/ops_zhang
visudo -c # 语法检查,必须显示 parsed OK1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
3. 收紧 sudo 默认行为
bash
cat >/etc/sudoers.d/99-defaults <<'EOF'
Defaults requiretty
Defaults logfile="/var/log/sudo.log"
Defaults log_input, log_output
Defaults passwd_tries=3
Defaults timestamp_timeout=5
EOF
visudo -c1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
log_input/log_output 会记录 sudo 会话的输入输出,便于事后审计。
4. 文件权限:收掉全局可写与危险 SUID
bash
find / -xdev -type f -perm -0002 -ls 2>/dev/null | head # 全局可写文件
find / -xdev -perm -4000 -type f -ls 2>/dev/null | head # SUID 文件
chmod o-w /path/to/file # 逐个确认后收紧
chmod u-s /path/to/suid_file # 确认不需要才摘除1
2
3
4
2
3
4
共享目录用 ACL 而不是 777:
bash
setfacl -m u:ops_zhang:rwx /data/shared
getfacl /data/shared1
2
2
5. 服务用独立低权限账号运行
bash
useradd -r -s /sbin/nologin svc_app
chown -R svc_app:svc_app /opt/myapp
# systemd 单元里指定
# [Service]
# User=svc_app
# Group=svc_app
# NoNewPrivileges=yes
# ProtectSystem=strict1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
6. 回收:离职、转岗、临时权限到期
bash
# 锁账号(保留文件归属)优于直接删除
usermod -L -e 1970-01-01 ops_zhang
# 确认无残留进程
pkill -u ops_zhang; ps -u ops_zhang
# 清掉 sudo 授权与密钥
rm -f /etc/sudoers.d/ops_zhang && visudo -c
rm -f /home/ops_zhang/.ssh/authorized_keys1
2
3
4
5
6
7
2
3
4
5
6
7
临时权限务必带到期时间,写进工单并由脚本自动回收。
验证
bash
awk -F: '$3==0 {print $1}' /etc/passwd # 只应出现 root
sudo -l -U ops_zhang # 逐条核对授权范围
grep -R "NOPASSWD:.*ALL" /etc/sudoers /etc/sudoers.d/ # 不应有结果
lastlog | grep -v "Never logged in" # 无已离职人员登录记录1
2
3
4
2
3
4
判定标准:无多余 UID 0 账号;sudo 授权可枚举且无 ALL 通配;离职账号 24 小时内锁定。
常见坑
直接 chmod 777 解决权限报错
777 等于对所有人开放写权限,是提权与植入后门的温床。先查清报错的真实归属与 SELinux 上下文。
sudo 给了 ALL=(ALL) NOPASSWD:ALL
等于给了 root。应一条命令一条命令地白名单化,并定期清理。
删除账号不留审计
userdel -r 会连家目录一起删,导致事后无法追溯。先 usermod -L 锁定并保留数据,过保留期再清理。
服务进程仍以 root 起
很多程序监听 80/443 后不降权。用 systemd 的 User= 配合 capability(AmbientCapabilities=CAP_NET_BIND_SERVICE)而不是直接给 root。