Linux的进程权限控制
Linux系统的安全性得益于其进程权限和文件权限的控制机制。今天抽空梳理下Linux下的进程权限控制相关的文件权限涉及一点。首先明确四个名词:真实用户ID(real ID)、有效用户ID(effective ID)、保存用户ID(Saved ID)、文件系统用户ID(File ID)。后面的特性同样适用组。
- 真实用户ID(real ID)
是指启动进程的用户ID,进程如果拥有root权限启动以后就可以调用setuid(newid)系统调用修改。修改之后四个ID的值都会变为newid,程序刚开始运行第一行命令时四个值都是启动这个进程的用户ID。
- 有效用户ID(effective ID)
指正在运行(强调他现在属于谁)进程的用户ID,看着让人疑惑啊,这不就是真实用户ID吗?其实不是,因为程序在运行过程中可以修改当前正在运行自己的人(为真实用户ID或着保存用户ID),所以启动进程的用户是真实ID但是运行进程的是有效ID。最初他俩是相同的,进程运行期间的权限认证使用的就是有效用户ID。
- 保存用户ID(Saved ID)
保存进程的最初有效用户ID,所以一般情况下一个程序如果运行期间不修改自己的ID则,前面这个三个ID应该是相同的
- 文件系统用户ID(File ID)
文件系统ID。他在Linux下的作用主要是体现在进程创建文件后的新文件的权限处理时使用的用户。Uunix上使用的是有效用户ID。
程序在运行过程是可以修改自己的有效用户ID从而修改自己的权限的,不过一般情况下应用程序是无法增加自己的权限的,所以修改进程有效用户ID我理解这个机制是为了在合适的时候减小进程权限而存在的,比如以root作为真实ID,但是以普通用户状态运行,避免程序越线操作。Linux下修改程序用户ID的系统调用主要有四个两类。
- 修改进程ID int seuid(uid_t uid)
这个系统调用的执行效果取决与当前调用进程的有效用户ID,如果是root则它将修改所有上面的四个ID(其实是五个还有一个suid),所以相当于他执行了这一个系统调用后就是放弃了自己的root权限,相反此时如果进程的有效用户ID是一个普通的用户,则他将只会修改有效用户ID和文件系统用户ID行为退化的和下面的系统调用用法相同。
- 修改进程有效用户ID int seteuid(uid_t uid)
正如前面所说的一样,这个系统调用只会修改进程的有效用户ID和文件系统用户ID,但是这个函数的操作可以讲有效ID设置成的新ID值只能是真实用户ID 和保存用户ID其中之一。
总结就是:
非root用户是无法出让权限给其它用户,只有root用户才能出让。非root用户权限本来就只有他自己的权限,所以其他用户他可能都是不可见的。setuid和seteuid是有区别的,setuid是永久的放弃root用户权限,转让给非root用户后,无法再restore到root用户,seteuid是临时放弃root用户权限,可以通过seteuid(0),restore到root权限。
最后还有就是suid,这是设置用户ID,他是存在与文件权限位rwx中的,如果一个可执行文件通过chmod设置了s位则,任何用户对这个文件有执行权限的用户执行了这个可执行文件,则其有效用户ID就是这个文件设置的s位的用户ID,常见用户是给文件属主用户设置这一位通过chmod u+s filename 命令。例如一个可执行文件的属主是user1 并且设置了属主设置权限位s,则user2去执行这个可执行文件时这个进程的 真实用户ID 有效用户ID 保存用户ID分别是 user2 user1 user1 。此外一个进程权限的继承,当使用 fork 子进程的时候,子进程全部继承父进程四个 uid,和父进程 uid 相同当使用exec系列函数时候,会把suid(文件S标志位)置为euid。这就是Linux下的进程权限控制的相关内容,还有一个疑惑就是既然有效用户ID常常和文件系统ID一起被修改,那么为什么需要他呢,还是我理解的有问题,如果有明白其中原由的大牛告知一下。
参考:https://www.jb51.net/article/98188.htm
最新文章
- Tensorflow 官方版教程中文版
- CAS 4.0.0RC 配置MD5验证功能
- OpenCascade HLR for Pipe Model
- php构造函数和析构函数
- HTML6 展望
- Android -- Home按键
- Come and join us at English corner
- Android大图片导致内存问题小结
- django 实现同一个ip十分钟内只能注册一次(redis版本)
- java equals == contentEquals
- C语言_了解下结构体指针
- Python多进程----从入门到放弃
- rest_framework之解析器、路由控制、分页
- Python进阶:自定义对象实现切片功能
- API响应
- 【学习笔记】--- 老男孩学Python,day6 字典
- 2013 C#单元测试
- json获取元素数量
- 20170719xlVBASmartIndent
- ubuntu18---安装python3.6下的virtualenv15.1.0
热门文章
- (15)-Python3之--configparser模块
- C#高级编程第11版 - 第四章 索引
- jackson学习之四:WRAP_ROOT_VALUE(root对象)
- Linux网卡没有eth0显示ens33原因以及解决办法
- 计算机网络第7版 PDF+ 计算机网络释疑与习题解答第7版 PDF 计算机网络 课后答案
- MySQL如何安全的给小表加字段
- Axure RP 9版本最新版授权码和密钥 亲测可用
- P5518 [MtOI2019]幽灵乐团 / 莫比乌斯反演基础练习题
- [JSOI2019]节日庆典 做题心得
- Java8 ,LocalDate,LocalDateTime处理日期和时间工具类,