如何向sudoers添加用户
如何将用户添加到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.