引言

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

一个名为 root 的特殊用户拥有“超级用户”特权。 这是一个不受普通用户限制的管理帐户。 用户可以通过许多不同的方式使用“超级用户”或“根用户”权限执行命令。

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

我们将在 Ubuntu 16.04服务器上完成这些步骤,但是大多数现代 Linux 发行版应该以类似的方式运行。

本指南假设您已经完成了这里讨论的初始服务器设置。 以常规、非根用户身份登录到服务器,然后在下面继续。

如何获得 Root 权限

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

以 Root 身份登录

获得 root 权限最简单、最直接的方法就是从一开始就以 root 用户身份登录到服务器。

如果您正在登录本地计算机(或者如果您正在使用 DigitalOcean,则使用带外控制台访问) ,只需在登录提示符中输入“ root”作为您的用户名,并在询问时输入 root 密码。

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

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

使用“ su”变成词根

通常不建议以 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 访问在缺省情况下不会授予用户,而且必须在正常运行之前进行设置。 如果您遵循了最初的服务器设置指南,那么您已经完成了一个简单的配置。

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

什么是 visualdo?

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

永远不要用普通的文本编辑器来编辑这个文件!

因为 / etc / sudoers 文件中不恰当的语法会使您无法获得更高的特权,所以使用 visualdo 命令编辑该文件非常重要。

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

传统上,visualdo 使用 vi 文本编辑器打开 / etc / sudoers 文件。 然而,Ubuntu 已经配置了 visualdo 来代替 nano 文本编辑器。

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

  • sudo update-alternatives --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

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

  • sudo visudo

如何修改 Sudoers 文件

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

我从 Ubuntu 16.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"

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 用户。 默认情况下,这是根帐户。

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

用户特权线

第四行,规定了 root 用户的 sudo 特权,与前面的行不同。 让我们来看看不同领域的含义:

  • 根 ALL (ALL: ALL) ALL 第一个字段表示规则将应用于(根)的用户名。
  • Demo ALL (ALL: ALL) ALL 第一个“ ALL”表示该规则适用于所有主机。
  • Demo ALL (ALL: ALL) ALL 这个“ ALL”表示 root 用户可以像所有用户一样运行命令。
  • Demo ALL (ALL: ALL) ALL 这个“ ALL”表示 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 文件本身一样,您应该始终编辑 / etc / sudoers 中的文件。 D 目录与 visualdo。 编辑这些文件的语法如下:

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

如何赋予用户 Sudo 特权

在管理 sudo 权限时,用户希望完成的最常见操作是授予新用户常规 sudo 访问权限。 如果您希望给予帐户对系统的完全管理访问权限,这是非常有用的。

在一个由通用管理组建立的系统中,最简单的方法就是将有问题的用户添加到这个组中,就像本指南中的 Ubuntu 系统。

例如,在 Ubuntu 16.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 用户。

我们可以让 group3的成员通过创建一个“命令别名”来关闭和重新启动机器,并在 group3的规则中使用这个别名:

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

我们创建一个名为 POWER 的命令别名,其中包含断电和重新启动计算机的命令。 然后我们允许 group3的成员执行这些命令。

我们还可以创建“ 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 时,还有一些更多的信息可能是有用的。

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

  • sudo -u run_as_user command
  • sudo -g run_as_group command

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

为了安全起见,如果你想在运行完管理命令后清除这个计时器,你可以运行:

  • sudo -k

另一方面,如果您希望对 sudo 命令进行“ prime” ,以便以后不会出现提示,或者希望更新 sudo 租约,那么您总是可以输入:

  • sudo -v

系统将提示您输入密码,密码将被缓存以供以后使用,直到 sudo 时间框架过期为止。

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

  • sudo -l

这将列出 / etc / sudoers 文件中应用于用户的所有规则。 这使您能够很好地了解,作为任何用户,您将允许或不允许使用 sudo 做什么。

有很多次,您将执行一个命令,但它将失败,因为您忘了在它之前加上 sudo。 为了避免重新键入命令,您可以利用 bash 功能,即“ repeat last command” :

  • sudo !!

双叹号将重复最后一个命令。 在此之前,我们使用 sudo 快速将 unprivileged 命令更改为 privileged 命令。

为了获得一些乐趣,您可以使用 visualdo 将以下行添加到 / 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 权限执行的每个命令的作用非常重要。 不要轻易承担责任。 学习使用这些工具的最佳方法,并锁定所有不需要的功能。