跳到主要内容

Privilege Management

sudo 权限

/etc/sudoers 文件里的一条授权规则,作用是:让 deploy 这个用户只能用 sudo 执行"重启 saleor 服务"这一条命令,别的 root 操作一律不行。

把它拆成四段来看:

deploy ALL=(ALL) /usr/bin/systemctl restart saleor
└─┬──┘ └┬┘ └┬┘ └──────────────┬──────────────┘
1 2 3 4

第 1 段: deploy —— 谁

规则作用的对象。这里是用户名 deploy

如果想作用于一个,前面加 %,比如 %developers 表示 developers 组的所有成员。

第 2 段: ALL —— 在哪些主机上生效

这是"主机"字段。ALL 表示在任意主机上都生效。

这个字段是历史遗留——sudoers 文件设计上可以一份配置分发到多台机器,用主机名区分"这条规则只在某台机器生效"。但实际中绝大多数人一台机器一份配置,所以这里几乎永远写 ALL

第 3 段: (ALL) —— 可以切换成哪个身份运行

括号里是"以谁的身份执行"。(ALL) 表示可以切换成任意用户来跑这条命令(包括 root)。

它其实可以更精确,完整写法是 (运行用户:运行组)。举例:

  • (ALL) —— 能以任何用户身份运行
  • (root) —— 只能以 root 身份运行
  • (postgres) —— 只能切成 postgres 用户运行(运维场景很常见,比如让某人只能以 postgres 身份操作数据库)

所以更收紧的写法会是 deploy ALL=(root) /usr/bin/systemctl restart saleor

第 4 段: /usr/bin/systemctl restart saleor —— 允许执行的具体命令

这是限制的核心。deploy 用 sudo 时,只有完整匹配这一条才被放行:

sudo systemctl restart saleor # ✅ 允许

其他全部拒绝:

sudo systemctl stop saleor # ❌ 拒绝(是 stop 不是 restart)
sudo systemctl restart nginx # ❌ 拒绝(服务名不对)
sudo cat /etc/shadow # ❌ 拒绝(命令完全不在授权里)
sudo su - # ❌ 拒绝(不能提权成 root shell)

注意两个细节:

① 必须写命令的绝对路径 /usr/bin/systemctl,不能只写 systemctl。否则攻击者可以在自己 PATH 里放一个假的 systemctl 脚本来骗过 sudo。
② 参数也是规则的一部分。写死了 restart saleor,deploy 就改不了参数。如果想允许带任意参数,可以只写到命令名 /usr/bin/systemctl


怎么写入

更推荐的做法——单独建一个文件,便于管理:

visudo -f /etc/sudoers.d/deploy