【Linux】权限管理2

简介: 【Linux】权限管理

三、Linux 权限管理


对于 Linux 的权限管理,我们主要围绕一张图进行讲解:

8888afcee08658c26461ee4a14aa5ae6.png


图里部分的内容会在下面详细讲解。


1、文件访问者的角色划分


对于 Linux 文件的访问者可以分成三类:

       文件拥有者:文件和文件目录的所有者,u —— user

       文件所属组:文件和文件目录的所有者所在组的用户,g —— group

       文件的 other:其它用户,除了拥有者和所属组之外的用户,o —— others

Linux 任何一个文件都一定有文件的 拥有者 和 other,拥有这个文件的就是拥有者,除了拥有者之外的其他用户就是 other。


   但是所属组是什么?为什么要存在所属组?


我们再次通过故事理解!


image-20221130002243221-1.png


   假如某公司只有一台机器,公司允许不同的小组来完成一项工作,组间为竞争关系。组A和组B,赢的小组的产品会被重金打造推出。


   张三被分到了a组,李四被分到了b组。a组组长叫做小a,b组小b。


   他们用的是不同的目录,公司的技术总监,创建了两个目录:A_code,b_code,存放他们的产品。a组代码放A_code,b组代码放b_code。


   张三写完了代码,组长小a要看,但是这里Linux不考虑所属组的概念,只有拥有者和other,张三是拥有者,那么小a属于other。给小a开放权限也就是给other开权限,小a可以看了,但是李四也是other就也能看到了,这里也就涉及到了权限安全问题。


所以 Linux 引入了 所属组 的概念,让拥有者为组内成员开放权限,给组里的人看,其他人还是other,其他人看不了。这样子权限安全问题就减少了。


   说到这里,我们再梳理一下 用户 和 文件访问者的关系:


用户就是 root 和 普通用户,是人。而 拥有者、所属组、other 是角色。


人可以扮演不同的角色,但是角色可以一直变化。用户可以是拥有者、所属组、other 中的任意一个,但是角色不可能称为人。



2、文件类型和访问权限


我们之前学习的第一个指令就是 ls 指令,ll 可以列出文件详细信息:


f0b37e55a7fdb465a0d7d5606d7f5157.png

那么先开始的一长串10个字符是什么意思呢?就比如:-rw-rw-r--?

这10个字符可以分为两组:第一个字符 和 后九个字符。分别对应着 文件类型 和 文件访问权限 。


a、文件类型(后缀理解 + file 指令讲解)


第一个字符为文件类型。可能大家会有些疑惑,文件类型不是由文件后缀来区别的吗?


   我们通过样例求证一下,Linux 中文件类型是否是由文件后缀来区别的:


首先,nano 一个 test.c,向其中输入代码,编译运行:

03002c5fb1be765a11944dcf1e71f4fe.png

程序可以跑过,那么我修改一下 a.out 的文件后缀呢

b12bd131b12115811ee57176589e75af.png


程序依然可以跑过,这就证明Linux上文件类型和后缀无关


但是再修改 test.c 的后缀呢,test.c 还能编译过吗?

dc77bba553af7aa8b31c762a1192ecb1.png

这里却报错了,是因为我们证明结果错误吗?其实并不是,这是因为在Linux下文件后缀不用来标识文件类型,不代表gcc这个软件不需要后缀。系统不管,但不代表操作文件的软件不关心。


那么说到这,我们可以怎么理解 Linux 中的 文件后缀 呢?


   文件后缀是给用户看的,让用户确定文件是什么类型。


   将后缀看做文件名的一部分。


   讲到这里,我们再回到正题,继续讲解文件类型。


文件类型大约被分为如下几类:


       -:普通文件,文本,可执行程序,归档文件(压缩包)等平常带后缀的文件,在Linux下统一被称为普通文件


       d:文件夹,目录


       l:软链接(类似Windows的快捷方式)


       b:块设备文件(例如磁盘、光驱等)


       p:管道文件


       c:字符设备文件(例如键盘或显示器)


       s:网络套接字socket文件


举个样例:

3562f55f457aeaea58af2384200321ff.png


file 指令:


在 Linux 中,file 指令能 辨识文件类型


语法:file [选项] 文件或目录…


常用选项:


  • -c 详细显示指令执行过程,便于排错或分析程序执行的情形。
  • -z 尝试去解读压缩文件的内容。

演示:


可执行程序:


8f10139bdf8250e39fd200e2cc140f5a.png



空文件:

e641bbe9475ef35adcbbb7d760238e4c.png



b、文件访问权限


后9个字符为 文件访问权限。9个字符,每三个一组,分别代表着 拥有者、所属组、other的权限。


       r —— 读:Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限,权值为4.


       w —— 写:Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限,权值为2.


       x —— 可执行:execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限,权值为1。


       -:表示不具有该项权限


问题回顾:


-rw-rw-r--:后九个字符就代表着,拥有者具有读、写权限,不具有执行权限;所属组具有读、写权限,不具有执行权限;other具有读权限,不具有写、执行权限。




四、文件访问权限的更改


文件访问权限的修改主要分为对 拥有者、所属组、other权限的更改对文件拥有者的更改对文件所属组的用户的更改


一般来说更改一个文件的权限,必须是文件的拥有者或者是 root 用户。


1、chmod 指令(对拥有者、所属组、other权限的更改)


功能:设置文件的访问权限


格式:chmod [参数] 权限 文件名


常用选项:


       R -> 递归修改目录文件的权限


chmod 命令设置权限的格式:


   chmod u/g/o/a ±= rwx filename


       +:向权限范围增加权限代号所表示的权限


       -:向权限范围取消权限代号所表示的权限


       =:向权限范围赋予权限代号所表示的权限


   用户符号:


       u:拥有者


       g:所属组


       o:其它用户


       a:所有用户


字符表示法表:

026fd34d7d091c3f26e8759aabb1a12e.png

演示:


对单个用户的权限进行更改:chmod 用户 ±权限 文件名


ba9c2c898861adb226460b34448fe191.png

对多个用户的权限进行修改:chmod 用户 ±权限,用户 ±权限,…(上限三个,拥有者、所属组、other) 文件名

1c4ddb9de5352fea1f363a5191a197c6.png



对全部用户进行权限修改:chmod a ± 用户权限 文件名


ecda2a5906f2e36545a072dcb5baa609.png


对用户进行 = 方式权限修改:例如 u = g,就是让 拥有者获得所属组对等的权限


253a73cad7d295c615c910a1ed37ffd3.png

  1. chmod 三位八进制 filename


通常写作 chmod 三位八进制 用户名的形式,每个八进制按顺序分别表示 拥有者、所属组、other,三个八进制组成的序列就可以表示各角色的权限。


r 权限权值为4,w 权值为2,x 权值为1。


八进制数值表示法表:

45d729c94aa4b54c0395fdfe4dd27093.png


举个例子:614


   拥有者:6 = 4 + 2 + 0,设置拥有者有读权限,有写权限,无执行权限。

   所属组:1 = 0 + 0 + 1,设置所属组无读权限,无写权限,有执行权限。

   other:4 = 0 + 4 + 0,设置other无读权限,有写权限,无执行权限。


演示:


1794608b31c23d0eb38902503d034971.png


2、chown(修改文件的拥有者)


功能:修改文件的拥有者


格式:chown [参数] 用户名 文件名


演示:


当前我的家目录有如下用户:


3d109b05892864197a6d5b0a70c20118.png


lx 用户当前文件夹:

4e11e024a5be5b2a1b5f1350e19d0094.png


如果我想要把 file.txt 的 拥有者 从 lx 改为 Guldan,能否修改成功?


10ed3f98773af430dec5b88d541cb43a.png


表示权限不被允许,我 lx 即时拥有者又是所属组,为什么不让我更改呢?


   举个例子吧,如果有一天一个人和你不认识,就要送你一辆车,你要还是不要?万一这是口黑锅呢,让你做背锅侠。如果那个人告诉你这是你买彩票中的,你才有可能接受。


对于权限来说也是一样的。但是在 Linux 上,总不可能在你给权限的时候给别人留个言,说我给你个权限吧,所以 普通用户是无法直接修改文件拥有者的!!!


但是我们可以用 root 强制把文件拥有者改掉,谁让 root 是超级管理员呢,就比如我使用 sudo 提权一下,然后强制改掉:

579921d9cd5ae012263f0321e0d6af71.png


3、 chgrp(修改文件的所属组)


功能:修改文件或目录的所属组


格式:chgrp [参数] 用户组名 文件名


常用选项:-R 递归修改文件或目录的所属组


演示:


同样的,通过 sudo 提权修改:



856f848cb1daed31c3b66eb0c1c1278e.png


补充:chownchgrp 可以同时使用,格式为:sudo chown 用户名 : 用户名 filename

比如将拥有者和所属组都改回 lx


a784d71711f749a2692d7add5b9f6102.png


4、有无权限的区别


首先,我将 file.txt 的权限全部去掉:


b3e825fe8e14cb1f8f4b70032af5c8cf.png


如果我现在读 file.txt:

d4cab9f694fd28fa8d2397c3552ba4ae.png

被权限拒绝了,再也用 echo "hello" > file.txt 写入试试:


454523ef132d42415ca0b97a560ac236.png


我当前是文件的拥有者 lx ,但是我在没有权限的情况下依然不能访问!!!

那么 root 呢?我们用 root 试试:


3b48a42f1b2232914198c7d7d22da171.png


我们发现,权限并不能约束 root因为我 root 是超级管理员,权限是约束普通人的。

总结一下:Linux 上权限是约束普通用户的,root 不会被约束!!!对于普通用户,被权限约束了什么都干不了;对于 root即使没有权限还是能畅通无阻





五、目录的权限



目录权限的功能:

       可执行权限 - x : 如果目录没有可执行权限, 则无法cd到目录中.

       可读权限 - r : 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容.

       可写权限 - w : 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件.

演示:

如果进入一个目录,只需要一种权限,就是可执行权限 x:



99f63d073a74fa7501c5b056ed55c9c8.png


如果进入一个目录,没有 w 权限,则不能在目录中创建文件:


e4545c0ef6f4bcbb5eb441a5ca026315.png

对于目录来讲,在没有r权限的目录下,无法查看当前目录下的文件名和文件属性:


eba90e7a2b3dd53ae863e4bfcffd48b0.png



六、默认权限


权限起始分为三部分:


       默认权限:也就是我们看到的文件和目录一创建就有的权限。


       起始权限:系统设定的权限


       最终权限:系统为了更好的控制文件权限,系统会有默认的 权限掩码 的概念(umask),起始文件和权限掩码进行计算后得到最终权限。


补充说明:


   普通文件起始权限:666开始,目录文件的起始权限:777。它们默认都是八进制表示的。

   Linux 上权限掩码可以用 umask 指令查看:

[lx@VM-4-3-centos mydir]$ umask
0002


我们看待权限掩码 0002 时,看后三位002,这三位是八进制序列,一个八进制位是3个二进制位,翻译成二进制序列:000 000 010。第一位暂时不用管,咱们现在用不着。


   权限掩码特性:在起始权限中,去掉在权限掩码 umask 中出现的权限,不能影响其他任何权限。意思就是说,只要在 umask 中出现的权限,在 最终权限 里就不能出现!


   那么 最终权限 是怎么计算出来的呢?


其实这时有一个计算公式的:最终权限 = 起始权限 & (~umask) (起始权限的值,按位与 取反后的权限掩码)


举个例子,比如我新建一个文件:



6a26a00e997f56d7285a321a352ee7ee.png


它的权限rw-rw-r--翻译成八进制就是 664,而翻译成二进制序列就是 110 110 100。


    起始权限:110 110 110

    权限掩码:000 000 010

    权限掩码取反:111 111 101

起始权限 & 权限掩码取反 = 110 110 110


       111 111 101 &

       -----------

       110 110 100 = 创建文件的最终权限


拓展:

我们再修改一下 umask 的值:

[lx@VM-4-3-centos lesson5]$ umask 0007


这种情况下,我们创建的文件的最终权限是什么?(自己算算看,算出来再继续看(* *))


答案揭晓:


7f3ecbd9635835f5761d45e13974fed7.png


rw-rw-r--翻译成八进制是 660,你算对了吗?




七、粘滞位


粘滞位出现的背景:在使用 Linux 的时候,未来可能会有一些共享目录,被所有的用户共享,用来保存普通用户产生的临时数据,使用户之间的安全更有保障。

在一台机器上,可能会有多个用户:


f510b2085f634c63d5095bfa0c37b515.png


而在 Linux 下,作为一个普通用户,它的家目录是只对自己开放的,从lx 用户的权限只对 拥有者 有 rwx 权限就可以看出,且 所属组 和 other 没有任何权限。

而对于 共享目录 ,一般是由 root 用户创建,由root将权限放开后,供这台机器上的用户使用,从而满足不同的用户在公共的目录下进行文件的增删查改。

我们这里直接 提权 创建一个 public 目录,并开放权限chmod 777 public:


e3bee00a26637e9b2ec22a596a86dffe.png

然后我们再做些准备工作,分别使用 rootlxGuldan 在 public 下创建若干文件:


71da9b09e2996f61edb1c7220403c2ce.png


假设本来 Guldan 和 lx 关系很好,之前总是一起互相看文件,这个行为由于在 共享目录 的前提下也都可以进行,但是他们有一天闹了矛盾,Guldan 把原先对 other 放开的 r 权限给全封掉了,导致 lx 无法查看了:

dbebee24268ee0e8bb972c71568559f0.png


这就导致 lx 看么看不了,想写些东西声讨 Guldan 又写不进去,于是 lx 想着你不让我看也不让我写,那么我就删你的目录!

571ffeb6de28d09686a9e3c5e538ed59.png


而我们就可以看出文件被所有人共享的时候,受权限约束,但是拦不住别人删我的文件!!!

为了让大家共享文件,且不让其他人随便删除别人的文件,于是就有了 粘滞位。

所以 Guldan 找到了 root 告状, root 就设置了粘滞位:

粘滞位只能给目录添加,所以 root 就使用 chmod +t public 给 public 添加了粘滞位:



cd0ae72679ffdbe20672d28763c0bfd4.png


(使用指令时为 a+t ,意思是给三个角色都 +t,但是只会把原先 other 的 x 的位置改为 t)

这就说明我们的 粘滞位 已经添加成功。

我们再试试能不能删除,假设 lx 要删 Guldan 的 Guldan2 了:


e66c6cc24f167a1edf6d2ebe063d1570.png


   听到这里,我们可能会有两个疑惑:


       其他用户没有权限为什么能删我的文件?为什么拦不住?这是权限的bug吗?


       为什么粘滞位只能给目录添加?


这两个实际上是一个问题,能否在特定目录下,创建或者删除文件由该目录的 w 权限决定。


那么既然这样,还要什么 粘滞位 ?我不是只要把 w 权限去掉 别人就不能删我的文件了吗?


请注意,这是共享目录,是多人合用的,如果把 w 权限去掉了,这也就把普通用户在该目录下创建文件的权限也去掉了!只有加上 w 权限,才能让其他用户正常地使用。


而被删的问题是由目录导致的,所以只能给目录添加 粘滞位 !!!


那么谈到这里,当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件能被谁删除呢?


       超级管理员删除


       该目录的所有者删除


       该文件的所有者删除











相关文章
|
4月前
|
算法 Linux 数据安全/隐私保护
【linux】root大王如何制约普通用户——权限管理
【linux】root大王如何制约普通用户——权限管理
|
6月前
|
Ubuntu Linux Shell
【Linux操作系统】探秘Linux奥秘:用户、组、密码及权限管理的解密与实战
【Linux操作系统】探秘Linux奥秘:用户、组、密码及权限管理的解密与实战
141 0
|
6月前
|
算法 Linux 数据安全/隐私保护
Linux权限管理:深入理解setuid、setgid、seteuid和setegid
Linux权限管理:深入理解setuid、setgid、seteuid和setegid
525 0
|
13天前
|
Linux 数据安全/隐私保护
linux权限管理
本文介绍了Linux系统中的权限管理,包括权限的概念、用户和用户组与权限的关系、文件权限位的说明以及rwx权限的具体含义。同时,详细讲解了如何使用`chmod`和`chown`命令更改文件和目录的权限,并通过多个实验演示了不同权限组合对文件和目录的实际影响。最后,总结了文件和目录权限的一些重要知识点,帮助读者更好地理解和应用Linux权限管理。
39 1
linux权限管理
|
1月前
|
Linux 数据安全/隐私保护
探索Linux操作系统下的权限管理
【8月更文挑战第66天】在数字世界中,操作系统的权限管理就如同现实世界中的钥匙和锁,保护着我们的数据安全。本文将带你深入理解Linux系统中的权限设置,通过实际代码示例,让你掌握文件和目录权限的分配与管理技巧。准备好了吗?让我们开始这场关于权限管理的探险之旅吧!
83 14
|
5月前
|
网络协议 Linux 数据安全/隐私保护
【Linux操作系统】权限管理和粘滞位
【Linux操作系统】权限管理和粘滞位
【Linux操作系统】权限管理和粘滞位
|
5月前
|
安全 Linux Shell
【Linux】权限管理
【Linux】权限管理
49 5
|
6月前
|
运维 安全 Linux
深入理解 Linux 文件系统的权限管理
【5月更文挑战第30天】 在 Linux 操作系统中,文件系统权限管理是维护系统安全与数据完整性的基石。本文旨在深入探讨 Linux 权限模型的核心概念、实现机制及其对系统安全性的影响。通过对用户身份、文件权限和访问控制列表(ACL)等关键元素的剖析,揭示权限管理在实际操作中的应用细节。文章还将讨论如何有效配置权限来优化系统性能和提升安全性,以及解决常见的权限问题的策略。
|
6月前
|
Linux PHP 数据安全/隐私保护
深入理解PHP7的返回值类型声明深入理解 Linux 文件系统的权限管理
【5月更文挑战第30天】在PHP7中,引入了返回值类型声明的特性。这一特性使得开发者可以在函数定义时指定函数应返回的值的类型。本文将详细解析返回值类型声明的用法,以及它在实际开发中的应用,帮助读者更好地理解和使用这一特性。
|
6月前
|
安全 Linux 数据安全/隐私保护
深入理解Linux文件系统的权限管理
【5月更文挑战第24天】 在Linux操作系统中,文件系统权限管理是维护系统安全和用户数据隔离的关键机制。本文将深入探讨Linux文件系统中的权限模型,包括用户、组和其他类别的读、写、执行权限。我们将分析权限位的具体含义,如何通过命令行工具修改权限,以及权限掩码(umask)的作用。此外,我们还将讨论文件系统权限在实际应用中的常见问题及其解决方案,帮助读者构建更为安全且高效的Linux工作环境。