sudo 的设计目的
直接用 root 工作 = 任何错误都是致命的。sudo 让你以普通身份工作,需要 root 权限时显式申请——既留下审计日志,又限制爆炸半径。
基础用法
sudo apt update # 单条命令用 root
sudo -i # 切到 root shell(小心)
sudo -u alice command # 以 alice 身份跑
sudo -l # 看自己有哪些 sudo 权限
sudo -k # 清空 sudo 缓存(下次重新输密码)
默认行为:
- 第一次输入自己的密码(不是 root 密码)
- 之后 15 分钟内不用再输
/etc/sudoers:权限规则
永远用 visudo 编辑,不要直接 vim:
sudo visudo
visudo 会语法检查——配错了系统会拒绝保存,避免 sudoers 损坏导致 sudo 完全失效。
规则语法
用户/组 主机=(运行身份) 命令
例:
# 所有 sudo 组成员都能跑任何命令(Ubuntu 默认)
%sudo ALL=(ALL:ALL) ALL
# wadely 能在任何机器上以任何身份跑任何命令
wadely ALL=(ALL) ALL
# alice 只能重启 nginx(不用密码)
alice ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
# deploy 用户只能跑几个具体命令
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp, \
/usr/bin/journalctl -u myapp *
# 禁止 alice 切到 root shell
alice ALL=(ALL) ALL, !/bin/bash, !/bin/sh, !/usr/bin/sudo -i
%组名 = 组规则;不加 % = 用户规则。
/etc/sudoers.d/:拆分管理
不直接改 sudoers,把规则放到 /etc/sudoers.d/ 下:
sudo visudo -f /etc/sudoers.d/deploy
内容:
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp
好处:
- 不同需求分文件
- 升级系统不冲突
- 删一个用户的权限只删一个文件
几条安全原则
1. 永远不要 NOPASSWD: ALL
等于把 root 密码白送:
# ❌ 危险
alice ALL=(ALL) NOPASSWD: ALL
2. 列具体命令
不是给"所有 systemctl"——是给"systemctl restart myapp":
# ❌ 太宽
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl
# ✓ 精确
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp
3. 注意 shell 提权
允许跑 vim / less / find 等命令 → 用户可以从里面跑 shell → 提权。
# ⚠ 警告:alice 能 sudo vim → 可以 :!bash → root shell
alice ALL=(ALL) NOPASSWD: /usr/bin/vim
要给编辑权限,用 sudoedit(看下面)。
4. 用 sudoedit 安全编辑
让用户能改特定文件,但不能跑任意命令:
alice ALL=(ALL) sudoedit /etc/nginx/nginx.conf
alice 用 sudoedit /etc/nginx/nginx.conf → 把文件复制到临时位置 → 用 alice 自己的编辑器 改 → 改完拷回 root 位置。没有提权风险。
5. 审计日志开起来
所有 sudo 命令都进 /var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(RHEL 系)。别关——出事时是唯一线索。
看自己有什么权限
sudo -l
# User wadely may run the following commands on myhost:
# (ALL : ALL) ALL
# (ALL) NOPASSWD: /usr/bin/systemctl restart nginx
下一篇起进入模块四:进程与服务管理。