如何编辑Sudoers文件

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

介绍

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

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

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

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

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

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


如何获得 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 访问权限,并且必须在其正常运行之前进行设置。 查看我们的 如何为 UbuntuCentOS 创建启用 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 权限执行的每个命令的作用。 不要掉以轻心。 了解将这些工具用于您的用例的最佳方式,并锁定任何不需要的功能。