linux特殊权限
安全上下文
前提:进程有属主和属组;文件有属主和属组
- 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限
- 启动为进程之后,其进程的属主为发起者;进程的属组为发起者所属的组
- 进程访问文件时的权限,取决于进程的发起者:
- 进程的发起者,同文件的属主:则应用文件属主权限
- 进程的发起者,属于文件的属组;则应用文件属组权限
- 应用文件“其它”权限
SUID
在安全上下文中,可执行文件运行为进程,我们说进程的属主为发起者,进程的属组为发起者所属的组,而有了SUID之后,进程的属主为可执行文件的的属主,进程的属组为可执行文件的属组,举例来说,centos用户使用cat命令,而cat命令具有suid权限,且cat的属主属组为root,当centos用户运行cat命令是,cat进程是以root身份在运行,这是一种提权的机制。
[root@node1 ~]# ls -l `which passwd`
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
[root@node1 ~]# ls -l /etc/shadow
----------. 1 root root 618 Apr 19 13:31 /etc/shadow
对shadow文件来说,任何人都没有权限去修改这个文件的,除了root,但是我们普通用户也能去修改自己的密码(即修改这个文件)
这就是因为suid权限,当普通用户运行passwd命令是,passwd是以root身份运行的,所以普通用户能修改这个文件,
但是普通用户不能对别的用户进行密码修改,这不是权限的问题,这是passwd命令设计时,已经不允许带参数运行的,这是程序设计的问题
我们可以通过以下的事例来进行一个直观的展示
1.我们使用root复制一个cat命令到tmp下面,centos用户通过tmp/cat命令来查看shadow文件,会提示我们权限不够,这是因为/tmp/cat是使用centos的身份运行的
[root@node1 ~]# cp /bin/cat /tmp/cat
[centos@node1 ~]$ ls -l /tmp/cat
-rwxr-xr-x. 1 root root 54080 Apr 19 13:41 /tmp/cat
[centos@node1 ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
2.我们给/tmp/cat命令添加suid权限,之后,centos运行/tmp/cat命令时,cat命令会以root的身份运行,我们就能查看到文件内容了
[root@node1 ~]# chmod u+s /tmp/cat
[root@node1 ~]# ll /tmp/cat
-rwsr-xr-x. 1 root root 54080 Apr 19 13:41 /tmp/cat
[root@node1 ~]# su - centos
Last login: Thu Apr 19 13:42:14 CST 2018 on pts/0
[centos@node1 ~]$ /tmp/cat /etc/shadow
root:$6$w9yEckZNJGkFhFRL$AovfVTQMMKriSutU/RMKqTmXKaNkZbrgXtKpg3Op4ZmHWptujFySoUe.EZv2Ciu63VmL52cgRl/cP0JYCWNUp/::0:99999:7:::
bin:*:17110:0:99999:7:::
daemon:*:17110:0:99999:7:::
SGID
默认情况下,用户创建文件时,其属组为此用户所属的基本组;
一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组
1.创建一个组distro,让distro组的目录有写权限
[root@node1 tmp]# groupadd distro
[root@node1 tmp]# chown :distro test/
[root@node1 tmp]# chmod g+w test/
[root@node1 tmp]# ll -dh test/
drwxrwxr-x. 2 root distro 6 Apr 19 14:00 test/
2.将一个普通用户centos加到distro组中,然后让其在目录中添加一个文件,我们会发现文件的属组是centos
[root@node1 tmp]# usermod -a -G distro centos
[root@node1 tmp]# su - centos
Last login: Thu Apr 19 13:50:11 CST 2018 on pts/2
[centos@node1 ~]$ touch /tmp/test/test.txt
[centos@node1 ~]$ ll /tmp/test/test.txt
-rw-rw-r--. 1 centos centos 0 Apr 19 14:07 /tmp/test/test.txt
3.当我们对目录赋予了Ssgid权限是,再次使用centos创建文件,我们会发现新文件的属组是distro(目录的属组),而不再是centos了,这就是sgid的用处
[root@node1 ~]# chmod g+s /tmp/test/
[root@node1 ~]# ll -hd /tmp/test/
drwxrwsr-x. 2 root distro 22 Apr 19 14:07 /tmp/test/
[centos@node1 ~]$ touch /tmp/test/test2.html
[centos@node1 ~]$ ll /tmp/test/test2.html
-rw-rw-r--. 1 centos distro 0 Apr 19 14:12 /tmp/test/test2.html
Sticky
对于一个多人可写的目录,如果设置了sticky,则每个用户仅能删除自己的文件,实现文档共享
对于上面的sgid目录,无论是哪个用户,只要属于目录的属组,就能任意删除其他用户的文件,这也是很危险了,所以我们通常将sgid跟sticky一起用,这样,用户就只能删除自己的文件,而不能删除别人的文件了。可以实现文件共享了
[root@node1 ~]# chmod o+t /tmp/test/
[rex@node1 ~]$ touch /tmp/test/test.rex
[centos@node1 ~]$ rm -rf /tmp/test/test.rex
rm: cannot remove ‘/tmp/test/test.rex’: Operation not permitted
八进制表示法
| 特殊权限| 数字 |
| :--- | :-----: | -----: |
| sticky | 1 |
| sgid | 2 |
| suid | 4 |
[centos@node1 ~]$ chmod 4777 /tmp/test/test.txt
[centos@node1 ~]$ ll /tmp/test/test.txt
-rwsrwxrwx. 1 centos centos 0 Apr 19 14:07 /tmp/test/test.txt
几个权限位映射:
SUID: user, 占据属主的执行权限位
- s: 属主拥有x权限
- S:属主没有x权限
SGID: group, 占据group的执行权限位
- s: group拥有x权限
- S:group没有x权限
Sticky: other, 占据ohter的执行权限位; - t: other拥有x权限
- T:other没有x权限

浙公网安备 33010602011771号