侧边栏壁纸
博主头像
学习笔记

行动起来,活在当下

  • 累计撰写 9 篇文章
  • 累计创建 2 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux普通用户免密使用root命令

brian
2025-09-21 / 0 评论 / 0 点赞 / 20 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

背景

在 Linux 系统中,有些操作需要 root 权限,例如重启服务、修改系统配置、查看硬件信息等。如果让普通用户每次都切换到 root 账户或者输入 root 密码,既不安全又不方便。

sudo(Superuser Do)是 Linux 下的权限委托机制,允许管理员精确控制"哪个用户"可以"在哪台机器上"以"哪个身份"执行"哪些命令",并且可以免输密码(NOPASSWD)。合理配置 sudoers 文件,是生产环境中运维和自动化部署的标准实践。

1. 安全编辑 /etc/sudoers

永远不要用普通编辑器(如 vim /etc/sudoers)直接修改 sudoers 文件。应使用 visudo,它会在保存时进行语法检查,防止因格式错误导致所有用户无法使用 sudo:

sudo visudo

如果想直接编辑某个独立配置文件(推荐做法):

# 在 /etc/sudoers.d/ 目录下创建独立配置文件(推荐)
sudo visudo -f /etc/sudoers.d/deploy

💡 推荐:将自定义规则放到 /etc/sudoers.d/ 目录下,而不是直接修改主文件,便于管理和回滚。

2. sudoers 配置格式详解

sudoers 的核心格式如下:

who  where=(as_whom)  [NOPASSWD:]  commands

各字段说明:

  1. who:执行命令的用户(或以 % 开头的用户组)

  2. where:允许从哪些主机执行,ALL 表示所有主机

  3. (as_whom):以哪个用户的身份执行,(root)(ALL)

  4. NOPASSWD:(可选):免输密码

  5. commands:允许执行的命令路径,ALL 表示所有命令,! 前缀表示排除

⚠️ 命令必须使用绝对路径,可用 which 命令名 查看路径,例如 which systemctl

3. 实用配置示例

示例一:免密执行单个命令

允许 jetson 用户免密执行 dmidecode(查看硬件信息):

jetson  ALL=(root)  NOPASSWD: /usr/sbin/dmidecode

示例二:限制来源主机 + 排除危险命令

james 用户只能从指定 IP 登录,并执行 /usr/sbin/ 下的所有命令,但不允许执行 userdel

james  192.168.175.136,192.168.175.138=(root)  /usr/sbin/, !/usr/sbin/userdel

示例三:允许用户组免密管理服务

ops 组的成员可以免密重启、停止、启动系统服务:

%ops  ALL=(root)  NOPASSWD: /bin/systemctl restart *, /bin/systemctl stop *, /bin/systemctl start *

示例四:部署账户免密执行特定脚本

CI/CD 自动化部署场景中,允许 deploy 用户免密执行部署脚本:

deploy  ALL=(root)  NOPASSWD: /opt/scripts/deploy.sh, /bin/systemctl restart myapp

示例五:用户组完全免密 sudo(慎用)

Ubuntu 系统中,sudo 组默认配置如下,可作为参考:

%sudo   ALL=(ALL:ALL)  ALL

若需完全免密:

%sudo   ALL=(ALL:ALL)  NOPASSWD: ALL

4. /etc/sudoers.d/ 目录使用规范

主文件 /etc/sudoers 末尾通常有如下一行,表示会自动加载该目录下的所有配置:

@includedir /etc/sudoers.d

最佳实践:

# 为 deploy 用户创建独立配置
sudo visudo -f /etc/sudoers.d/deploy

# 写入内容
deploy  ALL=(root)  NOPASSWD: /bin/systemctl restart myapp

# 验证语法(退出 visudo 时自动检查)
# 或手动验证
sudo visudo -c -f /etc/sudoers.d/deploy

5. 安全注意事项

  1. 最小权限原则:只授予用户必要的命令权限,不要随意使用 NOPASSWD: ALL

  2. 使用绝对路径:命令必须写绝对路径,防止通过 PATH 注入执行恶意命令。

  3. 禁止编辑器/Shell 获取 root:不要授权 vimbashpython 等可以逃逸到 shell 的命令,否则等同于直接给 root 权限。

  4. 定期审查:定期 sudo -l -U username 检查各用户的权限,及时回收不再需要的授权。

  5. 日志审计:生产环境确保 /var/log/auth.logjournald 记录 sudo 操作日志,便于安全审计。

总结

sudo + sudoers 是 Linux 权限委托的核心机制,合理使用可以在保证安全的同时提升运维效率。记住几个关键点:

  1. ✅ 用 visudo 编辑,不要直接 vim

  2. ✅ 自定义规则放 /etc/sudoers.d/,便于管理

  3. ✅ 命令用绝对路径,配合 NOPASSWD: 实现免密

  4. ✅ 遵循最小权限原则,禁止授权 shell/编辑器类命令

博主关闭了所有页面的评论