Linux文件特殊权限之SUID、 SGID、 SBIT、UMASK、 ACL

一、文件的高级特殊权限

此前我们已经学习过 r、w、 x 这三种权限,但在査询系统文件时会发现有一些其他权限的字母
比如:/usr/bin/passwd 文件,属主应该是 x 的权限位出现了 s

[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856 Apr  1  2020 /usr/bin/passwd

比如:/usr/bin/locate 文件,属组应该是 x 的权限位出现了 s

[root@localhost ~]# yum install mlocate


[root@localhost ~]# ll /usr/bin/locate
-rwx--s--x. 1 root slocate 40520 Apr 11  2018 /usr/bin/locate
[root@localhost ~]# 

比如:/tmp 目录,其他人应该是 x 的权限位出现了 t

[root@localhost ~]# ll -d /tmp
drwxrwxrwt. 10 root root 255 Jul 24 19:30 /tmp

三者颜色也很特殊:
在这里插入图片描述

我们把这种称为特殊权限,那么特殊权限有什么作用呢? 或者说能干啥?

1. suid

普通用户不是root用户也不是root组,于是它对/etc/shadow文件没有任何权限

[root@localhost ~]# ll /etc/shadow
----------. 1 root root 1535 Jul 24 15:39 /etc/shadow
[root@localhost ~]#

但是普通用户可以用passwd命令修改自己的密码,而修改密码就是修改/etc/shadow文件,这是如何实现的

其实,普通用户可以修改自己的密码在于 passwd 命令本身,该命令拥有特殊权限 SetUID 也就是在属主的权限位的执行权限上是 s
那如何理解特殊权限 SetUID:当一个执行文件设置 SetUID 后,用户在执行这个文件时将以文件所有者的身份来执行。

[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856 Apr  1  2020 /usr/bin/passwd

可以看root用户有一个s权限,s权限的特殊之处
s权限仅对二进制可执行文件有效
如果执⾏者对于该⼆进制可执⾏⽂件具有 x 的权限,执⾏者将具有该⽂件的所有者的权限
本权限仅在执行该二进制可执行文件的过程中有效
本权限可以让命令的执行者的身份,转换成命令的主人的身份

重要的事说三遍:
进程对以什么方式操作文件,取决于启动进程的用户对文件有什么权限。
进程对以什么方式操作文件,取决于启动进程的用户对文件有什么权限。
进程对以什么方式操作文件,取决于启动进程的用户对文件有什么权限。

假设普通用户jack 执行
/bin/passwd 修改自己的密码,passwd进程按理说是由jack启动的,但是通过过滤发现

[root@localhost ~]# su - jack
Last login: Sat Jul 24 20:20:22 CST 2021 on pts/0
[jack@localhost ~]$ passwd 

[root@localhost ~]# ps aux |grep "passwd" | grep -v grep
root       1461  0.0  0.1 170816  1980 pts/0    S+   20:39   0:00 passwd
[root@localhost ~]#

TM的竟然是转换成了root用户,也就是说实际上是root用户启动的passwd进程,那么,该进程对文件的何种操作,就取决于启动该进程的用户,也就是root, root当然有权限修改任何文件了。
其实是因为passwd本身有s权限。

SUID配置语法

[root@localhost ~]# chmod u+s /usr/bin/cat
[root@localhost ~]# chmod 4755 /usr/bin/cat

[root@localhost b]# ll `which cat`
-rwxr-xr-x. 1 root root 54080 Nov 17  2020 /usr/bin/cat
[root@localhost b]# 
[root@localhost /]# mkdir /test                # 创建/test

[root@localhost /]# chmod 777 /test            # 修改权限
[root@localhost /]# echo 1111 >> /test/a.txt   # 创建、/test/a.txt 并且写入内容1111
[root@localhost /]# chmod 000 /test/a.txt        # 修改文件权限000
[root@localhost /]# ll /test/a.txt 
----------. 1 root root 5 Jul  3 20:23 /test/a.txt   # 可以看见任何人都没有权限

[root@localhost /]# su - tom             # 切换到tom用户
Last login: Sat Jul  3 18:20:47 CST 2021 from 192.168.138.10 on pts/0
[tom@localhost ~]$ cat /test/a.txt  # tom 用户下查看,可以看到没有权限
cat: /test/a.txt: Permission denied
[tom@localhost ~]$ su
Password: 
[root@localhost tom]# chmod u+s `which cat` # 给二进制执行文件cat添加s权限
[root@localhost tom]# ll `which cat` # 查看是否添加成功
-rwsr-xr-x. 1 root root 54080 Nov 17  2020 /bin/cat

[root@localhost tom]# su - tom  -c 'cat /test/a.txt' # 可以看到tom用户已经有查看权限了
1111
[root@localhost tom]# 

suid总结:

  1. 让普通用户对二进制可执行文件,临时拥有二进制文件主人(并不一定是root)的权限
  2. .如果设置的二进制文件没有执行权限,那么 suid 的权限显示就是大S
  3. 特殊权限 suid 仅对二进制可执行程序有效,其他文件或目录则无效
  4. 注意: suid 相对危险,不建议对 vim 或 rm 进行 suid 设定操作

2. sgid

  1. 当作用到二进制可执行文件时,命令在执行的过程中,会以命令的属组身份运行该命令
  2. 当⼀个⽤户对某⼀⽬录有写和执⾏权限时,该⽤户就可以在该⽬录下建立文件,如果该⽬录同时⽤ SGID 修饰,则该⽤户在这个⽬录下建⽴的⽂件都是属于这个⽬录所属的组。这时候在该目录下新建的文件/目录自动继承父目录的属组。

sgdi配置语法:

[root@localhost ~]# chmod 2755 /test
[root@localhost ~]# chmod g+s /test

sgid作用到二进制文件模拟:

[root@localhost /]# mkdir /test                       # 1. 创建/test

[root@localhost /]# echo 111 >> /test/a.txt           # 2. 创建文件并写入内容
[root@localhost /]# ll /test/a.txt
-rw-r--r--. 1 root root 4 Jul  3 22:00 /test/a.txt    # 3.查看权限
[root@localhost /]# chmod 000 /test/a.txt  # 4.修改为000,目的是让普通用户不能读
[root@localhost /]# ll /test/a.txt
----------. 1 root root 4 Jul  3 22:00 /test/a.txt
[root@localhost /]# chmod u-s `which cat`             # 5.取消suid的影响
[root@localhost /]# ll `which cat`                    # 6. 查看cat的权限
-rwxr-xr-x. 1 root root 54080 Nov 17  2020 /bin/cat

[root@localhost /]# su - tom                          # 7.切换到tom用户
Last login: Sat Jul  3 22:04:13 CST 2021 on pts/1
[tom@localhost ~]$ cat /test/a.txt                 # 8.查看文件,可以看到没有权限查看
cat: /test/a.txt: Permission denied
[tom@localhost ~]$ su                                 # 9.切换回root用户
Password: 
[root@localhost tom]# chmod g+s `which cat`           # 10.给组增加sgid权限
[root@localhost tom]# ll `which cat`
-rwxr-sr-x. 1 root root 54080 Nov 17  2020 /bin/cat # 11.查看权限,看到已经加上了s权限
[root@localhost tom]# chmod g+r /test/a.txt           # 12. 给文件的属组加上r权限
[root@localhost tom]# ll /test/a.txt 
----r-----. 1 root root 4 Jul  3 22:00 /test/a.txt
 
[root@localhost tom]# su - tom       # 13. 重新切换回tom查看文件,看到已经能查看了
Last login: Sat Jul  3 22:06:11 CST 2021 on pts/1
[tom@localhost ~]$ cat /test/a.txt
111
[tom@localhost ~]$ 
总结:文件开始没有任何权限,所以普通用户没有查看的权限,但是给cat命令加上s权限,则普通用户具有文件属组的权限,然后再给文件属组加上r权限,这样普通用户就可查看文件了。

给文件夹修饰sgid模拟:

[root@localhost /]# mkdir /test               # 1.root用户创建 test文件夹
[root@localhost /]# ll -d /test               # 2.查看文件夹权限
drwxr-xr-x. 2 root root 6 Jul  3 22:24 /test
[root@localhost /]# mkdir /test/aaa           # 3.在test下创建aaa文件夹
[root@localhost /]# mkdir /test/bbb.txt       # 4.在test下创建bbb.txt文件
[root@localhost /]# ll /test                  # 5. 查看创建的文件权限
total 0
drwxr-xr-x. 2 root root 6 Jul  3 22:25 aaa
drwxr-xr-x. 2 root root 6 Jul  3 22:25 bbb.txt

# 6.修改test文件夹权限,其他人+w 目的是能让其他人在test下创建文件
[root@localhost /]# chmod o+w /test 

[root@localhost /]# ll -d /test                 # 7.再次查看权限
drwxr-xrwx. 4 root root 32 Jul  3 22:25 /test
[root@localhost /]# su - tom                      # 8.切换到tom用户


[tom@localhost /]$ mkdir /test/ccc              # 9. tom用户在/test下创建ccc目录
[tom@localhost /]$ touch /test/ddd.txt          # 10.tom用户在/test下创建ddd.txt文件
[tom@localhost /]$ ll /test/                    # 11. 查看创建的文件,可以看到组都为tom
total 0
drwxr-xr-x. 2 root root 6 Jul  3 22:25 aaa
drwxr-xr-x. 2 root root 6 Jul  3 22:25 bbb.txt
drwxrwxr-x. 2 tom  tom  6 Jul  3 22:31 ccc
-rw-rw-r--. 1 tom  tom  0 Jul  3 22:31 ddd.txt

 现在有这种需求,无论是哪个用户,在/test文件下创建的文件或文件夹都跟/test文件夹一个属组
 
[tom@localhost /]$ su                           # 12. 切换到root用户
Password: 
[root@localhost /]# chmod g+s /test             # 13.给组设置sgid

[root@localhost /]# ll -d /test                 # 14.查看属组设置的s权限
drwxr-srwx. 5 root root 58 Jul  3 22:31 /test
[root@localhost /]# groupadd group1             # 15.重新创建组

[root@localhost /]# chown .group1 /test         # 16./test/ 属组改为group1

[root@localhost /]# ll -d /test                 # 17. 查看更改的权限
drwxr-srwx. 5 root group1 58 Jul  3 22:31 /test
[root@localhost /]# su - tom                 # 18. 重新切回tom用户创建文件和文件夹
Last login: Sat Jul  3 22:26:19 CST 2021 on pts/1
[tom@localhost ~]$ mkdir /test/eee
[tom@localhost ~]$ touch /test/fff.txt
[tom@localhost ~]$ ll -d /test/
drwxr-srwx. 6 root group1 84 Jul  3 22:34 /test/
[tom@localhost ~]$ ll /test/  # 19.查看文件信息,可以看到新创建的文件属组都为 group1
total 0
drwxr-xr-x. 2 root root   6 Jul  3 22:25 aaa
drwxr-xr-x. 2 root root   6 Jul  3 22:25 bbb.txt
drwxrwxr-x. 2 tom  tom    6 Jul  3 22:31 ccc
-rw-rw-r--. 1 tom  tom    0 Jul  3 22:31 ddd.txt
drwxrwsr-x. 2 tom  group1 6 Jul  3 22:34 eee
-rw-rw-r--. 1 tom  group1 0 Jul  3 22:34 fff.txt
[tom@localhost ~]$ 

sgid场景举例:
需求:
1.系统有两个用户,分别为 rd1 与 rd2,这两个用户都拥有 development 附加组
2.这两个用户需要共同拥有 /develop/code 目录的开发权
3.互相之间能修改彼此的文件,且该目录不允许其他人进入查阅

[root@localhost ~]# useradd rd1
[root@localhost ~]# useradd rd2
[root@localhost ~]# groupadd development
[root@localhost ~]# usermod rd1 -G  development
[root@localhost ~]# usermod rd2 -G  development


[root@localhost dev]# mkdir -p /develop/code
[root@localhost dev]# ll -d /development/code
ls: cannot access /development/code: No such file or directory
[root@localhost dev]# ll -d /develop/code
drwxr-xr-x. 2 root root 6 Jul 24 22:34 /develop/code
[root@localhost dev]# chgrp development /develop/code
[root@localhost dev]# ll -d /develop/code
drwxr-xr-x. 2 root development 6 Jul 24 22:34 /develop/code
[root@localhost dev]# chmod 770 /develop/code
[root@localhost dev]# ll -d /develop/code
drwxrwx---. 2 root development 6 Jul 24 22:34 /develop/code
[root@localhost dev]# 


[root@localhost dev]# chmod g+s /develop/code # 给code目录+s权限
[root@localhost dev]# ll /develop/code
total 0
[root@localhost dev]# ll /develop/code -d
drwxrws---. 2 root development 6 Jul 24 22:34 /develop/code
[root@localhost dev]# su - rd1
[rd1@localhost ~]$ touch /develop/code/rd1.txt
[rd1@localhost ~]$ ll /develop/code/rd1.txt
-rw-rw-r--. 1 rd1 development 0 Jul 24 22:58 /develop/code/rd1.txt
[rd1@localhost ~]$ echo 111 >>/develop/code/rd1.txt
[rd1@localhost ~]$ su -
Password: 
Last login: Sat Jul 24 22:29:42 CST 2021 from 10.0.0.1 on pts/0
[root@localhost ~]# su - rd2  # 切换到rd2用户,可以查看修改rd1创建的文件
[rd2@localhost ~]$ cd /develop/code/
[rd2@localhost code]$ ls
rd1.txt
[rd2@localhost code]$ cat rd1.txt
111
[rd2@localhost code]$ echo 222 >> rd1.txt
[rd2@localhost code]$ cat rd1.txt
111
222

如果切换到除了rd1和rd2以外的其他人,压根就进入不了data目录

总结:如果sgid作用的目录或文件没有x权限,则显示为S

3. SBIT

其实 SBIT 与 SUID 和 SGID 的关系并不大。 SBIT 是 the restricted deletion flag or sticky bit 的简称,有时也称为Sticky(粘滞位)。 SBIT 只对⽬录有效,⽤来阻非文件的拥有者(除root外)删除文件。
也就是说普通用户对该目录就算拥有 w 权限,也只能删除自己建立的文件,而不能删除其他用户建立的文件。

设置粘滞位:

[root@localhost ~]# chmod o+t /tmp
[root@localhost ~]# chmod 1755 /tmp

场景1:
后期当我们要初始化 MySQL 服务时,服务会创建一些临时文件存储至 /tmp 目录下,当初始化完毕后,自己会清理掉里面的数据,别人无法清理。(如果这个目录不是粘滞位,那么如果初始化时候别人删除了该临时文件,初始化MySQL就会报错)
1.模拟 MySQL 初始化创建文件至 /tmp 目录
2.然后登陆普通用户删除 MySQL的初始化文件
3.如果普通用户删除成功,则初始化失败 (因为 MySQL 服务创建的文件,需要自行销毁)
4.如果普通用户删除失败,则 MySQL 服务尝试删除,删除成功,则初始化成功

[root@localhost ~]# bash mysql_init.sh 
[root@localhost ~]# cat mysql_init.sh 
touch /tmp/mysql_init
su - tank -c 'rm -rf /tmp/mysql_init'>/dev/null
if [ $? -eq 0 ];then
	rm -rf /tmp/mysql_init 
	echo '初始化mysql成功,/tmp存在粘滞位'
else
	echo '初始化mysql失败,/tmp不存在粘滞位'
fi

[root@localhost ~]# chmod o-t /tmp # 取消粘滞位再次尝试
[root@localhost ~]# ll -d /tmp
drwxr-xr-x. 2 root root 24 Jul 24 23:44 /tmp
[root@localhost ~]# bash mysql_init.sh 
rm: cannot remove ‘/tmp/mysql_init’: Permission denied
初始化mysql失败,/tmp不存在粘滞位

场景2:

[root@localhost ~]# chmod o+t /test/  # 在这个文件夹下创建的文件只能文件的主人删除
[root@localhost tom]# mkdir /share           # 1.创建文件夹
[root@localhost tom]# ll -d /share           # 2.查看权限
drwxr-xr-x. 2 root root 6 Jul  3 23:06 /share
[root@localhost tom]# chmod 777 /share       # 3.修改权限(所有人有所有权限)
[root@localhost tom]# useradd user01         # 4. 创建用户
[root@localhost tom]# useradd user02
[root@localhost tom]# useradd user03

[root@localhost share]# cd /share/
[root@localhost share]# touch a.txt       
[root@localhost share]# ll 
total 0
-rw-r--r--. 1 root root 0 Jul  3 23:13 a.txt
[root@localhost share]# su - user01          # 5.登录用户1创建文件
[user01@localhost ~]$ touch /share/01.txt

[user01@localhost ~]$ exit
logout
[root@localhost share]# su - user02         # 6.登录用户2创建文件
Last failed login: Sat Jul  3 23:18:24 CST 2021 on pts/1
There was 1 failed login attempt since the last successful login.
[user02@localhost ~]$ touch /share/02.txt
[user02@localhost ~]$ exit
logout
[root@localhost share]# su - user03         # 7.登录用户3创建文件
[user03@localhost ~]$ touch /share/03.txt
[user03@localhost ~]$ ll /share/
total 0
-rw-rw-r--. 1 user01 user01 0 Jul  3 23:16 01.txt
-rw-rw-r--. 1 user02 user02 0 Jul  3 23:19 02.txt
-rw-rw-r--. 1 user03 user03 0 Jul  3 23:19 03.txt
-rw-r--r--. 1 root   root   0 Jul  3 23:13 a.txt
 # 8. user03用户下删除test下的文件,发现tmd都能删除
[user03@localhost ~]$ rm -rf /share/*           
[user03@localhost ~]$ ll /share/
total 0

[user03@localhost ~]$ su                 # 9.切换管理员
Password: 
[root@localhost user03]# chmod o+t /share/      #10. 文件夹 加SBIT权限
[root@localhost user03]# ll -d /share/ 
drwxr-srwt. 6 root group1 84 Jul  3 22:34 /share/

[root@localhost user03]# cd /share # 11. 管理员账户,其他用户分别创建文件
[root@localhost share]# touch a.txt
[root@localhost share]# su - user01 -c "touch /share/01.txt"
[root@localhost share]# su - user02 -c "touch /share/02.txt"
[root@localhost share]# su - user03 -c "touch /share/03.txt"
[root@localhost share]# su - user03
Last login: Sun Jul  4 00:08:44 CST 2021 on pts/1
[user03@localhost ~]$ cd /share
[user03@localhost share]$ ll   #11.在user03下 查看文件
total 0
-rw-rw-r--. 1 user01 user01 0 Jul  4 00:08 01.txt
-rw-rw-r--. 1 user02 user02 0 Jul  4 00:08 02.txt
-rw-rw-r--. 1 user03 user03 0 Jul  4 00:08 03.txt
-rw-r--r--. 1 root   root   0 Jul  4 00:08 a.txt
# 12.user03不能删除其他用户创建的文件,但是可以删除自己创建的文件
[user03@localhost share]$ rm -rf a.txt   
rm: cannot remove ‘a.txt’: Operation not permitted
[user03@localhost share]$ rm -rf 01.txt 
rm: cannot remove ‘01.txt’: Operation not permitted
[user03@localhost share]$ rm -rf 02.txt 
rm: cannot remove ‘02.txt’: Operation not permitted
[user03@localhost share]$ rm -rf 03.txt 
[user03@localhost share]$ ll
total 0
-rw-rw-r--. 1 user01 user01 0 Jul  4 00:08 01.txt
-rw-rw-r--. 1 user02 user02 0 Jul  4 00:08 02.txt
-rw-r--r--. 1 root   root   0 Jul  4 00:08 a.txt
[user03@localhost share]$ 

sbit总结:
1. 让所有普通用户对该目录具有写入权限,并且能实现每个用户只能删自己的文件
2. 粘滞位目录表现在 others 的 x 位,用 t 表示,如果没有执行权限则显示为 T
3. 粘滞位目录的属主以及 root 用户有权限删除目录中的内容,其他用户无权限删除

5.文件特殊属性

是一种高级属性,凌驾于rwx基础权限之上
作用:

  1. 创建一个文件,不允许被修改、移动、删除,包括 root 也不行–>适合 /etc/passwd
  2. 创建一个文件,仅允许往文件里面追加数据,不允许修改、移动、删除。–>适合 sudo 审计日志/var/log/secure
    设置:
命令格式:chattr [+-=] [选项] 文件或目录名
a:可对文件进行追加内容
i:锁定文件,不允许其他操作
A:不允许修改访问时间

例1.配置/etc/passswd文件,不能改,不能追加,不能删除。

[root@localhost ~]# chattr +i /etc/passwd
[root@localhost ~]# useradd bert  # root用户也不可以使用了
useradd: cannot open /etc/passwd
[root@localhost ~]# rm -rf /etc/passwd
rm: cannot remove ‘/etc/passwd’: Operation not permitted

例2.配置 /var/log/secure 文件,只能追加写入日志,不允许手动修改,也不允许删除

[root@localhost ~]# chattr +a /var/log/secure
[root@localhost ~]# echo 111 >>/var/log/secure

# 打开文件试着删除111
[root@localhost ~]# vim /var/log/secure
# 报错不能删除
"/var/log/secure"
"/var/log/secure" E212: Can't open file for writing
Press ENTER or type command to continue
# 试着删除文件
[root@localhost ~]# rm -rf /var/log/secure
rm: cannot remove ‘/var/log/secure’: Operation not permitted

如果想取消特殊属性,需要使用 root 身份

[root@localhost ~]# chattr +a /opt/1.txt  # 允许追加内容

# 禁止任何修改,有些病毒程序会对文件加上该权限 (如果本身具有读权限,是可以读的)
[root@localhost ~]# chattr +i /opt/2.txt  
[root@localhost ~]# chattr +A /opt/3.txt  # 不更改文件访问时间

二、文件默认权限UMASK

1.umask分析

默认权限:指用户在创建文件或目录时,默认分配给文件或目录的访问权限;
用户创建一个文件的默认访问权限为:rw-rw-rw- (八进制值666)
用户创建一个目录的默认访问权限为:rwxrwxrwx (八进制值777)

查看root用户创建的目录和文件的权限

[root@localhost test]# mkdir aaa
[root@localhost test]# touch bbb.txt
[root@localhost test]# ll
total 0
drwxr-xr-x. 2 root root 6 Jul 25 11:51 aaa       # 755
-rw-r--r--. 1 root root 0 Jul 25 11:52 bbb.txt   # 644

查看普通用户常见的目录和文件的权限

[zhangliang@localhost ~]$ mkdir aaa
[zhangliang@localhost ~]$ touch bbb.txt
[zhangliang@localhost ~]$ ll
total 0
drwxrwxr-x. 2 zhangliang zhangliang 6 Jul 25 11:55 aaa       #775  
-rw-rw-r--. 1 zhangliang zhangliang 0 Jul 25 11:55 bbb.txt  # 664
[zhangliang@localhost ~]$

发现最终创建出来的文件权限是 644 目录是 755,为什么目录不是777,文件不是666呢?
分析: 因为系统创建文件或目录受 UMASK 控制,比如root用户 UMASK为022,普通用户UMASK为002

root用户:
目录:777 - 022 = 755 最终创建出来的目录权限
文件:666 - 022 = 644 最终创建出来的文件权限

普通用户:
目录:777 - 002 = 775 最终创建出来的目录权限
文件:666 - 002 = 664 最终创建出来的文件权限

查看umask值

[root@localhost test]# umask     # root用户
0022
[zhangliang@localhost ~]$ umask  # 普通用户
0002

结论:umask表示需要减掉的权限

2.系统默认权限配置文件

为什么默认 root 用户的 UMASK 为 022,在系统哪个配置文件有设定呢?

  1. 当用户登陆系统时,会加载 /etc/profile 环境变量文件
  2. 在该配置文件中有一条 UMASK 的判断语句
  3. 如果用户 UID 小于 199 那么就将 UMASK 初始化为 022
  4. 如果用户 UID 大于 199 并且组名称和用户名称一致,那么就将 UMASK 初始化为 002
    /etc/profile文件部分代码如下:
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
	umask 002
else   
	umask 022
fi

文件和目录权限计算

文件权限计算方法:偶数位直接相减,奇数位相减再加1

⽂件的起始权限值umask值操作方式计算后⽂件实际权限
666022 (每位如果都是偶数)直接相减即可644
666033 (每位如果有奇数也有偶数)相减(奇数位相减后在其原奇数位加1)644
666325(每位如果有奇数或偶数)相减(奇数位相减后在其原奇数位加1)422

目录权限计算方法:直接相减即可

目录的起始权限值umask值操作方式计算后目录权限
777022相减755
777033相减744
777325相减452

umask设置的越⼩,权限越⼤,慎⽤
临时设置umask

[root@localhost ~]# umask 000 //设置umask权限

永久设置umask

[root@localhost tmp]# vim /etc/profile # 或者/etc/bashrc内容⼀样
......
if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
	umask 002 //表示uid⼤于等于199的默认umask值,表示普通⽤户
else 
	umask 022 //表示uid⼩于199的默认umask值,表示root
fi

三、文件权限之ACL

用命令setfacl设置的ACL(Access Control List) 权限是UGO权限的扩展,ACL可以针对单一用户、单一文件或目录来进⾏r,w,x的权限控制,对于需要特殊权限的使⽤状况有⼀定帮助。

ps:UGO中的O即其他⼈,涵盖了⾮常⼤的范围,我们使⽤setfacl可以将⽤户对⽂件的权限进⾏进⼀步细化,
修改属主的权限 setfacl -m u::权限 a.txt 
修改属组的权限 setfacl -m g::权限 a.txt  
修改其他⼈的权限 setfacl -m o::权限 a.txt  
修改具体某⼀个⽤户的权限 setfacl -m u:⽤户名:权限 a.txt 
删除ACL:setfacl -x u:[用户名] [文件路径]
清除所有权限:setfacl -b [文件路径]
 
修改具体某⼀个组的权限 setfacl -m g:组名:权限 a.txt # 组必须存在  # 也可以给⽬录设置,都⼀样 

1.修改具体某⼀个⽤户的权限

语法:
setfacl -m u:⽤户名:权限 a.txt

[root@localhost ~]# touch a.txt               # 1. 创建文件
[root@localhost ~]# echo 111 > a.txt          # 2. 写入内容
[root@localhost ~]# ll a.txt                  # 3. 查看权限
-rw-r--r--. 1 root root 4 Jul  4 11:50 a.txt

[root@localhost ~]# getfacl a.txt             # 4. 查看 acl
# file: a.txt
# owner: root
# group: root
user::rw-
group::r--
other::r--

[root@localhost ~]# ll -d /root
dr-xr-x---. 2 root root 163 Jul  4 11:50 /root
[root@localhost ~]# chmod o+x /root               # 5./root文件夹一个o+x权限
[root@localhost ~]# ll -d /root
dr-xr-x--x. 2 root root 163 Jul  4 11:50 /root
[root@localhost ~]# useradd tom01                 # 6. 创建用户
[root@localhost ~]# useradd tom02
[root@localhost ~]# useradd tom03
[root@localhost ~]# chmod o=- a.txt               # 7.置空o权限
[root@localhost ~]# ll a.txt
-rw-r-----. 1 root root 4 Jul  4 11:50 a.txt
[root@localhost ~]# setfacl -m u:tom01:r a.txt  # 8. a.txt文件给用户tom01一个r权限
[root@localhost ~]# setfacl -m u:tom02:w a.txt  # 9. a.txt文件给用户tom02一个w权限
[root@localhost ~]# setfacl -m u:tom03:x a.txt  # 10. a.txt文件给用户tom03一个x权限

[root@localhost ~]# getfacl a.txt               # 11. 重新查看文件的acl
# file: a.txt
# owner: root
# group: root
user::rw-
user:tom01:r--
user:tom02:-w-
user:tom03:--x
group::r--
mask::rwx
other::---
# 12.检查tom01是否具有r权限,而其他用户不具有r权限
[root@localhost ~]# su - tom01 -c 'cat /root/a.txt' 
111
[root@localhost ~]# su - tom02 -c 'cat /root/a.txt'
cat: /root/a.txt: Permission denied
[root@localhost ~]# su - tom03 -c 'cat /root/a.txt'
cat: /root/a.txt: Permission denied
[root@localhost ~]# 
[root@localhost ~]# su - tom01 -c 'echo 222 > /root/a.txt'  #13. 检查谁具有写权限
-bash: /root/a.txt: Permission denied
[root@localhost ~]# su - tom02 -c 'echo 222 > /root/a.txt'
[root@localhost ~]# su - tom03 -c 'echo 222 > /root/a.txt'
-bash: /root/a.txt: Permission denied
[root@localhost ~]# 

2、修改具体某一个组的权限

语法:
setfacl -m g:组名:权限 a.txt

[root@localhost ~]# touch a.txt           # 1./root下创建文件a.txt并写入内容
[root@localhost ~]# echo 111 > a.txt     
[root@localhost ~]# ll -d /                # 2.查看权限
dr-xr-xr-x. 17 root root 224 Jun 29 16:54 /
[root@localhost ~]# ll -d /root
dr-xr-x--x. 2 root root 141 Jul  4 23:53 /root
[root@localhost ~]# ll /root
total 4
-rw-r--r--. 1 root root 4 Jul  4 23:53 a.txt
[root@localhost ~]#  chmod g=- a.txt      # 3.将文件的组设置权限---
[root@localhost ~]# ll a.txt 
-rw----r--. 1 root root 4 Jul  4 23:53 a.txt

[root@localhost ~]# groupadd group1       # 4.创建新组group1
[root@localhost ~]# getfacl a.txt         # 5. 查看acl
# file: a.txt
# owner: root
# group: root
user::rw-
group::---
other::r--

[root@localhost ~]# setfacl -m u:tom01:r a.txt  #6.给tom01 r权限
[root@localhost ~]# setfacl -m u:tom02:w a.txt  # 7. 给tom02 w权限
[root@localhost ~]# getfacl a.txt               # 8. 创新查看acl
# file: a.txt
# owner: root
# group: root
user::rw-
user:tom01:r--
user:tom02:-w-
group::---
mask::rw-
other::r--

# 9. 用这种方式把文件属组权限设置为---,如果不为---情况下才设置
[root@localhost ~]# setfacl -m g::- a.txt   
[root@localhost ~]# getfacl a.txt
# file: a.txt
# owner: root
# group: root
user::rw-
user:tom01:r--
user:tom02:-w-
group::---
mask::rw-
other::r--


[root@localhost ~]# gpasswd -a tom03 root     # 10. 将tom03加入root组
Adding user tom03 to group root
[root@localhost ~]# id tom03
uid=1002(tom03) gid=1002(tom03) groups=1002(tom03),0(root)

# 11.因为root组已经不具备任何权限,所以tom03也没有权限
[root@localhost ~]# su - tom03 -c "cat /root/a.txt" 
cat: /root/a.txt: Permission denied
[root@localhost ~]# groupadd jjj             # 12.创建新组jjj

[root@localhost ~]# setfacl -m g:jjj:r a.txt # 13.设置组acl  jjj组有r权限
[root@localhost ~]# getfacl a.txt
# file: a.txt
# owner: root
# group: root
user::rw-
user:tom01:r--
user:tom02:-w-
group::---
group:jjj:r--
mask::rw-
other::r--
#14. 重新把tom03加入jjj 于是tom03已经有jjj的权限r
[root@localhost ~]# gpasswd -a tom03 jjj  
Adding user tom03 to group jjj
[root@localhost ~]# su - tom03 -c "cat /root/a.txt"
111
[root@localhost ~]# 

3、清除acl

删除ACL:setfacl -x u:[用户名] [文件路径]

清除所有权限:setfacl -b [文件路径]
[root@localhost ~]# setfacl -x g:jjj a.txt  # 清除jjj

[root@localhost ~]# getfacl a.txt
# file: a.txt
# owner: root
# group: root
user::rw-
user:tom01:r--
user:tom02:-w-
group::---
mask::rw-
other::r--

[root@localhost ~]# setfacl -x u:tom01 a.txt # 清除tom01
[root@localhost ~]# getfacl a.txt
# file: a.txt
# owner: root
# group: root
user::rw-
user:tom02:-w-
group::---
mask::-w-
other::r--

[root@localhost ~]# setfacl -b a.txt  # 清除所有 -b
[root@localhost ~]# getfacl a.txt
# file: a.txt
# owner: root
# group: root
user::rw-
group::---
other::r--

[root@localhost ~]# 

4. acl继承

1.mask
命令:

1setfacl -m m:rw /opt/a.txt

设置完mask后,除了主人和other不受影响,其他都会受到mask的影响,mask决定了他们的最⾼权限)mask值就像⼀个筛⼦,⽂件属主和other之外的所有权限都需要被它筛⼀遍,如果mask值为rw-则代表该筛⼦只放⾏rw权限。本质原理是权限A需要与mask值B进⾏按位与运算,得到的结果才是effective有效权限

AB
rrr
r--
-r-

default: 继承(默认) 要求: 希望tom能够对/test以及以后在/test下新建的文件有读、写、执行权限
setfacl -m d:u:tom:rwx /test

[root@localhost ~]# mkdir /test

[root@localhost ~]# setfacl -m u:tom:rwx /test
[root@localhost ~]# setfacl -m d:u:tom:rwx /test
[root@localhost ~]# getfacl /test
getfacl: Removing leading '/' from absolute path names
# file: test
# owner: root
# group: root
user::rwx
user:tom:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:tom:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

[root@localhost ~]# mkdir /test/aaa
[root@localhost ~]# touch /test/b.txt
[root@localhost ~]# getfacl /test/aaa
getfacl: Removing leading '/' from absolute path names
# file: test/aaa
# owner: root
# group: root
user::rwx
user:tom:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:tom:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

[root@localhost ~]# getfacl /test/b.txt 
getfacl: Removing leading '/' from absolute path names
# file: test/b.txt
# owner: root
# group: root
user::rw-

# 权限已经继承过来了,但是因为mask的影响,变成了rw-, 这是mask为了安全考虑
user:tom:rwx		#effective:rw-
group::r-x			#effective:r--
mask::rw-
other::r--


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值