sudo用途:
sudo用于为普通用户授权,一句话:允许哪些用户在哪些主机上登录后以哪个用户身份运行哪些命令。类似Windows系统中的右键以管理员方式运行。
一、sudo与su的区别
举个例子,运维部门来一位新人想交给他完成一些基本的软件部署任务,但又担心他对系统架构环境不熟而引发误操作,此时让他使用su命令直接切换高权限的管理账号可能会风险很大,而sudo的灵活授权就可以把权限限定到合理的范围,从而降低风险。
1. su 实际上就是以目标用户身份进行登录,执行su命令切换用户时必须知道目标用户的密码,授权很不灵活,同时也带来了用户密码泄露的安全风险。
2. sudo 则是基于配置文件明确定义指定用户中以执行哪些命令,只是临时进行安全上下文切换,而不需要进行用户登录切换。在执行sudo 执行命令时只需要输入用户自己的密码即,而不需要知道安全上下文切换的目标用户密码。
3. su与sudo都可以执行用户切换操作,但sudo必须在配置文件中明确定义才可以进行账号切换。
su 切换用户
- su username:不完全切换,HOME不会变为目标用户的HOME目录
- su - username:完全切换,HOME会变为目标用户的HOME目录。
sudo切换用户- sudo -i 切换为root用户
- 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/目录下。
学习思路:
4个授权元素可以是明确的具体对象,也可以是将一组对象组织在一起的别名。
被授权用户:进程的发起者,可是将一组用户名或组名组织在一个集合中,集合的名字就是对象别名 登录主机:可以是一个具体的IP地址,主机名称,也可以是多个IP地址、主机名称,网段组织一起的集合。 切换后的用户身份:进程的最终用户,如果不填写则默认为root用户,即被授权的用户以任种身份来执行后面的定义的Command。 command:可以是一系列相关命令的集合,如:将网络管理类命令组织在一起定义别名。
以上三种元素的别名定义在配置文件中已有明确的范例,可以直接引用,在定义用户别名时如果其成员中包含用户组名,则必须使用%进行引用。
最佳操作实践:
二、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也有类似的访问令牌生存周期机制。
- sudo -V 可以查看令牌期限,字段为:Authentication timestamp timeout 默认为5分钟,原理是执行sudo时通过检测时间探针文件的时间戳来判断访问令牌是否过期,方法就是将执行sudo的当前时间与时间探针文件的时间戳对比,如果当前时间大于时间探针文件时间戳并且超过了5分钟,则认为访问令牌过期,需要重新认证。
- 探针文件存储于/run/sudo/ts目录下。可以根据生产需求修改令牌生存周期,visudo编辑配置文件,在env_reset后添加超时时间如:env_reset,timesamp_timeout=1
- sudo-v 可以重置时间探针文件的时间戳
- sudo -k 通过重置密码时间为1970年1月1日来作废sudo的缓存令牌。使用户在本次或下一次用sudo执行命令时必须输入密码。
- 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. 编辑默认配置文件:visudo
2. 定义模块化的配置文件:visudo -f /etc/sudoers.d/vmlab
3. 定义别名
4. 定义sudo默认用户
Defaults:microcisco runas_default=vmlab
sudo command 用户默认用户执行命令。
sudo -u username 用指定用户执行命令。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。