sudo深入解析(免密+权限精细分配的几种方案)
在系统运维时,免不了需要配置sudo以提高系统的安全性,那么,具体的做法应该如何实现呢?请看如下场景:
场景一:
系统账号管理员需要使用普通账号zsk1来管理系统内的所有账号,包括,账号的增删,密码的设置,但是这个普通账号不能修改root密码,其余的权限都没有,这个如何实现?
场景二:
希望某一个普通用户zsk2,仅仅能够做系统的服务管理,比如使用systemctl 命令启停某个指定的服务或者所有服务,其余的高权限操作全部禁止,比如增加用户,rpm安装各类软件,这个如何实现?
场景三:
希望某一个普通用户zsk3,仅仅能够使用iptables 等防火墙配置相关的基础命令,并能够离线安装一部分rpm 包以完成网络配置工作,zsk3 这个用户可以关机,其余的操作全部禁止,包括yum安装,这个如何实现?
场景四:
希望普通用户zsk4具有所有权限,但不能更改任何用户的密码,包括自身的密码,如何实现?
sudo权限配置类似系统内的防火墙配置,第一个思路是,禁止所有权限,放行部分权限,第二个思路是放行全部权限,禁止部分权限,通常的做法是第一个思路:禁止所有权限,放行所需权限。
首先,sudo配置需要root账号运行visudo命令, 在root用户下执行visudo命令:
场景一的配置:visudo
98 ## Allow root to run any commands anywhere
99 root ALL=(ALL) ALL
100 zsk1 ALL=(ALL) NOPASSWD: USERMANAGE
101 Cmnd_Alias USERMANAGE = /usr/bin/passwd ,!/usr/bin/passwd root ,/usr/sbin/useradd ,/usr/sbin/userdel
验证:
[root@centos7 ~]# su - zsk1
Last login: Mon Dec 21 14:50:42 CST 2020 on pts/0
[zsk1@centos7 ~]$ sudo passwd zsk2
Changing password for user zsk2.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[zsk1@centos7 ~]$ sudo passwd root
Sorry, user zsk1 is not allowed to execute '/bin/passwd root' as root on centos7.
[zsk1@centos7 ~]$ sudo passwd
Changing password for user root.
可以看到,不能修改root密码,可以修改其余用户密码,可以默认形式修改root密码(防君子不防小人)。当然,添加删除用户是没有任何问题的,没有演示,可自行实验。因此,为了彻底隔绝隐患,编写如下内容:
root ALL=(ALL) ALL
zsk1 ALL=(ALL) NOPASSWD: USERMANAGE
Cmnd_Alias USERMANAGE = !/usr/bin/passwd ,!/usr/bin/passwd root ,/usr/sbin/useradd ,/usr/sbin/userdel ,/usr/bin/passwd zsk1 ,/usr/bin/passwd zsk2 ,/usr/bin/passwd zsk3
把需要管理密码的用户追加在 Cmnd_Alias 后面,现在用户zsk1用户可以sudo修改zsk1,zsk2,zsk3的密码,可以添加任意用户和删除任意用户,但root用户密码不可更改。(没办法的办法了)
场景二的实现:
执行visudo命令,编辑内容如下,在zsk1 下面添加一行,切换到zsk2用户后,可以启停所有服务,使得普通用户zsk2可以完成服务管理工作。:
root ALL=(ALL) ALL
zsk1 ALL=(ALL) NOPASSWD: USERMANAGE
zsk2 ALL=(ALL) NOPASSWD: /usr/bin/systemctl
验证:
[root@centos7 ~]# su - zsk2
Last login: 21 11:28:50 CST 2020 on pts/0
[zsk2@centos7 ~]$ systemctl restart docker
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ===
Authentication is required to manage system services or units.
Authenticating as: root
Password:
[zsk2@centos7 ~]$ sudo systemctl restart docker
可以看到,sudo服务可以正常启停。其余的需要root权限的命令不能执行。
场景三的实现:
执行visudo命令,编辑内容如下,在zsk2下面添加一行 NETMANAGE,
root ALL=(ALL) ALL
zsk1 ALL=(ALL) NOPASSWD: USERMANAGE
zsk2 ALL=(ALL) NOPASSWD: /usr/bin/systemctl
zsk3 ALL=(ALL) NOPASSWD: NETMANAGE
Cmnd_Alias USERMANAGE = !/usr/bin/passwd ,!/usr/bin/passwd root ,/usr/sbin/useradd ,/usr/sbin/userdel ,/usr/bin/passwd zsk1 ,/usr/bin/passwd zsk2 ,/usr/bin/passwd zsk3
Cmnd_Alias NETMANAGE = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool ,/bin/rpm
场景四的实现:
root执行命令 visudo ,在zsk3这一行下面添加一行内容
zsk4 ALL=(ALL) NOPASSWD: ALL,!/usr/bin/passwd
验证:
[zsk4@centos7 ~]$ sudo passwd root
Sorry, user zsk4 is not allowed to execute '/bin/passwd root' as root on centos7.
[zsk4@centos7 ~]$ sudo passwd zsk4
Sorry, user zsk4 is not allowed to execute '/bin/passwd zsk4' as root on centos7.
[zsk4@centos7 ~]$ sudo cat /etc/shadow
root:$6$qd.f6L1o$l6K7gxiGMUBqpksi29WSOVRrF5WO1pwS2jPr/M..RuAWtCHMEMoMeMJlJbCUr/exp38Qx4b6yHoMgHkgilA2J1:18617:0:99999:7::
除了更改用户密码(所有的用户,包括root),其余的需要root权限的操作zsk4都可以实现。
总结:
Cmnd_Alias 名称,然后在 用户名 hostname 命令 也就是第三列调用即可。默认是全部禁止,然后需要放行的权限写在分号后或者引用alias。!后的命令禁止, 命令1 空格,命令2 空格,的形式书写。
通过这些实现精细化的权限分配。
所有命令都需要绝对路径的形式书写。