Linux入门真经-025使用sudo进行管理授权
前面我们说到,有时候服务器是需要多人管理的。比如说你是老大,啥事都是你说了算。那么你应该对服务器拥有全部的权限。但是假如来了俩实习生,把root密码告诉他们就不太合适了,但是总得给他们放通部分命令的执行权限,好让他们能干点活。
这个时候sudo就派上用场了。
sudo可以让获得授权的用户以另外一个用户的身份(包括root)运行指定的命令。这样不仅可以减轻root管理员的负荷,也避免了root密码的大量流传。接下来就来介绍sudo,并举一些例子帮助你理解。
管理员可以通过修改/etc/sudoer文件,来设置哪些用户能够执行哪些命令。由于这个文件有着特殊的语法格式,因此如果你不按照它的语法编写的话可能会导致sudo无法使用。有一个命令可以修改sutoer文件并且检查语法格式,他就是visudo,visudo同时也调用了vi编辑器的接口,因此你可以使用vi的各个用法来使用visudo。
首先我们可以看一下sudoer的内容。里面有大量的注释,熟悉英语的朋友可以自行参阅,这里我先过滤注释和空行,对默认配置进行简要说明,免得输出太多让人眼花。
[[email protected] ~]# cat /etc/sudoers | grep-Ev "^$|^[#]"
Defaults !visiblepw
Defaults always_set_home
Defaults match_group_by_gid
Defaults env_reset
Defaults env_keep = "COLORS DISPLAYHOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESSLC_CTYPE"
Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENTLC_MESSAGES"
Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPERLC_TELEPHONE"
Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSETXAUTHORITY"
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
rootALL=(ALL) ALL
%wheel ALL=(ALL)ALL
前面几行无需关心,让我们把目光放在最后两行。
他的含义是:
root(谁) ALL(可以在哪些主机)=(ALL)(以哪些用户的身份) ALL(运行哪些命令)
%wheel(哪些组) ALL(可以在哪些主机)=(ALL)(以哪些用户的身份) ALL(运行哪些命令)
也就是说,root可以在任何主机以任何用户的身份运行任何命令
加入wheel组的用户,可以在任何主机以任何用户的身份运行任何命令
我们可以在此基础上通过visudo进行增加或删改。
新增的条目仍然需要遵循以下格式:
users hosts=(runas) commands
users(用户):
可以直接使用username
也可以使用uid(数字)
%groupname(某个组)
%gid(%加组id)
user_alias(用户别名),支持将多个用户定义为一组用户,称之为用户别名,即user_alias;
hosts字段表明可以在何处主机执行sudo,这一字段可以填写:
ip地址
或者hostname(主机名)
或者host_alias(别名,类比user的别名,你就能体会他的含义)
runas字段表示以何种身份运行,这一字段的填写参考user字段:
commands这一字段表示能运行哪些指令,请务必填写绝对路径。(因为不同的用户PATH变量都有所不同)。多个命令也可以一起写成别名
定义别名的方法:
ALIAS_TYPE NAME=item1, item2, item3, ...
NAME:别名名称,必须使用全大写字符;
ALIAS_TYPE:
User_Alias
Host_Alias
Runas_Alias
Cmnd_Alias
例如:
User_Alias NETADMIN=tom, jerry
Cmnd_Alias NETCMND=useradd,usermod
使用visudo编辑好sudoer文件之后,切换到对应用户即可使用sudo命令
认证机制:成功认证后的一段时间无需认证,默认为5分钟;
以sudo的方式来运行指定的命令;
sudo [options] COMMAND
-l 列出用户能执行的命令
-k 清除此前缓存用户成功认证结果;
另外,在通过sudo放权的时候,要注意一些逻辑上的安全漏洞。比如你允许某用户能通过sudo以root用户来修改其他用户的密码。一旦它拥有此权限,虽然他不知道root的密码,但是他可以直接通过sudo把root密码改掉并且登录上去,是很严重的安全隐患。
举例:
赋予test用户增加用户、修改用户属性、修改除了root以外用户的密码的权限。(用!来排除)
visudo之后在文末添加两行:
Cmnd_Alias USERADMINCMNDS = /usr/sbin/useradd, /usr/sbin/usermod,/usr/bin/passwd, !/usr/bin/passwd root, !/usr/bin/passwd root --stdin
test ALL=(root) USERADMINCMNDS
切换到test之后,可以使用sudo –l查看可执行命令
[[email protected] ~]$ sudo -l
[sudo] password for test:
Matching Defaults entries for test on localhost:
!visiblepw,always_set_home, match_group_by_gid, env_reset, env_keep="COLORS DISPLAYHOSTNAME
HISTSIZE KDEDIRLS_COLORS", env_keep+="MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESSLC_CTYPE",
env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENTLC_MESSAGES", env_keep+="LC_MONETARY
LC_NAME LC_NUMERICLC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS
_XKB_CHARSETXAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User test may run the following commands on localhost:
(root)/usr/sbin/useradd, /usr/sbin/usermod, /usr/bin/passwd, !/usr/bin/passwd root,
!/usr/bin/passwdroot --stdin
[[email protected] ~]$
可以看到test可以以root的身份执行/usr/sbin/useradd,/usr/sbin/usermod,/usr/bin/passwd且不能修改root密码。
[[email protected] ~]$ sudo passwd root
[sudo] password for test:
Sorry, user test is not allowed to execute '/bin/passwd root' asroot on localhost.localdomain.
[[email protected] ~]$ echo "hello" | sudo passwd root--stdin
Sorry, user test is not allowed to execute '/bin/passwd root--stdin' as root on localhost.localdomain.
但是可以新建用户并修改非root用户的密码。另外,当你成功通过一次sudo的密码认证后,5分钟之内都不用再输入密码了。
[[email protected] ~]$ sudo useradd mytest
[[email protected] ~]$ echo "mytest" | sudo passwd mytest--stdin
Changing password for user mytest.
passwd: all authentication tokens updated successfully.
[[email protected] ~]$
权限部分到此结束,下一节开启新内容。