sudo底层实现原理

哈喽,我是子牙老师

关于sudo,想必大家不陌生了,给我们最直观的感受就是以root权限执行后面的命令,那你是否好奇它底层是如何实现的呢?最近正好备课把这个问题深入研究了一下,分享给大家

以下,enjoy

场景

Linux系统中,你是个普通用户(非root),你想mount,会得到报错信息
在这里插入图片描述

提示你,只有root用户才能做这个操作

其实不止是mount,你普通用户想做任何高危操作,都需要root权限
在这里插入图片描述

但是你没有root密码,这时候你会怎么办?使用sudo,对吧

输入你自己的密码,就可以了

为什么这样就可以了?

sudo

来看下sudo命令有什么特殊的地方
在这里插入图片描述

常见的权限位是rwx,对应的权限是可读可写可执行。你会发现sudo的权限位有个s位,这个是什么呢?这个是SUID,在Linux内核中对应的宏是S_ISUID
在这里插入图片描述

这个SUID的信息存储在哪?存储在可执行文件对应的inode节点中
在这里插入图片描述

如果你想看源码,存储在inode的属性i_mode中。如图
在这里插入图片描述

如果你想知道存储细节,满足你:i_mode是16位的,前4位存放文件类型,中间3位存放特殊权限位如SUID、SGID、Sticky Bit,后面9位就存放所有者所属组其他人的rwx权限

我为什么知道的这么细?Linux内核玩熟了呗你玩到这么熟,你可能比我还细

为什么sudo命令有了s权限就可以如此强大呢?

SUID

SUID的作用是:以文件所有者权限执行这个程序。所以光有SUID还不行,文件的所有者还得是root,两个条件缺一不可

来看看所属用户是root,具备s权限的sudo,Linux系统是如何做到以root权限运行的

Linux系统执行sudo命令的时候,会创建进程,对应的内核对象是task_struct,task_struct中有三个属性与用户权限相关
在这里插入图片描述

ptracer_cred与调试相关,real_cred是进程的真实凭证,cred是运行时凭证。SUID作用的就是cred中的属性euid

结构体cred中与uid、gid相关的几个属性
在这里插入图片描述

来看Linux内核源码论证,Linux内核真的会根据SUID配置进程的cred中的euid
在这里插入图片描述

一个进程为什么要有两个cred?因为Linux系统提供了相关的机制可以去修改程序运行时的所有者与所属组、粘滞位,分开存储。如果不分开,那就会把一个程序变成真正的root权限,存在安全隐患。这部分是Linux安全子系统 LSM 中的内容,感兴趣的小伙伴可以自行深究

至此,自上而上,sudo可以以root权限执行程序的谜底已全部揭晓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值