权限分离是 Linux 和类 Unix 操作系统中实现的基本安全范例之一。普通用户以有限的权限进行操作,以减少对自己环境(而不是更广泛的操作系统)的影响范围。
一个特殊的用户,称为root, has 超级用户特权。这是一个管理帐户,没有普通用户的限制。用户可以使用超级用户或root以多种不同方式享有特权。
在本文中,我们将讨论如何正确、安全地获取root特权,特别关注编辑/etc/sudoers
file.
我们将在 Ubuntu 20.04 服务器上完成这些步骤,但大多数现代 Linux 发行版(例如 Debian 和 CentOS)应该以类似的方式运行。
本指南假设您已经完成了初始服务器设置在这里讨论。正常登录您的服务器,非root用户并继续下面。
Note:本教程深入探讨权限提升和sudoers
文件。如果您只想添加sudo
用户的权限,请查看我们的如何创建新的启用 Sudo 的用户快速入门教程Ubuntu and CentOS.
基本有以下三种获取方式root特权,其复杂程度各不相同。
最简单直接的获取方法root权限是直接登录到您的服务器root user.
如果您要登录本地计算机(或使用虚拟服务器上的带外控制台功能),请输入root
在登录提示符处作为您的用户名并输入root当询问时输入密码。
如果您通过 SSH 登录,请指定root用户位于 SSH 连接字符串中的 IP 地址或域名之前:
-
ssh root@server_domain_or_ip
如果您尚未设置 SSH 密钥root用户,输入root出现提示时输入密码。
直接登录为root通常不建议这样做,因为很容易开始使用系统执行非管理任务,这是危险的。
获得超级用户权限的下一个方法是让您成为root用户可以根据需要随时使用。
我们可以通过调用来做到这一点su
命令,代表“替代用户”。获得root权限,类型:
-
su
系统将提示您输入root用户的密码,之后,您将进入root外壳会话。
当你完成了需要的任务后root权限,通过输入以下命令返回到普通 shell:
-
exit
最后的获取方式root我们将讨论的特权是sudo
命令。
The sudo
命令允许您执行一次性命令root特权,无需生成新的 shell。它是这样执行的:
-
sudo command_to_execute
Unlike su
, the sudo
命令将请求密码current用户,而不是root密码。
由于其安全隐患,sudo
默认情况下,不会向用户授予访问权限,必须先进行设置,然后才能正常运行。看看我们的如何创建新的启用 Sudo 的用户快速入门教程Ubuntu and CentOS了解如何设置sudo
- 启用的用户。
在下一节中,我们将讨论如何修改sudo
配置更详细。
The sudo
命令是通过位于的文件配置的/etc/sudoers
.
Warning:切勿使用普通文本编辑器编辑此文件!始终使用visudo
命令代替!
因为语法不正确/etc/sudoers
文件可能会让您的系统损坏,无法获得提升的权限,因此使用visudo
命令来编辑文件。
The visudo
命令像平常一样打开文本编辑器,但它会在保存时验证文件的语法。这可以防止配置错误阻塞sudo
操作,这可能是您获得的唯一途径root特权。
传统上,visudo
打开/etc/sudoers
文件与vi
文本编辑器。不过Ubuntu已经配置了visudo
使用nano
改为文本编辑器。
如果您想将其改回vi
,发出以下命令:
-
sudo更新替代方案--config editor
Output
There 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
file:
-
sudo visudo
您将看到/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=...
,指定PATH
(操作系统将在文件系统中查找应用程序的位置)将用于sudo
运营。这可以防止使用可能有害的用户路径。
第四行,规定root user’s sudo
特权,与前面几行不同。我们来看看不同字段的含义:
-
root ALL=(ALL:ALL) ALL
The first field indicates the username that the rule will apply to (root).
-
root ALL=(ALL:ALL) ALL
The first “ALL” indicates that this rule applies to all hosts.
-
root ALL=(ALL:ALL) ALL
This “ALL” indicates that the root user can run commands as all users.
-
root ALL=(ALL:ALL) ALL
This “ALL” indicates that the root user can run commands as all groups.
-
root ALL=(ALL:ALL) ALL
The last “ALL” indicates these rules apply to all commands.
这意味着我们的root用户可以使用运行任何命令sudo
,只要他们提供密码。
接下来的两行与用户权限行类似,但它们指定sudo
团体规则。
以a开头的名字%
表示组名。
在这里,我们看到admin组可以以任何主机上的任何用户身份执行任何命令。同样,sudogroup 具有相同的权限,但也可以作为任何组执行。
乍一看,最后一行可能看起来像一条注释:
/etc/sudoers
. . .
#includedir /etc/sudoers.d
It does以一个开始#
,通常表示注释。然而,这一行实际上表明文件在/etc/sudoers.d
目录也将被获取和应用。
该目录中的文件遵循与/etc/sudoers
文件本身。任何不以以下结尾的文件~
并且没有.
其中将被读取并附加到sudo
配置。
这主要是为了让应用程序改变sudo
安装时的权限。将所有关联规则放在一个文件中/etc/sudoers.d
目录可以让您轻松查看哪些权限与哪些帐户关联,并轻松地反转凭据,而无需尝试操纵/etc/sudoers
直接归档。
与/etc/sudoers
文件本身,您应该始终在/etc/sudoers.d
目录与visudo
。编辑这些文件的语法是:
-
sudo visudo -f /etc/sudoers.d/file_to_edit
用户在管理时最希望完成的操作sudo
权限是授予新用户一般sudo
使用权。如果您想授予帐户对系统的完全管理访问权限,这非常有用。
在设置有通用管理组的系统(例如本指南中的 Ubuntu 系统)上执行此操作的最简单方法实际上是将相关用户添加到该组。
例如,在 Ubuntu 20.04 上,sudo
组拥有完整的管理员权限。我们可以通过将用户添加到组中来授予用户相同的权限,如下所示:
-
sudo usermod -aG sudo username
The gpasswd
还可以使用命令:
-
sudo gpasswd -a username sudo
这些都会完成同样的事情。
在 CentOS 上,这通常是wheel
组而不是sudo
group:
-
sudo usermod -aG wheel username
或者,使用gpasswd
:
-
sudo gpasswd -a username wheel
在 CentOS 上,如果将用户添加到组不能立即生效,您可能需要编辑/etc/sudoers
文件取消注释组名称:
-
sudo visudo
/etc/sudoers
. . .
%wheel ALL=(ALL) ALL
. . .
现在我们已经熟悉了文件的一般语法,让我们创建一些新规则。
The 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 user.
我们可以允许成员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
user.
请记住,当两者之间存在冲突时,后面的规则将覆盖前面的规则。
您可以通过多种方式更好地控制sudo
对呼叫做出反应。
The updatedb
与相关的命令mlocate
软件包在单用户系统上相对无害。如果我们想允许用户执行它root特权without必须输入密码,我们可以制定如下规则:
/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
and -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
快速将非特权命令更改为特权命令。
为了一些乐趣,您可以将以下行添加到您的/etc/sudoers
文件与visudo
:
-
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特权。不要掉以轻心。了解针对您的用例使用这些工具的最佳方法,并锁定任何不需要的功能。