第 10 章 管理 sudo 访问

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

10.1. sudoers 中的用户授权

/etc/sudoers 文件指定哪些用户可以使用 sudo 命令来执行其他命令。规则可应用到单个用户和用户组。您还可以使用别名轻松地为主机组、命令甚至用户定义规则。默认别名定义在 /etc/sudoers 文件的第一部分中。

当用户输入带有 sudo 的命令时(因为用户没有授权),系统会将一条包含字符串 <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.example.com>=(<run_as_user>:<run_as_group>) <path/to/command>

其中:

  • <username> 是输入命令的用户,如 user1。如果值以 % 开头,则它会定义一个组,例如 %group1
  • <hostname.example.com> 是应用该规则的主机的名称。
  • 部分 (<run_as_user>:<run_as_group>) 定义执行命令的用户或组。如果省略这部分,<username> 可以以 root 用户身份执行命令。
  • <path/to/command> 是该命令的完整的绝对路径。您还可以通过在命令路径后面添加这些选项,将用户限制为仅使用特定的选项和参数执行命令。如果没有指定任何选项,用户可以使用带有所有选项的命令。

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

警告

使用过于宽松的规则(如 ALL=(ALL) ALL ),所有用户可以以所有主机上的所有用户身份运行所有命令。这带来了严重的安全风险。

您可以使用 ! 运算符来指定参数的反。例如,!root 指定除 root 以外的所有用户。请注意,允许特定用户、组和命令比禁止特定用户、组和命令更安全。这是因为允许规则也会阻止新的未授权的用户或组。

警告

避免对命令使用负规则,因为用户可以使用 alias 命令重命名命令来克服此类规则。

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

要在系统更新期间保留规则,并轻松地修复错误,请在 /etc/sudoers.d/ 目录中创建新文件,而不是直接在 /etc/sudoers 文件中输入规则。当系统在 /etc/sudoers 文件中达到以下行时,会读取 /etc/sudoers.d 目录中的文件:

#includedir /etc/sudoers.d

请注意,此行开头的数字符号(#)是语法的一部分,并不意味着该行是一个注释行。该目录中文件的名称不得包含句点,不得以波形符(~)结尾。

其他资源

  • sudo (8)sudoers (5) 手册页