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

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

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

  • 相关阅读:
    gets_s()函数的参数太少,strcpy_s():形参和实参 2 的类型不同,等c函数在Visual Studio上出现的问题, get()函数和scanf()读取字符串的区别,栈的随机性
    线性表的顺序存储实现
    汉诺塔问题, 用递归方法求集合中的中位数
    共用体union
    洛谷3384:【模板】树链剖分——题解
    BZOJ4196:[NOI2015]软件包管理器——题解
    BZOJ3140:[HNOI2013]消毒——题解
    BZOJ1059:[ZJOI2007]矩阵游戏——题解
    洛谷4277:萃香的请柬——题解
    BZOJ1854:[SCOI2010]连续攻击游戏——题解
  • 原文地址:https://www.cnblogs.com/yaoyangding/p/14901642.html
Copyright © 2020-2023  润新知