如何在Ubuntu和CentOS上编辑Sudoers文件
介绍
特权分离是在Linux和类Unix操作系统中实现的基本安全范例之一。普通用户以有限的权限进行操作,以减少其对自身环境的影响范围,而不是更广泛的操作系统。
一个叫做root“特权”的用户拥有“超级用户”特权。这是一个没有在普通用户上出现的限制的管理帐户。用户可以通过多种不同的方式执行“超级用户”或“根”权限的命令。
在本文中,我们将讨论如何正确安全地获取root权限,特别关注编辑/etc/sudoers文件。
我们将在Ubuntu 16.04服务器上完成这些步骤,但大多数现代Linux发行版应该以类似的方式运行。
本指南假设您已经完成了这里讨论的初始服务器设置。以普通,非root用户身份登录到您的服务器,并继续下面。
如何获得根权限
获得root特权的三种基本方法,其复杂程度不同。
以root身份登录
获取root权限的最简单和最直接的方法只是root从一开始以用户身份登录到您的服务器。
如果您登录本地机器(或使用带外控制台访问,如果您使用DigitalOcean),只需在登录提示符下输入“root”作为用户名,并root在询问时输入密码。
如果您通过SSH登录,请root在SSH连接字符串中的IP地址或域名前指定用户:
$ ssh root@server_domain_or_IP
如果您尚未为root用户设置SSH密钥,请root在出现提示时输入密码。
使用“su”成为根
root通常不建议登录,因为很容易开始使用系统进行非管理任务,这是危险的。
获得超级用户权限的另一种方式可以让您root随时随地成为用户。
我们可以通过调用su命令来代替“替代用户”来实现。要获得root特权,只需键入:
$ su
系统将提示您输入root用户密码,之后您将被删除到一个rootshell会话中。
当您完成需要root权限的任务时,请键入以下命令返回到正常的shell:
# exit
使用“sudo”执行命令作为根
最终的,最复杂的获得root我们将要讨论的特权的方式是sudo命令。
该sudo命令允许您使用root特权执行一次性命令,而无需生成新的shell。它像这样执行:
$ sudo command_to_execute
不同的是su,该sudo命令将请求用户调用命令的root密码,而不是密码。
由于其安全性的影响,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
#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文件:
$ 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
第一行“Defaults env_reset”将重置终端环境以删除任何用户变量。这是一个用于从sudo会议中清除潜在有害环境变量的安全措施。
第二行Defaults mail_badpass告诉系统向sudo配置的mailto用户发送不良密码尝试的通知。默认情况下,这是root帐户。
第三行以“Defaults secure_path = ...”开头,指定PATH将用于操作的(操作系统将查找应用程序的文件系统中的位置)sudo。这样可以防止使用可能有害的用户路径。
用户权限
指定root用户sudo权限的第四行与上述行不同。我们来看看不同的领域是什么意思:
root ALL=(ALL:ALL) ALL 第一个字段指示规则将应用于(root)的用户名。 demo ALL=(ALL:ALL) ALL 第一个“ALL”表示此规则适用于所有主机。 demo ALL=(ALL:ALL) ALL 此“ALL”表示root用户可以作为所有用户运行命令。 demo ALL=(ALL:ALL) ALL 此“ALL”表示root用户可以作为所有组运行命令。 demo 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目录编辑文件visudo。编辑这些文件的语法是:
$ 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用户。
我们可以允许成员GROUPTHREE通过创建“命令别名”关闭并重新启动机器,并在规则中使用它GROUPTHREE:
#/etc/sudoers
. . .
Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE ALL = POWER
. . .
我们创建一个命名别名POWER,其中包含关闭并重启机器的命令。然后,我们允许成员GROUPTHREE执行这些命令。
我们还可以创建“运行为”别名,可以替换指定用户执行命令的规则部分:
#/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可以用来防止某些程序中的一些危险的行为。
例如,一些程序,如“较少”,可以通过从其界面中输入来生成其他命令:
$ !command_to_run
这基本上执行用户给予它的任何命令与“少”运行在相同的权限,这可能是相当危险的。
为了限制这一点,我们可以使用这样的行:
#/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特权执行的每个命令。不要轻率地承担责任。了解使用这些工具的最佳方法,并锁定任何不需要的功能。