Linux粘滞位使用 - 运维笔记 (t权限)

在介绍Linux粘滞位之前,先来简单介绍一下文件权限和目录权限的区别。在linux系统中文件(文件和目录)的权限有三种(r,w,x),而这三种权限对文件和目录的意义有所不同。

权限对文件
r (read) :可读取该文件的实际内容;
w(write):可以编辑,新增或者修改该文件的内容(但不含删除该文件);
x(execute):代表该文件可以被系统执行

对于文件的r ,w, x来说,主要针对的"文件的内容"而言,与文件名的存在与否没有关系;

权限对目录
r (read):表示具有读取目录结构列表的权限,不如可以用ls查看一下目录有什么
w(write):而写的权限对目录来说就显得很强大了,代表具有更改该目录结构列表的权限。目录可写操作包括:新建文件或目录、删除文件或目录(不论文件的权限是什 么)、对文件或目录重命名、移动文件或目录等。  
x(execute):目录的X权限代表的是用户能否进入该目录称为工作目录。拥有此权限,就可以cd进去,否则,将不能进入目录内部。

一、粘滞位介绍
粘滞位(Stickybit),或粘着位。最常见的用法在目录上设置粘滞位,如此以来,只有目录内文件的所有者或者root才可以删除或移动该文件。如果不为目录设置粘滞位,任何具有该目录写和执行权限的用户都可以删除和移动其中的文件。在linux系统的实际应用中,粘滞位一般用于/tmp目录,以防止普通用户删除或移动其他用户的文件。一个目录具有粘滞位,则在other的X位会表现为 t,或者T。T和t的区别在于,原来x位上有x权限,有了粘滞位则表现为t,否则,则表现为T。

在Linux系统中比较典型的例子就是"/tmp"、 "/var/tmp"目录。这两个目录作为Linux系统的临时文件夹,权限为"rwxrwxrwx",即允许任意用户、任意程序在该目录中进行创建、删除、移动文件或目录等操作。试想一下:若任意一个普通用户都能够删除系统服务运行中使用的临时文件,将造成什么结果?

粘滞位权限便是针对此种情况设置,当目录被设置了粘滞位的t权限以后,即便用户对该目录有写入权限,也不能删除该目录中其他用户的文件数据,而是只有该文件的所有者和root用户才有权将其删除。设置了粘滞位的t权限之后,正好可以保持这种动态的平衡:允许各用户在目录中任意写入、删除数据,但是禁止随意删除其他用户的数据。需要注意: 粘滞位权限只能针对⽬录设置,对于⽂件⽆效。

正常情况下,在Linux系统中,如果对一个目录具有写权限,那么就可以在这个目录下创建删除文件。现在有这么个需求:如果现在需要创建这样一个目录,可以在这个目录里创建文件,但是其他用户不能删除这个文件。这里就要用到Linux这个特殊的权限:粘滞位,也就是t特殊权限!需要注意:粘滞位t权限给其它用户带来的安全限制 仅仅在于不能删除和移动/更名文件 (即粘滞位保护的是文件不被其他用户rm或mv,即使文件对其他用户有写权限,777都不行!),因为它针对的是目录。

在Linux中有三种特殊权限,分别为:
SetUID  =  4:在所有者设置的权限     
SetGID  =  2:在所属组设置的权限
粘着位  =  1:在其他人的位置设置的(使用t来表示)

SetUID  、SetGID、t权限的设置,之前已在另一篇文档中简单介绍:https://www.cnblogs.com/kevingrace/p/5823003.html,这里重点说下粘滞位的设置,对于授予了粘滞位权限的目录(目录权限777)来说:每个用户都能在这个目录里面创建文件,但是只能删除或移动自己创建的文件。

二、粘滞位应用
设置了粘滞位t权限的目录,使用ls命令查看其属性时,其他用户权限位置的"x"将变为"t"。

查看/tmp、 /var/tmp目录本身的权限,确认存在"t"标记。
[root@ss-server ~]# ll -d /tmp/
drwxrwxrwt. 8 root root 4096 Dec  6 03:46 /tmp/
[root@ss-server ~]# ll -d /var/tmp/
drwxrwxrwt. 3 root root 4096 Dec  3 20:18 /var/tmp/

粘滞位t权限都是针对其他用户(other)设置,使用chmod命令设置目录权限时,"o+t"、"o-t"权限模式可分别用于添加、移除粘滞位权限。

设置粘滞位权限方法
# chomd o+t
# chomd 1777

删除粘滞位权限方法
# chomd o-t

设置粘滞位t权限示例:

1)创建粘滞位t权限之前
用root身份创建/opt/kevin目录,并用参数-m 为它指定权限为777(可读,可写,可执行),并且所属者和所属组都是root。
[root@ss-server ~]# mkdir -m 777 /opt/kevin/          #-m参数表示mkdir创建时指定目录权限,省略了创建后再chmod授权("相当于chmod 777 /opt/kevin")
[root@ss-server ~]# ll -d /opt/kevin/
drwxrwxrwx 2 root root 4096 Dec  6 16:17 /opt/kevin/

接着在该目录下新建两个文件,权限为默认。因为其他用户other对/opt/kevin目录具有w权限,所以可以删除目录内容。
[root@ss-server kevin]# touch test1 test2
[root@ss-server kevin]# ll
total 0
-rw-r--r-- 1 root root 0 Dec  6 16:19 test1
-rw-r--r-- 1 root root 0 Dec  6 16:19 test2

切换到名为linan的普通用户,尝试去删除刚刚在root下新建的两个文件test1 和 test2。经过实践,发现可以删除。
[root@ss-server ~]# su - linan
Last login: Fri Dec  6 16:21:48 CST 2019 on pts/21
[linan@ss-server ~]$ cd /opt/kevin/
[linan@ss-server kevin]$ ll
total 0
-rw-r--r-- 1 root root 0 Dec  6 16:33 test1
-rw-r--r-- 1 root root 0 Dec  6 16:33 test2
[linan@ss-server kevin]$ 
[linan@ss-server kevin]$ ll
total 0
-rw-r--r-- 1 root root 0 Dec  6 16:33 test1
-rw-r--r-- 1 root root 0 Dec  6 16:33 test2
[linan@ss-server kevin]$ echo "123" > test1
-bash: test1: Permission denied
[linan@ss-server kevin]$ echo "123" >> test1
-bash: test1: Permission denied
[linan@ss-server kevin]$ mv test1 test11
[linan@ss-server kevin]$ ll
total 0
-rw-r--r-- 1 root root 0 Dec  6 16:33 test11
-rw-r--r-- 1 root root 0 Dec  6 16:33 test2
[linan@ss-server kevin]$ rm -rf test11
[linan@ss-server kevin]$ rm -rf test2
[linan@ss-server kevin]$ ll
total 0
[linan@ss-server kevin]$ 

需要注意:
1. 这时候其他普通用户对/opt/kevin目录下的文件可以进行删除和更名权限!尽管这些文件的other用户是r--,因为/opt/kevin目录在其他用户这一权限栏是rwx,
   即普通用户对/opt/kevin目录有可写权限。目录可写权限是指可对目录下的文件进行删除、新建和更名操作。
2. 但是此时,普通用户对/opt/kevin目录下的文件本身不能进行修改操作,因为/opt/kevin目录下的文件自身的其他用户这一权限栏是r--。
   如果文件权限对其他普通用户设置了可写权限,可就能进行文件修改操作!

===========================================================================================================================================
2)创建粘滞位t权限之后
回到root用户下,给/opt/kevin目录加上粘滞位再次查看目录,发现other的x权限变为t,说明添加粘滞位成功。
[linan@ss-server kevin]$ logout
[root@ss-server ~]# cd /opt/kevin/
[root@ss-server kevin]# ll -d
drwxrwxrwx 2 root root 4096 Dec  6 16:34 .
[root@ss-server kevin]# chmod o+t .             #或者直接执行"chmod o+t /opt/kevin"
[root@ss-server kevin]# ll -d      
drwxrwxrwt 2 root root 4096 Dec  6 16:34 .

依旧在该目录下重新新建两个文件 test1 和 test2。
[root@ss-server kevin]# touch test1 test2
[root@ss-server kevin]# ll 
total 0
-rw-r--r-- 1 root root 0 Dec  6 16:37 test1
-rw-r--r-- 1 root root 0 Dec  6 16:37 test2

再次切换到其他普通用户下,尝试对在/opt/kevin目录设置粘滞位权限后创建的文件test1 和 test2进行删除或更名操作。 
结果发现不能删除或更名文件!! (即使给文件授予777权限也不行)
可以证实粘滞位给其它用户带来的安全限制。
[root@ss-server kevin]# su - linan
Last login: Fri Dec  6 16:33:29 CST 2019 on pts/22
[linan@ss-server ~]$ cd /opt/kevin/
[linan@ss-server kevin]$ ll
total 0
-rw-r--r-- 1 root root 0 Dec  6 16:37 test1
-rw-r--r-- 1 root root 0 Dec  6 16:37 test2
[linan@ss-server kevin]$ rm -rf test1               
rm: cannot remove ‘test1’: Operation not permitted
[linan@ss-server kevin]$ rm -rf test2
rm: cannot remove ‘test2’: Operation not permitted
[linan@ss-server kevin]$ mv test1 test11
mv: cannot move ‘test1’ to ‘test11’: Operation not permitted
[linan@ss-server kevin]$ mv test2 test22
mv: cannot move ‘test2’ to ‘test22’: Operation not permitted

即使上面给test1、test1文件授予777权限,那么其他用户也不能删除或移动这两个文件!!!

为了进一步证实文件所有者和root依旧可以删除。用root对该文件进行删除操作。结果发现,依旧可以正常删除。
[linan@ss-server kevin]$ logout
[root@ss-server kevin]# ll
total 0
-rw-r--r-- 1 root root 0 Dec  6 16:37 test1
-rw-r--r-- 1 root root 0 Dec  6 16:37 test2
[root@ss-server kevin]# rm -rf test1
[root@ss-server kevin]# rm -rf test2
[root@ss-server kevin]# ll -d
drwxrwxrwt 2 root root 4096 Dec  6 16:48 .

再来验证下,当文件对other用户有可写权限的时候,粘滞位t权限的保护作用!
[root@ss-server kevin]# ll -d
drwxrwxrwt 2 root root 4096 Dec  6 17:00 .
[root@ss-server kevin]# touch test1 test2
[root@ss-server kevin]# chmod 777 test1
[root@ss-server kevin]# chmod 777 test2
[root@ss-server kevin]# ll
total 0
-rwxrwxrwx 1 root root 0 Dec  6 17:00 test1
-rwxrwxrwx 1 root root 0 Dec  6 17:00 test2

[root@ss-server kevin]# su - linan
Last login: Fri Dec  6 16:54:47 CST 2019 on pts/20
[linan@ss-server ~]$ cd /opt/kevin/
[linan@ss-server kevin]$ ll -d .
drwxrwxrwt 2 root root 4096 Dec  6 17:00 .
[linan@ss-server kevin]$ ll
total 0
-rwxrwxrwx 1 root root 0 Dec  6 17:00 test1
-rwxrwxrwx 1 root root 0 Dec  6 17:00 test2
[linan@ss-server kevin]$ echo "123" > test1
[linan@ss-server kevin]$ echo "123" >> test2
[linan@ss-server kevin]$ rm -rf test1
rm: cannot remove ‘test1’: Operation not permitted
[linan@ss-server kevin]$ mv test2 test22
mv: cannot move ‘test2’ to ‘test22’: Operation not permitted

可以看出,尽管test1、test2文件设置了777权限,但是由于它们所在目录/opt/kevin设置了粘滞位t权限!
则其他用户均不能对这两个文件执行rm和mv操作!!!!

再次回到root账号下,删除test1、test2文件
[linan@ss-server kevin]$ logout
[root@ss-server kevin]# ll
total 8
-rwxrwxrwx 1 root root 4 Dec  6 17:00 test1
-rwxrwxrwx 1 root root 4 Dec  6 17:01 test2
[root@ss-server kevin]# rm -rf test1
[root@ss-server kevin]# rm -rf test2
[root@ss-server kevin]# ll
total 0
[root@ss-server kevin]# ll -d .
drwxrwxrwt 2 root root 4096 Dec  6 17:01 .

根据以上示例,可以得出结论
当一个目录被设置为"粘滞位"的t权限后,则该目录下的文件只能由  
1. 超级管理员(root)删除或移动/更名(rm或mv)  
2. 该目录或文件的所有者删除或移动/更名(rm或mv)

需要注意
1. 虽然目录有了粘滞位t权限,other用户不能对该目录的文件进行删除或者移动操作,但是如若other对该文件由w权限,还是可以进行修改文件内容的。
2. 粘滞位只对目录有效,对文件无效。

删除粘滞位t权限的设置

[root@ss-server kevin]# chmod o-t /opt/kevin/        
[root@ss-server kevin]# ll -d .
drwxrwxrwx 2 root root 4096 Dec  6 17:01 .
上一篇:Linux运维笔记-日常操作命令总结(3)


下一篇:IOS开发学习笔记032-UITableView 的编辑模式