Linux用户权限策略教程_sudoACL策略配置与案例解析

15次阅读

sudo权限控制核心是通过/etc/sudoers(用visudo编辑)按序匹配的精确规则,定义“谁在哪些主机上以什么身份运行哪些命令”;推荐拆分策略至/etc/sudoers.d/并结合用户组实现细粒度、可维护的授权。

Linux用户权限策略教程_sudoACL策略配置与案例解析

sudo权限控制的核心逻辑

sudo不是简单地“让普通用户执行root命令”,而是通过精确的规则定义“谁能在哪些主机上、以什么身份、运行哪些命令”。配置的关键在于/etc/sudoers文件(必须用visudo编辑)及其包含的片段,所有规则按顺序匹配,第一条生效,不满足则拒绝。

基础sudoers语法与安全写法

一条典型规则形如:
alice ALL=(root) /usr/bin/systemctl restart nginx
含义是:用户alice在任意主机(ALL)上,可切换为root身份,仅执行指定的systemctl重启nginx命令。

  • 避免使用NOPASSWD: ALL——除非是开发测试环境,生产中应限定命令路径和参数
  • Cmnd_Alias归类命令,例如:
    Cmnd_Alias WEB_CMD = /usr/bin/systemctl start nginx, /usr/bin/systemctl stop nginx, /bin/journalctl -u nginx
  • User_AliasHost_Alias提升可维护性,例如:
    User_Alias WEBADMINS = alice, bob
    WEBADMINS webserver01 = (root) WEB_CMD

ACL式细粒度控制:sudoers.d与组策略

现代linux发行版推荐将策略拆分到/etc/sudoers.d/目录下,按功能或团队命名(如90-webteam),文件需无扩展名、权限644、不带空格。结合Linux用户组可实现批量授权:

  • 创建系统组:groupadd webops
  • 把用户加入组:usermod -aG webops alice
  • /etc/sudoers.d/webops中写:
    %webops ALL=(root) NOPASSWD: /usr/bin/nginx -t, /usr/sbin/nginx -s reload
  • 注意%前缀表示组;NOPASSWD仅对列出的命令生效,其他仍需密码

实战案例:限制dba只能重启mysql且验证配置

目标:dba组成员可无密重启MySQL服务,但不能停止、启动其他服务,也不能shell逃逸。

  • 定义命令别名:
    Cmnd_Alias MYSQL_CMD = /usr/bin/systemctl restart mysql, /usr/bin/mysqladmin ping
  • 禁止shell访问:
    Defaults: %dba !shell, !sudoedit
  • 主策略行:
    %dba ALL=(root) NOPASSWD: MYSQL_CMD
  • 验证方式:
    切换到dba用户后运行sudo -l查看可用命令;尝试sudo systemctl stop mysql应被拒绝;sudo -i应失败

不复杂但容易忽略

text=ZqhQzanResources