如何编辑 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 密码。

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

1ssh root@server_domain_or_ip

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

使用su成为根

通常不建议直接登录为 root ,因为开始使用系统用于非行政任务很容易,这很危险。

获取超级用户特权的下一个方法允许您随时成为 root 用户,根据需要。

我们可以通过召唤su命令来做到这一点,该命令代表代替用户

1su

您将被要求提供 root 用户的密码,之后,您将被扔进一个 ** root** 壳会话。

当您完成需要 root 权限的任务时,请通过键入返回正常壳:

1exit

使用sudo执行命令作为根

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

sudo命令允许您使用 root 权限执行一次性命令,而无需生成新的壳。

1sudo command_to_execute

su不同,sudo命令将要求 current 用户的密码,而不是 root 密码。

由于其安全影响,sudo访问不被默认授予用户,并且必须设置,才能正常工作. 查看我们的 How To Create a New Sudo-enabled User quickstart 教程 UbuntuCentOS 学习如何设置一个sudo功能的用户。

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

什么是Visudo?

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

<$>[警告] 警告: 永远不要用正常的文本编辑器编辑这个文件! 永远不要使用visudo命令! <$>

由于在 /etc/sudoers 文件中的不当语法可能会让你失败的系统,在那里无法获得高级特权,重要的是使用 visudo' 命令来编辑该文件。

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

传统上,visudo打开了/etc/sudoers文件,使用了vi文本编辑器,但Ubuntu已经配置了visudo来使用nano文本编辑器。

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

1sudo update-alternatives --config editor
 1[secondary_label Output]
 2There are 4 choices for the alternative editor (providing /usr/bin/editor).
 3
 4  Selection Path Priority Status
 5------------------------------------------------------------
 6* 0            /bin/nano 40 auto mode
 7  1            /bin/ed             -100 manual mode
 8  2            /bin/nano 40 manual mode
 9  3            /usr/bin/vim.basic 30 manual mode
10  4            /usr/bin/vim.tiny 10 manual mode
11
12Press <enter> to keep the current choice[*], or type selection number:

选择与您想要做出的选择相匹配的数字。

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

1export EDITOR=`which name_of_editor`

來源檔案來執行變更:

1. ~/.bashrc

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

1sudo visudo

如何修改 Sudoers 文件

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

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

 1[label /etc/sudoers]
 2Defaults env_reset
 3Defaults mail_badpass
 4Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
 5
 6root ALL=(ALL:ALL) ALL
 7
 8%admin ALL=(ALL) ALL
 9%sudo ALL=(ALL:ALL) ALL
10
11#includedir /etc/sudoers.d

让我们看看这些线条是怎么做的。

默认线条

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

第二行,Defaults mail_badpass,告诉系统向配置的mailto用户发送恶意sudo密码尝试的通知。

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

用户特权线

第四行规定了 root 用户的sudo特权,与前一行不同,让我们看看不同字段的含义:

  • root ALL=(ALL:ALL) ALL 第一个字段表示该规则将适用于(root )的用户名。 * root ALL=(ALL:ALL) ALL 第一个ALL表示该规则适用于所有主机。 * root ALL=(ALL:ALL) ALLALL表示 ** root** 用户可以作为所有用户运行命令。

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

群体特权线

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

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

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

包含 /etc/sudoers.d 线

最后一行可能在第一眼看起来像一个评论:

1[label /etc/sudoers]
2. . .
3
4#includedir /etc/sudoers.d

它以# 开始,通常表示评论;然而,这个行实际上表明,在/etc/sudoers.d目录中的文件也将源并应用。

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

将所有相关规则放在一个文件夹中,可以很容易地看到哪些权限与哪个帐户相关联,并且可以轻松地扭转凭证,而无需直接尝试操纵 `/etc/sudoers’ 文件。

/etc/sudoers 文件本身一样,你应该总是用 visudo 编辑 /etc/sudoers.d 目录中的文件。

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

如何给用户Sudo特权

用户在管理sudo权限时想要完成的最常见操作是授予新的用户通用sudo访问权限。

在使用一般用途管理组设置的系统上,如本指南中的Ubuntu系统,最简单的方法是实际上将该用户添加到该组中。

例如,在Ubuntu 20.04上,sudo组具有完整的管理权限,我们可以通过将其添加到组中来赋予用户这些权限:

1sudo usermod -aG sudo username

gpasswd命令也可以使用:

1sudo gpasswd -a username sudo

两者将实现相同的事情。

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

1sudo usermod -aG wheel username

或者,使用gpasswd:

1sudo gpasswd -a username wheel

在 CentOS 上,如果将用户添加到组中不立即工作,您可能需要编辑 /etc/sudoers 文件以解除组名称的评论:

1sudo visudo
1[label /etc/sudoers]
2. . .
3%wheel ALL=(ALL) ALL
4. . .

如何设置定制规则

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

如何创建 Aliases

sudoers文件可以更容易地通过将东西与各种类型的代名组合来组织。

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

1[label /etc/sudoers]
2. . .
3User_Alias		GROUPONE = abby, brent, carl
4User_Alias		GROUPTWO = brent, doris, eric,
5User_Alias		GROUPTHREE = doris, felicia, grant
6. . .

然后,我们可以允许GROUPTWO的成员通过创建一个规则来更新apt数据库:

1[label /etc/sudoers]
2. . .
3GROUPTWO	ALL = /usr/bin/apt-get update
4. . .

如果我们不指定一个用户/组运行为,如上所述,sudo默认到 root 用户。

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

1[label /etc/sudoers]
2. . .
3Cmnd_Alias		POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
4GROUPTHREE	ALL = POWER
5. . .

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

我们还可以创建运行为异名,它可以取代规则中指定用户执行命令的部分:

1[label /etc/sudoers]
2. . .
3Runas_Alias		WEB = www-data, apache
4GROUPONE	ALL = (WEB) ALL
5. . .

这将允许任何是GROUPONE成员的人作为www-data用户或apache用户执行命令。

请记住,当两者之间存在冲突时,以后的规则将超过以前的规则。

如何锁定规则

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

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

1[label /etc/sudoers]
2. . .
3GROUPONE	ALL = NOPASSWD: /usr/bin/updatedb
4. . .

NOPASSWD是一个标签,这意味着不会要求任何密码,它有一个名为PASSWD的伴侣命令,这是默认行为。

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

1[label /etc/sudoers]
2. . .
3GROUPTWO	ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill
4. . .

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

例如,一些程序,如,可以通过从其界面输入其他命令:

1!command_to_run

这基本上执行了用户给出的任何命令,具有较少运行的相同权限,这可能非常危险。

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

1[label /etc/sudoers]
2. . .
3username	ALL = NOEXEC: /usr/bin/less
4. . .

混淆的信息

有几个信息可能在处理sudo时有用。

如果您在配置文件中指定了一个用户或组运行为,则可以使用-u-g旗,分别执行命令作为这些用户:

1sudo -u run_as_user command
2sudo -g run_as_group command

为了方便,默认情况下,sudo会将您的身份验证详细信息存储在一个终端中一段时间,这意味着您不需要再次输入密码,直到该计时器过期。

出于安全原因,如果您想要在完成运行管理命令时清除此计时器,则可以运行:

1sudo -k

另一方面,如果您想打印``sudo命令,以便您以后不会被提示,或者要更新您的sudo租赁,您可以始终键入:

1sudo -v

您将被要求提供您的密码,该密码将用于以后的sudo用途,直到sudo时间范围到期。

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

1sudo -l

这将列出适用于您的用户的 /etc/sudoers 文件中的所有规则,这会给你一个很好的想法,你会或不会被允许做与 sudo 作为任何用户。

有很多时候你会执行一个命令,它会失败,因为你忘了用sudo提前命令。为了避免重新键入命令,你可以利用一个bash功能,这意味着重复最后命令:

1sudo !!

我们先用sudo来快速改变非特权命令为特权命令。

为了一些乐趣,你可以将以下行添加到你的 /etc/sudoers 文件中,用 visudo:

1sudo visudo
1[label /etc/sudoers]
2. . .
3Defaults	insults
4. . .

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

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

结论

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

请记住,超级用户权限不会因为某种原因给普通用户。你必须了解你使用 root 权限执行的每个命令所做的事情。不要轻易承担责任。学习如何为你的用例使用这些工具,并锁定不需要的任何功能。

Published At
Categories with 技术
comments powered by Disqus