Linux命令-sudo(以其他用户身份执行命令)
Linux命令-sudo(以其他用户身份执行命令)
- 快速参考
- 基本用法
- 常用选项
- Sudoers 配置
- sudoers 语法
- 实用配置示例
- 安全审计
- sudo vs su
- 常见问题
sudo(SuperUser DO)是 Linux 系统中默认的权限提权工具,允许授权用户以 root 或其他用户的身份执行命令。它是系统安全策略的执行者,通过/etc/sudoers配置文件实现细粒度的权限控制。相比su,sudo更安全——用户使用自身密码认证,所有操作均有审计日志。
快速参考
sudo[选项]命令[参数...]
sudo默认以 root 身份执行命令。通过/etc/sudoers配置可以精确控制谁可以在哪些主机上以哪个用户的身份执行哪些命令。
基本用法
# 以 root 身份执行命令(默认)sudoapt-getupdate# 以指定用户身份执行sudo-upostgres psql# 以 root 身份启动登录 Shellsudo-i# 以 root 身份启动指定 Shellsudo-s/bin/bash# 列出当前用户的 sudo 权限sudo-l# 刷新 sudo 时间戳(延长免密时间)sudo-v# 使 sudo 时间戳过期(下次需要密码)sudo-k# 编辑文件(推荐使用 sudoedit)sudo-e/etc/apt/sources.list# 等同于 sudoedit /etc/apt/sources.list# 保留当前 HOME 环境变量sudo-Hcommand# 非交互模式(密码从 stdin 读取)echo"mypassword"|sudo-Sapt-getupdate# ⚠️ 安全风险:密码明文出现在脚本/历史记录中!常用选项
| 选项 | 说明 |
|---|---|
-u USER | 以指定用户身份执行 |
-g GROUP | 以指定组身份执行 |
-i | 登录 Shell(模拟完整登录) |
-s | 指定 Shell 运行 |
-l | 列出当前用户权限 |
-v | 验证/刷新时间戳 |
-k | 使时间戳立即失效 |
-b | 后台运行命令 |
-e | 编辑文件(sudoedit) |
-E | 保留环境变量 |
-H | 将 HOME 设为目标用户的家目录 |
-n | 非交互(不提示密码) |
-- | 标记选项结束,之后的参数原样传递 |
Sudoers 配置
关键警告:永远不要直接编辑
/etc/sudoers!始终使用visudo!visudo在保存前会进行语法检查,避免因语法错误导致所有 sudo 命令失效。
# 编辑主配置文件sudovisudo# 编辑用户特定配置(推荐)sudovisudo-f/etc/sudoers.d/webadminssudoers 语法
# 基本格式:用户 主机=(以谁的身份) 命令 # 用户 主机 = (运行身份) 命令列表 root ALL = (ALL) ALL admin ALL = (ALL) ALL # 组授权(% 前缀表示组) %sudo ALL = (ALL) ALL %wheel ALL = (ALL) ALL # 无需密码执行 deploy ALL = (ALL) NOPASSWD: /usr/bin/systemctl restart nginx # 限制可执行的命令 operator ALL = (root) /usr/bin/systemctl, /usr/bin/journalctl # 仅允许以特定用户执行 app ALL = (www-data) /usr/bin/php, /usr/local/bin/composer # 命令别名 Cmnd_Alias SERVICES = /usr/bin/systemctl restart *, /usr/bin/systemctl stop * Cmnd_Alias PKG_MGMT = /usr/bin/apt-get, /usr/bin/apt webadmin ALL = (root) SERVICES, PKG_MGMT # 禁止危险命令(! 取反) joe ALL = (ALL) ALL, !/usr/bin/su, !/usr/bin/passwd root # 要求 tty(避免后台脚本注入 sudo) Defaults requiretty # 日志记录 Defaults logfile="/var/log/sudo.log" # 设置 sudo 密码超时(分钟) Defaults timestamp_timeout=15 # 密码尝试次数 Defaults passwd_tries=3 # 防止配置被下级目录覆盖 Defaults !includedir实用配置示例
# 开发团队配置cat>/etc/sudoers.d/developers<<'EOF' # 允许开发团队重启服务 %developers ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx %developers ALL=(root) NOPASSWD: /usr/bin/systemctl restart php*-fpm %developers ALL=(root) NOPASSWD: /usr/bin/systemctl restart redis # 允许查看日志 %developers ALL=(root) /usr/bin/journalctl, /usr/bin/tail # 不允许切换到 root %developers ALL=(ALL) ALL, !/usr/bin/su -, !/usr/bin/su root EOF# 数据库管理员配置cat>/etc/sudoers.d/dba<<'EOF' # DBA 以 postgres/mysql 用户操作数据库 %dba ALL=(postgres) NOPASSWD: /usr/bin/psql, /usr/bin/pg_dump, /usr/bin/pg_restore %dba ALL=(mysql) NOPASSWD: /usr/bin/mysql, /usr/bin/mysqldump EOF# CI/CD 部署用户配置cat>/etc/sudoers.d/cicd<<'EOF' # 部署用户只能执行部署相关操作 deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart app-server deploy ALL=(root) NOPASSWD: /usr/local/bin/deploy.sh deploy ALL=(root) NOPASSWD: /bin/chown -R www-data\:www-data /var/www/* Defaults:deploy !requiretty EOF安全审计
# 查看 sudo 执行日志sudogrep"sudo"/var/log/auth.logsudogrep"sudo"/var/log/secure# RHEL/CentOS# 自定义 sudo 日志位置# 在 /etc/sudoers 中添加:Defaultslogfile="/var/log/sudo.log"# 查看最近的 sudo 操作tail-f/var/log/auth.log|grepsudo# 审计用户 sudo 行为cat/var/log/auth.log|grep"COMMAND"|awk'{print $NF}'|sort|uniq-c|sort-rn# 查看谁在使用 sudowho-u|awk'{print $1}'|whilereaduser;doecho"$user:$(sudo-l-U"$user"2>&1)"donesudo vs su
| 特性 | sudo | su |
|---|---|---|
| 密码要求 | 自身密码 | 目标用户密码 |
| 审计日志 | 详细(每条命令) | 仅记录切换 |
| 权限粒度 | 精确到命令 | 全部或没有 |
| 密码共享 | 无需 | 需要 |
| 时间控制 | 支持超时 | 无 |
| 配置文件 | /etc/sudoers | /etc/pam.d/su |
| 推荐场景 | 日常使用 | 救援模式 |
常见问题
# 问题 1: "xxx is not in the sudoers file"# 将用户加入 sudo 组usermod-aGsudousername# Debian/Ubuntuusermod-aGwheel username# RHEL/CentOS# 问题 2: sudo 不要求密码(检查配置)sudo-l|grepNOPASSWD# 问题 3: sudo 命令未找到(环境变量被重置)# 在 sudoers 中添加安全路径Defaultssecure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"# 问题 4: visudo 语法错误后恢复# 如果因为错误配置导致 sudo 不可用:# 使用 pkexec 或救援模式恢复pkexec visudo# 问题 5: sudo 密码超时设置# 查看当前超时时间sudo-V|grep"Authentication timestamp timeout"安全准则:
- 原则:最小权限——只给用户完成工作所需的最小 sudo 权限
- 禁止
NOPASSWD: ALL——这是等同于 root 的无密码访问- 强制使用
visudo编辑 sudoers- 配置审计日志,定期审查 sudo 使用记录
- 为服务用户(如 deploy)配置精确的命令白名单
