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