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

下一篇起进入模块四:进程与服务管理。