如何编辑 Sudoers 文件 您所在的位置:网站首页 visudo编辑退不出来怎么解决 如何编辑 Sudoers 文件

如何编辑 Sudoers 文件

2024-07-02 22:49| 来源: 网络整理| 查看: 265

介绍

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

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

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

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

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

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

如何获得根权限

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

以根用户身份登录

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

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

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

ssh root@server_domain_or_ip

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

使用su成为根

通常不建议直接以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用户。

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

什么是 Visudo?

该sudo命令是通过位于/etc/sudoers.

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

因为/etc/sudoers文件中不正确的语法会使您的系统损坏,无法获得提升的权限,所以使用该visudo命令来编辑文件很重要。

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

传统上,使用文本编辑器visudo打开/etc/sudoers文件vi。但是,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 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 18.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用户的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了组的规则。

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

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

包含 /etc/sudoers.d 行

最后一行乍一看可能像一条注释:

/etc/sudoers . . . #includedir /etc/sudoers.d

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

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

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

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

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呼叫的反应。

updatedb与mlocate包关联的命令在单用户系统上相对无害。如果我们想让用户以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快速将非特权命令更改为特权命令。

为了一些乐趣,您可以/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权限执行的每个命令的作用。不要掉以轻心的责任。了解在您的用例中使用这些工具的最佳方式,并锁定所有不需要的功能。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有