如何编辑Sudoers文件

来自菜鸟教程
跳转至:导航、​搜索

介绍

权限分离是在 Linux 和类 Unix 操作系统中实现的基本安全范例之一。 普通用户以有限的权限进行操作,以减少他们对自己环境的影响范围,而不是更广泛的操作系统。

一个名为 root 的特殊用户拥有 super-user 权限。 这是一个管理帐户,没有普通用户存在的限制。 用户可以通过多种不同的方式以超级用户或 root 权限执行命令。

在本文中,我们将讨论如何正确、安全地获取 root 权限,特别关注编辑 /etc/sudoers 文件。

我们将在 Ubuntu 20.04 服务器上完成这些步骤,但大多数现代 Linux 发行版(例如 Debian 和 CentOS)应该以类似的方式运行。

本指南假定您已经完成了此处讨论的 初始服务器设置 。 以普通的非 root 用户身份登录您的服务器,然后继续下面的操作。

注意: 本教程深入介绍了权限提升和 sudoers 文件。 如果您只想为用户添加 sudo 权限,请查看我们的 如何创建新的启用 Sudo 的用户 快速入门教程,用于 Ubuntu 和 CentOS 。


如何获得 Root 权限

获得 root 权限的基本方法有三种,它们的复杂程度各不相同。

以根用户身份登录

获得 root 权限的最简单和最直接的方法是直接以 root 用户身份登录到您的服务器。

如果您正在登录本地计算机(或在虚拟服务器上使用带外控制台功能),请在登录提示符处输入 root 作为您的用户名并输入 root 密码当被问到时。

如果您通过 SSH 登录,请在 SSH 连接字符串中的 IP 地址或域名之前指定 root 用户:

ssh root@server_domain_or_ip

如果您尚未为 root 用户设置 SSH 密钥,请在提示时输入 root 密码。

使用su成为root

通常不建议以 root 身份直接登录,因为很容易开始使用系统进行非管理任务,这是很危险的。

获得超级用户权限的下一个方法是让您在需要时随时成为 root 用户。

我们可以通过调用 su 命令来做到这一点,该命令代表“替代用户”。 要获得 root 权限,请键入:

su

系统将提示您输入 root 用户的密码,之后,您将进入 root shell 会话。

完成需要 root 权限的任务后,键入以下命令返回到您的正常 shell:

exit

使用sudo以root身份执行命令

我们将讨论的最后一种获得 root 权限的方法是使用 sudo 命令。

sudo 命令允许您以 root 权限执行一次性命令,而无需生成新的 shell。 它是这样执行的:

sudo command_to_execute

与 su 不同,sudo 命令将请求 当前 用户的密码,而不是 root 密码。

由于其安全隐患,默认情况下不会向用户授予 sudo 访问权限,并且必须在其正常运行之前进行设置。 查看我们的 如何为 Ubuntu 和 CentOS 创建启用 Sudo 的新用户 快速入门教程,了解如何设置 sudo-启用的用户。

在下一节中,我们将更详细地讨论如何修改 sudo 配置。

什么是 Visudo?

sudo 命令是通过位于 /etc/sudoers 的文件配置的。

警告: 切勿使用普通文本编辑器编辑此文件! 始终使用 visudo 命令代替!


由于 /etc/sudoers 文件中的不正确语法可能会使您的系统损坏,无法获得提升的权限,因此使用 visudo 命令编辑文件很重要。

visudo 命令像正常一样打开文本编辑器,但它会在保存时验证文件的语法。 这可以防止配置错误阻止 sudo 操作,这可能是您获得 root 权限的唯一方法。

传统上,visudo 使用 vi 文本编辑器打开 /etc/sudoers 文件。 然而,Ubuntu 已将 visudo 配置为使用 nano 文本编辑器。

如果您想将其改回 vi,请发出以下命令:

sudo update-alternatives --config editor
OutputThere are 4 choices for the alternative editor (providing /usr/bin/editor).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /bin/nano            40        auto mode
  1            /bin/ed             -100       manual mode
  2            /bin/nano            40        manual mode
  3            /usr/bin/vim.basic   30        manual mode
  4            /usr/bin/vim.tiny    10        manual mode

Press <enter> to keep the current choice[*], or type selection number:

选择与您要做出的选择相对应的数字。

在 CentOS 上,您可以通过将以下行添加到 ~/.bashrc 来更改此值:

export EDITOR=`which name_of_editor`

获取文件以实现更改:

. ~/.bashrc

配置好visudo后,执行命令访问/etc/sudoers文件:

sudo visudo

如何修改 Sudoers 文件

您将在您选择的文本编辑器中看到 /etc/sudoers 文件。

我已经从 Ubuntu 20.04 复制并粘贴了该文件,并删除了注释。 CentOS /etc/sudoers 文件有很多行,其中一些我们不会在本指南中讨论。

/etc/sudoers

Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

root    ALL=(ALL:ALL) ALL

%admin ALL=(ALL) ALL
%sudo   ALL=(ALL:ALL) ALL

#includedir /etc/sudoers.d

让我们看一下这些行的作用。

默认行

第一行 Defaults env_reset 重置终端环境以删除任何用户变量。 这是一种用于从 sudo 会话中清除潜在有害环境变量的安全措施。

第二行 Defaults mail_badpass 告诉系统将错误的 sudo 密码尝试通知邮寄给配置的 mailto 用户。 默认情况下,这是 root 帐户。

第三行以 Defaults secure_path=... 开头,指定将用于 sudo 操作的 PATH(操作系统将在文件系统中查找应用程序的位置)。 这可以防止使用可能有害的用户路径。

用户权限线

第四行表示 root 用户的 sudo 权限,与前面几行不同。 让我们看一下不同字段的含义:

  • root ALL=(ALL:ALL) ALL 第一个字段表示规则将应用于的用户名(root)。
  • root ALL=(ALL:ALL) ALL 第一个“ALL”表示该规则适用于所有主机。
  • root ALL=(ALL:ALL) ALL 这个“ALL”表示root用户可以作为所有用户运行命令。
  • root ALL=(ALL:ALL) ALL 这个“ALL”表示root用户可以作为所有组运行命令。
  • root ALL=(ALL:ALL) ALL 最后一个“ALL”表示这些规则适用于所有命令。

这意味着我们的 root 用户可以使用 sudo 运行任何命令,只要他们提供密码。

团体特权线

接下来的两行类似于用户权限行,但它们为组指定 sudo 规则。

以 % 开头的名称表示组名。

在这里,我们看到 admin 组可以在任何主机上以任何用户身份执行任何命令。 同样,sudo 组具有相同的权限,但也可以作为任何组执行。

包含 /etc/sudoers.d 行

乍一看,最后一行可能看起来像注释:

/etc/sudoers

. . .

#includedir /etc/sudoers.d

它确实以#开头,通常表示注释。 然而,这一行实际上表明 /etc/sudoers.d 目录中的文件也将被获取和应用。

该目录中的文件遵循与 /etc/sudoers 文件本身相同的规则。 任何不以 ~ 结尾并且其中没有 . 的文件都将被读取并附加到 sudo 配置中。

这主要用于应用程序在安装时更改 sudo 权限。 将所有相关规则放在 /etc/sudoers.d 目录中的单个文件中,可以轻松查看哪些权限与哪些帐户相关联,并轻松反转凭据,而无需尝试操纵 /etc/sudoers直接存档。

与 /etc/sudoers 文件本身一样,您应该始终使用 visudo 编辑 /etc/sudoers.d 目录中的文件。 编辑这些文件的语法是:

sudo visudo -f /etc/sudoers.d/file_to_edit

如何赋予用户 Sudo 权限

用户在管理 sudo 权限时最常见的操作是授予新用户通用 sudo 访问权限。 如果您想授予帐户对系统的完全管理访问权限,这很有用。

在设置有通用管理组的系统(如本指南中的 Ubuntu 系统)上执行此操作的最简单方法实际上是将相关用户添加到该组。

例如,在 Ubuntu 20.04 上,sudo 组具有完全管理员权限。 我们可以通过将用户添加到组中来授予用户这些相同的权限,如下所示:

sudo usermod -aG sudo username

也可以使用 gpasswd 命令:

sudo gpasswd -a username sudo

这些都将完成同样的事情。

在 CentOS 上,这通常是 wheel 组而不是 sudo 组:

sudo usermod -aG wheel username

或者,使用 gpasswd:

sudo gpasswd -a username wheel

在 CentOS 上,如果无法立即将用户添加到组中,您可能需要编辑 /etc/sudoers 文件以取消注释组名:

sudo visudo

/etc/sudoers

. . .
%wheel ALL=(ALL) ALL
. . .

如何设置自定义规则

现在我们已经熟悉了文件的一般语法,让我们创建一些新规则。

如何创建别名

sudoers 文件可以通过使用各种“别名”对事物进行分组来更轻松地组织。

例如,我们可以创建三个不同的用户组,具有重叠的成员资格:

/etc/sudoers

. . .
User_Alias      GROUPONE = abby, brent, carl
User_Alias      GROUPTWO = brent, doris, eric,
User_Alias      GROUPTHREE = doris, felicia, grant
. . .

组名必须以大写字母开头。 然后,我们可以通过创建如下规则允许 GROUPTWO 的成员更新 apt 数据库:

/etc/sudoers

. . .
GROUPTWO    ALL = /usr/bin/apt-get update
. . .

如果我们没有像上面那样指定用户/组来运行,sudo 默认为 root 用户。

我们可以允许 GROUPTHREE 的成员通过创建“命令别名”并在 GROUPTHREE 的规则中使用它来关闭和重新启动机器:

/etc/sudoers

. . .
Cmnd_Alias      POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE  ALL = POWER
. . .

我们创建了一个名为 POWER 的命令别名,其中包含关闭和重新启动机器的命令。 然后我们允许 GROUPTHREE 的成员执行这些命令。

我们还可以创建“Run as”别名,它可以将规则中指定用户执行命令的部分替换为:

/etc/sudoers

. . .
Runas_Alias     WEB = www-data, apache
GROUPONE    ALL = (WEB) ALL
. . .

这将允许任何属于 GROUPONE 成员的人以 www-data 用户或 apache 用户身份执行命令。

请记住,当两者之间存在冲突时,稍后的规则将覆盖先前的规则。

如何锁定规则

您可以通过多种方式更好地控制 sudo 对呼叫的反应方式。

与 mlocate 包关联的 updatedb 命令在单用户系统上相对无害。 如果我们想允许用户以 root 权限 执行它而无需 输入密码,我们可以制定如下规则:

/etc/sudoers

. . .
GROUPONE    ALL = NOPASSWD: /usr/bin/updatedb
. . .

NOPASSWD 是一个“标签”,表示不会请求密码。 它有一个名为 PASSWD 的伴随命令,这是默认行为。 一个标签与规则的其余部分相关,除非稍后被其“孪生”标签否决。

例如,我们可以有这样的一行:

/etc/sudoers

. . .
GROUPTWO    ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill
. . .

另一个有用的标签是 NOEXEC,它可以用来防止某些程序中的一些危险行为。

例如,某些程序,如 less,可以通过在其界面中键入以下命令来生成其他命令:

!command_to_run

这基本上执行用户赋予它的任何命令,其权限与运行 less 的权限相同,这可能非常危险。

为了限制这一点,我们可以使用这样的一行:

/etc/sudoers

. . .
username   ALL = NOEXEC: /usr/bin/less
. . .

杂项信息

在处理 sudo 时,还有一些可能有用的信息。

如果您在配置文件中指定了用户或组“运行方式”,则可以分别使用 -u 和 -g 标志作为这些用户执行命令:

sudo -u run_as_user command
sudo -g run_as_group command

为方便起见,默认情况下,sudo 会将您的身份验证详细信息保存在一个终端中一段时间。 这意味着在计时器用完之前,您无需再次输入密码。

出于安全考虑,如果您希望在运行完管理命令后清除此计时器,您可以运行:

sudo -k

另一方面,如果您想“启动” sudo 命令以便以后不会收到提示,或者要续订 sudo 租约,您可以随时键入:

sudo -v

系统将提示您输入密码,该密码将被缓存以供 sudo 以后使用,直到 sudo 时间范围到期。

如果您只是想知道为您的用户名定义了什么样的权限,您可以键入:

sudo -l

这将列出 /etc/sudoers 文件中适用于您的用户的所有规则。 这让您对作为任何用户的 sudo 允许或不允许做什么有一个很好的了解。

很多时候你会执行一个命令并且它会失败,因为你忘记在它前面加上 sudo。 为避免重新键入命令,您可以利用 bash 功能,即“重复上一个命令”:

sudo !!

双感叹号将重复上一个命令。 我们在它前面加上 sudo 以快速将非特权命令更改为特权命令。

为了好玩,您可以使用 visudo 将以下行添加到您的 /etc/sudoers 文件中:

sudo visudo

/etc/sudoers

. . .
Defaults    insults
. . .

当用户为 sudo 输入错误密码时,这将导致 sudo 返回愚蠢的侮辱。 我们可以使用sudo -k清除之前的sudo缓存密码试试:

sudo -k
sudo ls
Output[sudo] password for demo:    # enter an incorrect password here to see the results
Your mind just hasn't been the same since the electro-shock, has it?
[sudo] password for demo:
My mind is going. I can feel it.

结论

您现在应该对如何读取和修改 sudoers 文件有了基本的了解,并掌握了可以用来获得 root 权限的各种方法。

请记住,超级用户权限不授予普通用户是有原因的。 您必须了解使用 root 权限执行的每个命令的作用。 不要掉以轻心。 了解将这些工具用于您的用例的最佳方式,并锁定任何不需要的功能。