Linux sudo实现灵活授权

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux sudo实现灵活授权相关的知识,希望对你有一定的参考价值。

sudo用途:

sudo用于为普通用户授权,一句话:允许哪些用户在哪些主机上登录后以哪个用户身份运行哪些命令。类似Windows系统中的右键以管理员方式运行。

一、sudo与su的区别

举个例子,运维部门来一位新人想交给他完成一些基本的软件部署任务,但又担心他对系统架构环境不熟而引发误操作,此时让他使用su命令直接切换高权限的管理账号可能会风险很大,而sudo的灵活授权就可以把权限限定到合理的范围,从而降低风险。

1. su 实际上就是以目标用户身份进行登录,执行su命令切换用户时必须知道目标用户的密码,授权很不灵活,同时也带来了用户密码泄露的安全风险。
2. sudo 则是基于配置文件明确定义指定用户中以执行哪些命令,只是临时进行安全上下文切换,而不需要进行用户登录切换。在执行sudo 执行命令时只需要输入用户自己的密码即,而不需要知道安全上下文切换的目标用户密码。
3. su与sudo都可以执行用户切换操作,但sudo必须在配置文件中明确定义才可以进行账号切换。

su 切换用户

  1. su username:不完全切换,HOME不会变为目标用户的HOME目录
  2. su - username:完全切换,HOME会变为目标用户的HOME目录。
    sudo切换用户
  3. sudo -i 切换为root用户
  4. sudo -u 命令后跟切换的目标用户名

sudo的相关文件

1.  sudo命令来源sudo-1.8.25p1-4.el8.x86_64软件包。
2.  配置文件:存储于/etc/sudoers,但支持模块化配置独立的配置模块存储于/etc/sudoers.d/目录
3.  日志文件:sudo的操作记录存储于/var/log/secure文件中。
4.  时间探针:sudo的令牌超时机制是基于时间探针文件时间戳来判断是否超时的,时间探针文件存储于/run/sudo/ts/目录下。

学习思路:

  1. sudo提供了专门的配置文件编辑工具visudo命令,具有语法检测功能。
  2. 授权语法输写格式:user host=(root) command
  3. 授权语法共由4个元素:被授权用户 登录主机IP=(切换后的用户身份) 授予哪些操作权限
  4. 4个授权元素可以是明确的具体对象,也可以是将一组对象组织在一起的别名。

      被授权用户:进程的发起者,可是将一组用户名或组名组织在一个集合中,集合的名字就是对象别名
      登录主机:可以是一个具体的IP地址,主机名称,也可以是多个IP地址、主机名称,网段组织一起的集合。
      切换后的用户身份:进程的最终用户,如果不填写则默认为root用户,即被授权的用户以任种身份来执行后面的定义的Command。
      command:可以是一系列相关命令的集合,如:将网络管理类命令组织在一起定义别名。

    以上三种元素的别名定义在配置文件中已有明确的范例,可以直接引用,在定义用户别名时如果其成员中包含用户组名,则必须使用%进行引用。

最佳操作实践:

  1. sudo的配置文件采用模块化风格的配置,支持includedir引用/etc/sudoers.d目录中的单独定义的模块化配置文件,因此建议根据生产需求基于授权用户或功能性操作集来单独定义配置文件,在授权管理上会更清晰。
  2. 在编辑配置文件时强烈建议使用visudo命令,该命令不加任何选项参数则直接编辑/etc/sudoers文件,所以在定义模块化配置时使用visudo -f 后加配置模块文件的路径。

二、sudo元素别名定义

元素别名可以理解为变量,别名定义有严格的格式要求,sudo中共有四种类型的别名:别名内的成员对象类型受这四种类型的约束,且是必须在系统中存在的对象。

1. 定义语法原则:

  a.语法:别名类型     名称=对象1,对象2,对象3…
  b.别名可以是在大字母、数字、下划线的组,注意必须是大写字母
  c.如果别名内有多个成员,则用逗号分隔即可。
  d.别名定义必须在同一行内,如果一行写不下可以使用进行续行。
  e.支持通配符书写。

2. User_Alias :进程起发始者

例:基于用户或组名定义别名:User_Alias ADMINS = user1,user2,%admins
例:基于UID或GID定义别名:User_Alias ADMINS = #1023(UID), user2,%#1099(GID)

3. Host_Alias:登录主机

成员对象可以是:IP地址、主机名、FQDN、CDIR格式网络号
例:Host_Alias     CDNSERVERS =192.168.39.7, 192.168.40.0/24, node1, notd2.microcisco.com

4. Runas_Alias:进程执行的最终用户

Runas_Alias SRVMGMT=microcisco

5. Cmnd_Alias:被授权用户允许执行的命令集合

集合成员之间以逗号分隔,每个命令都书写绝对路径,命令支持通配符匹配,要执行的命令如果有必须明确指定参数,命令的参数同样支持通配符匹配。
例1:【定义安装命令集】Cmnd_Alias INSTALL= /bin/rpm, /usr/bin/up2date, /usr/bin/yum
例2:【基于通配符排除】Cmnd_Alias ADMINCMD = /usr/sbin/useradd,/usr/sbin/usermod, /usr/bin/passwd [a-zA-Z]*, !/usr/bin/passwd root

6. 默认用户与runas用户

授权需求:定义授权模板用户,将常用的权限都授予该模板用户,将其他有权限需求的用户只需要将该模板用户作为默认账号,即可解决频繁的授权工作。如果有新的权限需求则只需对授权模板用户授权即可。
配置文件中可以定默认用户与runas用户,使用sudo时可以使用-u 选项指定runas用户,不加-u时使用默认用户,定义语法如下:
Defaults:microcisco runas_default=vmlab
microcisco IPMI=(tom,root) /usr/bin/cat /etc/shadow,NOPASSWD:SOFTWARE

三、sudo安全

1.sudo自身权限委派sudoedit

默认sudo的配置文件/etc/sudoers权限440,属主属组为root,也就是这个文件其它用户没有任何权限,sudoedit则是用于授权哪个用户可以编辑sudo配置文件,只需在授权规则中将sudoedit命令写入执行的command列表中即可。

2.sudo的访问令牌生存周期

为用户做sudo授权后,用户执行命令会要求输入自己的用户密码,默认情况此后的5分钟之内再用sudo执行命令则不必再次输入密码,由次可见sudo也有类似的访问令牌生存周期机制。

  1. sudo -V 可以查看令牌期限,字段为:Authentication timestamp timeout 默认为5分钟,原理是执行sudo时通过检测时间探针文件的时间戳来判断访问令牌是否过期,方法就是将执行sudo的当前时间与时间探针文件的时间戳对比,如果当前时间大于时间探针文件时间戳并且超过了5分钟,则认为访问令牌过期,需要重新认证。
  2. 探针文件存储于/run/sudo/ts目录下。可以根据生产需求修改令牌生存周期,visudo编辑配置文件,在env_reset后添加超时时间如:env_reset,timesamp_timeout=1
  3. sudo-v 可以重置时间探针文件的时间戳
  4. sudo -k 通过重置密码时间为1970年1月1日来作废sudo的缓存令牌。使用户在本次或下一次用sudo执行命令时必须输入密码。
  5. sudo -K 通过册除时间探针文件来作废sudo的缓存令牌

3.使用sudo时取消输用密码过程

对于频繁使用的命令在每次sudo令牌过期后重新输入密码会比较麻烦,在运行shell脚本中涉及到sudo授权的命令时因要求输入密码也会打断脚本的运行。
NOPASSWD可以实现sudo免密执行命令,但同时也存在安全隐患,一定要做好严格授权。如下图所示
技术图片
正确的授权方式
技术图片
4.sudo 通配符匹配引发安全漏洞
wang ALL=(root) /bin/cat /var/log/messages
期望授权允许用户wang,查看 /var/log/目录下的messages开头的文件。
安全威胁:sudo cat /var/log/messages /etc/shadow,结果可以查看shadow文件,
在glob中代表任意长度任意字符,包括空格、/等。

5.sudo在安全实践中的注意事项:

  1. sudo文件默认具有权限suid权限,属主属组为root,其它用户具备执行权限。
  2. sudo的访问令牌生存周期:执行sudo获取授予权令牌后,若暂时离开管理机时执行sudo -k或-K作废sudo获取的访问令牌。
  3. sudo在进行目录授权时,一定要明确排除不希望授权的对象。基于通配符的经典错误授权
  4. 不要将sudoedit命令授权给其它用户,sudoedit实际上就是sudo命令的软链接

四、实验部分

1. 编辑默认配置文件:visudo
2. 定义模块化的配置文件:visudo -f /etc/sudoers.d/vmlab
3.  定义别名

技术图片

4. 定义sudo默认用户

Defaults:microcisco runas_default=vmlab
sudo command 用户默认用户执行命令。
sudo -u username 用指定用户执行命令。

以上是关于Linux sudo实现灵活授权的主要内容,如果未能解决你的问题,请参考以下文章

Sudo使用(linux用户授权)

Linux系列:sudo免密用户授权

sudo授权、su切换用户、免密登陆与切换

linux sudo 命令

Linux sudo 详解

Linux sudo 权限管理