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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 俞敏洪是新东方_新东方创始人是谁

    俞敏洪是新东方_新东方创始人是谁一年前,不用考虑省略号后的故事,那是个不可能的假设。作为教育培训机构,新东方带有比一般企业更为浓烈的创始人气质。俞敏洪就是新东方,他的儒雅风度、人文情怀、幽默口才,卡内基式奋斗经历,都成为公司的标签。特别是另外两位同样富有个性魅力的创始人徐小平和王强离开后,俞更没有理由拒绝扮演这

  • Zotero使用记录—-2 Zotfile安装与配置「建议收藏」

    Zotero使用记录—-2 Zotfile安装与配置「建议收藏」Zotfile插件实现自动重命名

    2022年10月26日
  • APK签名机制原理详解

    APK签名机制原理详解众所周知,Android系统在安装Apk的过程中,会对Apk进行签名校验,校验通过后才能安装成功。那你知道签名校验的机制是什么?具体校验的是什么内容吗?申请第三方SDK(如微信支付)时填入的SAH1值是什么?目前众多的快速批量打包方案又是如何绕过签名检验的?我将通过一系列的文章来解开这些疑惑。

  • PHP获取客户端IP地址方式[通俗易懂]

    PHP获取客户端IP地址方式[通俗易懂]一、如果没有使用代理服务器REMOTE_ADDR=客户端IPHTTP_X_FORWARDED_FOR=没数值或不显示$ip=$_SERVER[‘REMOTE_ADDR’];二、使用透明代理REMOTE_ADDR=最后一个代理服务器IPHTTP_X_FORWARDED_FOR=客户端真实IP(经过多个代理服务器时,这个值类似:221.5.252….

    2022年10月26日
  • 百度地图开放平台开发者注册_全国矢量地图shp格式百度云

    百度地图开放平台开发者注册_全国矢量地图shp格式百度云SHA1分为发布版和开发版,便于开发者开发调试和最终上线使用。1通过Eclipse获取使用adt22以上版本,可以在Eclipse中直接查看,具体位置如下:Windows:依次在Eclipse中打开Window->Preferances->Android->Build;Mac:依次在Eclipse中打开Eclipse/ADT->Preferances->Android->Build。在弹出的对话框中SHA1f

  • laravel 预加载特定的列

    laravel 预加载特定的列

发表回复

您的电子邮箱地址不会被公开。

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