Linux权限

1 Linux 权限介绍

Linux 是多用户的操作系统,允许多个用户同时登录和工作,Linux 权限是操作系统用来限制不同用户对资源的访问机制。这里暂且将 Linux 中的权限分为三类:

  • 基本权限:给文件和目录的所属者(u)、所属组(g)、其他用户(o) 分配的 读®、写(w)、执行(x) 权限
  • ACL权限:ACL 权限可以针对单一用户或用户组设定权限,是基本权限之外更细化的权限设定,弥补了基本权限设定不能满足的一些场景
  • 特殊权限:除了读写执行权限(rwx) 的另一种 特殊权限(s/t, SUID/SGID/SBIT)

2 基本权限

使用 ls 命令时,长格式显示的第一列就是文件的权限,例如

lrwxrwxrwx.   1 root root    7 322 14:22 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 322 14:30 boot
drwxr-xr-x.   4 root root   33 323 11:36 data
drwxr-xr-x.  20 root root 3240 322 17:52 dev
drwxr-xr-x.  87 root root 8192 323 11:42 etc
drwxr-xr-x.   6 root root   52 323 05:49 home
lrwxrwxrwx.   1 root root    7 322 14:22 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 322 14:22 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6 411 2018 media
drwxr-xr-x.   2 root root    6 411 2018 mnt
drwxr-xr-x.   2 root root    6 411 2018 opt
dr-xr-xr-x. 152 root root    0 322 17:52 proc

第一列的权限位 -rw-r–r–.,则共11位,这11位权限位的含义如下图所示:
在这里插入图片描述
在这里插入图片描述

  • 第1位:代表文件类型。Linux不像Windows使用扩展名表示文件类型,而是使用权限位的第一位表示文件类型。虽然Linux文件的种类不像Windows中那么多,但是分类也不少,详细情况可以使用“info ls” 命令查看。这里列出一些常见的文件类型

    • -: 普通文件
    • d: 目录文件。Linux中一切皆文件,所以目录也是文件的一种
    • l: 软链接文件
    • b: 块设备文件。这是一种特殊设备文件,存储设备都是这种文件,如分区文件/dev/sda1就是这种文件
    • c: 字符设备文件。这也是特殊设备文件,输入设备一般都是这种文件,如鼠标、键盘等
    • p: 管道符文件。这是一种非常少见的特殊设备文件。
    • s: 套接字文件。这也是一种特殊设备文件,一些服务支持socket访问就会产生这样的文件
  • 第2~4位:代表文件所属者的权限

    • r: 代表read,是读取权限
    • w: 代表write,是写权限
    • x: 代表execute,是执行权限
  • 第5~7位: 代表文件所属组的权限,同样拥 有 “rwx” 权限
    第8~10位:代表文件其他人的权限,同样拥有 “rwx” 权限

  • 第11位

    • . :如果是个点代表受 SELinux 安全上下文保护,这里忽略暂不做详细介绍
    • +:如果是个加号表示设置了ACL权限,下文再做详细介绍

2.2 权限含义解释

读、写、执行权限对文件和目录的含义是不同

  • 权限对文件的作用

    • 读®:对文件有读权限,代表可以读取文件中的数据。如果把权限对应到命令上,那么一旦对文件有读权限,就可以对文件执行 cat、more、less、head、tail 等文件查看命令
    • 写(w):对文件有写权限,代表可以修改文件中的数据。如果把权限对应到命令上,那么一旦对文件有写权限,就可以对文件执行 vim、echo 等修改文件数据的命令。注意:对文件有写权限,是不能删除文件本身的,只能修改文件中的数据,如果想要删除文件,则需要对文件的上级目录拥有写权限。
    • 执行(x):对文件有执行权限,代表文件可以运行。在Linux中,只要文件有执行权限,这个文件就是执行文件了,只是这个文件到底能不能正确执行,不仅需要看执行权限,还要看文件的代码是不是正确的语言代码。
  • 权限对目录的作用

    • 读®:对目录有读权限,代表可以查看目录下的内容,也就是可以查看目录下有哪些文件和子目录。如果包权限对应到命令上,那么一旦对目录拥有了读权限,就可以在目录下执行 ls 命令查看目录下的内容了
    • 写(w):对目录有写权限,代表可以修改目录下的数据,也就是可以在目录中新建、删除、复制、剪贴子文件或子目录。如果把权限对应到命令上,那么一旦对目录拥有了写权限,就可以在目录下执行 touch、rm、cp、mv 等命令
    • 执行(x):目录是不能运行的,那么对目录拥有执行权限,代表可以进入目录。如果把权限对应到命令上,那么一旦对目录拥有了执行权限,就可以对目录执行 cd 命令进入目录

2.3 权限设定

2.3.1 chmod 命令
chmod 命令用来修改文件或目录的权限。

命令格式:chmod [选项] 权限模式 文件或目录

  • 选项:

    • -R:递归设置权限,也就是给予目录中的所有文件和子目录设定权限
    • –reference=参考文件或目录:使用参考文件或参考目录的权限来设置目标文件或目录的权限
  • 权限模式:权限模式分为符号组合和八进制数组合

  • 符号组合的格式是[ugoa][[±=][permission]],也就是[用户身份][[赋予方式][权限]]的格式。

    • 用户身份

      • u:代表所有者(user)
      • g:代表所属组(group)
      • o:代表其他人(other)
      • a:代表全部身份(all)
    • 赋予方式

      • +:加入权限
      • -:减去权限
      • =:设置权限
    • 权限

      • r: 读取权限(read)
      • w: 写权限(write)
      • x: 执行权限(execute)
  • 八进制数组合的格式是 [0-7][0-7][0-7] 三位数字组成(每一位数字都是权限之和),第一位是所属者权限之和,第二位是所属组权限之和,第三位其他人权限之和

    • r 读取权限对应的数字是 4
    • w 写权限对应的数字是 2
    • x 执行权限对应的数字是 1
    • 例如读写权限 rw 八进制数表示 6

2.3.2 chown 命令
chown 命令用来修改文件和目录的所有者和所属组。

命令格式:chown [选项] 所有者[:所属组] 文件或目录

  • 选项:

    • -R:递归修改目录下所有的文件及子目录的所属者和所属组
    • –reference=参考文件或目录:使用参考文件或参考目录的所属者和所属组来设置目标文件或目录的所属者和所属组
    • 所有者[:所属组]:当省略 “:所属组”,仅改变文件所属者
      注意**:普通用户不能修改文件的所属者和所属组,哪怕自己是这个文件的所属者也不行。普通用户可以修改所属者是自己的文件权限**

2.3.3 chgrp 命令
chown 命令只能用来修改文件和目录的所属组,其实完全可以由 chown 命令来替代。

命令格式:chgrp 用户组 文件或目录

选项:

    • -R:递归修改目录下所有的文件及子目录的所属组
    • –reference=参考文件或目录:使用参考文件或参考目录的所属组来设置目标文件或目录的所属组

2.4 默认权限与 umask

2.4.1 权限掩码:umask
当创建一个新的文件和目录是都默认会有一些权限,新建的文件权限一般是 “-rw-r–r–”,新建的目录权限一般是 “drwxr-xr-x”。这些新建文件或目录的默认权限是由权限掩码 umask来决定的。在讲解 umask 之前,需要先了解一下文件和目录的默认最大权限

  • 文件默认最大权限: 对于文件来讲,新建文件的默认最大权限是 666 (即 -rw-rw-rw-),没有执行权限,只是因为执行权限对文件来讲比较危险,不能再新建文件的时候默认赋予,而必须通过用户手工赋予
  • 目录默认最大权限:对于目录来讲,新建目录的默认最大权限是777 (即 drwxrwxrwx),这是因为对目录而言,执行权限仅仅代表进入目录,所以即使新建目录时直接默认赋予也没有什么危险

2.4.2 默认权限计算方式

按照官方的标准算法,umask 默认权限需要使用二进制进行逻辑与和逻辑非联合运算才可以得到正确的新建文件和目录的默认权限,这种方法既不好计算也不好理解,不推荐。我们这里按照权限字母相减的方式来说明默认权限的计算方式,以权限掩码值等于 “022” 为例:

  • 新建文件: 文件的默认最大权限是 -rw-rw-rw- ,通过计算 (-rw-rw-rw-) - (-----w–w-) = (-rw-r–r–),则新建文件默认权限是 -rw-r–r–,即 644
  • 新建目录: 目录的默认最大权限是 drwxrwxrwx ,通过计算 (drwxrwxrwx) - (d----w–w-) = (drwxr-xr-x),则新建目录默认权限是 drwxr-xr-x,即 655
    注意:
    计算新建文件的默认权限时,网上有些教程直接使用使用权限数字相减得到默认权限,这样其实是不对的。例如 umask 值为 003(即 --------wx),权限数字相减 666 - 003 = 663,得到的默认权限是 663(即-rw-rw–wx), 显然不对,因为通过权限掩码可以看出默认权限里 other 是不应该包含wx权限的。正确的计算结果是 (-rw-rw-rw-) - (--------wx) = (-rw-rw-r–),即 664。造成这个错误的根本原因是文件的默认最大权限是 666,所有二进制位并没有满 1,而目录的默认最大权限是 777,所有二进制位都满 1了,所以新建目录的默认权限计算是可以使用权限数字相减的,而新建文件的默认权限计算不能使用权限数字相减的

2.4.3 修改权限掩码:umask 命令
umask 命令是用来显示或设置创建文件或目录的权限掩码的。

命令格式:umask [选项] [权限模式]

选项:

  • -S:以符号组合的方式输出权限掩码,不使用该选项时以八进制数的形式输出
  • 权限模式:与上面 chmod 命令的权限模式相同
    使用 umask 命令设置的权限掩码只是临时有效,如果需要永久有效,需要修改 /etc/bashrc 文件里的内容,但是不建议修改

3 ACL 权限

3.1 ACL 权限介绍
假如有这样一种场景,有一个这样一个文件,权限是 “rwx-r----”,所属者是 user1,所属组组 gruop1。现在需要对另一个用户 user2 单独设置该文件的写(w) 权限,能够想到的方法是 把其他用户(other) 的权限赋予写权限,但是这样除了 user2 之外的其他用户都能对该文件进行写操作了,显然不合适;如果把 user2 加入到用户组 group1,并设置 group1 对该文件有写权限,同样也不合适,因为这样 group1 内的用户对该文件都有了写权限;如果把所有者改为 user2 显然更不合适,这样该文件原有的所属者 user1 就对该文件没有了操作权限。

上面那种场景,只通过 所属者(u)、所属组(g)、其他用户(o) 配合 读®、写(w)、执行(x)权限 是无法满足的。这时就需要设定 ACL 权限来实现。ACL 是 Access Control List 的缩写,主要的目的是在提供传统的 owner、group、others 的 read、write、execute 权限之外的细部权限设定,ACL 可以针对单一使用者,单一文件或目录来进行 r、w、x 的权限规范。

ACL 主要是针对三个方面来控制权限的:

  • 用户(user):针对用户为对象来设定权限。用户不一定是所属者,可以是任意用户
  • 用户组(group):针对用户组为对象来设定权限。用户组不一定是所属组,可以是任意用户组
  • 有效权限(mask):针对目录下新建文件或子目录时,规范新数据的有效权限

3.2 ACL 权限设定
3.2.1 检查 ACL 是否开启
事实上,原本 ACL 是 unix-like 操作系统的额外支持项目,但因为近年以来 Linux 系统对权限细部设定的热切需求,因此目前 ACL 几乎已经预设加入在所有常见的 Linux 文件系统(ext2/ext3/ext4/xfs 等)的挂载参数中!所以你无须进行任何动作,ACL 就可以被使用了!不过,如果你不放心文件系统是否真的支持 ACL 的话,那么就检查一下磁盘分区信息,以确保开启了 ACL。

# 1. 查看当前系统有哪些分区。其中"/dev/mapper/VolGroup-lv_root"是逻辑卷分区,"/dev/sda1"是传统分区
[root@localhost ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                       18G  3.7G   13G  23% /
tmpfs                 490M     0  490M   0% /dev/shm
/dev/sda1             477M   35M  417M   8% /boot
# 2. 查看指定分区文件信息。如果输出包含"acl"字眼则代表该分区已经开启了 ACL
[root@localhost ~]# dumpe2fs -h /dev/mapper/VolGroup-lv_root | grep -i acl
dumpe2fs 1.41.12 (17-May-2010)
Default mount options:    user_xattr acl
[root@localhost ~]# dumpe2fs -h /dev/sda1 | grep -i acl
dumpe2fs 1.41.12 (17-May-2010)
Default mount options:    user_xattr acl
[root@localhost ~]# 

2. 开启 ACL
如果上面的查看信息中分区没有开启 ACL的话,你也可以通过下面两种方式来开启 ACL

  • 执行命令重新挂载并加入ACL权限,如 “mount -o remount,acl /”。这种方式只能临时生效,系统重启又会恢复
  • 修改配置文件 “vim /etc/fstab”,找到对应分区那一行,在 “defaults” 后面追加 “acl”,如下图。然后重启系统或者重新挂载 “mount -o remount /” 使修改生效

3.2.2 命令:setfacl、getfacl
setfacl 命令用来设定 acl 权限,命令格式:setfacl 选项 文件或目录

  • 选项

    • -m [u|g|m]:[用户名|组名]:权限:设定 acl 权限。也可以设置 acl 的有效权限(不用指定用户或用户组)
    • -x [u|g]:[用户名|组名] :删除指定的 acl 权限。与 -m 选项是相对的
    • -b:删除全部 acl 权限
    • -R:递归设定 acl 权限,指目录下现有的所有文件和子目录也设定相同的 acl 权限
    • -d:设定默认 acl 权限,指目录下后续新建的文件和子目录拥有的默认 acl 权限
    • -k:删除默认 acl 权限
      getfacl 用来查看 acl 权限,命令格式:getfacl 文件或目录

4 特殊权限:SUID、SGID、SBIT

4.1 SetUID

当 s 权限标志出现在文件所属者的 x 权限位时,如 “/usr/bin/passwd” 的权限状态 “-rwsr-xr-x”,则代表该文件被设置了 SetUID 权限,简称 SUID。如果文件被设置了 SUID 所起到的作用是任何用户去执行该文件时,用户的身份会被切换为该文件所属者的身份去执行而不是以该用户自己的身份去执行。

以还是 “/usr/bin/passwd” 命令为例,使用 passwd 命令修改密码时,实际上修改的是 “/etc/shadow” 文件,而该文件的权限是 “----------”,所属者和所属组都是 root,也就是说只有 root 用户才可以强制修改 “/etc/shadow” 文件。但是实际使用中普通用户也是可以修改自己的密码的,即也能修改 “/etc/shadow” 文件,这是因为 “/usr/bin/passwd” 被设置了 SUID,普通用户执行 passwd 命令的过程中实际上是以 root 身份去执行的。

SUID 的限制与功能:

  • 只有可执行的二进制程序文件才能设置 SUID 权限
  • 命令执行者包括所属者要对该二进制程序拥有执行(x)权限
  • 命令执行者在执行二进制程序时获得该程序文件的所属者身份
  • SUID 权限只在二进制程序执行过程中有效,即身份的改变只发生在程序的执行过程中

设置 SUID 权限

  • 命令格式:chmod u+s 可执行二进制程序文件 或 chmod 4(0-7)(0-7)(0-7) 可执行二进制程序文件
  • 设置的 SUID 权限即 s 权限标志占用所属者原本的 x 权限位。如果显示的是大 S,说明是在所属者没有执行权限的情况下设置的 SUID,这时设置的 SUID 权限是无效的,需要把所属者的执行权限加上才能有效,即变为小 s
  • 权限标志 s 对应的数值是 4

一般不要轻易设置 SUID 权限,因为该动作很危险,试想一下,如果给 “/usr/bin/vim” 设置 SUID 权限,那么任何用户都能使用 “vim” 命令修改任何文件了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值