文章目录
一、文件的高级特殊权限
此前我们已经学习过 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总结:
- 让普通用户对二进制可执行文件,临时拥有二进制文件主人(并不一定是root)的权限
- .如果设置的二进制文件没有执行权限,那么 suid 的权限显示就是大S
- 特殊权限 suid 仅对二进制可执行程序有效,其他文件或目录则无效
- 注意: suid 相对危险,不建议对 vim 或 rm 进行 suid 设定操作
2. sgid
- 当作用到二进制可执行文件时,命令在执行的过程中,会以命令的属组身份运行该命令
- 当⼀个⽤户对某⼀⽬录有写和执⾏权限时,该⽤户就可以在该⽬录下建立文件,如果该⽬录同时⽤ 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基础权限之上
作用:
- 创建一个文件,不允许被修改、移动、删除,包括 root 也不行–>适合 /etc/passwd
- 创建一个文件,仅允许往文件里面追加数据,不允许修改、移动、删除。–>适合 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,在系统哪个配置文件有设定呢?
- 当用户登陆系统时,会加载 /etc/profile 环境变量文件
- 在该配置文件中有一条 UMASK 的判断语句
- 如果用户 UID 小于 199 那么就将 UMASK 初始化为 022
- 如果用户 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值 | 操作方式 | 计算后⽂件实际权限 |
---|---|---|---|
666 | 022 (每位如果都是偶数) | 直接相减即可 | 644 |
666 | 033 (每位如果有奇数也有偶数) | 相减(奇数位相减后在其原奇数位加1) | 644 |
666 | 325(每位如果有奇数或偶数) | 相减(奇数位相减后在其原奇数位加1) | 422 |
目录权限计算方法:直接相减即可
目录的起始权限值 | umask值 | 操作方式 | 计算后目录权限 |
---|---|---|---|
777 | 022 | 相减 | 755 |
777 | 033 | 相减 | 744 |
777 | 325 | 相减 | 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有效权限
A | B | 与 |
---|---|---|
r | r | r |
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--