Yaitza

Linux上的特殊权限

特殊权限:SUID,SGID,STICKY

安全上下文:

1、进程以某用户的身份运行;进程是发起此进程用户的代理,因此以此用户的身份和权限完成此操作。
2、权限匹配模型:
(1)判断进程的属主,是否为被访问的文件属主;如果是,则应用属主的权限;否则检查访问控制列表的属主权限;再否则进入第2步;
(2)判断进程的属组,是否属于被访问的文件属组;如果是,则应用属组的权限;否则检查访问控制列表的属组权限;再否则进入第3步;
(3)使用Other权限。

1. SUID

默认情况下:用户发起的进程,进程的属主是属于发起者;因此,其以发起者的身份运行。
功用:用户运行某程序时,如果此程序拥有SUID权限,那么程序运行为进程时,进程的属主不是发起者,而程序文件自己的属主。
管理文件的SUID权限:

1
chmod u+|-s FILE…

展示位置:属主的执行权限位;如果属主原本有执行权限,显示为小写s;否则显示为大写S。
示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# ubuntu 用户查看/etc/shadow,提示无权限
ubuntu@YAITZA:/$ ls -l /etc/shadow
-rw-r----- 1 root shadow 929 Dec 17 15:42 /etc/shadow
ubuntu@YAITZA:/$ cat /etc/shadow
cat: /etc/shadow: Permission denied

# 构造新的cat程序,用ubuntu用户启动该进程,依旧提示无权限
ubuntu@YAITZA:/$ sudo cp /bin/cat /tmp/cat
ubuntu@YAITZA:/$ ls -l /tmp/cat
-rwxr-xr-x 1 root root 35064 Dec 17 16:08 /tmp/cat
ubuntu@YAITZA:/$ /tmp/cat /etc/shadow
/tmp/cat: /etc/shadow: Permission denied

# 给cat服务SUID权限,则使用/tmp/cat的进程属主权限查看/etc/shadown,则有权限
ubuntu@YAITZA:/$ sudo chmod u+s /tmp/cat
ubuntu@YAITZA:/$ ls -l /tmp/cat
-rwsr-xr-x 1 root root 35064 Dec 17 16:08 /tmp/cat
ubuntu@YAITZA:/$ /tmp/cat /etc/shadow
root:*:17737:0:99999:7:::
daemon:*:17737:0:99999:7:::

2. SGID

功用:当目录属组有写权限,且有SGID权限时,那么所有属于此目录的属组,且以属组身份在此目录中新建文件或目录时,新文件的属组不是用户的基本组,而是此目录的属组。
管理文件的SGID权限:

1
chmod g+|-s FILE…

展示位置:属组的执行权限位;如果属组原本有执行权限,显示为小写s;否则显示为大写S。
示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 创建用户centos,fedora;并附加组为mygrp
ubuntu@YAITZA:/var/tmp$ id centos
uid=1001(centos) gid=1002(centos) groups=1002(centos),1001(mygrp)
ubuntu@YAITZA:/var/tmp$ id fedora
uid=1002(fedora) gid=1003(fedora) groups=1003(fedora),1001(mygrp)
ubuntu@YAITZA:/var/tmp$ ls -l
total 0
-rw-rw-r-- 1 root mygrp 0 Dec 17 16:54 test
# test目录下对应用户创建文件,文件权限为对应的属主和属组
root@YAITZA:/var/tmp# ls -l
total 0
drwxrwxr-x 1 root mygrp 4096 Dec 17 16:58 test
centos@YAITZA:/var/tmp/test$ touch a.centos
fedora@YAITZA:/var/tmp/test$ touch a.fedora
ubuntu@YAITZA:/var/tmp/test$ ll
total 0
drwxrwxr-x 1 root mygrp 4096 Dec 17 17:00 ./
drwxrwxrwt 1 root root 4096 Dec 17 16:58 ../
-rw-rw-r-- 1 centos centos 0 Dec 17 17:00 a.centos
-rw-rw-r-- 1 fedora fedora 0 Dec 17 16:59 a.fedora
# 赋予test目录属组SGID权限
ubuntu@YAITZA:/var/tmp$ sudo chmod g+s test/
ubuntu@YAITZA:/var/tmp$ ls -l
total 0
drwxrwsr-x 1 root mygrp 4096 Dec 17 17:00 test
# 则centos,fedora用户创建的文件,属主为自己,属组为test的属组
ubuntu@YAITZA:/var/tmp/test$ ls -l
total 0
-rw-rw-r-- 1 centos centos 0 Dec 17 17:00 a.centos
-rw-rw-r-- 1 fedora fedora 0 Dec 17 16:59 a.fedora
-rw-rw-r-- 1 centos mygrp 0 Dec 17 17:03 b.centos
-rw-rw-r-- 1 fedora mygrp 0 Dec 17 17:03 b.fedora

3. STICKY

功用:对于属组或全局可写的目录,组内的所有用户或系统上的所有用户对此目录中都能创建新文件或删除所有的已有文件;如果为此目录设置STICKY权限,则每个用户能创建新文件,且只能删除自己的文件。
管理文件的SGID权限:

1
chmod o+|-t FILE…

展示位置:其他的执行权限位;如果其他原本有执行权限,显示为小写t;否则显示为大写T。
示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ubuntu@YAITZA:/var/tmp$ mkdir test
ubuntu@YAITZA:/var/tmp$ ll
total 0
drwxrwxrwt 1 root root 4096 Dec 17 17:13 ./
drwxr-xr-x 1 root root 4096 Jul 25 2018 ../
drwxrwxr-x 1 ubuntu ubuntu 4096 Dec 17 17:13 test/
ubuntu@YAITZA:/var/tmp$ ll
total 0
drwxrwxrwt 1 root root 4096 Dec 17 17:13 ./
drwxr-xr-x 1 root root 4096 Jul 25 2018 ../
drwxrwxrwt 1 ubuntu ubuntu 4096 Dec 17 17:18 test/
centos@YAITZA:/var/tmp/test$ ls -l
total 0
-rw-rw-r-- 1 centos mygrp 0 Dec 17 17:14 a.centos
-rw-rw-r-- 1 fedora mygrp 0 Dec 17 17:15 a.fedora
# test文件其他赋予STICKY权限后,fedora用户删除centos创建的文件,提示无权限
fedora@YAITZA:/var/tmp/test$ rm a.centos
rm: cannot remove 'a.centos': Operation not permitted

注意: 系统上的/tmp和/var/tmp目录默认均有sticky权限。
管理特殊权限的另一方式:

SUID SGID STICKY 八进制权限
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7

基于八进制方式赋权时,可与默认的三位八进制数字左侧再加一位八进制数字。
例如:

1
chmod 1777 FILE…

4. facl:file access control lists

4.1 文件的额外赋权机制

在原有的u,g,o外,另一层让普通用户能控制赋权给另外的用户或组的赋权机制。

4.2 getfacl命令

1
getfacl FILE…

4.3 setfacl命令

1
2
3
4
5
6
7
8
9
#赋权给用户
setfacl -m u:USERNAME:MODE FILE…
#赋权给组:
setfacl -m g:GROUPNAME:MODE FILE…

#撤销赋权给用户:
setfacl -x u:USERNAME:MODE FILE…
#撤销赋权给组:
setfacl -x g:GROUPNAME:MODE FILE…
🐶 您的支持将鼓励我继续创作 🐶