Sudo(全称 superuser do)这个工具的设计,就是为了让普通用户在不切换到 root 账户的情况下,也能以其他用户(默认为 root)的身份来执行命令。和直接使用 su 命令相比,sudo 提供了更精细、更安全的权限控制方式。
今天,我们就来详细聊一聊如何进行 sudo 权限的管理。

1. 什么是 sudo?
简单来说,sudo 就像一把临时授权的钥匙。它允许普通用户,在保持自己登录状态的前提下,临时以超级管理员(root)或其他指定用户的身份,去运行特定的命令或程序。这种“按需授权”的模式,比直接切换到 root 拥有完整权限要安全得多,能够有效防止因误操作带来的系统性风险。
2. sudo 的基本命令用法
sudo command # 以 root 权限执行命令
sudo -u
3. sudo 权限配置
sudo 的所有核心配置都存放在 /etc/sudoers 这个文件里。但请务必注意,不要直接用文本编辑器去修改它,因为一旦语法错误,可能导致整个 sudo 功能失效。强烈推荐使用 `visudo` 命令来编辑,它会自动检查语法,避免配置出错。
visudo
sudoers 文件的基本语法结构是这样的:
<用户或用户组> <主机名>=(<可切换身份>) <命令列表>
举个例子:
liyb ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
这行配置的含义是:用户 liyb 可以在所有主机上,以任意用户的身份,无需输入密码,直接执行 `/usr/bin/systemctl restart nginx` 这个重启 Nginx 服务的命令。
4. 实战案例
(1)限制用户只运行特定命令
liyb ALL=(ALL) /usr/bin/systemctl restart nginx
效果:用户 bob 只能使用 sudo 来重启 nginx,无法用它执行其他任何命令,权限被严格约束。
(2)多个用户共享相同权限
Cmnd_Alias RESTART_CMDS = /sbin/reboot, /usr/bin/systemctl restart nginx
User_Alias ADMINS = alice, liyb
ADMINS ALL=(ALL) NOPASSWD: RESTART_CMDS
通过定义命令别名(Cmnd_Alias)和用户别名(User_Alias),我们可以让 ADMINS 组里的成员(alice 和 liyb)都能无需密码地执行 RESTART_CMDS 里定义的重启服务器和重启 nginx 命令,管理起来非常清晰。
(3)开发人员编辑特定配置文件
dev ALL=(ALL) NOPASSWD: /usr/bin/vi /etc/nginx/nginx.conf
这个配置只允许开发人员使用 vi 编辑器来修改 Nginx 的主配置文件,既能完成工作,又无法访问或修改系统其他敏感文件,实现了安全的职责分离。
(4)将 liyb 设为具备 root 权限
liyb ALL=(ALL) ALL
如果这样设置,意味着用户 liyb 可以在所有主机上执行任何命令,几乎等同于 root,但每次执行时仍然需要输入自己的密码进行验证。这是一种比较宽松但仍有基本管控的授权方式。
还有一种更常见的做法,是将用户 liyb 加入到系统预定义的 `wheel` 组(在某些发行版中是 `sudo` 组)。

5. sudo 日志与审计
所有通过 sudo 执行的命令都会被系统详细记录,这为日后的安全审计和行为追踪提供了重要依据。日志通常存放在以下路径: Ubuntu/Debian 系统:/var/log/auth.log CentOS/RHEL 系统:/var/log/secure
日志信息非常全面,包括执行命令的用户名、具体执行的命令、来自哪个终端、命令是否成功等关键信息,一目了然。

