如何在Ubuntu和CentOS中编辑sudoers文件

sudo命令的执行通常以外用户的范围与权限的命令非常有用。本指南将讨论如何以定制的方式sudo功能编辑配置文件。

介绍

特权分离是在Linux和类Unix操作系统中实现的基本安全模式之一。普通用户以有限的特权操作,以便将其影响范围减小到其自己的环境,而不是更宽的操作系统。 一个特殊的用户,被称为root ,具有“超级用户”的特权。这是一个没有普通用户存在的限制的管理帐户。用户可以以多种不同的方式使用“超级用户”或“root”权限执行命令。 在本文中,我们将讨论如何正确,安全地获得root权限,特别注重对编辑/etc/sudoers文件。 我们将在Ubuntu 16.04服务器上完成这些步骤,但是大多数现代Linux发行版应该以类似的方式运行。 本指南假定您已经完成了最初的服务器设置在这里讨论。以正常,非root用户身份登录到您的服务器,然后继续下面。

如何获取根权限

有三种基本方法来获得root权限,这在他们的复杂程度而有所不同。

作为根登录

获得的最简单,最直接的方法root权限只是登录到你的服务器的root从一开始用户。 如果您登录到本地计算机(或使用了带外控制台访问如果您正在使用DigitalOcean),只需输入“根”作为您的用户名在登录提示符下,输入root当问及密码。 如果您是通过SSH登录,指定root之前,你的SSH连接字符串中的IP地址或域名的用户:
ssh root@server_domain_or_IP
如果你还没有设置SSH密钥为root用户,请输入root提示时密码。

使用“su”成为Root

登录为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访问默认情况下不授予用户,并且必须设置其正确运行之前。 如果按照最初的服务器设置向导,你已经完成了最基本的配置。 在下一节中,我们将更详细地讨论如何修改配置。

什么是Visudo?

sudo命令通过设在一个文件中配置/etc/sudoers
警告
切勿使用常规文本编辑器编辑此文件! 切勿使用普通的文本编辑器编辑这个文件!始终使用visudo命令! 因为语法不当/etc/sudoers文件,可以让你有一个系统,就不可能获得提升的权限,使用是很重要的visudo命令编辑文件。 该visudo命令打开一个文本编辑器像正常的,但它验证在保存文件的语法。 这可以防止配置错误sudo操作,这可能是唯一的获得方式root权限。 传统上, visudo将打开/etc/sudoers与文件vi文本编辑器。 Ubuntu的,然而,已配置visudo使用nano文本编辑器来代替。 如果您想改回vi ,发出以下命令:
sudo update-alternatives --config editor
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
让我们来看看这些行是什么。

Default行

第一行“Defaults env_reset”重置终端环境以删除任何用户变量。这是用来从清除潜在的有害环境变量安全措施sudo会话。 第二行, Defaults mail_badpass ,告诉系统坏邮寄通知书sudo密码尝试配置的mailto的用户。 默认情况下,这是root帐户。 第三行,它与“默认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集团能够具有相同的权限,但可作为任何团体执行为好。

includedir /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 ,它可用于防止在某些方案的一些危险的行为。 例如,一些程序,如“less”,可以通过在其界面中键入这些命令来产生其他命令:
!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
[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权限。不要轻率地承担责任。了解为您的用例使用这些工具的最佳方法,并锁定不需要的任何功能。