linux超级用户权限 rwx_Linux的RWX权限管理实现详解及chmod使用

linux超级用户权限 rwx_Linux的RWX权限管理实现详解及chmod使用前文我们对Linux操作系统的权限管理进行了简要的介绍。今天我们就详细介绍一下关于RWX权限管理的更多细节。很多同学对RWX权限都有一些了解,但是要说出子丑来恐怕就不那么容易了。Linux的RWX权限控制又称为DAC(DiscretionaryAccessControl,自主访问控制)。DAC机制就是指对象的拥有者可以任意修改或授予此对象相应的权限。从主体和客体的角度来说,就是主体对其拥有的…

大家好,又见面了,我是你们的朋友全栈君。

前文我们对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的一个实例。

177166354_1_20191203084602878

图1 RWX权限示例

RWX的组成及含义如图2所示。整个权限描述分为4段,第一段用于描述该文件的类型,可以是常规文件(-)、目录(d)、块设备(b)、链接(l)和字符设备(c)等等。

177166354_2_2019120308460334

图2 RWX权限属性含义

后面三段是文件具体的权限描述信息了,分别是文件主权限、组用户权限和其它用户(UGO)的权限。通过上述三段的组合就可以实现比较复杂的权限控制。比如允许某个用户的文件可以被其它用户读,但是不可以改写和执行等等。

上述权限控制信息中包含rwx-四种字符,具体含义如下:r表示对于该用户可读,对于文件来说是允许读取内容,对于目录来说是允许读取其中的文件;

w表示对于该用户可写,对于文件来说是允许修改其内容,对于目录来说可以写信息到目录中,即可以创建、删除文件、移动文件等操作。

x表示对于该用户可执行,对于文件来说就是可以执行该文件,对于目录来说则是可以进入目录;可以搜索(能用该目录名称作为路径名去访问它所包含的文件和子目录)

从用户角度来说文件的权限是通过rwx字符串表示的,其实在底层实现就是一些标示位。如果该位置1则表示有该权限,否则没有该权限。这些信息保持在文件的inode信息中。

图3中的宏定义就是Linux内核中对文件权限属性的宏定义,例如S_IRUSR表示主权限可读的标示。这里需要理解的是每个标示占用一个位,本文暂时不过多介绍,这里先有个概念就可以了。

177166354_3_20191203084603128

图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用户创建文件时,得到文件的属性如下所示。

177166354_4_20191203084603331

该小程序的代码如下,请作为参考。

177166354_5_20191203084603378

当我们在zhangsn用户下,通过该程序访问test_root的时候,open函数会返回13的错误码。该错误的含义是拒绝访问。因为test_root是属于root用户的文件,只能被该用户访问,因此会返回拒绝访问的错误。

内核代码解释

对于操作系统的API来说,打开文件的整个流程如图所示。最终do_last函数会调用到一个名为may_open的函数,而该函数则调用inode_permission函数。该函数实现了具体的权限检测功能。

177166354_6_20191203084603503

基本的权限检查是在acl_permission_check函数中完成的,整个调用过程为inode_permission->do_inode_permission->generic_permission->acl_permission_check。

该函数的逻辑也比较简单,可以看出,该函数先检查具体的用户关系,然后检查组关系,最后检查权限是否允许。

177166354_7_20191203084603566

对于RWX权限控制,其代码实现还是比较简单的。当然,除了打开文件外,还有其它API也涉及到权限控制相关的内容,比如重命名、删除文件和创建目录等等。由于原理都是相似的,本文不再赘述。

以下是付费内容

修改文件的权限的常用工具

介绍了RWX权限管理的原理和内核代码实现,我们接下来看看如何对文件和目录的权限进行调整。这部分内容相对比较简单,我们只介绍一下主要内容,更详细的使用请参考man手册。

当然,为了调整资源的所属关系,我们经常需要调整文件的权限属性。经常使用命令包括chmod和chown等,这些命令就是用来修改文件的访问权限信息的。其中chmod用于修改文件权限熟悉,而chown则用于修改文件所属的用户和组。

chmod命令

例如我们想让文件b具有执行权限,那么可以执行如下命令:sudo chmod x b

执行后结果如图4所示,可以对比图中上下两部分,看到文件b的权限熟悉发生了变化。其中增加了可执行属性。

177166354_8_20191203084603691

由于底层是二进制的方式存储的,chmod也是支持通过数字的方式修改其权限属性的。比如执行如下命令:sudo chmod 777 b

由于777其实就是使所有的RWX为1,也即可以被任何用户和组访问。执行效果如下。

177166354_9_20191203084603769

chown命令

命令chown用于修改文件的所属用户信息,比如将属于root的文件test3改为属于itworld123,那么可以执行如下命令。sudo chown itworld123:itworld123 test3

chgrp命令

从名字上可以看出,命令chgrp用于修改文件的所属组信息。使用方法很简单,本文不再赘述。

关于RWX的权限访问控制就先介绍到这里。其实除了RWX权限控制之外,还有其它类型的权限控制,本文暂时不做介绍。后续我们在详细介绍关于Linux文件系统的其它方面的内容。文章后期可能会进行错误更正和内容更新,关注我们更方便了解内容变化。177166354_10_20191203084603831这是一个有温度的公众号177166354_12_20191203084603941

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/138732.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 什么是静态代理和动态代理,两者的区别(笔记)「建议收藏」

    什么是静态代理和动态代理,两者的区别(笔记)「建议收藏」文章目录1.什么是代理?2.静态代理3.动态代理4.总结:1.什么是代理?​ 代理:就是让代理角色帮助真实角色完成一件事情;​ 举例:过年回家让朋友代买火车票,朋友帮你买火车票的过程就是代理2.静态代理​ 什么是静态代理:静态代理相当于是多写了一个代理类,在调用的时候调用的是代理类,在代理类中的处理还是原生的处理逻辑,不过在前后添加上需要添加的代码。缺点:需要为每一个被代理的对象都创建一个代理类。​ 特点:​ 代理角色和真实角色都需要实现同一个接口,​ 真实角色专注于自己的.

    2022年10月19日
    0
  • Python检测代码覆盖率工具之coverage

    Python检测代码覆盖率工具之coverage

    2021年5月24日
    150
  • SecureCRT背景配色

    SecureCRT背景配色SecureCRT背景配色

    2022年4月24日
    52
  • 用百度ocr+微信截图实现文字识别

    用百度ocr+微信截图实现文字识别作用:将图片中的文字识别出来一、调用微信截图dll控件将微信截图插件复制到项目文件,使用ctypes加载(胶水语言就是给力)defcapture():try:dll=ctypes.cdll.LoadLibrary(‘PrScrn.dll’)exceptException:print(“Dllloaderror!”)…

    2022年6月3日
    79
  • 解决verycd上不能下载资源的问题

    解决verycd上不能下载资源的问题以下内容为转载:当时在verycd上搜索资料,但是下载不了,忽然看到这一篇文章,试了以下,果然可以下载。顺便记下以便后续使用。唉,我真的挺喜欢verycd的,好多好好的资源哟,尤其是杂志啊、设计素材

    2022年7月2日
    19
  • vue 深入响应式原理 注意事项

    vue 深入响应式原理 注意事项对vue.js的响应式的原理的理解,有助于更加灵活的使用vue,和避开一些坑所以了解其运行原理十分重要

    2022年5月9日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号