Red Hat Training

A Red Hat training course is available for RHEL 8

第 24 章 管理 sudo 访问

系统管理员可以授予 sudo 访问权限来允许非 root 用户执行通常为 root 用户保留的管理命令。因此,非 root 用户可以在不登录 root 用户帐户的情况下执行这些命令。

24.1. sudoers 中的用户授权

/etc/sudoers 文件指定哪些用户可以使用 sudo 命令运行哪些命令。这些规则可应用于单个用户和用户组。您还可以使用别名来简化为一组主机、命令甚至用户定义规则。默认别名在 /etc/sudoers 文件的第一部分中定义。

当用户试图使用 sudo 权限运行 /etc/sudoers 文件中不允许的命令时,系统会记录一个信息,其中包含 username : user NOT in sudoers 到日志中的。

默认 /etc/sudoers 文件提供授权信息和示例。您可以通过从行开始删除 # 注释字符来激活特定示例规则。与用户相关的授权部分标记如下:

## Next comes the main part: which users can run what software on
## which machines  (the sudoers file can be shared between multiple
## systems).

您可以使用以下格式创建新的 sudoers 授权并修改现有授权:

username hostname=path/to/command

其中:

  • 用户名 是用户或组群的名称,例如 user1%group1
  • hostname 是规则适用的主机的名称。
  • path/to/command 是命令 的完整绝对路径。您还可以将用户限制为只执行带有特定选项和参数的命令,方法是在命令路径后添加这些选项。如果您没有指定任何选项,用户就可以使用包含所有选项的命令。

您可以将任何这些变量替换为 ALL,将规则应用到所有用户、主机或命令。

警告

使用过量的 permissive 规则,如 ALL ALL=(ALL) ALL,所有用户都可以作为所有主机的所有用户运行所有命令。这可能导致安全隐患。

您可以使用 ! Operator 来拒绝指定参数。例如,使用 !root 指定除 root 用户以外的所有用户。请注意,使用允许列表允许特定用户、组群和命令比使用块列表来禁止特定的用户、组群和命令更为安全。您还可以使用允许列表阻止新的未授权用户或组。

警告

避免对命令使用负规则,因为用户可以使用 alias 命令重新命名命令来绕过这些规则。

系统从开始到结尾读取 /etc/sudoers 文件。因此,如果文件包含用户的多个条目,条目会按顺序应用。如果值冲突,系统也会使用最后的匹配项,即使它不是最具体的匹配项。

sudoers 中添加新规则的首选方法是在 /etc/sudoers.d/ 目录中创建新文件,而不是直接在 /etc/sudoers 文件中输入规则。这是因为这个目录的内容会在系统更新过程中被保留。另外,与 /etc/sudoers 文件中相比,可以更容易修复独立文件中的任何错误。当在 /etc/sudoers 文件中到达以下行时,系统读取 /etc/sudoers.d 目录中的文件:

#includedir /etc/sudoers.d

请注意,在这个行的开头符号 # 是语法的一部分,并不意味着行是一个注释。该目录中的文件名称不能包含句点 .,且不能以 tilde ~ 结尾。

24.2. 为用户授予 sudo 访问权限

系统管理员可以授予 sudo 访问权限来允许非 root 用户执行管理命令。sudo 命令在不使用 root 用户密码的情况下为用户提供管理访问。

当用户需要执行管理命令时,您可以在使用 sudo 命令前执行该命令。然后会像 root 用户一样执行该命令。

请注意以下限制:

  • 只有 /etc/sudoers 配置文件中列出的用户才能使用 sudo 命令。
  • 该命令在用户的 shell 中执行,而不是在 root shell 中执行。

先决条件

  • root 访问

流程

  1. 以 root 用户身份打开 /etc/sudoers 文件。

    # visudo

    /etc/sudoers 文件定义 sudo 命令应用的策略。

  2. /etc/sudoers 文件中,找到为管理 wheel 组中的用户授予 sudo 访问权限的行。

    ## Allows people in group wheel to run all commands
    %wheel        ALL=(ALL)       ALL
  3. 确保以 %wheel 开头的行前面没有 # 注释字符。
  4. 保存所有更改并退出编辑器。
  5. 添加您要向管理 wheel 组授予 sudo 访问权限的用户。

     # usermod --append -G wheel username

    使用用户名替换 username

    验证步骤

    • 验证用户是否已添加到管理 wheel 组中:

      # id username
      uid=5000(username) gid=5000(_username) groups=5000(username),10(wheel)

24.3. 启用非特权用户运行某些命令

您可以配置一个策略,允许非特权用户在特定工作站运行特定命令。要配置这个策略,您需要编辑 sudoers.d 文件。

先决条件

  • root 访问

流程

  1. 以 root 用户身份,在 /etc/ 下创建新 sudoers.d 目录:

    # mkdir -p /etc/sudoers.d/
  2. /etc/sudoers.d 目录中创建新文件:

    # visudo -f /etc/sudoers.d/file-name

    使用您要创建 的文件的名称替换 file- name。该文件将自动打开。

  3. 在新创建的文件中添加以下行:

    username hostname = /path/to/the/command

    使用用户名替换 username。使用主机的名称替换 hostname。使用 命令的绝对路径替换 /path/to /the/command(例如 /usr/bin/yum)。

  4. 保存所有更改并退出编辑器。

    例 24.1. 启用非特权用户使用 yum 和 dnf 安装程序

    要让用户 sarah 使用具有 sudo 权限的 yumdnf 工具在 localhost.localdomain 工作站中安装程序,请使用:

    1. 以 root 用户身份,在 /etc/ 下创建新 sudoers.d 目录:

      # mkdir -p /etc/sudoers.d/
    2. /etc/sudoers.d 目录中创建新文件:

      # visudo -f /etc/sudoers.d/sarah

      该文件将自动打开。

    3. /etc/sudoers.d/sarah 文件中添加以下行:

      sarah localhost.localdomain = /usr/bin/yum, /usr/bin/dnf

      确定两个命令路径用 , 逗号分开,后跟一个空格。

    4. :每次用户 sarah 尝试使用 sudo 权限时,若要接收电子邮件通知,请在该文件中添加以下行:

      Defaults    mail_always
      Defaults    mailto="email@domain.com"
    5. 要验证用户 sarah 是否可以使用 sudo 权限运行 yum 命令,请切换帐户:

      # su sarah -
    6. 输入 sudo yum 命令:

      $ sudo yum
      [sudo] password for sarah:

      为用户 sarah 输入 sudo 密码。

    7. 系统显示 yum 命令和选项列表:

      ...
      usage: yum [options] COMMAND
      ...

      如果您收到 sarah is not in the sudoers file. This incident will be reported. 信息,则配置无法正确完成。请确定您以 root 身份执行这个步骤,并且您明确遵循了这些步骤。

24.4. 其它资源

  • sudo(8) man page
  • visudo(8) man page