第 3 章 Linux 文件权限
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:递归修改,只对当前已存在的文件有效
-
使用数值方式修改权限
[root@arm64v8 ~]# chmod 755 iptables [root@arm64v8 ~]# ll iptables -rwxr-xr-x 1 root root 812 May 29 10:00 iptables [root@arm64v8 ~]#
-
使用字符方式修改权限
由于权限属性附在文件所有者、所属组和其它上,它们三者都有独立的权限位,所有者使用字母 "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 一般都已经加载到内存中,所以每次查询权限的资源消耗是非常小的。
无论是读、写还是执行权限,所体现出来的能力究其本质都是因为它作用在对应文件的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 决定文件默认权限原则:
-
如果创建的是目录,则使用 777-umask 值,如 root 的 umask=022,则 root 创建目录时该目录的默认权限为 777-022=755,而普通用户创建目录时,权限为 777-002=775。
-
如果创建的是普通文件,在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 权限
实验步骤:
-
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 ~]#
-
分别对 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 ~]#
-
验收 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 ~]#