Loading

Linux SUID、SGID、SBIT详解

Linux SUID、SGID、SBIT详解

linux对文件、目录的权限控制可谓非常的细致,除了属主、属组、其他用户对应的rwx权限;ACL权限控制;chattr对文件、目录属性的控制,还有今天要说的文件的特殊权限SUID、SGID、SBIT。

一、UNIX下关于文件权限的表示方法和解析

SUID 是 Set User ID, SGID 是 Set Group ID,SBIT是Sticky Bit的意思。

UNIX下可以用ls -l 命令来看到文件的权限。用ls命令所得到的表示法的格式是类似这样的:-rwxr-xr-x 。下面解析一下格式所表示的意思。这种表示方法一共有十位:

9 8 7 6 5 4 3 2 1 0

- r w x r - x r - x

第9位表示文件类型,可以为p、d、l、s、c、b和-:

p 表示命名管道文件

d 表示目录文件

l 表示符号连接文件

- 表示普通文件

s 表示socket文件

c 表示字符设备文件

b 表示块设备文件

第8-6位、5-3位、2-0位分别表示文件所有者的权限,同组用户的权限,其他用户的权限,其形式为rwx:

r 表示可读,可以读出文件的内容

w 表示可写,可以修改文件的内容

x 表示可执行,可运行这个程序

没有权限的位置用-表示

例子:

ls -l myfile显示为:

# ls -lh myfile 
-rwxr----- 1 root root 700M 3月   9 14:16 myfile

表示文件myfile是普通文件,文件的所有者是root用户,所属组root,文件只有1个硬连接,大小是700M,最后修改时间3月9日14:16。

所有者root对文件有读写执行权限,root组的成员对文件有读权限,其他的用户对这个文件没有权限。

如果一个文件被设置了SUID、SGID、SBIT位,会分别表现在所有者或同组用户的权限的可执行位上。例如:

1、-rwsr-xr-x 表示SUID和所有者权限中可执行位被设置

2、-rwSr--r-- 表示SUID被设置,但所有者权限中可执行位没有被设置

3、-rwxr-sr-x 表示SGID和同组用户权限中可执行位被设置

4、-rw-r-Sr-- 表示SGID被设置,但同组用户权限中可执行位没有被社

5、drwxrwxrwt  表示SBIT黏着位被设置

其实在UNIX的实现中,文件权限用12个二进制位表示,如果该位置上的值是

1,表示有相应的权限:

11 10 9 8 7 6 5 4 3 2 1 0

S G T r w x r w x r w x

第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-0位对应于上面的三组rwx位,哪个位置上的权限被授予则该位置为1,否则就为0,再将这12位数字每三位一组转换成八进制就可以得到数值形式表示的权限,如:4755,只不过绝大多数文件没有特殊权限,所以我们会忽略第一位数值将0755写成755。

11 10 9 8 7 6 5 4 3 2 1 0

上面的-rwsr-xr-x的值为: 1 0 0 1 1 1 1 0 1 1 0 1

-rw-r-Sr--的值为:0 1 0 1 1 0 1 0 0 1 0 0

二、SUID、SGID、SBIT的详细解析

1) SETUID 的功能

  1. 只有可执行的二进制程序才能设置SGID权限,对脚本无效;
  2. 命令执行者要对该程序拥有x(执行)权限;
  3. 程序在执行过程中(runtime)获得该程序文件属主的身份。有点灵魂附体的感觉,可以是普通用户执行的程序拥有文件属主身份;
  4. SETUID 权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效。

例:

Linux 普通用户是可以修改自己的密码的,这不足为奇。但用户的密码是存在/etc/shadow这个文件的,如果你注意到shadow文件的权限你会发现所有用户都无权查看和修改(当然root是超级用户是有查看和修改的权限的),那么普通用户是如何修改自己的密码的呢?这就要归功于SUID权限了。

# ls -l /etc/shadow
---------- 1 root root 1280 2月   5 15:47 /etc/shadow
# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856 4月   1 2020 /usr/bin/passwd

可以看到/usr/bin/passwd拥有s权限,那么普通用户执行passwd命令时实际上进程是以root身份运行的,所以才可以修改shadow文件达到修改密码的目的。

SUID很有用,管理员可以授权普通用户只有root才有权限使用的命令如:ping、tcpdump等。SUID也是相对危险的,如当vim被授权SUID权限,普通用户将可以阅读修改原本没有权限的文件,例如/etc/shadow等等。

UNIX的内核是根据什么来确定一个进程对资源的访问权限的呢?是这个进程的运行用户的(有效)ID,包括user id和group id。用户可以用id命令来查到自己的或其他用户的user id和group id。

除了一般的user id 和group id外,还有两个称之为effective 的id,就是有效id,上面的四个id表示为:uid,gid,euid,egid。内核主要是根据euidegid来确定进程对资源的访问权限。

一个进程如果没有SUID或SGID位,则euid=uid egid=gid,分别是运行这个程序的用户的uid和gid。例如kevin用户的uid和gid分别为204和202,foo用户的uid和gid为200,201,kevin运行二进制程序形成的进程的euid=uid=204,egid=gid=202,内核根据这些值来判断进程对资源访问的限制,其实就是kevin用户对资源访问的权限,和foo没关系。

如果一个程序设置了SUID,则euid和egid变成被运行的程序的所有者的uid和gid,例如kevin用户运行myfile,euid=200,egid=201,uid=204,gid=202,则这个进程具有它的属主foo的资源访问权限。

SUID的作用就是这样:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。passwd就是一个很鲜明的例子。

SUID的优先级比SGID高,当一个可执行程序设置了SUID,则SGID会自动变成相应的egid。

  给文件加SUID的命令如下:

+ :在原有参数设定基础上,追加参数。

- :在原有参数设定基础上,移除参数。

= :更新为指定参数设定。

chmod u+s filename      设置SUID位
chmod 4755 filename     设置SUID位
chmod u=rwxs filename   指定文件所有者权限
chmod u-s filename      去掉SUID设置
chmod 755 filename    去掉SUID设置

2)SETGID 作用

SGID针对文件的作用

(1)如果是文件则只有可执行的二进制程序才能设置SGID权限;

(2)命令执行者要对该程序拥有x(执行)权限;

(3)程序在执行的时候,组身份升级为该程序文件的属组;

(4)SETGID权限同样只在程序执行过程中有效。

SGID针对目录的作用

(1)普通用户必须对此目录拥有r和x权限,才能进入此目录;

(2)普通用户在此目录中的有效组会变成此目录的属组;

(3)普通用户对此目录有w权限时,新建的文件默认属组是这个目录的属组。

  给文件配置SUID的命令如下:

chmod g+s filename 设置SGID位
chmod 2755 filename 设置SGID位
chmod g=rxs filename 设置SGID位
chmod g-s filename 去掉SGID设置
chmod 755 filename  去掉SGID设置

3)SBIT 粘着位作用

(1)粘着位目前只对目录有效;

(2)普通用户要对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限,没有w权限设置粘着位就失去了意义;

(3)想想有没有这么一种场景,就是所有用户都可以在此目录创建文件目录,也就是有w权限。但又不希望a用户创建的文件不被b用户删除,除了root其他用户只能删除自己的文件。没错/tmp目录就要具备这样的要求。那是如何做到的呢?只要给/tmp/目录赋予粘着位权限就可以了。只有root可以赋予粘着位权限。

#ls -ld /tmp
drwxrwxrwt. 16 root root 4096 3月   9 17:48 /tmp

  给文件配置SBIT的命令如下:

chmod o+t filename 设置SBIT黏着位
chomd 1755 filename    设置SBIT黏着位
chmod o-t filename  去掉SBIT设置

可能是出于安全的考虑,chmod命令使用数字表示权限来取消特殊权限可能会不生效,所以建议使用 + - 这种形式配置权限。

文件的特殊权限真的系统权限管理解决了不少问题,据说AT&T还为SUID/SGID申请了专利。

三、特殊权限带来的安全问题

SUID虽然很好了解决了一些问题,但是同时也会带来一些安全隐患。

因为设置了 SUID 位的程序如果被攻击(通过缓冲区溢出等方面),那么hacker就可以拿到root权限。因此在安全方面特别要注意那些设置了SUID的程序。

通过以下的命令可以找到系统上所有的设置了suid的文件:

[root@myhost /]# find / -perm -04000 -type f -ls

对于这里为什么是4000,大家可以看一下前面的st_mode的各bit的意义就明白了。

在这些设置了suid的程序里,如果用不上的,就最好取消该程序的suid位。

四、为什么会有大写的S和T

有时我们会看到权限位有大写的S或者T而不是正常的小写字母,这是为什么呢?我们实验看下。

[root@CentOS7.9 tmp]# ls -ld testdir/
drwxrwxrwt 2 root root 6 3月   9 11:19 testdir/      #testdir 目录当前权限正常
[root@CentOS7.9 tmp]# chmod o-rwx testdir/      #取代other用户的rwx权限
[root@CentOS7.9 tmp]# ls -ld testdir/     
drwxrwx--T 2 root root 6 3月   9 11:19 testdir/      #other用户最后一位权限有小写的t变成了大写的T

[root@CentOS7.9 tmp]# touch testfile
[root@CentOS7.9 tmp]# ls -ld testfile 
-rw-r--r-- 1 root root 0 3月   9 20:08 testfile
[root@CentOS7.9 tmp]# chmod u+s testfile     #给testfile加SUID权限(这里testfile只是个普通文件不是二进制文件,但这不影响实验结果)
[root@CentOS7.9 tmp]# chmod g+s testfile      #给testfile 加SGID权限
[root@CentOS7.9 tmp]# ls -ld testfile    
-rwSr-Sr-- 1 root root 0 3月   9 20:08 testfile     #权限位有两个大小的S

通过上面的示例可以看到 SUID、SGID、SBIT权限的设置需要文件的属主、属组和其他用户有相应的权限配合,当特殊权限和这些权限不匹配时就会显示为大写S或大写T,这时特殊权限是无效的,这一点需要注意。

posted @ 2021-03-09 11:01  五月的麦田  阅读(1529)  评论(0编辑  收藏  举报