一个故事看懂Linux文件权限管理
前情回顾:
我通过open这个系统调用虫洞来到了内核空间,又在老爷爷的指点下来到了sys_open的地盘,即将开始打开文件的工作。
详情参见:内核地址空间大冒险:系统调用
open系统调用链
我是一个线程,出生在这个Linux帝国。
在老爷爷的指点下,通过系统调用表来到了这个叫sys_open的地方。这里很简陋,简单比划了几下就直接来到了do_sys_open的地盘。

一个负责接待的美女给我简单办理了手续,就让我去里面一个do_filp_open的房间。进去之后,这个房间里的工作人员又让我去后面的path_openat房间。
“打开个文件怎么这么麻烦,搞这么层级处理~”,我开始有点不爽了,便随口抱怨了一句。
“这才哪到哪,后面要办的手续还多着呢,年轻人一点耐心都没有”,原来我的抱怨不小心被path_openat里的工作人员听到了。
我有点不好意思,硬着头皮走了过去。

“把你要打开的文件名和需要的权限准备好,先去左手边的path_init窗口先做些准备工作”,工作人员低着头说到。我
瞅了瞅旁边的窗口,按他说的照办。
“再去右手边的link_path_walk窗口,找到你要访问的文件”,工作人员再次说到。我继续照办。
“好了,我办好了,这下该给我打开文件了吧?”,我累得上气不接下气。
“你穿过这个门,去do_last房间吧,里面有位大爷,他会接受你的请求的。
对了,把这个带上,一会儿他们要用”,工作人员说完给了我一张纸条。
没想到还没办完手续,不过这名字既然叫do_last,应该就是最后一道手续了吧。我揣起纸条,又继续前行。
来到do_last房间,我傻眼了,这里看起来要做的事情很多啊,没办法,都走到这一步了咬着牙也得坚持下去。
一顿操作猛如虎,总算来到了一个叫finish_open函数的面前,看样子马上就要真正打开文件了。
权限检查
“唉,等一下!”,突然一个声音叫住了我,我不由得心头一紧,难不成到嘴的肉要飞了?我转过头来,之前工作人员口中的大爷出现在我背后。

“大爷,您叫我干什么?”“小伙子,我是这里的保安,你现在还不能去那儿,先过来做个安检”
真是怕啥来啥,打开个文件怎么就这么难!
“安检?”
“对,这里有个may_open的大门,你先进去,检查合格了我才能让你打开文件。”,大爷一边说一边把我往may_open的大门里拽。
半推半就,我进入了他口中的may_open房间,环顾四周,这里也比较简陋,没两步就到了一个叫inode_permission的房间。
这里面的气氛一下子紧张了起来,几个彪形大汉在此值守。

“把你要打开的文件的inode拿来,还有你要的访问权限”,门口的一个大汉大声说到。
“访问权限我知道,我是要读取权限READ,你说的文件inode是什么,我...我这里只有文件的名字”,我感觉到自己有点紧张。
“我要你名字干什么,我们需要inode信息,不然怎么检查你有没有权限,你一路走到这里怎么会没有inode信息呢?”
他的这句话倒是提醒了我,想起刚刚在path_openat房间,那边的工作人员给了我一个纸条。我掏了出来,上面果然记录了inode信息,我赶紧交给了大汉。

“你跟我来,先去做常规DAC检查”,其中一个稍微面善的老伯带着我又来到隔壁一个叫generic_permission的房间。
这里面有一台很大的机器在轰隆隆运转着,旁边还有三个大门,老伯走到机器前一顿操作。“我已经把你要访问的文件inode信息输入进去了,你从面前那个门走过去一下”

按照老伯的指示,我穿过了第一台安检门,机器自动发出了提示音:“ERROR,当前进程fsuid != 目标文件uid”听到提示音的我吓了一跳。
“看来这文件不是你所属的用户的啊,没关系,再走过第二扇安检门试试”
“老伯,这机器是怎么知道文件是不是我所属的用户的呢?”我有点好奇
“文件的归属用户id是保存在文件索引inode里面的,而你所在的进程的用户id也是保存在进程的task_struct里面的,这台机器自动提取这两个信息比较就知道了”,老伯微笑着说到。
“原来是这样,我的task_struct里面确实有一个uid”
老伯摇了摇头,“不对不对,不是那个,是fsuid。也不在那里,是在task_struct->cred里面的,这个cred就是你的凭证,来咱们内核空间办事儿,到处都要检查,你可要收好了,弄丢了就麻烦了”

“那现在怎么办?这文件不是我所属用户的,我是不是没有权限打开呢?”
“别着急,你再走过第二扇门试试”
听从老伯的指示,我又穿过了第二道门,机器又一次发出了提示音:“ERROR,当前进程fsgid != 目标文件gid”
又报错了!我越发的担心起来。
“看来你也不在这个文件的归属组里啊”,老伯叹了口气。我正想问,老伯又开口了,“不过别着急,还有一次机会,快走进第三扇门”
抱着一丝希望,走进了第三扇门,没有意外的机器又报警了:“ERROR,目标文件权限640,其他用户无访问权限!”
我的心情跌落到了谷底,没想到忙活了这么久,居然没有权限打开。
UGO & ACL
“先别气馁,还有机会!”,老伯突然拍了下我的肩膀。
“不是三道门都报错了吗,怎么还有机会呢?”,我小声的问道。
“UGO权限检查没通过,不过我注意到你要访问的文件有ACL,兴许还有机会也未可知。”
“UGO是什么?ACL又是什么”,面对这两个新词,我一下有点懵。

“UGO就是(User, Group, Other)的缩写,Linux帝国为所有文件针对所属用户、同组用户和其他用户分别设置了访问权限,Read、Write、Execute三种权限的组合,并把这些权限信息和文件的归属信息记录在了索引信息inode里面,就是你之前拿到的那个纸条,帝国把这种权限管理方式叫UGO”
我听得似懂非懂,“那ACL又是什么呢?”
“UGO的管理方式有些简单粗暴,为了更精细化的管理,帝国高层经过商议后,颁布了新的政策就是ACL(Access Control List),访问控制列表的意思,在UGO的基础上,可以单独记录一些细粒度的权限信息,比如指定组外某一个特殊用户允许对文件的访问,这些信息就构成了一个访问控制列表,把这个表的地址放到了inode里面,你看到那个红色的+号没,表示这个文件是有ACL的,所以你还有机会再试一试”

听完老伯的讲解,我又重新燃起了希望,辛苦大半天,我可不想空手而归。
老伯再次对着机器一顿操作,出现了第四扇门,我给自己鼓了鼓劲,走了过去。
这一次机器没有发出刺耳的声音,而是一声清脆的“SUCCESS”!
老伯走了过来,“恭喜,检查通过了,咱们回去吧”
检查通过的我仿佛经历了一场大考,心里如释重负,回去的步伐轻快了许多。
Cgroup & SELinux
回到inode_permission房间,老伯向另一个彪形大汉提交了检查结果。
“阿虎,DAC检查已经通过了,下面交给你了。”原来这一位叫阿虎,正想着,他走了过来。

“小子,跟我来吧,继续做Cgroup检查”
我的心咯噔一下,居然还有检查。“Cgroup检查又是干嘛的?”,我忍不住问到。
“我们是Linux帝国进程分组控制管理部下辖的devices部门,在此奉命检查你是否有权限访问对应的设备,请配合我们的工作”,阿虎严肃正经的回答。
“这应该是最后一次检查了吧,完事儿总该放我走了吧?”
命运总是会跟我开玩笑,听到我的问题,旁边又一位大哥走了过来,“等会检查通过的话,我们SELinux部门还有最后一道检查,麻烦您再坚持一下~”

我一下没了力气,瘫坐了一旁,“容我休息休息”。
未完待续·······
彩蛋
在我休息的间隙,隔壁generic_permission房间又传来了几下错误的提示音,不知道哪个倒霉蛋要空手而归了。
一会儿老伯就出来了,“阿虎,DAC检查已经通过了,下面交给你了。”
“老伯,我刚刚明明听到了机器报警,检查不通过才对啊”,我走上去问老伯。
“哦,你说他啊,他是一个特权进程的线程,有CAP_DAC_OVERRIDE能力标记,可以无视那台机器,哈哈”
欲知后事如何,请关注后续精彩......

往期热门文章:
一个故事看懂Linux文件权限管理的更多相关文章
- 一个故事看懂HTTPS
我是一个浏览器,每到夜深人静的时候,主人就打开我开始学习. 为了不让别人看到浏览记录,主人选择了"无痕模式". 但网络中总是有很多坏人,他们通过抓包截获我和服务器的通信,主人干了什 ...
- Linux 文件权限管理
1.文件权限的概述 在Linux系统下,使用权限来保护资源的安全将是一种不错的选择.系统中每个文件的权限都有可读(r).可写(w)和可执行(x)这三种权限,它们分别对应权限数值4.2 和1.系统为每个 ...
- 《linux文件权限管理大总结》RHEL6
在linux系统下文件的权限通常会以下面的格式显示出来: Chmod文件权限: 权限的管理chmod -a 所有的权限 -u 文件所有者的权限 -g 组权限 -o 其他用户的权限 可以使用运算符来设 ...
- Linux文件权限管理(持续更新)
文章是从我的个人博客上粘贴过来的, 大家也可以访问我的主页 www.iwangzheng.com 以root身份登录linux以后, ls -al 可以看到 -rw-rw-r-- 1 wangzhe ...
- 一个故事看懂CPU的TLB
Hi,我是CPU一号车间的阿Q,还记得我吗,真是好久不见了- 我所在的CPU是一个八核CPU,就有八个工作车间,那运行起来速度杠杆的- 虚拟地址翻译 一大早,我们一号车间MMU(内存管理单元)部门的小 ...
- Linux文件权限管理
一.设置文件所属的用户以及所属的组(chown,chgrp) chgrp用来更改文件的组拥有者,其一般格式为:chgrp [option] group file(1)把文件test的组拥有者改为zfs ...
- 一个故事看懂AI神经网络工作原理
我是一个AI神经元 我是一个AI神经元,刚刚来到这个世界上,一切对我来说都特别新奇. 之所以叫这个名字,是因为我的工作有点像人类身体中的神经元. 人体中的神经元可以传递生物信号,给它输入一个信号,它经 ...
- 一个故事看懂CPU的SIMD技术
好久不见,我叫阿Q,是CPU一号车间的员工.我所在的CPU有8个车间,也就是8个核心,咱们每个核心都可以同时执行两个线程,就是8核16线程,那速度杠杠滴. 我所在的一号车间,除了负责执行指令的我,还有 ...
- Linux常用命令之文件权限管理
Linux文件权限管理1.改变文件或目录的权限:chmod命令详解命令名称:chmod命令所在路径:/bin/chmod执行权限:所有用户语法:chmod [{ugoa}{+-=}{rwx}] [文件 ...
随机推荐
- 引用类型(C# 参考)
C# 中有两种类型:引用类型和值类型. 引用类型的变量存储对其数据(对象)的引用,而值类型的变量直接包含其数据. 对于引用类型,两种变量可引用同一对象:因此,对一个变量执行的操作会影响另一个变量所引用 ...
- MongoDB 官方文档中的 aggregate 例子当中的 $sum: 1 , 这里的 1 起什么作用?
按照 group 的条件, 满足一条就加1, db.getCollection('user_login_info').aggregate( [ {$project:{account_id:" ...
- Webpack实战(一):Webpack打包工具安装及参数配置
为什么要模块化 javascript跟其他开发语言有很多的区别,其中一个就是没有模块化概念,如果一个项目中有多个js文件,我们只能通过script标签引入的方式,把一个个js文件插入到页面,这种做法会 ...
- 如何高效实用 Git
Git 工作流 只要项目是多人参与的,那么就需要使用正确的 Git 工作流程. 下面介绍一个简单有效的工作流程. 场景 假设有一个项目,要开发下一代的 Facebook,你就是这个项目的技术 lead ...
- kafka(一)-为什么选择kafka
作为开发人员,我们在选择一个框架或者工具时,我们都需要考虑些什么,我们不是头脑发热,一拍脑袋就它了,我们首先要认清这个框架或工具的作用是什么,能给我们带来什么样的好处,同时也要考虑带来什么样的负面结果 ...
- 异数OS-织梦师-异数OS虚拟容器交换机(七) 走进4Tbps网络应用时代,加速5G应用真正落地
. 异数OS-织梦师-异数OS虚拟容器交换机(七) 走进4Tbps网络应用时代,加速5G应用真正落地 本文来自异数OS社区 github: https://github.com/yds086/Here ...
- (转)宽字节编码类型的XSS
今晚又看了一遍PKAV-心上的瘦子写的xss腾讯系列的例子,收获挺大的,其中对宽字节注入有了更深的了解,又查找了一些相关的资料,整理一下,以备以后查阅 参考文档: http://book.2cto.c ...
- GP工作室的项目计划书
目录 零点六一八--项目计划书 一.团队简介 1.1团队名称:GP工作室(Gold Point Studio) 1.2团队成员 1.3成员简介 1.4团队特色 二.项目介绍 2.1项目名称: 零点六一 ...
- os模块常用方法笔记
os模块是程序和系统文件之间的交互接口,可以实现对文件的创建.删除等功能,以下对os模块的功能做一个笔记,方便以后学习和查找. import os os.getcwd() #获取当前工作目录,即当前p ...
- MVVM的理解和Vue的生命周期
一.对于MVVM的理解? MVVM 是 Model-View-ViewModel 的缩写.Model代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑.View 代表UI 组件,它负责将数 ...