***linux系统中的特殊权限之SUID(Set UID)***
***linux系统中的特殊权限之SGID(Set GID)***
***linux系统中的特殊权限之SBIT(Sticky BIT)***
前言
在进入正题之前,让我们来看一条简单的linux命令
[root@centos7u6 ~]# ls -l
total 8
-rw-------. 1 root root 1409 Mar 13 12:22 anaconda-ks.cfg
drwxr-xr-x. 2 root root 119 Mar 28 20:13 test
以上面的test目录为例,linux系统中的文件,有9位基本权限,即 rwxr-xr-x ,其中:
- 左三位:定义属主(owner)的权限
- 中三位:定义属组(group)的权限
- 右三位:定义其他(other)的权限
同时,每3位又分别代表着不同的权限,分别为:
- r:readable, 读
- w:writable, 写
- x:excutable,执行
有权限时分别用3个字母表示,这9个权限位,决定一个用户了访问文件时,对该文件具有哪些权限。
但是除了这个9个权限位之外,linux系统中还有3个特殊权限位,即SUID、SGID、SBIT。
这里,我们先说说SUID,SGID和SBIT会放在后面的文章讲解。
SUID的作用
当一个用户运行一个程序时,如果这个程序拥有SUID权限,则当这个程序运行为进程时,进程的属主不再是其发起者,而是这个程序文件自己的属主。
下面,为了更好的理解SUID的作用,我们用一个简单的示例来展示。
进程安全上下文
当一个用户发起一个进程去访问一个文件时,这个进程是以该用户的身份和权限对文件完成相关操作,这个过程基于一个简单的权限匹配模型:
- 第一步,判断进程的属主与被访问文件的的属主是否相同,
- 如果相同,则直接应用属主的权限去访问文件;
- 如果不同,则进入第二步;
- 第二步,判断进程的属主与被访问文件的属组是否相同,
- 如果相同,则应用属主的权限去访问该文件;
- 如果不同,则进入第三步;
- 第三步,应用其他(other)的权限去访问该文件;
实例讲解
默认的情况(不使用SUID)
这里我们使用less命令来进行简单演示
- #查看/bin/less命令的权限和属主属组
[root@centos7u6 ~]# ls -l /bin/less
-rwxr-xr-x. 1 root root 158240 Jul 31 2015 /bin/less
- #安全起见,我先将/bin/less命令拷贝至/tmp/目录下,以便后期修改其SUID权限
[root@centos7u6 ~]# cp /bin/less /tmp/
- #这里注意,/tmp/less的权限同/bin/less一样,属主和属组都是root
[root@centos7u6 ~]# ls -l /tmp/less
-rwxr-xr-x. 1 root root 158240 Mar 29 23:47 /tmp/less
- #现在切换至tom用户,并使用less命令查看
注意:这个地方,不要使用q退出less命令,以保证less进程存在
[root@centos7u6 ~]# su - tom
Last login: Fri Mar 29 23:32:38 on pts/1
[tom@centos7u6 ~]$ /tmp/less /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed Mar 13 12:15:41 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=c67d3986-456a-44c8-898b-4517da247de1 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
- #使用另一个终端,或者ssh登录到这台主机,并查看进程
[root@centos7u6 ~]# ps aux| grep less
tom 56820 0.0 0.1 110308 1008 pts/1 S+ 00:04 0:00 /tmp/less /etc/fstab
root 57040 0.0 0.0 112708 976 pts/2 R+ 00:09 0:00 grep --color=auto less
总结:从以上几步可以看到,默认情况下,虽然/tmp/less的属主属组均为root,但是tom作为其他用户有执行权限,所以tom在使用/tmp/less命令时,发起的进程的属主是tom,并不是root。这符合之前提到的进程的安全上下文。
使用SUID的情况
- #现在,在刚才的默认情况的基础上,我们给予/tmp/less特殊权限SUID,
注意:文件的属主的执行权限变成了小s,不再是基本权限中的x。
[root@centos7u6 tmp]# chmod u+s /tmp/less
[root@centos7u6 tmp]# ls -l /tmp/less
-rwsr-xr-x. 1 root root 158240 Mar 29 23:47 /tmp/less
- #继续以tom用户运行/tmp/less命令,并且不退出
[tom@centos7u6 ~]$ /tmp/less /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed Mar 13 12:15:41 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root / xfs defaults 0 0
UUID=c67d3986-456a-44c8-898b-4517da247de1 /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
- #再次用其他终端登录这个主机并用ps aux查看进程
[root@centos7u6 tmp]# ps aux |grep less
root 57587 0.0 0.1 110308 1008 pts/1 S+ 00:20 0:00 /tmp/less /etc/fstab
root 57676 0.0 0.0 112708 976 pts/2 R+ 00:22 0:00 grep --color=auto less
总结:可以看到,当/tmp/less拥有了SUID权限后,虽然以tom用户执行/tmp/less命令,但是/tmp/less的进程的属主仍为root。
其实,SUID在linux中有一个非常常用的命令,使用了SUID权限,这个命令就是passwd。
[root@centos7u6 tmp]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
passwd命令拥有了这一特殊权限,使得除了root之外的用户去发起一个passwd命令的进程时,进程的属主为root,拥有root权限,这样就能够修改自己的密码了。不过,passwd是一个安全指数很高的命令,这保证了一个用户(除root外)无法去修改用户的密码。
SUID的语法
- 第一种方法
chmod u+|-s FILENAME
设置权限:chmod u+s /tmp/ls
取消:chmod u+s /tmp/ls - 第二种方法
SUID/SGID/SBIT三个特殊权限又形成了一个8进制权限位,所以在基于8进制赋权时,可以在默认的3位8进制数字左侧再加1位8进制数字,来代表特殊权限。
设置权限:chmod 4644 FILENAME
取消:
SUID | SGID | SBIT | 八进制权限 |
---|---|---|---|
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 |
判断文件是否有SUID权限
SUID的权限展示位,在属主的执行权限位上。
- 如果有SUID
- 属主原本有执行权限,则属主的执行权限位,显示为小s
- 属主原本没有执行权限,则属主的执行权限位,显示为大写S
- 如果没有SUID
- 属主的执行权限位,仍然按其基本权限,显示为x或者-
[root@centos7u6 tmp]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
使用SUID的注意事项
- 只有可执行的二进制程序才可以设置SUID
- 被设置SUID的文件属主必须具备可执行(x) 权限
- SUID的生命周期:当这个程序运行为进程时SUID有效,进程结束后,SUID权限也随之消失
- 这个权限有风险,慎用