sudo-为普通用户提权
目录
sudo简介
Sudo
(substitute user
[或 superuser
]do
)是linux
系统管理指令,允许系统管理员委派授权给某些用户(或用户组)以root用户或其他用户身份运行某些(或全部)命令的能力,同时提供命令及其参数的审计跟踪。
sudo特性
-
sudo
能够授权指定用户在指定主机上运行某些命令。 如果未授权用户尝试使用sudo
,会提示联系管理员。 -
sudo
可以提供日志,记录每个用户使用sudo
操作。 -
sudo
为系统管理员提供配置文件,允许系统管理员集中地管理用户的使用权限和使用的主机。 -
sudo
使用时间戳文件来完成类似“检票”的系统,默认存活期为5分钟的“入场券” 。
相关文件
配置文件: /etc/sudoers
,/etc/sudoers.d/
可以修改/etc/sudoers
也可以在/etc/sudoers.d/
目录下新建配置文件
时间戳文件:/var/db/sudo
日志文件:/var/log/secure
配置文件
配置支持使用通配符glob
:
-
?
:任意单一字符 -
*
:匹配任意长度字符-
[wxc]
:匹配其中一个字符 -
[!wxc]
:除了这三个字符的其他字符
-
-
x
:转义-
[[alpha]]
:字母:示例:/bin/ls [[alpha]]*
-
配置文件规则:
- 别名定义:不是必须的除了
- 授权规则:必须的
授权规则格式:
user host=(runas) command
用户 登入主机=(代表用户) 命令
示例:root ALL=(ALL) ALL
-
格式说明:
-
user
:运行命令者的身份 -
username
:用户名 -
#uid
:用户UID
-
%group_name
:组名 -
%#gid
:用户组GID
User_Alias
:用户别名
用户别名:格式
User_Alias USER=用户1,用户2...
。例:User_Alias DBA=haiyun,wang
;其中DBA
是别名,haiyun,wang是别名内的用户。注:别名必须为大写。 -
-
host
:通过哪些主机-
ip
或hostname
:IP
或者主机名 -
network
(/netmask
):网段 -
Host_Alias
:主机别名
主机别名:格式
Host_Alias HOST=主机1,主机2...
。例:Host_Alias HOST=192.168.8.10,192.168.8.100
。其中:HOST
是别名,192.168.8.10,192.168.8.100
是别名中的IP
。注:别名必须大写。 -
(runas
):以哪个用户的身份 -
username
:用户名
#uid
:用户UID
%group_name
:组名%#gid
:用户组GID
Runas_Alias
:用户别名 用户别名:格式
Runas_Alias USER=用户1,用户2...
。用法同User_Alias
。注:别名必须大写。
command
:运行哪些命令 -
command name
:命令名称,注:写绝对路径 -
directory
:目录下的命令 -
sudoedit
:有编辑sudoers
文件的权限,授权的用户可以自定义权限 -
Cmnd_Alias
:命令别名
命令别名:格式Cmnd_Alias CMD=命令1,命令2...
。例:Cmnd_Alias CMD=/bin/cat,/bin/mount
。其中,CMD
为别名,/bin/cat
,/bin/mount
为别名中的命令。注:别名必须大写。
命令执行不需要密码,在Commands
前可以加NOPASSWD:CMD
例如:haiyun ALL=(ALL) NOPASSWD: ALL
。代表haiyun
用户可以执行所有命令,且不需要密码。注:这只是一个例子,并不建议这么做。
范例
范例1:使用户haiyun
能够有权限挂载/dev/sr0
到/mnt/cdrom
目录下
[root@A ~]# vi /etc/sudoers #修改文件/etc/sudoers
root ALL=(ALL) ALL #在此行后面添加,下面内容。注:命令要写绝对路径
haiyun ALL=(ALL) /bin/mount /dev/sr0 /mnt/cdrom
[root@A ~]# su - haiyun # 切换到haiyun用户
[haiyun@A ~]$ sudo /bin/mount /dev/sr0 /mnt/cdrom # 使用sudo执行挂载命令
[sudo] password for haiyun: # 输入用户haiyun的密码
mount: block device /dev/sr0 is write-protected, mounting read-only #挂载成功
[haiyun@A ~]$ df /dev/sr0 #确认挂载成功
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sr0 3878870 3878870 0 100% /mnt/cdrom
范例2:使用户haiyun
能够有权限编辑/etc/sudoers
文件
[root@A ~]# sudoedit /etc/sudoers.d/test #编辑文件/etc/sudoers.d/test
haiyun ALL=(ALL) /usr/bin/sudoedit /etc/sudoers.d/test #是用户haiyun可以编辑test文件
[root@A ~]# su - haiyun
[haiyun@A ~]$ sudo /usr/bin/sudoedit /etc/sudoers.d/test
[sudo] password for haiyun:
#haiyun ALL=(ALL) /usr/bin/sudoedit /etc/sudoers.d/test #haiyun用户可以编辑test文件
[haiyun@A ~]$ sudo /usr/bin/sudoedit /etc/sudoers.d/test # 注释后已经不能使用
Sorry, user haiyun is not allowed to execute '/usr/bin/sudoedit /etc/sudoers.d/test' as root on A.
范例3:使wang
用户和haiyun
用户能够有权限修改IP
,使用别名实现,且不需要输入密码
[root@A ~]# sudoedit /etc/sudoers.d/test #
User_Alias NETUSER=wang,haiyun # 定义别名NETUSER,有两个用户wang,haiyun
Cmnd_Alias IP=/sbin/ip # 定义命令别名为 /sbin/ip
NETUSER ALL=(root) NOPASSWD: IP # NOPASSWD代表无需输入密码
[haiyun@A ~]$ sudo ip add add 192.168.1.2/24 dev eth0 # 使用haiyun用户执行添加IP命令
[haiyun@A ~]$ ip addr show dev eth0 # 查看eth0的iP,已经添加
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:de:d2:82 brd ff:ff:ff:ff:ff:ff
inet 172.18.250.42/16 brd 172.18.255.255 scope global eth0
inet 192.168.1.2/24 scope global eth0
inet6 fe80::20c:29ff:fede:d282/64 scope link
valid_lft forever preferred_lft forever
[root@A ~]# su - wang # 切换到wang用户
[wang@A ~]$ ip add del 192.168.1.2/24 dev eth0 # 直接删除IP是没有权限的
RTNETLINK answers: Operation not permitted
[wang@A ~]$ sudo ip add del 192.168.1.2/24 dev eth0 # 使用sudo可以删除
[wang@A ~]$ ip addr show eth0 # 查看eth0IP已经别删除
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:de:d2:82 brd ff:ff:ff:ff:ff:ff
inet 172.18.250.42/16 brd 172.18.255.255 scope global eth0
inet6 fe80::20c:29ff:fede:d282/64 scope link
valid_lft forever preferred_lft forever
范例4:使wang
用户和haiyun
用户能够有权限查看/etc/shadow
文件,默认为haiyun
用户。
[root@A ~]# sudoedit /etc/sudoers.d/test # 编辑/etc/sudoers.d/test文件
Defaults:haiyun runas_default=wang
haiyun ALL=(root) /bin/cat /etc/shadow
[root@A ~]# sudo /bin/cat /etc/shadow # 使用sudo查看/etc/shadow文件
root:$6$SVxwnkSIO7UUYS71$Nga3eujjzHub.oIfdEY12TLdVwpbJ/WNDaLTrvl4.WkfMYiEGCfW85vX5vVWj08mWT2nkkFXHoge7SaZGIKcA.:17392:0:99999:7:::
bin:*:17246:0:99999:7:::
[root@A ~]# sudo -u wang /bin/cat /etc/shadow # 使用wang用户查看shadow文件,无权限
/bin/cat: /etc/shadow: Permission denied
范例5:使haiyun
用户能够有权限使用/usr/sbin/
目录下的所有命令除了/usr/sbin/userdel
命令
[root@A ~]# sudoedit /etc/sudoers.d/test # 添加规则使haiyun用户能够使用/usr/sbin/目录下的所有命令除了/usr/sbin/userdel命令
haiyun ALL=(root) /usr/sbin/,!/usr/sbin/userdel
[haiyun@A ~]$ useradd test # 直接添加用户是没有权限的
-bash: /usr/sbin/useradd: Permission denied
[haiyun@A ~]$ sudo useradd test # 使用sudo可以添加
[haiyun@A ~]$ id test # 查看test的UID等信息
uid=514(test) gid=514(test) groups=514(test)
[haiyun@A ~]$ sudo userdel -r test # 删除test用户,是没有权限的
Sorry, user haiyun is not allowed to execute '/usr/sbin/userdel -r test' as root on A.
范例6:使用户haiyun
能够有权限查看/var/log/message
后的所有文件
[[email protected] ~]# sudoedit /etc/sudoers.d/test #编辑/etc/sudoer.d/test文件
haiyun ALL=(root) /bin/cat /var/log/message* #使haiyun用户能够查看/var/log/message文件
[[email protected] ~]$ sudo /bin/cat /var/log/messages /etc/shadow #但这样又会有一个问题后面跟一个其他文件也能查看了
Sep 13 09:30:29 centos6 xinetd[1391]: xinetd Version 2.3.14 started with libwrap loadavg labeled-networking options compiled in.
Sep 13 09:30:29 centos6 xinetd[1391]: Started working: 0 available services
Sep 13 12:52:37 centos6 yum[2876]: Installed: zlib-devel-1.2.3-29.el6.x86_64
Sep 13 14:15:12 centos6 yum[7400]: Installed: aide-0.14-11.el6.x86_64
Sep 13 19:16:39 centos6 dhclient[1114]: DHCPREQUEST on eth0 to 172.18.0.1 port 67 (xid=0x44c4eda2)
Sep 13 19:16:40 centos6 dhclient[1114]: DHCPACK from 172.18.0.1 (xid=0x44c4eda2)
Sep 13 19:16:42 centos6 dhclient[1114]: bound to 172.18.250.42 -- renewal in 41913 seconds.
。。。省略后面内容
root:$6$SVxwnkSIO7UUYS71$Nga3eujjzHub.oIfdEY12TLdVwpbJ/WNDaLTrvl4.WkfMYiEGCfW85vX5vVWj08mWT2nkkFXHoge7SaZGIKcA.:17392:0:99999:7:::
bin:*:17246:0:99999:7:::
。。。省略后面内容
[[email protected] ~]# sudoedit /etc/sudoers.d/test #再次编辑/etc/sudoer.d/test文件
haiyun ALL=(root) /bin/cat /var/log/message*,!/bin/cat /var/log/messages* * #我们将后面跟空的文件排除了
[[email protected] ~]$ sudo /bin/cat /var/log/messages-20170820 /etc/shadow #这样是不可以看的
Sorry, user haiyun is not allowed to execute '/bin/cat /var/log/messages-20170820 /etc/shadow' as root on centos6.haiyun.com.
[[email protected] ~]$ sudo /bin/cat /var/log/messages-20170820 #跟一个文件就可以了
Aug 20 09:26:49 centos6 kernel: type=1305 audit(1503192408.924:3): audit_pid=1238 old=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:auditd_t:s0 res=1
Aug 20 09:27:00 centos6 automount[1319]: problem reading master map, maximum wait exceeded
Aug 20 09:27:00 centos6 automount[1319]: automount: warning: could not read at least one map source after waiting, continuing ...
Aug 20 09:27:01 centos6 kdump: kexec: loaded kdump kernel
Aug 20 09:27:01 centos6 kdump: started up
。。。后面内容省略
sudo命令和参数
-
sudo –i –u wang
切换身份为wang
用户 -
`sudo -u user
默认为root
,使用指定的用户执行命令 -
sudo -l
列出用户在主机上可用的和被禁止的命令 -
sudo -v
再延长密码有效期限5分钟,更新时间戳 -
sudo -k
清除时间戳(1970-01-01),下次需要重新输密码 -
sudo -b
在后台执行指令
su命令
su
命令用于变更为其他使用者的身份,除 root 外,需要键入该使用者的密码。
su - username
:代表使用login-shell
的变量文件读取方式来登陆系统
su username -c command
:仅进行一次命令
注意事项:
-
centos 7
将普通用户添加到wheel组因为whell组默认sudo有全部权限的。注意此行:%wheel ALL=(ALL) ALL
在centos 7
默认是开启的。 - 假设
root
的UID不
是0的话,那么也可以利用sudo
实现管理操作。可以考略将此行:root ALL=(ALL) ALL
禁用掉。
上一篇: const限定符的一些使用区别
下一篇: 可以显示和隐藏密码的EditText