Linux 文件权限

概述

Linux 系统的一大特色便在于其可以提供多用户多任务环境。鉴于各用户往往存在数据隐私保护需求,Linux 系统便提供了一套文件权限管理机制。本文介绍与文件权限管理相关的若干机制,具体包括 rwx 权限、隐藏权限、特殊权限、ACL。

rwx 权限

借助于命令 ls -l,我们可以查看当前目录下各文件的权限设置。举例而言:

1
2
-rwxrwxr-x            1               hhd    hhd    4096  2月 20 20:58   bin
权限设置 链接至此inode的文件名数量 拥有者 所在群组 容量 最近修改时间 文件名

对于第一栏信息,进一步可解析如下:

1
2
   -               rwx                    rwx                 r-x
文件属性 文件拥有者所具有的权限 文件所在群组所具有的权限 其他人所具有的权限

对此我们做如下解释:

  • 对于某个文件访问者而言,其身份可能为 owner/group/other,这是 Linux 系统对用户身份的一种简单分类。类比于社会而言,owner 等价于自身,group 等价于家庭,other 等价于家庭以外的事物。
  • 针对某种用户身份而言,一个文件可能具有的权限设置为 r、w、x。
  • 对于一般文件而言,r 指代是否可读取其中内容,w 指代是否可向其中写入内容,x 指代是否可执行此文件。
  • 因为目录文件内部存放目录内各文件或文件夹名与其 inode 对应编号信息,因此对于目录文件而言,r 指代是否可查看目录内容,w 指代是否可向其中增删文件或目录,x 指代是否可进入此目录。

据此,我们可知:对于文件 bin 而言,其拥有者具有 rwx 权限,其所在群组成员具有 rwx 权限,其他人仅具有 rx 权限。

接下来,我们说明若干指令以修改各文件的属性或权限设置。

  • chown

    该指令用于设置文件拥有者和所在群组信息,具体用法为 chown owner:group fileName

  • chgrp

    该指令用于设置文件所在群组信息,具体用法为 chgrp group fileName

  • chmod

    该指令用于设置文件权限信息,其具体可细分为两种写法:其一,数字类型表示 rwx 权限,1 表示 x,2 表示 w,4 表示 r,那么 7 即表示 rwx。例如,chmod 743 fileName,即表示所设权限为 rwxr---wx,其中 xxx 为三个数字;其二,符号类型表示 rwx 权限,它直接借助于 r/w/x 以设置文件权限。例如,chmod u=rw,go=r fileName,即表示所设权限为 rw-r--r--

实践发现,似乎仅 root 用户可设置文件拥有者和所在群组属性,似乎仅文件拥有者和 root 用户可设置文件权限。

在这部分最后,我们再谈一个问题:创建一个文件后,使用命令 ls -l 查看,会发现其具有默认权限,该默认权限由何决定?

指令 umask 可用于查看或设置新建文件的权限,因此该默认权限由此命令指定。 umask 用于查看默认权限,而 umask xxxx 用于设置默认权限 (第一个数字表示特殊权限的设置,下文有具体解释)。

隐藏权限

除最基本的 rwx 权限之外,在 Linux 系统的 ext2/3/4 文件系统之下,还可设置其他隐藏权限。

指令 lsattr 用于列举各文件所具有的隐藏权限,指令 chattr 用于设置各文件的隐藏权限。

在这些隐藏权限之中,我们重点关注两项:

  • chattr +i fileName,经此设置之后,该文件不能被删除、改名、设置链接、写入数据。
  • chattr +a fileName,经此设置之后,只能向该文件中写入数据,而不能修改或删除其中数据。

特殊权限

在 Linux 系统中,存在三种特殊权限:SUIDSGIDSBIT,我们依次介绍之。

  • SUID

    该权限出现于文件拥有者的 x 权限之上,它具有如下使用限制和功能:

    1. 该权限仅对于二进制程序有效。
    2. 使用者对于该程序需具有 x 执行权限。
    3. 程序执行过程中,使用者暂时具有程序拥有者的所有权限。

    换言之,如果使用者有权执行某程序,且此程序具有 SUID 权限,则程序执行时是以程序拥有者的身份执行的。

    典型例子:ls -l /usr/bin/passwd

  • SGID

    该权限出现于文件所在群组的 x 权限之上,它具有如下使用限制和功能:

    1. 该权限仅对二进制程序和目录有效。
    2. 如果该权限作用于二进制程序,且使用者对于该程序具有 x 执行权限,则程序执行过程中,使用者暂时具有该程序所在群组的群组身份。
    3. 如果该权限作用于目录,且使用者对于该目录具有 wx 权限,则使用者在此目录下的有效群组暂时变更为该程序所在群组。

    典型例子:ls -l /usr/bin/locate

  • SBIT

    该权限出现于其他人的 x 权限之上,它具有如下使用限制和功能:

    1. 该权限仅对目录有效。
    2. 如果使用者对于该目录具有 wx 权限,则使用者在此目录下创建的文件,只能由使用者自己或 root 删除,即该目录下某文件的删除权利仅限于文件拥有者和 root 用户。

如果某文件拥有 SUID 权限,则表明此文件拥有者同时具有 x 权限,同理可得 SGIDSBIT

有效群组的相关介绍详见 Linux 账号管理

既然指令 chmod 用于设置文件权限,我们看看这个命令如何设置特殊权限。

与普通 rwx 权限类似,同样存在两种设置特殊权限的写法:其一,数字类型表示特殊权限,4 表示 SUID,2 表示 SGID,1 表示 SBIT,此时设置命令可表示为:chmod 7xxx fileName;其二,符号类型表示特殊权限,此时设置命令可表示为:chmod ug+s,o+t fileName

ACL

将使用者简单划分为 owner/group/other 三类,并在此基础上设置权限,该种权限管理机制终究是粗粒度的。要使用更加细粒度的权限管理,就需要引入额外机制。

ACL 全称为 Access Control List,它可以提供 Linux 系统传统权限机制之外的细部权限设置。另外,现有 Linux 系统也已默认支持 ACL。

ACL 可以达到如下程度的细粒度控制:

  • 对于某文件或目录而言,可设置特定用户的特定权限。
  • 对于某文件或目录而言,可设置特定群组的特定权限。
  • 对于某文件或目录而言,可设置该文件或目录上所能设置的最大权限 mask,即在该文件或目录下设置的各用户或群组的实际权限为其设置权限和 mask 相与的结果。
  • 对于某目录而言,可设置该目录下新建文件或目录的默认 ACL 权限。

命令 getfaclsetfacl 可用于查看或设置某文件或目录的 ACL 权限信息。

如果某文件或目录设置了 ACL 权限信息,则使用命令 ls -l 时,可以看到权限设置后部会多出 +,例如 -rwxrw-r--+