权限检查和有效ID、有效组ID
一、进行相关ID
一共有6个与进程相关的ID(也有可能更多)。
1、实际用户ID(RUID)和实际组ID(RGID)
实际ID说明了我们实际上是谁或者属于谁,该值在login函数执行时,取自口令文件/etc/passwd中,一般由用户标识号(第三列)和组标识号标识(第四列)(0-999的数)。
这个两个ID在登录期间一般不会改变,除非有root权限用setuid和setgid改变。
2、有效用户ID(EUID)和有效组ID(EGID)(附属组ID)
有效ID用于权限检查,当访问或执行文件时会检查相应的权限,这个检查就是检查有效ID,其中附属组ID代表一个用户属于多个其他组的组ID。具体检查规则稍后列出。
设位置
设置位是文件的属性用于改变访问者的相应ID,使其具有访问权限。查看文件权限 ls -l时,uid区域的s和gid区域的s即代表文件有设置位。在访问者访问该文件时,把访问者的EUID或者EGID改变为文件的UID或者GID。这样访问者就拥有了访问文件的权限。例如命令passwd就是利用这样的机制来使任何用户拥有修改他们自己的密码的功能,而不用在passwd命令的所有者中加入所有用户或者加入一个组来达到这样的目的。
思考:为什么需要设置位而不是直接设置文件的其他用户权限?
因为设置位可以维护文件权限这一机制,比如passwd是靠设置位修改访问者有效ID然后根据passwd的内容访问/etc/shadow文件来修改对应的密码(文件内判断访问者的实际ID,来用对应的参数修改shadow文件)。如果是直接设置shadow和passwd的其他位,则任何用户都可以修改任何用户的密码,则丧失了文件权限这一机制的初衷。
3、保存的设置用户ID(SUID)和保存的设置组ID(SGID)
这个用户ID的作用是保存有效用户ID的一个副本。有效用户ID可以被更改,既然有更改那么就应该有恢复,一个进程在访问文件的时候要设置有效用户ID但在处理进程命令的时候要切换回用户实际ID,SUID的作用就是保存有效用户ID的副本,用于后续恢复有效用户ID。
这个ID的作用可以看这个博客 https://blog.csdn.net/zhoucheng05_13/article/details/86304602 讲的很详细。
二、文件访问权限测试
每当进程打开、创建或者删除一个文件时,内核就进行内核访问权限测试。测试顺序如下
1、若进程的有效用户ID是0(root),则允许访问。
2、若进程的有效用户ID等于文件所有者,那么如果所有者适当的访问权限被设置,则允许访问;否则访问拒绝。
3、若进程的有效组ID或进程的附属组ID之一等一文件的组ID,那么有过组权限适当位被设置,则允许访问;否则拒绝访问
4、若其它用户适当的访问权限位被设置,则允许访问;否则拒绝。
原文地址:https://www.cnblogs.com/wildricky/p/15384767.html
- 基于重叠IO模型的 回显TCP服务器设计
- Git常用命令
- 手把手教你搭建SpringMVC——最小化配置
- Mysql-16-缓存的配置和使用
- 重叠(Overlapped)IO模型
- Mysql-15-mysql分布式应用
- 基于Spring Mvc实现的Excel文件上传下载
- Java程序员的日常—— Arrays工具类的使用
- Mysql-14-mysql的日志管理
- ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
- Java程序员的日常 —— static的用法讲解实践
- WSAEventSelect模型 ---应用实例,重写TCP服务器实例
- Mysql-13mysql的复制
- 蓝牙门禁系统
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP删除字符串中非字母数字字符方法总结
- 实例讲解php将字符串输出到HTML
- PHP的mysqli_stat()函数讲解
- php中访问修饰符的知识点总结
- 浅谈keras 模型用于预测时的注意事项
- 使用Keras预训练好的模型进行目标类别预测详解
- keras输出预测值和真实值方式
- 对python pandas中 inplace 参数的理解
- PHP基于GD2函数库实现验证码功能示例
- PHP合并两个或多个数组的方法
- PHP的mysqli_set_charset()函数讲解
- PHP常见加密函数用法示例【crypt与md5】
- PHP的mysqli_sqlstate()函数讲解
- PHP Laravel中的Trait使用方法
- PHP CURL使用详解