当前位置: 首页 > news >正文

文件权限

一、文件信息结构

图1 文件信息结构stat

与文件有关的信息结构,如图1所示,结构的实际定义可能随具体实现会有所不同,但这是基本形式。本节中主要涉及的有st_modest_uidst_gid成员。

图2 获取stat函数

获取文件信息结构stat,有4个stat函数。

stat通过pathname来获得文件相关信息结构stat;

fstat通过文件描述符fd来获得文件相关信息结构stat;

lstat类似于stat,但当命名文件是一个符号链接时,lstat返回该符号链接的有关信息,不是符号链接引用的文件信息【NOFOLLOW】。

fstatat中,fd控制相对路径的起始目录,flag控制是否跟随符号链接【AT_SYMLINK_NOFOLLOW】。

  • 文件类型

(1)普通文件(2)目录文件(3)块特殊文件(4)字符特殊文件(5)FIFO(6)套接字(7)符号链接

文件类型信息包含在stat结构中的st_mode成员中,可用图3的文件类型宏判断,输入为st_mode,如S_ISREG(stat.st_mode)

图3 文件类型宏

 二、与进程相关的ID

与进程相关联的ID有6个或更多,如图4

图4 与进程相关的ID

1、实际用户ID和实际组ID,标识实际上我们是谁,这两个字段在登录时取自口令文件中的登录项。

2、有效用户ID、有效组ID及附属组ID,这3个ID决定了进程的文件访问权限。

即判断文件访问权限是根据进程有效ID文件的ID进行判断的。具体规则后续再展开。

3、保存设置用户ID、保存设置组ID,分别是有效用户ID、有效组ID的副本。这个字段的用处,后续再展开。

 

注意:一般情况下,有效用户ID=实际用户ID,有效组ID=实际组ID

特殊情况下:st_modeset-user-ID位(设置用户位)set-group-ID位(设置组位) 会改变这种情况。

如果文件的设置用户位被设置,那么执行该文件(exec)时,有效用户ID=文件用户ID,而不是有效用户ID=实际用户ID;

如果文件的设置组位被设置,那么执行该文件(exec)时,有效组ID=文件组ID,而不是有效用户ID=实际用户ID。

 

例1:passwd是一个设置用户ID程序,当普通用户进程执行passwd时,有效用户ID更改为文件的用户ID(root),这样就拥有了root特限,可以更改口令文件。

 

  • 保存设置ID的作用

以用户ID为例,组ID效果类似,可推广。

更改用户ID的方法,如图5所示。

图5 更改用户ID的方法

实际的用户ID在登录时获取,有效用户ID=实际用户ID;

除非exec一个文件时,该文件设置了设置用户ID位,有效用户ID=文件的用户ID;

保存设置用户ID从有效用户ID中复制。

这些在前边都介绍过了。

 

当程序需要增加特权或者降低特权时,需要对用户ID或组ID进行更改,以获取合适的访问权限。

这里以用户ID为例,更改用户ID,可以用setuid进行。

(1)若进程具有超级特权,setuid则会更改实际用户ID、有效用户ID、以及保存的设置用户ID为uid。

(2)若没有超级特权,setuid只能更改有效用户ID,而且uid要么为实际用户ID,要么为设置用户ID

 

例2:at程序,可用于调度在哪个时刻运行特定的命令。at文件是root用户所拥有的,且设置用户ID位被设置了。

 运行at程序,过程:

(1)运行at程序,用户ID状态如下

实际用户 ID = 我们的用户ID(未改变)

有效用户ID = root(从at程序文件得来)

保存的设置用户 ID = root(复制有效用户ID)

(2)at先降低自己的特权,调用setuid更改为实际用户ID

实际用户 ID = 我们的用户ID(未改变)

有效用户ID = 我们的用户ID(uid=实际用户ID)

保存的设置用户 ID = root(未改变)

(3)直到需要特权时(更改命令何时的运行配置文件),调用setuid更改为root(uid = 保存的设置用户ID,这也是保存设置用户ID作用的体现)

实际用户 ID = 我们的用户ID(未改变)

有效用户ID = root(uid=保存的设置用户ID)

保存的设置用户 ID = root(未改变)

(4)降低特权,防止对特权的误用

实际用户 ID = 我们的用户ID(未改变)

有效用户ID = 我们的用户ID(uid=实际用户ID)

保存的设置用户 ID = root(未改变)

(5)时间到,守护进程开始用root特权运行,代表用户运行命令(用setuid,将所有用户ID设置为我们的用户ID)

实际用户 ID = 我们的用户ID(root,setuid更改所有)

有效用户ID = 我们的用户ID(root,setuid更改所有)

保存的设置用户 ID = 我们的用户ID(root,setuid更改所有)

 

总结:保存设置用户ID,很多部分是为了实现最小特权

 

三、文件访问权限

每个文件有9个访问权限位,可分为3类,用户读写执行、读写执行、其它读写执行,如图6所示(存储在st_mode)。

 

图5 文件访问权限

 根据前边,知道访问权限测试,是根据进程有效ID(有效用户ID和有效组ID)和文件的ID进行判断的。

(1)进程的有效用户ID是0(超级用户),具有所有访问权限;

(2)进程的有效用户ID等于文件用户ID(stat.st_uid),且文件中用户适当的访问权限位(读写执行)被设置,则允许访问;

(3)进程的有效组ID或附属组ID之一等于文件组ID(stat.st_gid),且文件中组适当的访问权限位(读写执行)被设置,则允许访问;

(4)其它情况,若文件中其它用户适当的访问权限(读写执行)被设置,则允许访问;

  • access和faccessat

access和faccessat函数,可根据进程实际ID来测试访问权限,而不是有效ID

 

图6 access和faccessat函数

 

四、新文件的所有权和权限

所有权:

新文件的用户ID设置为进程有效用户ID

新文件的组ID,可以是进程有效组ID;也可以是所在目录的组ID

注意:Linux3.2.0和Solaris 10,新文件的组ID取决于目录的设置组ID位是否被设置。若被设置,则新文件的组ID是所在目录的组ID。

 

新文件的权限:

umask为文件模式创建屏蔽字,在文件模式创建屏蔽字中位1的位,在文件mode中的相应位一定被关闭。

还有,普通文件文件被创建时,不能拥有执行权限。

常用值有002,022和027。

002屏蔽其它用户的写权限,022屏蔽组成员和其它用户的写权限,027屏蔽组成员的写权限以及其它用户的所有权限。

 

五、更改文件的权限位

 

图7 chmod、fchmod和fchmodat函数

 只有进程的有效用户ID等于文件所有者ID,或者进程具有超级用户权限,才可以更改文件的权限位。

参数mode是一下的常量按位或:

图8 权限位总览

 粘着位作用:

(1)可执行文件,第一次被执行后,程序正文部分还保留在交换区

(2)扩展了使用范围,如果一个目录设置了粘着位,那么改目录下的文件删除有限制条件

拥有此文件 or 拥有此目录 or 是超级用户才能删除。

 

六、更改文件的用户ID和组ID

图9 更改文件用户ID和组ID函数

_POSIX_CHOWN_RESTRICTED限制生效:

(1)只有超级用户可更改用户ID

(2)非超级用户可以更改自己拥有文件的组ID,但只能更改到自己所属的组

 

七、文件权限位总结

图10 文件权限位总结

 

转载于:https://www.cnblogs.com/songdechiu/p/10264886.html

相关文章:

  • 『原创』PPC和PC使用TCP通讯——简单实现
  • 天音控股荣获“金圆桌”两项大奖
  • Rsync同步文件
  • 几种重要的网络演化模型
  • 一名2018应届生的全栈之路 | 掘金年度征文
  • android:focusableInTouchMode和android:focusable的意思用途
  • JAVA并发编程--1.基础概念
  • Amino—结构层
  • 使用双拼的好处
  • swift开发常用代码片段
  • 五分钟了解身体作息规律
  • jzoj6003. 【THUWC2019模拟2019.1.16】Square (乱搞)
  • MongoDB 之pymongodb
  • Web安全小攻略 | Web高能短文系列
  • 淘淘商城的一些错误
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • CentOS7 安装JDK
  • CSS魔法堂:Absolute Positioning就这个样
  • JWT究竟是什么呢?
  • linux学习笔记
  • Making An Indicator With Pure CSS
  • Spring-boot 启动时碰到的错误
  • Vim 折腾记
  • VuePress 静态网站生成
  • 闭包--闭包之tab栏切换(四)
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 给初学者:JavaScript 中数组操作注意点
  • 排序(1):冒泡排序
  • 排序算法之--选择排序
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 微信小程序:实现悬浮返回和分享按钮
  • 为什么要用IPython/Jupyter?
  • 正则与JS中的正则
  • 仓管云——企业云erp功能有哪些?
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • # 计算机视觉入门
  • #laravel 通过手动安装依赖PHPExcel#
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (c语言)strcpy函数用法
  • (day6) 319. 灯泡开关
  • (二)学习JVM —— 垃圾回收机制
  • (算法)N皇后问题
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET企业级应用架构设计系列之技术选型
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [C++]高精度 bign (重载运算符版本)
  • [COGS 622] [NOIP2011] 玛雅游戏 模拟