第 3 章 Linux 文件权限

作者: Brinnatt 分类: ARM64 Linux 基础精修 发布时间: 2022-01-20 15:01

Linux 是一个多用户的操作系统,对使用者来说,一切皆文件,为了让每个用户都可以安全地使用 Linux 操作系统,正确地设置文件、目录的权限非常重要。

3.1、文件和目录的权限

3.1.1、文件的权限

每个文件都有其所有者(u:user)、所属组(g:group)和其他人(o:other)对它的操作权限,a:all 则同时代表这 3 者。权限包括读(r:read)、写(w:write)、执行(x:execute)。在不同类型的文件上读、写、执行权限的体现有所不同,所以目录权限和普通文件权限要区分开来。

在普通文件上

  • r:可读,可以使用类似 cat 等命令查看文件内容;读是文件的最基本权限,没有读权限,普通文件的一切操作行为都被限制;
  • w:可写,可以编辑此文件,类似 vim、nano、emacs 这样的编辑器编辑;
  • x:可执行,表示文件可由特定的解释器解释并运行。可以理解为 windows 中的可执行程序或批处理脚本,双击就能运行起来的文件。

在目录上

  • r:可以对目录执行 ls 以列出目录内的所有文件;读是文件的最基本权限,没有读权限,目录的一切操作行为都被限制。
  • w:可以在此目录创建或删除文件/子目录;
  • x:可进入此目录,可使用 ls -l 查看文件的详细信息。可以理解为windows中双击就进入目录的动作。

如果目录没有 x 权限,其他人将无法查看目录内文件属性,所以一般目录都要有 x 权限。而如果只有执行却没有读权限,则权限拒绝。

一般来说,普通文件的默认权限是 644(没有执行权限),目录的默认权限是 755(必须有执行权限,否则进不去),链接文件的权限是 777。当然,默认文件的权限设置方法是可以通过 umask 值来改变的。

3.1.2、权限的表示方式

权限的模式有两种体现:数字体现方式和字符体现方式。

权限的数字表示:"-" 代表没有权限,用 0 表示。

r -------- 4

w -------- 2

x -------- 1

举例:rwx rw- r-- 对应的数字权限是764,732代表的权限数值表示为 rwx -wx -w-

3.1.3、chmod 命令

此命令可以修改文件权限,能够修改权限的人只有文件所有者和超级管理员

chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... num_mode FILE...
chmod [OPTION]... --reference=RFILE FILE...

选项说明:
--reference=RFILE:引用某文件的权限作为权限值
-R:递归修改,只对当前已存在的文件有效
  1. 使用数值方式修改权限

    [root@arm64v8 ~]# chmod 755 iptables 
    [root@arm64v8 ~]# ll iptables 
    -rwxr-xr-x 1 root root 812 May 29 10:00 iptables
    [root@arm64v8 ~]#
  2. 使用字符方式修改权限

    由于权限属性附在文件所有者、所属组和其它上,它们三者都有独立的权限位,所有者使用字母 "u" 表示,所属组使用 "g" 来表示,其他使用 "o" 来表示,而字母 "a" 同时表示它们三者。所以使用字符方式修改权限时,需要指定操作谁的权限。

    # "+"是加上权限,"-"是减去权限,"="是直接设置权限
    chmod [ugoa][+ - =] [权限字符] 文件/目录名
    
    [root@arm64v8 ~]# chmod a-rwx iptables # 去掉文件权限
    [root@arm64v8 ~]# ll iptables 
    ---------- 1 root root 812 May 29 10:00 iptables
    [root@arm64v8 ~]# chmod u+rwx,g+rw,o+r iptables # 指定属主可读可写可执行,组可读可写,其它可读
    [root@arm64v8 ~]# ll iptables 
    -rwxrw-r-- 1 root root 812 May 29 10:00 iptables
    [root@arm64v8 ~]#

3.1.4、chgrp 命令

更改文件和目录的所属组,要求组已经存在。

chgrp [OPTION]... GROUP FILE...
chgrp [OPTION]... --reference=RFILE FILE..

选项说明:
-R:递归修改
--reference=dest_file  file_list:引用某文件的group作为文件列表的组,即将file文件列表的组改为dest_file的组

注意:对于链接文件而言,修改组的作用对象是链接的源文件,而非链接文件本身。

3.1.5、chown 命令

chown 可以修改文件所有者和所属组。

chown [OPTION]... [OWNER][:[GROUP]] FILE...
chown [OPTION]... [OWNER][.[GROUP]] FILE...
chown [OPTION]... --reference=RFILE FILE...

选项说明:
--from=CURRENT_OWNER:CURRENT_GROUP:只修改当前所有者或所属组为此处指定的值的文件
--reference=RFILE:引用某文件的所有者和所属组的值作为新的所有者和所属组
-R:递归修改。注意,当指定-R时,且同时指定下面某一个选项时对链接文件有不同的行为
    -H:如果chown的文件参数是一个链接到目录的链接文件,则穿过此链接文件修改其源目录的所有者和所属组
    -L:目录中遇到的所有链接文件都穿越过去,修改它们的源文件的所有者和所属组
    -P:不进行任何穿越,只修改链接文件本身的所有者和所属组。(这是默认值)
    这 3 项若同时指定多项时,则最后一项生效

注意:对于链接文件而言,默认直接修改源文件,而非修改链接文件本身。

chown指定所有者和所属组的方式有两种,使用冒号和点

[root@arm64v8 ~]# ll iptables 
-rwxrw-r-- 1 root root 812 May 29 10:00 iptables
[root@arm64v8 ~]# 
[root@arm64v8 ~]# chown hadoop.hadoop iptables 
[root@arm64v8 ~]# ll iptables 
-rwxrw-r-- 1 hadoop hadoop 812 May 29 10:00 iptables
[root@arm64v8 ~]# chown .root iptables 
[root@arm64v8 ~]# ll iptables 
-rwxrw-r-- 1 hadoop root 812 May 29 10:00 iptables
[root@arm64v8 ~]#

3.2、权限机制

权限的元数据放在 inode 中,严格地说是放在 inode table 中,因为每个块组的所有 inode 组成一个 inode table。

在 inode table 中使用一列来存放数字型的权限,比如某文件的权限为 644。

每次用户要对文件进行操作时系统都会先查看权限,确认该用户是否有对应的权限来执行操作。

inode table 一般都已经加载到内存中,所以每次查询权限的资源消耗是非常小的。

file permision

无论是读、写还是执行权限,所体现出来的能力究其本质都是因为它作用在对应文件的data block上。

目录文件和普通文件,执行权限之间有依赖关系

  • 目录文件
    • 执行权限依赖于读权限
    • 写权限依赖于执行权限
  • 普通文件
    • 执行权限依赖于读权限

3.3、umask 权限

umask 值用于设置用户在创建文件时的默认权限。

对于 root 用户(实际上是 UID 小于 200 的 user),系统默认的 umask 值是 022;对于普通用户和系统用户,系统默认的 umask 值是002。

默认它们的设置是写在 /etc/profile 和 /etc/bashrc 两个环境配置文件中。

[root@arm64v8 ~]# grep -C 5 -R "umask 002" /etc/ | grep "umask 022"
/etc/bashrc-       umask 022
/etc/csh.cshrc-    umask 022
/etc/profile-    umask 022
[root@arm64v8 ~]#

相关设置项如下:

if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
   umask 002
else
   umask 022
fi

执行 umask 命令可以查看当前用户的 umask 值。

[root@arm64v8 ~]# umask 
0022
[root@arm64v8 ~]# 
[root@arm64v8 ~]# su - hadoop
Last login: Mon May 31 15:42:37 CST 2021 on pts/0
[hadoop@arm64v8]~% umask
002
[hadoop@arm64v8]~%

执行 umask num 可以临时修改 umask 值为 num,但这是临时的,要永久有效,需要写入到环境配置文件中,至于写入到 /etc/profile、/etc/bashrc、~/.bashrc 还是 ~/.bash_profile 中,看你自己的需求了。不过一般来说,不会去永久修改 umask 值,只会在特殊条件下临时修改下 umask 值。

umask 决定文件默认权限原则:

  1. 如果创建的是目录,则使用 777-umask 值,如 root 的 umask=022,则 root 创建目录时该目录的默认权限为 777-022=755,而普通用户创建目录时,权限为 777-002=775。

  2. 如果创建的是普通文件,在Linux中,深入贯彻了一点:文件默认不应该有执行权限,否则是危险的。如果 umask 的三位都为偶数,则直接使用 666 去减掉 umask 值,root 创建普通文件时默认权限为 666-022=644;如果 umask 值某一位为奇数,则 666 减去 umask 值后再在奇数位上加1,普通用户创建文件时默认权限为 666-021=645,在奇数位上加1,则为646。

    [hadoop@arm64v8]~% umask 021
    [hadoop@arm64v8]~% touch test
    [hadoop@arm64v8]~% ll test 
    -rw-r--rw- 1 hadoop hadoop 0 Jun  1 14:31 test
    [hadoop@arm64v8]~%

3.4、文件的扩展权限

在计算机相关领域,所有的 ACL(access control list) 都表示访问控制列表。

文件的 owner/group/others 的权限就是一种 ACL,它们是基本的 ACL。很多时候,只通过这 3 个权限位是无法完全合理设置权限问题的,例如如何仅设置某单个用户具有什么权限。这时候需要使用扩展 ACL。

扩展 ACL 是一种特殊权限,它是文件系统上功能,用于解决所有者、所属组和其他这三个权限位无法合理设置单个用户权限的问题。所以,扩展 ACL 可以针对单一使用者,单一档案或目录里的默认权限进行 r,w,x 的权限规范。

需要明确的是,扩展 ACL 是文件系统上的功能,且工作在内核,默认在 ext4/xfs 上都已开启。

在下文中,都直接以 ACL 来表示代替扩展 ACL 的称呼。

3.4.1、查看文件系统是否开启 ACL

对于 ext 家族的文件系统来说,要查看是否开启 acl 功能,使用 dumpe2fs 导出文件系统属性即可。

[root@controller1 ~]# dumpe2fs -h /dev/sda2 | grep -i acl
dumpe2fs 1.42.9 (28-Dec-2013)
Default mount options:    user_xattr acl
[root@controller1 ~]#

对于 xfs 文件系统,则没有直接的命令可以输出它的相关信息,需要使用 dmesg 来查看。其实无需关注它,因为默认 xfs 会开启 acl 功能。

[root@arm64v8 ~]# dmesg | grep -i acl
[    1.969898] systemd[1]: systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
[    3.149392] SGI XFS with ACLs, security attributes, no debug enabled
[root@arm64v8 ~]#

3.4.2、设置和查看 ACL

设置使用 setfacl 命令。

setfacl [options] u:[用户列表]:[rwx] 目录/文件名    # 对用户设置使用 u
setfacl [options] g:[组列表]:[rwx]   目录/文件名    # 对组设置使用 g

选项说明:
-m:设定ACL权限(modify)
-x:删除指定的ACL权限,可以指定用户、组和文件来删除(remove)
-M:写了ACL条目的文件,将从此文件中读取ACL条目,需要配合-m,所以-M指定的是modify file
-X:写了ACL条目的文件,将从此文件中读取ACL条目,需要配合-x,所以-X指定的是remove file
-n:不重置mask
-b:删除所有的ACL权限
-d:设定默认ACL权限,只对目录有效,设置后子目录(文件)继承默认ACL,只对未来文件 有效
-k:删除默认ACL权限
-R:递归设定ACL权限,只对目录有效,只对已有文件有效

查看使用 getfacl 命令

getfacl [-aceEsRLPtpndvh] file ...

选项说明:
-a:显示文件 ACL
-d:显示文件默认 ACL
-c:不显示注释信息,也就是前三行注释
-R:递归显示

案例:有一共享目录 /Greatwall/development

要求

  • root 用户
    • 对目录有 rwx 权限
    • 对目录中的所有文件有 rw 权限
  • elder 用户
    • 对目录有 rx 权限
    • 对目录中的所有 pdf 文件有 r 权限
  • newer 用户
    • 对目录有 rx 权限
    • 仅对目录中的 uat.pdf 有 r 权限

实验步骤

  1. root 用户创建环境

    # root 创建目录和文件,可以设置任何权限,实验中不验收 root 权限,只验收普通用户 elder 和 newer 的权限
    [root@arm64v8 ~]# mkdir /Greatwall/development -pv
    mkdir: created directory ‘/Greatwall’
    mkdir: created directory ‘/Greatwall/development’
    
    # elder 和 newer 对 /Greatwall/development/ 默认就有读和执行权限
    [root@arm64v8 ~]# ll /Greatwall/development/ -d
    drwxr-xr-x 2 root root 6 Jun  1 20:58 /Greatwall/development/
    [root@arm64v8 ~]#
    [root@arm64v8 ~]# touch /Greatwall/development/prodction.pdf
    [root@arm64v8 ~]# touch /Greatwall/development/uat.pdf
    [root@arm64v8 ~]# echo "production" > /Greatwall/development/prodction.pdf
    [root@arm64v8 ~]# echo "uat" > /Greatwall/development/uat.pdf 
    [root@arm64v8 ~]# chmod o-r /Greatwall/development/*.pdf
    
    # elder 和 newer 对 /Greatwall/development/ 下的文件没有任何权限
    [root@arm64v8 ~]# ll /Greatwall/development/
    total 8
    -rw-r----- 1 root root 11 Jun  1 21:03 prodction.pdf
    -rw-r----- 1 root root  4 Jun  1 21:03 uat.pdf
    [root@arm64v8 ~]#
  2. 分别对 elder 和 newer 用户设置 acl 权限

    [root@arm64v8 ~]# setfacl -m u:elder:r /Greatwall/development/*.pdf
    [root@arm64v8 ~]# getfacl /Greatwall/development/*.pdf
    getfacl: Removing leading '/' from absolute path names
    # file: Greatwall/development/prodction.pdf
    # owner: root
    # group: root
    user::rw-
    user:elder:r--
    group::r--
    mask::r--
    other::---
    
    # file: Greatwall/development/uat.pdf
    # owner: root
    # group: root
    user::rw-
    user:elder:r--
    group::r--
    mask::r--
    other::---
    
    [root@arm64v8 ~]# setfacl -m u:newer:r /Greatwall/development/uat.pdf 
    [root@arm64v8 ~]# getfacl /Greatwall/development/*
    getfacl: Removing leading '/' from absolute path names
    # file: Greatwall/development/prodction.pdf
    # owner: root
    # group: root
    user::rw-
    user:elder:r--
    group::r--
    mask::r--
    other::---
    
    # file: Greatwall/development/uat.pdf
    # owner: root
    # group: root
    user::rw-
    user:elder:r--
    user:newer:r--
    group::r--
    mask::r--
    other::---
    
    [root@arm64v8 ~]#
  3. 验收 elder 和 newer 对文件的权限

    # elder acl 控制符合预期
    [root@arm64v8 ~]# su - elder
    Last login: Tue Jun  1 21:23:00 CST 2021 on pts/1
    [elder@arm64v8 ~]$ cat /Greatwall/development/prodction.pdf 
    production
    [elder@arm64v8 ~]$ cat /Greatwall/development/uat.pdf 
    uat
    [elder@arm64v8 ~]$ echo "acl w test" >> /Greatwall/development/prodction.pdf 
    -bash: /Greatwall/development/prodction.pdf: Permission denied
    [elder@arm64v8 ~]$ echo "acl w test" >> /Greatwall/development/uat.pdf 
    -bash: /Greatwall/development/uat.pdf: Permission denied
    [elder@arm64v8 ~]$ touch /Greatwall/development/acltest
    touch: cannot touch ‘/Greatwall/development/acltest’: Permission denied
    [elder@arm64v8 ~]$
    
    # newer acl 控制符合预期
    [root@arm64v8 ~]# su - newer
    [newer@arm64v8 ~]$ cat /Greatwall/development/prodction.pdf 
    cat: /Greatwall/development/prodction.pdf: Permission denied
    [newer@arm64v8 ~]$ cat /Greatwall/development/uat.pdf 
    uat
    [newer@arm64v8 ~]$ touch /Greatwall/development/acltest
    touch: cannot touch ‘/Greatwall/development/acltest’: Permission denied
    [newer@arm64v8 ~]$

3.4.3、ACL:mask

设置 mask 后会将 mask 权限与已有的 acl 权限进行与计算,计算后的结果会成为新的 ACL 权限。

设定 mask 的方式为:

setfacl -m m:[rwx] 目录/文件名
A B and
r r r
r - -
- r -
- - -

注意:默认每次设置文件的 acl 时,mask 值会自动重置为当前用户指定的值。如果一个文件上要设置多个用户的 acl,重置 mask 后就会对已有用户的 acl 重新计算,而使得 acl 权限得不到有效的控制。

使用 setfacl 的 "-n" 选项,它表示此次设置不会重置 mask 值。

# 当前的acl权限
[root@arm64v8 ~]# getfacl -c /Greatwall/development/prodction.pdf 
getfacl: Removing leading '/' from absolute path names
user::rw-
user:elder:rwx
group::r--
mask::rwx
other::---

# 设置mask值为rx,设置mask后,它提示有效权限是r-x。这是rwx和r-x做与运算之后的结果
[root@arm64v8 ~]# setfacl -m m:rx /Greatwall/development/prodction.pdf
[root@arm64v8 ~]# getfacl -c /Greatwall/development/prodction.pdf 
getfacl: Removing leading '/' from absolute path names
user::rw-
user:elder:rwx          #effective:r-x
group::r--
mask::r-x
other::---

[root@arm64v8 ~]#

# 再设置elder的acl为rwx,然后查看mask,会发现mask也被重置为rwx
[root@arm64v8 ~]# setfacl -m u:elder:rwx /Greatwall/development/prodction.pdf
[root@arm64v8 ~]# getfacl -c /Greatwall/development/prodction.pdf 
getfacl: Removing leading '/' from absolute path names
user::rw-
user:elder:rwx
group::r--
mask::rwx
other::---

[root@arm64v8 ~]#

# 在设置文件的acl时,要使用-n选项来禁止重置mask
[root@arm64v8 ~]# setfacl -m m:rx /Greatwall/development/prodction.pdf
[root@arm64v8 ~]# getfacl -c /Greatwall/development/prodction.pdf 
getfacl: Removing leading '/' from absolute path names
user::rw-
user:elder:rwx          #effective:r-x
group::r--
mask::r-x
other::---

[root@arm64v8 ~]# setfacl -n -m u:elder:rwx /Greatwall/development/prodction.pdf
[root@arm64v8 ~]# getfacl -c /Greatwall/development/prodction.pdf 
getfacl: Removing leading '/' from absolute path names
user::rw-
user:elder:rwx          #effective:r-x
group::r--
mask::r-x
other::---

[root@arm64v8 ~]# 

3.4.4、权限递归

递归 ACL 权限只对目录里已有文件有效,默认权限只对未来目录里的文件有效

# 设置递归ACL权限
setfacl -m u:username:[rwx] -R 目录名

# 设置默认ACL权限
setfacl -m d:u:username:[rwx] 目录名

3.4.5、删除 ACL 权限

setfacl -x u:用户名 文件名       # 删除指定用户ACL
setfacl -x g:组名 文件名         # 删除指定组名ACL
setfacl -b 文件名                # 指定文件删除ACL,会删除所有ACL

3.5、文件隐藏属性

一般来说,使用文件的读写执行权限就能满足大部分需求,利用文件隐藏属性在一定程度上可以加大文件的安全性。

3.5.1、lsattr 命令

查看文件隐藏属性

lsattr [-RVadlv] [files...]

参数说明:
-R 递归列出目录及文件属性
-a 显示所有文件属性,包括隐藏文件

[root@arm64v8 ~]# lsattr -a -R /Greatwall/
---------------- /Greatwall/.
---------------- /Greatwall/..
---------------- /Greatwall/development

/Greatwall/development:
---------------- /Greatwall/development/.
---------------- /Greatwall/development/..
---------------- /Greatwall/development/prodction.pdf
---------------- /Greatwall/development/uat.pdf

---------------- /Greatwall/hello.txt
[root@arm64v8 ~]# 

3.5.2、chattr 命令

修改文件隐藏属性

# +表示增加,-表示减少,=表示设定
chattr [+ - =] [ai] files

a:文件中将只能增加内容,不能删除数据,且不能打开文件进行任何编辑,像sed等需要打开文件的再写入数据的工具也无法操作成功
i:文件将被锁定,不能向其中增删改内容,也不能删除修改文件等各种动作

# 对/etc/shadow文件设置i属性,任何用户包括root将不能修改密码,而且也不能创建用户
[root@arm64v8 ~]# chattr +i /etc/shadow
[root@arm64v8 ~]# lsattr /etc/shadow
----i----------- /etc/shadow
[root@arm64v8 ~]#
[root@arm64v8 ~]# useradd brinnatt
useradd: cannot open /etc/shadow
[root@arm64v8 ~]#

# 删除隐藏属性
[root@arm64v8 ~]# chattr -i /etc/shadow
[root@arm64v8 ~]# lsattr /etc/shadow
---------------- /etc/shadow
[root@arm64v8 ~]#

3.6、特殊权限

3.6.1、SUID 权限

SUID 针对二进制文件,指运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者

chmod u[+-]s FILE

# Seri 这个用户对 /etc/shadow 这个文件没有查看权限,但是 root 有
[root@arm64v8 ~]# ls -l /etc/shadow
-rw------- 1 root root 1026 Jun  1 21:13 /etc/shadow
[root@arm64v8 ~]# su - Seri
Last login: Sun May 30 23:23:45 CST 2021 from 120.227.21.217 on pts/1
[Seri@arm64v8 ~]$ 
[Seri@arm64v8 ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
[Seri@arm64v8 ~]$

# 为了解决这个问题,换一个思路,将/bin/cat二进制程序加上SUID,也就是运行/bin/cat时变成其属主root身份
[root@arm64v8 ~]# chmod u+s /bin/cat
[root@arm64v8 ~]# ls -l /bin/cat
-rwsr-xr-x. 1 root root 70408 Apr 16  2018 /bin/cat
[root@arm64v8 ~]# 
[root@arm64v8 ~]# su - Seri
Last login: Wed Jun  2 09:35:42 CST 2021 on pts/0
[Seri@arm64v8 ~]$ 
[Seri@arm64v8 ~]$ cat /etc/shadow
root:$6$4cwKaV9Xadwv/Q/T$LnkXwvC7PzbNJgpyI.lrKntuN9MEM0Cm2fYKG/WDI/Zk1hMS4OSmiLkj7xqJesw/lyfBnWrZ90CqrGvFCTwbn.::0:99999:7:::
bin:*:17632:0:99999:7:::
daemon:*:17632:0:99999:7:::

3.6.2、SGID 权限

SGID 针对二进制和目录文件,指运行某程序时,相应进程的属组是程序文件自身的属组,而不是启动者所属的基本组

chmod g[+-]s FILE

案例:有一公共目录 /tmp/project/

要求:hadoop hbase hive 三用户都能在公共目录创文件并且相互之间可以修改删除

实现步骤:创建成员附加组 develop,将公共目录组改成 develop 加写权限,此时都能在里面创建删除文件,但是不能相互修改,此时就用 g+s 就可以了

# 创建hadoop hbase hive三用户并附加到同一组develop
[root@arm64v8 ~]# useradd hadoop && echo "hadoop" | passwd --stdin hadoop
[root@arm64v8 ~]# useradd hive && echo "hive" | passwd --stdin hive
[root@arm64v8 ~]# useradd hbase && echo "hbase" | passwd --stdin hbase
[root@arm64v8 ~]# groupadd develop
[root@arm64v8 ~]# usermod -a -G develop hadoop 
[root@arm64v8 ~]# usermod -a -G develop hive 
[root@arm64v8 ~]# usermod -a -G develop hbase

# 创建/tmp/project目录,将此目录属组改成develop,属组加写权限
[root@arm64v8 ~]# mkdir /tmp/project
[root@arm64v8 ~]# chown -R .develop /tmp/project/
[root@arm64v8 ~]# chmod -R g+w /tmp/project/
[root@arm64v8 ~]# ll -d /tmp/project/
drwxrwxr-x 2 root develop 6 Jun  2 10:10 /tmp/project/
[root@arm64v8 ~]#

# 三个用户各自都在/tmp/project创建自己的文件,可以相互删除(取决于对目录是否有w权限),但是不能相互修改(取决于对文件是否有w权限)
[root@arm64v8 ~]# su - hadoop
[hadoop@arm64v8 ~]$ touch /tmp/project/hadoop.file
[root@arm64v8 ~]# su - hive
[hive@arm64v8 ~]$ touch /tmp/project/hive.file
[root@arm64v8 ~]# su - hbase
[hbase@arm64v8 ~]$ touch /tmp/project/hbase.file
[hbase@arm64v8 ~]$ ll /tmp/project/
total 0
-rw-rw-r-- 1 hadoop hadoop 0 Jun  2 10:18 hadoop.file
-rw-rw-r-- 1 hbase  hbase  0 Jun  2 10:19 hbase.file
-rw-rw-r-- 1 hive   hive   0 Jun  2 10:18 hive.file
[hbase@arm64v8 ~]$
[hadoop@arm64v8 ~]$ echo "I am hadoop inserting hello to hive.file" > /tmp/project/hive.file 
-bash: /tmp/project/hive.file: Permission denied
[hadoop@arm64v8 ~]$

# 对/tmp/project目录加上SGID权限,互相之前就可以修改文件了,但是注意,必须是加了SGID后,新创建的文件才行
[root@arm64v8 ~]# chmod g+s /tmp/project/
[root@arm64v8 ~]# su - hadoop
[hadoop@arm64v8 ~]$ touch /tmp/project/hadoop.file
[root@arm64v8 ~]# su - hive
[hive@arm64v8 ~]$ touch /tmp/project/hive.file
[root@arm64v8 ~]# su - hbase
[hbase@arm64v8 ~]$ touch /tmp/project/hbase.file
[hbase@arm64v8 ~]$ 

# 查看三个用户各自创建的文件,发现文件属组都自动变成了develop,相互能修改也就理所当然了
[hbase@arm64v8 ~]$ ls -l /tmp/project/
total 0
-rw-rw-r-- 1 hadoop develop 0 Jun  2 10:50 hadoop.file
-rw-rw-r-- 1 hbase  develop 0 Jun  2 10:51 hbase.file
-rw-rw-r-- 1 hive   develop 0 Jun  2 10:50 hive.file
[hbase@arm64v8 ~]$
[hbase@arm64v8 ~]$ echo "I am hbase inserting hello to hadoop.file" > /tmp/project/hadoop.file 
[hbase@arm64v8 ~]$ cat /tmp/project/hadoop.file
I am hbase inserting hello to hadoop.file
[hbase@arm64v8 ~]$

3.6.3、Sticky 权限

做 SGID 实验时发现,由于公共目录的公共组有写的权限,所以此目录下的文件可以相互删除,为了避免删除别人文件引入 Sticky

Sticky:在一个公共目录,每个都可以创建文件,删除自己的文件,但不能删除别人的文件;

chmod o[+-]t DIR

继续 SGID 的实验

# 对/tmp/project目录加上Sticky权限
[root@arm64v8 ~]# chmod o+t /tmp/project/
[root@arm64v8 ~]# ll -d /tmp/project/
drwxrwsr-t 2 root develop 60 Jun  2 10:51 /tmp/project/
[root@arm64v8 ~]#

# 发现相互删除文件是不行的,只能删除自己的文件
[root@arm64v8 ~]# su - hadoop
[hadoop@arm64v8 ~]$ rm -rf /tmp/project/hive.file 
rm: cannot remove ‘/tmp/project/hive.file’: Operation not permitted
[hadoop@arm64v8 ~]$ 
[hadoop@arm64v8 ~]$ rm -rf /tmp/project/hadoop.file 
[hadoop@arm64v8 ~]$ ll /tmp/project/
total 0
-rw-rw-r-- 1 hbase develop 0 Jun  2 10:51 hbase.file
-rw-rw-r-- 1 hive  develop 0 Jun  2 10:50 hive.file
[hadoop@arm64v8 ~]$

3.6.4、特权组合

SUID, SGID, Sticky 可以组合成一个特殊权限组合加到文件的权限列中,放在首位

chmod [u+s g+s o+t] File...

  • umask 0022 这个前面的一个 0 就是特殊权限的组合

  • 比如刚 g+s o+t 这个组合,可以直接使用 chmod 3755 /tmp/project

    [root@arm64v8 ~]# chmod u-s,g-s,o-t /tmp/project/
    [root@arm64v8 ~]# 
    [root@arm64v8 ~]# ll -d /tmp/project/
    drwxr-xr-x 2 root develop 41 Jun  2 11:10 /tmp/project/
    [root@arm64v8 ~]# 
    [root@arm64v8 ~]# chmod 3755 /tmp/project/
    [root@arm64v8 ~]# 
    [root@arm64v8 ~]# ll -d /tmp/project/
    drwxr-sr-t 2 root develop 41 Jun  2 11:10 /tmp/project/
    [root@arm64v8 ~]#
标签云