大家好,又见面了,我是你们的朋友全栈君。
前文我们对Linux操作系统的权限管理进行了简要的介绍。今天我们就详细介绍一下关于RWX权限管理的更多细节。很多同学对RWX权限都有一些了解,但是要说出子丑来恐怕就不那么容易了。
Linux的RWX权限控制又称为DAC(Discretionary Access Control,自主访问控制)。DAC 机制就是指对象的拥有者可以任意修改或授予此对象相应的权限。从主体和客体的角度来说,就是主体对其拥有的客体,有权决定自己和其他主体对该客体应具有怎样的访问权限。比如在Linux中的某个用户A可以随意设定UGO(即:本用户、本用户组、其他用户)对该文件的RWX(即:读、写、执行)权限。
本文将从RWX最基本的使用和原理入手,然后深入Linux操作系统内核实现,深层次的剖析RWX的实现细节。
RWX权限基本组成及原理
RWX访问控制恐怕是我们见得最多的访问控制了。当我们通过ls命令获取文件的详细信息时,其前面的rwx字符串就是对文件权限的标示,而后面跟的itworld13 itworld123则是其所属用户和组的信息。如图1就是RWX的一个实例。
图1 RWX权限示例
RWX的组成及含义如图2所示。整个权限描述分为4段,第一段用于描述该文件的类型,可以是常规文件(-)、目录(d)、块设备(b)、链接(l)和字符设备(c)等等。
图2 RWX权限属性含义
后面三段是文件具体的权限描述信息了,分别是文件主权限、组用户权限和其它用户(UGO)的权限。通过上述三段的组合就可以实现比较复杂的权限控制。比如允许某个用户的文件可以被其它用户读,但是不可以改写和执行等等。
上述权限控制信息中包含rwx-四种字符,具体含义如下:r表示对于该用户可读,对于文件来说是允许读取内容,对于目录来说是允许读取其中的文件;
w表示对于该用户可写,对于文件来说是允许修改其内容,对于目录来说可以写信息到目录中,即可以创建、删除文件、移动文件等操作。
x表示对于该用户可执行,对于文件来说就是可以执行该文件,对于目录来说则是可以进入目录;可以搜索(能用该目录名称作为路径名去访问它所包含的文件和子目录)
从用户角度来说文件的权限是通过rwx字符串表示的,其实在底层实现就是一些标示位。如果该位置1则表示有该权限,否则没有该权限。这些信息保持在文件的inode信息中。
图3中的宏定义就是Linux内核中对文件权限属性的宏定义,例如S_IRUSR表示主权限可读的标示。这里需要理解的是每个标示占用一个位,本文暂时不过多介绍,这里先有个概念就可以了。
图3 权限宏定义
另外一个需要注意的是目录内文件对目录属性的集成性。也就是如果目录属于用户itworld123,而其中的文件属于itworld123t1。如果itworld123对该文件没有写权限,那么强制写的情况下文件的权限会变为itworld123。
RWX权限管理的内核实现
前面我们看到了内核中定义的一些宏定义。接下来我们深入的分析一下,在内核中操作系统是如何控制用户和进程的访问权限的。
操作系统API及说明
任何文件的访问都涉及到文件打开的动作,因此我们先从文件系统的打开接口讲起。在Linux操作系统中打开接口是open函数,该函数的原型如下:int open(const char *pathname, int flags, mode_t mode);
该函数中第一个参数是文件名,第二个参数flags是打开文件的属性,包括O_RDONLY、 O_WRONLY或者O_RDWR,也即只读、直写和可读写。
第三个参数则是mode是在创建的时候使用的,可以指定文件的RWX访问权限属性。具体属性的定义在前面代码中展示过,包括如下宏定义:S_IRWXU 00700 用户(文件所有者)具有读、写和执行权限。S_IRUSR 00400 用户有读权限S_IWUSR 00200 用户有写权限S_IXUSR 00100 用户有执行权限S_IRWXG 00070 组具有读、写和执行权限。S_IRGRP 00040 组有读权限S_IWGRP 00020 组有写权限S_IXGRP 00010 组有执行权限S_IRWXO 00007 其他用户具有读、写和执行权限。S_IROTH 00004 其他用户具有读权限。S_IWOTH 00002 其他用户具有写权限。S_IXOTH 00001 其他用户具有执行权限。
这些旗标可以通过或的方式进行组合,从而创建具有期望访问权限的文件。文件的UG属性则是继承自进程的用户和组。例如我们通过一个小程序实现创建文件的功能,当分别用root用户和zhangsn用户创建文件时,得到文件的属性如下所示。
该小程序的代码如下,请作为参考。
当我们在zhangsn用户下,通过该程序访问test_root的时候,open函数会返回13的错误码。该错误的含义是拒绝访问。因为test_root是属于root用户的文件,只能被该用户访问,因此会返回拒绝访问的错误。
内核代码解释
对于操作系统的API来说,打开文件的整个流程如图所示。最终do_last函数会调用到一个名为may_open的函数,而该函数则调用inode_permission函数。该函数实现了具体的权限检测功能。
基本的权限检查是在acl_permission_check函数中完成的,整个调用过程为inode_permission->do_inode_permission->generic_permission->acl_permission_check。
该函数的逻辑也比较简单,可以看出,该函数先检查具体的用户关系,然后检查组关系,最后检查权限是否允许。
对于RWX权限控制,其代码实现还是比较简单的。当然,除了打开文件外,还有其它API也涉及到权限控制相关的内容,比如重命名、删除文件和创建目录等等。由于原理都是相似的,本文不再赘述。
以下是付费内容
修改文件的权限的常用工具
介绍了RWX权限管理的原理和内核代码实现,我们接下来看看如何对文件和目录的权限进行调整。这部分内容相对比较简单,我们只介绍一下主要内容,更详细的使用请参考man手册。
当然,为了调整资源的所属关系,我们经常需要调整文件的权限属性。经常使用命令包括chmod和chown等,这些命令就是用来修改文件的访问权限信息的。其中chmod用于修改文件权限熟悉,而chown则用于修改文件所属的用户和组。
chmod命令
例如我们想让文件b具有执行权限,那么可以执行如下命令:sudo chmod x b
执行后结果如图4所示,可以对比图中上下两部分,看到文件b的权限熟悉发生了变化。其中增加了可执行属性。
由于底层是二进制的方式存储的,chmod也是支持通过数字的方式修改其权限属性的。比如执行如下命令:sudo chmod 777 b
由于777其实就是使所有的RWX为1,也即可以被任何用户和组访问。执行效果如下。
chown命令
命令chown用于修改文件的所属用户信息,比如将属于root的文件test3改为属于itworld123,那么可以执行如下命令。sudo chown itworld123:itworld123 test3
chgrp命令
从名字上可以看出,命令chgrp用于修改文件的所属组信息。使用方法很简单,本文不再赘述。
关于RWX的权限访问控制就先介绍到这里。其实除了RWX权限控制之外,还有其它类型的权限控制,本文暂时不做介绍。后续我们在详细介绍关于Linux文件系统的其它方面的内容。文章后期可能会进行错误更正和内容更新,关注我们更方便了解内容变化。
这是一个有温度的公众号
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/138732.html原文链接:https://javaforall.cn