如何向sudoers添加用户

时间:2020-01-09 10:37:05  来源:igfitidea点击:

如何将用户添加到sudoers文件?如何给用户sudo访问权限?如何在linux中为用户授予root权限?如何在linux中授予超级用户权限?什么是sudo别名?sudoers文件使用的语法是什么?

这些是用户在开始使用sudoers文件时遇到的一些常见问题。在本教程中,我将给你一个关于sudo特权的详细概述,并分享将用户添加到sudoers文件的正确方法。

sudoers特权概述

  • 普通用户在有限的权限会话中操作,以限制其对整个系统的影响范围。

  • Linux上有一个特殊的用户,我们已经知道它是root,它拥有超级用户权限。

  • 此帐户没有任何对普通用户的限制。

  • Sudoer是Linux系统的一种功能,管理员可以使用它来向受信任的普通用户提供管理访问,而不必实际共享根用户的密码。

  • 管理员只需将普通用户添加到"sudoers"列表中。

  • 一旦用户被添加到"sudoers"列表,他们就可以通过在它前面加sudo来执行任何管理命令。

  • 然后根据配置要求用户输入自己的密码。

  • 在此之后,管理命令将以与根用户相同的方式执行。

正确更新"sudoers"非常重要,否则可能会破坏"sudoers"的完整功能。在向"sudoers"文件中添加用户或者新条目时,必须遵循特定的语法。

我们将在本文后面讨论这些语法。但是首先让我强调一下使用sudoers文件时必须遵循的"dos"和"dont's"。

编辑sudoers文件的建议准则

  • 应该避免使用 echo "<content>" >> /etc/sudoers方法将任何用户内容添加到主sudoers文件中。原因是,如果我们使用了错误的语法,那么就可以破坏整个"sudoers"功能

  • 始终使用"visudo"编辑"/etc/sudoers"文件。同样"不建议"使用任何编辑器(如vim或者"nano"等)直接编辑"/etc/sudoers"文件。这是因为"visudo"编辑器是"sudo"rpm的一部分,它将在保存和退出"sudoers"文件之前执行语法检查。假设我们在"sudoers"文件中提供了不正确的语法,并尝试保存和退出"sudoers"文件,我们将得到以下错误提示:

# visudo
>>> /etc/sudoers: syntax error near line 125 <<<
>>> /etc/sudoers: syntax error near line 126 <<<
>>> /etc/sudoers: syntax error near line 125 <<<
>>> /etc/sudoers: syntax error near line 126 <<<
What now?
Options are:
  (e)dit sudoers file again
  e(x)it without saving changes to sudoers file
  (Q)uit and save changes to sudoers file (DANGER!)
  • 因此,"visudo"将警告我们任何不正确的语法,但如果我们使用任何普通编辑器编辑"/etc/sudoers",则不会执行语法检查,我们可能会得到不正确的"sudoers"条目

  • "visudo"的另一个优点是,当多个用户试图同时修改"sudoers"文件时,它可以保护我们不受"race condition"的影响。如果在已有"visudo"会话的情况下并行使用"visudo",则会导致"visudo:/etc/sudoers忙,请稍后再试`

  • 最好保持默认的"sudoers"文件不变,我们应该在"/etc/sudoers.d"中添加任何自定义内容,这样损坏原始"sudoers"内容的可能性就很小了。

  • 默认情况下,/etc/sudoers包含以下条目

## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment)
#includedir /etc/sudoers.d
  • 因此,我们可以基于团队或者组在/etc/sudoers.d/下创建多个文件,并为组织中的用户或者组添加相应的"sudo"权限。这将确保其他"sudo"用户不受任何"syntax"错误的影响

提示:

visudo本身没有任何编辑器,因此它将使用系统的默认编辑器打开sudoers文件。在大多数Linux和Unix发行版中,vim是默认编辑器,因此"visudo"将使用"vim"打开"sudoers"文件。要修改它,我们可以修改用户的.bashrc并添加.export EDITOR=/usr/bin/nano或者我们喜欢的任何其他编辑器

sudoers文件的语法

对于复杂的用例,"sudoers"的语法用法可能有点棘手和复杂。为了充分解释/etc/sudoers的语法,我们将使用一个示例规则并对每一列进行分解:

deepak  ALL=(root) /usr/bin/find, /bin/rm

第一列

  • 第一列定义此"sudo"规则应用于哪个用户或者组。

  • 在本例中,是用户"deepak"。

  • 如果此列中的单词前面有%符号,则会将此值指定为组而不是用户,因为系统可以有同名的用户和组。

第二列

  • 第二个值(ALL)定义此"sudo"规则应用于的主机。

  • 当我们跨多个系统部署"sudo"环境时,此列非常有用。

  • 对于桌面Ubuntu系统,或者不打算将"sudo"角色部署到多个系统的系统,可以随意将此值设置为"ALL",这是一个匹配所有主机的通配符。

  • 对于单服务器部署,此部分没有太多用法,可以保留为默认的"ALL"或者提供localhost的"hostname"`

第三列

  • 第三个值在括号中设置,并定义第一列中的用户可以作为什么用户执行命令。

  • 此值设置为"root",这意味着允许"deepak"以root用户身份执行最后一列中指定的命令。

  • 此值还可以设置为"ALL"通配符,这将允许"deepak"以系统上任何用户的身份运行命令。

第四列

  • 最后一个值(/usr/bin/find/bin/rm)是逗号分隔的命令列表,第一列中的用户可以作为第三列中的用户运行。

  • 在本例中,我们允许'deepak'以'sudo'权限作为'root'运行'find'和'rm'。

  • 此值还可以设置为"ALL"通配符,这将允许"deepak"以root用户身份在系统上运行所有命令。

既然我们已经了解了"sudoers"文件的基本语法,那么让我们继续向"sudoers"文件添加一些用户,并以root用户的身份执行一些命令

如何将用户添加到sudoers

说明:

本教程假设我们已经有一个系统用户或者组,我们希望为其分配sudo权限。如果没有用户,则必须在执行这些步骤之前创建用户或者组

在本例中,我们希望从我的Linux服务器向用户"deepak"提供"sudo"权限,以便能够以"root"用户的身份执行"chown"和"chmod"

理解sudoers文件第一个字段的示例

我将在"/etc/sudoers.d/"下创建一个名为"custom"的新文件,我们可以根据需要使用任何名称

# touch /etc/sudoers.d/custom

使用"visudo"在该文件中添加以下内容`

# visudo --file=/etc/sudoers.d/custom
deepak ALL=(ALL) /usr/bin/chown

保存并退出文件。

将用户添加到sudoers

接下来尝试以"deepak"用户身份登录并以"sudo"用户身份执行"chown"`

[deepak@server ~]$ sudo chown
[sudo] password for deepak:
chown: missing operand
Try 'chown --help' for more information.

所以命令提示输入密码,执行成功。我们可以忽略"missing operand"错误,因为我没有使用正确的命令语法,所以该命令引发错误。但我们知道这个命令是用sudo权限成功执行的

这就解释了第一列

理解sudoers文件第二个字段的示例

让我们了解第二列的用法。

现在我们有100台服务器,我们正在使用一些远程工具将"sudoers"列表部署到所有这100台服务器上。现在,在这100台服务器中,我们希望允许用户"deepak"仅在主机名为"server"的主机上使用"chown",因此我们将使用

deepak server=(ALL) /usr/bin/chown

现在,相同的"sudoers"脚本将部署到100台服务器上,但用户"deepak"将只允许在服务器上使用"chown"和"sudo"。如果他试图在其他服务器上使用'chown',他将得到

deepak is not allowed to run sudo on server.  This incident will be reported.

而在"server"主机上也是如此

不过,在进行单服务器部署时,这一点也没有太大用处。我们可以选择使用通配符"ALL"或者提供主机的"hostname",两者都可以。

理解sudoers文件第三个字段的示例

让我们了解第三列是如何在"sudoers"文件中使用的。

我们有一个脚本,它应该只由用户'amit'使用,但由于一些要求,我们也希望用户'deepak'能够执行这个脚本。

我们将在/etc/sudoers.d/custom中添加以下内容

# visudo --file=/etc/sudoers.d/custom
deepak ALL=(amit) /tmp/amit_script.sh

如果"deepak"试图调用 amit\_script.sh, 将显示Get Lost

[deepak@server ~]$ /tmp/amit_script.sh
This script can be called only by amit
Get Lost

然后,他尝试运行与"sudo"user相同的脚本,但遗憾的是,结果显示他不允许执行/tmp/amit\_脚本.sh当他知道他被赋予了特权。

[deepak@server ~]$ sudo /tmp/amit_script.sh
[sudo] password for deepak:
Sorry, user deepak is not allowed to execute '/tmp/amit_script.sh' as root on server.example.com.

问题是,deepak正试图运行amit脚本,因此他必须使用sudo-u amit才能以amit用户的身份执行amit脚本。让我们再试一次:

[deepak@server ~]$ sudo -u amit /tmp/amit_script.sh
[sudo] password for deepak:
Welcome Amit

"第四栏"应该很容易理解。必须提供命令列表,或者脚本的完整路径由命令和空格字符分隔。

如何在sudoers中使用别名

"sudoers"中有一个别名的概念,它可以使"sudoers"文件保持组织和干净。它类似于我们在脚本和代码中使用的变量。在下面的语法中,所有"ALIAS_NAME"必须以"UPPERCASE""letters"形式提供,否则会出现语法错误。

可以使用创建用户别名

User_Alias ALIAS NAME USER1, USER2, USER3, ..

创建命令别名

Cmnd_Alias ALIAS_NAME = /path/cmd1, /path/cmd2, /path/cmd3, ..

创建主机别名

Host_Alias ALIAS_NAME = server1, server2, ..

说明:

它们与组不同,要使用系统组,必须在第一列中使用"%group_name"

例如,我有一个场景,在这个场景中,我想向一堆用户分配执行同一组命令的权限。现在这些用户来自不同的系统组。所以在这种情况下,我有以下可能的选择

  • 创建一个新的系统组并将这些用户分配给该系统组,以便我可以将所有权限分配给单个系统组

  • 我为所有这些用户创建单独的条目,然后分配权限(非常长的任务)

  • 在"sudoers"文件中创建一个用户别名,然后在单行中分配权限

因此,第三种选择听起来简单明了。因此,我将创建一个新的"User_Alias",并将用户名添加到此别名中

# visudo --file=/etc/sudoers.d/custom
User_Alias MYADMINS = deepak, rahul

接下来,将命令权限分配给此别名

MYADMINS ALL=(ALL) /usr/bin/chown

因此,现在"MYADMINS"别名组的所有用户都将拥有"sudo"权限,以root用户身份执行"chown"。

禁止在sudoers中使用一组命令

我们还可以防止用户执行一组特定的命令,即"sudoers"中的脚本。例如,我希望用户"deepak"能够执行"/usr/bin"中除"chown"命令以外的所有命令。

所以打开sudoers文件

# visudo --file=/etc/sudoers.d/custom

添加此条目

deepak ALL=(ALL) /usr/bin/*, !/usr/bin/chown

所以其中我们允许了/usr/bin/\*下的所有命令,但是添加了一个NOT("/usr/bin/chown"的运算符。我们可以以类似的格式添加多个命令,以阻止对相应用户或者组提供的这些命令的"sudo"访问

让我们验证此权限:

[root@server ~]# su - deepak
Last login: Fri May 17 22:53:07 IST 2017 on pts/2

正如所料,允许用户"deepak"使用"chmod"`

[deepak@server ~]$ sudo chmod
[sudo] password for deepak:
chmod: missing operand
Try 'chmod --help' for more information.

但是'chown'的执行在我们的配置中被拒绝了

[deepak@server ~]$ sudo chown
Sorry, user deepak is not allowed to execute '/bin/chown' as root on server.example.com.

删除sudo用户的密码提示

默认情况下,我们可能已经注意到,每当用户尝试使用sudo权限执行命令时,都会提示他们输入用户密码。这是"sudoers"的默认行为。要覆盖它,必须在"sudoers"文件中使用"NOPASSWD",同时以下面的格式添加用户权限(来自上一个示例)

deepak ALL=(ALL) NOPASSWD: /usr/bin/*, !/usr/bin/chown

因此,现在用户"deepak"可以使用"sudo"权限执行所有命令,而无需每次输入密码

[deepak@server ~]$ sudo chmod
chmod: missing operand
Try 'chmod --help' for more information.