sudo深入解析(免密+权限精细分配的几种方案)

sudo深入解析(免密+权限精细分配的几种方案)

 

                               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 空格,的形式书写。

通过这些实现精细化的权限分配。

所有命令都需要绝对路径的形式书写。

posted @ 2021-06-18 23:35  耀阳居士  阅读(200)  评论(0编辑  收藏  举报