返回博客

配置 Linux Sudoers 文件

配置 Linux Sudoers 文件

介绍

你是否曾想过,为什么必须输入 “sudo” 来在 LinuxUnix 操作系统环境中执行某些命令?Sudo 实际上是一个缩写,代表 “super-user do”。当您使用 sudo 命令时,您可以使用另一个用户的安全权限来运行程序和执行命令。

默认情况下,sudo 命令允许系统用户以 super-user 的权限执行命令。新安装 of a Linux/Unix 操作系统会创建一个具有超级用户权限的 root 帐户。在进行 Linux/Unix 系统的初始服务器设置时,系统管理员使用 root 帐户登录并向其他系统用户分配系统权限。这些设置存储在名为 sudoers 的文件中。具有 root 权限的帐户可以编辑 sudoers 文件并更改其他用户的权限。

在本教程中,我们将讨论如何获取 root 权限并对 sudoers 文件进行编辑。

前提条件

这是一个动手实践教程,您需要测试这些命令以充分理解本教程。在本教程中,我们将使用 Ubuntu 20.04 服务器,但是,如果您使用的是任何现代 Linux 发行版,例如 DebianCentOS,您也可以按照这些步骤操作。您可以点击 此链接在 CloudSigma 上设置您自己的 Ubuntu 云服务器.

获取 Root 权限

您可以通过以下讨论的三种方式获取 root 权限:

以 root 身份登录

大多数人获取 root 权限最简单的方法是使用 root 用户凭据登录系统。如果您正在访问本地计算机,只需提供用户名,系统就会提示您输入密码。

另一种可以用来以 root 身份登录的方法是使用 SSH —— 一种用于登录服务器并在服务器上执行任务的命令行工具。它需要您服务器的用户名和 IP 地址。以 root 身份登录的语法如下,请替换为您服务器的 IP 地址:

当您在终端中输入上述命令时,如果您尚未设置 SSH 密钥,系统将提示您提供密码;如果您已设置了 SSH 密钥,系统将提示您输入 SSH 密钥的密码短语。提供正确的凭据后,您将成功登录。请遵循此 指南,获取有关如何在 Ubuntu 中使用 SSH 连接到远程服务器的逐步说明.

使用 su 成为 root

您可以使用 root 以外的任何其他帐户登录 Linux 系统,这通常是执行非管理任务时的推荐方式。每当您想获取 root 权限时,只需在终端上输入 su 即可:

系统会提示您输入 root 密码,之后您将进入 root shell 会话。在此 shell 会话中,您可以执行所有管理任务,每当您想返回普通 shell 时,只需按 Ctrl + D。或者,您可以在终端上输入 exit 并按回车键。

使用 sudo 运行具有 root 权限的命令

在本教程开始时简要介绍过的 sudo 命令允许您执行单行命令,而无需 root 权限的 shell。您只需输入 sudo 后跟要执行的命令:

例如,要更新系统,您可以输入以下内容:

系统会提示您输入密码。 susudo 命令的区别在于,su 要求输入 root 密码,而 sudo 要求输入当前用户的密码。默认情况下,用户不会被授予 sudo 访问权限,因为它对系统具有重大的安全影响。我们将在以下章节中对此进行更多讨论。

使用 Visudo 编辑 sudoers 文件

Sudo 权限配置在 sudoers 文件 中,该文件位于 /etc/sudoers. 这些权限是任何用户访问 Linux 系统所必需的。任何语法错误都会导致用户无法登录系统,从而使系统崩溃。

Visudo 命令会使用一个特殊的编辑器打开该文件,该编辑器在保存时会检查文件的语法。因此,非常重要的一点是,您只能使用 visudo 命令来打开文件,以防止您的服务器系统变得不可用。默认情况下,visudo 被设置为使用 (vi) 打开文本编辑器 vim。然而,Ubuntu 已将 visudo 配置为使用 nano 文本编辑器。在 Debian 或 Ubuntu 上,您可以通过输入以下命令来更改为其他编辑器:

它会显示一个编辑器列表,您可以从中选择一个默认编辑器,如屏幕截图所示。选择您偏好的编辑器对应的数字:

displays a list of editors

CentOS Linux 发行版上,编辑 /etc/sudoers 并添加以下行:

输入以下命令。请记住替换 your_editor_of_choice 的名称:

该命令将该行添加到 ~/.bashrc 文件中。在终端中输入以下内容以应用更改:

现在您的 visudo 已配置完毕,您可以通过输入以下命令打开位于 /etc/sudoers 的文件:

编辑 Sudoers 文件

当您运行上一个命令时,该文件将在您配置的主编辑器中打开。以下是该文件的内容:

注释非常具有描述性,但我们将在下面讨论这些行所表示的含义。

默认行
  • Defaults env_reset – 重置终端环境变量以删除任何用户变量。因此,它会从 sudo 会话中清除潜在的有害变量。
  • Defaults mail_badpass – 指示系统将 sudo 密码尝试失败的通知邮寄给配置的 mailto 用户,通常是 root 帐户。
  • Defaults secure_path – 包含文件系统中的几个路径,sudo 操作在执行时会寻找这些路径中的应用程序来使用,以防止使用其他可能对系统危险的用户定义路径。
用户权限规范行
此行与其他行不同,它指定了 root 用户的权限。以下是该行中每个标记所表示的含义:

  1. root ALL=(ALL:ALL) ALL – 第一个字段指定该规则将应用到的用户名。在这种情况下,它是 root 用户。
  2. root ALL=(ALL:ALL) ALL – 第一个 ALL 指定该规则将应用于所有主机。
  3. root ALL=(ALL:ALL) ALL – 第二个 ALL 指定此规则适用的用户(即 root)可以作为所有用户运行命令。
  4. root ALL=(ALL:ALL) ALL – 第三个 ALL 指定此规则适用的用户(即 root)可以作为所有组运行命令。
  5. root ALL=(ALL:ALL) ALL – 最后一个 ALL 指定这些规则适用于所有命令。

根据该规则的指示,root 用户在提供正确的密码后,可以使用 sudo 运行任何命令。

组权限规范行

这些行指定了适用于组的 sudo 权限规则。这些字段表示与用户权限行相同的操作,只有微小的差别。它们以 % 开头以表示组名。

如您所见,admin 组可以在任何主机上作为任何用户执行任何命令。sudo 组具有相同的权限,并具有作为任何组执行命令的附加权限。

包含 /etc/sudoers.d 行

由于行首的 #,#includedir /etc/sudoers.d 行看起来可能像是一条注释。然而,这是一个 include 指令,表示应该引入 /etc/sudoers.d 目录中的文件并将其作为 sudoers 文件的一部分使用。该目录中的文件遵循与 sudoers 文件相同的规则。

该目录中任何不包含点(.)且不以 ~ 结尾的文件都会被读取并附加到 sudoers 文件配置中。该目录允许应用程序在安装时通过将其所有相关规则放入 /etc/sudoers.d 目录中的单个专用文件中来更改 sudo 权限,而无需修改默认的 sudoers 文件。此外,当您想要检查或撤销某个应用程序的权限时,您可以轻松地检查或修改 /etc/sudoers.d 目录中的文件,而无需直接修改 /etc/sudoers 文件。

根据经验,/etc/sudoers.d 目录中的所有文件都应始终使用 visudo 命令进行编辑。以下是语法,请记住在命令中替换您要编辑的文件名:

为用户分配 Sudo 权限

当您向新用户授予常规 sudo 访问权限时,这意味着您已赋予该用户帐户对系统的完全管理访问权限。这是系统管理员在创建其他具有 sudo 权限的非 root 用户时执行的常见任务。

在像 Ubuntu 20.04 这样已经拥有通用管理组的系统中,我们可以通过将用户添加到该组来轻松地为用户分配 sudo 权限。在 /etc/sudoers 文件中可以看到,sudo 组具有完全的管理权限,我们可以通过输入以下命令将用户名添加到该组中:

或者,您可以使用 gpasswd 命令来达到相同的目的:

CentOS 上,具有 sudo 权限的默认组名为 wheel,因此您可以使用以下命令分配权限:

或者,使用 gpasswd 命令,您可以使用以下命令达到相同的目的:

在某些情况下,wheel CentOS 上的组在 /etc/sudoers 文件中可能被注释掉了。要启用它,请使用 visudo 打开该文件,并取消注释包含该组名的行。您可以通过删除行首的 # 来实现此操作:%wheel ALL=(ALL) ALL.

创建自定义规则

掌握了目前为止所学的 sudoers 通用语法知识,现在是时候设置一些规则了。

创建别名

别名允许您通过将项目分组到各种“别名”下来组织 sudoers 文件。我们将在本节中讨论三个指令:User_Alias 用于创建用户/组别名,Cmnd_Alias 用于创建命令别名,以及 Runas_Alias 用于允许一个用户以另一个用户的身份运行。

例如,使用 User_Alias,在您的 /etc/sudoers 文件中,您可以添加以下代码片段来创建三个不同的用户组。某些用户可能属于多个组:

请注意,所有组名都以大写字母开头。在 /etc/sudoers 文件中添加上述组别名后,您可以将更新 apt 数据库的权限分配给 GROUPTWO,方法是在 /etc/sudoers 文件中添加以下规则:

请注意,如果不指定要以其身份运行的用户/组,sudo 命令将始终默认为 root 用户。

以下是 Cmnd_Alias 的示例,其中我们创建了一个用于关闭和重启系统的命令别名。然后将该规则分配给 GROUPTHREE。在 /etc/sudoers 文件中添加以下行即可实现此目的:

在上面的代码片段中,第一行创建了一个名为 POWER 的命令别名,其中包含关机和重启命令。第二行允许 GROUPTHREE 的成员运行此命令。

以下是 Runas_Alias 的示例,我们创建了一个别名,允许一组用户以另一个用户的身份运行:

在上面的代码片段中,第一行创建了一个名为 WEB 的别名,指定该别名将以 apache 用户或 www-data 用户的身份运行。第二行将该别名分配给 GROUPONE。现在,第一组的成员可以以 apachewww-data 用户的身份执行命令。

锁定规则

在本节中,您将学习控制 sudo 对调用的反应的各种方法。在单用户系统上,某些命令是相对无害的。在这种情况下,您可以允许用户以 root 权限执行它们,而无需输入 root 密码。例如,您可以创建一条规则,允许 GROUPONE 中的用户在运行 updatedb 命令时无需输入密码,方法是将以下内容添加到 /etc/sudoers 文件中:

标签 NOPASSWD 意味着不需要输入密码。与 NOPASSWD 标签相对应的是 PASSWD,这是默认行为。这意味着必须在提示符处提供密码。

除非被其对应标签覆盖,否则标签适用于规则,例如:

在此规则中,GROUPTWO 中的用户可以执行 updatedb 命令而无需输入密码。但是,他们在执行 kill 命令之前必须提供密码。

在某些情况下,您可能希望限制用户执行某些命令,以防止一些危险的执行。这就是 NOEXEC 标签发挥作用的地方。某些程序可以从其界面内部运行其他命令。此类程序的一个例子是 less。如果您在 less 界面中输入具有以下语法的命令,它将运行,从而导致一些意外行为。

为了防止此类行为,您可以将以下规则添加到 /etc/sudoers 文件中,以限制由 username:

附加信息

在本节中,我们包含了一些在使用 sudo 时您可能会发现必要的附加信息、指令和命令。

如果您在配置中使用了 Runas_Alias,指定用户或组可以作为另一个用户运行,则可以通过对用户使用 -u 标志以及对组使用 -g 标志来作为这些用户执行命令。语法如下:

每个命令都会提示您输入关联的密码。为了方便起见,sudo 会将密码保存一段时间,这样您就不必在每次使用 sudo 运行命令时都重复输入密码。在完成 sudo 特权命令后,您可能希望通过输入以下命令来清除该时间:

如果您有更多需要以 sudo 特权执行的任务,并且希望延长密码请求前的时间,或者希望避免 sudo 命令稍后提示输入密码,您可以通过输入以下命令来更新时间:

该命令会提示您输入密码并将其缓存,以便稍后使用 sudo。

要列出为您的用户名定义的 sudo 特权,您可以输入以下命令:

该命令列出了 /etc/sudoers 文件中配置的适用于您用户名的所有规则。通过这些规则,您可以了解您的用户名在系统上可以执行哪些任务。以下是示例截图:

screenshot

在某些情况下,您执行的命令可能会失败,因为您忘记在前面加上 sudo。在这种情况下,您可能必须重新输入以 sudo 开头的命令。为了避免重新输入命令,您可以利用 bash 的“重复上一个命令”功能。语法是双感叹号。您可以通过输入以下内容来执行您在终端上运行的最后一个命令:

最后,重要的是要了解 sudo 只是提升了要以 sudo 特权执行的命令。有关其他信息,您可以按照以下链接中的说明进行操作,此链接来和您的用户找点乐子.

结论

在与多个用户一起工作时,熟悉 sudo 命令和 sudoers 文件至关重要。在本教程中,我们介绍了读取和修改 sudoers 文件的基础知识,以及可用于获取 root 特权的各种方法。

请始终记住,特权分离是 Linux 系统安全的原因。因此,不应将超级用户特权授予普通用户。仅分配特定用户在系统中执行其特定任务所绝对必需的特权,而不是所有特权。

祝您使用愉快!

author

Manpreet Singh

作者 · CloudSigma

Preslav Dobrev 是 CloudSigma 的创意设计师,专注于通过传统和创新营销渠道打造一致的企业形象。他擅长将艺术愿景与战略营销相融合,创造具有影响力的品牌叙事。

评论

暂无评论。发表第一条评论吧。