Please enable Javascript to view the contents

Linux查漏补缺-2-特殊权限[s·t]

 ·  ☕ 7 分钟

1.简介

​ 在kubernetes中部署mariadb服务,挂载local-storage时,binlog目录赋予777
权限,仍权限不足导致服务无法启动,后执行chmod 1777 binlog/ 解决问题。没有系统研究过linux的权限,以为rwx
是就是所有权限,缺少对特殊权限s和t权限的理解。

2.说明

s权限:强制位权限。可执行的文件搭配这个权限,便能得到特权,任意存取该文件的所有者能使用的全部系统资源。

请注意具备SUID/SGID权限的文件,黑客经常利用这种权限,以SUID/SGID配上root帐号拥有者,无声无息地在系统中开扇后门,供日后进出使用。

例如:

  • SUID举例 /usr/bin/passwd
  • SGID举例 /usr/bin/locate

t权限:粘滞位权限。一般只用在目录上,在具备此权限的目录下,任何用户可写入文档,又不让用户删除这个目录下他人的文档。

例如:

  • /tmp/var/tmp目录

2.1 SUID

Set UID:简称为SUID,s的权限是在用户。

把此进程的有效用户ID设置为此文件拥有者的用户ID,程序在执行过程中拥有文件拥有者的权限。仅可用在可执行二进制文件。

场景举例:

账号与密码的存放文件其实是/etc/passwd/etc/shadow)。而/etc/shadow文件的权限如下

1
2
3
4
5
6
7
8
9
hex@hex-PC:/tmp$ stat /etc/shadow
  File: /etc/shadow
  Size: 1427            Blocks: 8          IO Block: 4096   regular file
Device: 10302h/66306d   Inode: 21758432    Links: 1
Access: (0640/-rw-r-----)  Uid: (    0/    root)   Gid: (   42/  shadow)
Access: 2022-10-26 10:30:01.647835420 +0800
Modify: 2022-09-21 15:42:07.468201547 +0800
Change: 2022-09-21 15:42:07.472201579 +0800
 Birth: 2022-09-21 15:42:07.468201547 +0800

shadow文件所有者是root,权限为0640。在这个权限中,仅有root可以存储,其他人是连看都不行的。

现有普通用户hex也有更新自身密码的需求,即使用/usr/bin/passwd命令,存取/etc/shadow密码文件。

这是因为/usr/bin/passwd的文件权限如下

1
2
3
4
5
6
7
8
9
hex@hex-PC:/tmp$ stat /usr/bin/passwd 
  File: /usr/bin/passwd
  Size: 59976           Blocks: 120        IO Block: 4096   regular file
Device: 10302h/66306d   Inode: 49283913    Links: 1
Access: (4755/-rwsr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2022-09-19 15:45:14.219152977 +0800
Modify: 2022-03-14 16:59:13.000000000 +0800
Change: 2022-09-19 02:49:39.597789775 +0800
 Birth: 2022-09-19 02:49:39.597789775 +0800

passwd文件所有者是root,权限为4755

  • other位x权限说明普通用户具备此文件的可执行权限;
  • user位s权限说明当其他用户执行passwd时会获得文件passwd的拥有者root的权限。

有s权限的帮助,当普通用户hex执行/usr/bin/passwd时,会“暂时”得到passwd文件拥有者root的权限。

2.2 SGID

Set GID: 简称为SGID,s的权限是在group。

把此进程的有效用户组ID设置为此文件的组ID,程序在执行过程中拥有文件所属组的权限。

可以用在两个方面:

  • 文件:如果SGID设置在二进制文件上,则不论用户是谁,在执行该程序的时候,它的有效用户组(effective group)
    将会变成该程序的用户组所有者(group id)。

    举例来说,/usr/bin/locate 可以读取 /var/lib/mlocate/mlocate.db 这个文件的内容 , mlocate.db 的权限如下:

    1
    2
    3
    
    root@hex-PC:/tmp# ll /usr/bin/plocate /var/lib/plocate/plocate.db
    -rwxr-sr-x 1 root plocate   313904 Feb 17  2022 /usr/bin/plocate*
    -rw-r----- 1 root plocate 70159347 Oct 26 19:14 /var/lib/plocate/plocate.db
    

    SUID 类似,如果使用普通用户去执行 locate ,那 普通用户 将会取得 slocate 组的支持,
    因此就能够去读取 mlocate.db 文件

  • 目录:如果SGID设置在A目录上,则用户在A目录下新建的文件的群组都会与A目录的群组名称相同。

    • 用户若对于此目录具有 r 与 x 的权限时,该用户能够进入此目录;
    • 用户在此目录下的有效群组(effective group)将会变成该目录的群组;
    • 用途:若用户在此目录下具有 w 的权限(可以新建文件),则用户所创建的新文件,该新文件的群组与此目录的群组相同。

2.3 SBIT

Sticky Bit: 简称为SBit,只针对目录有效,对文件没有效果。

SBIT 对于目录的作用是:用户在该目录下建立文件或目录时,只有自己与root才有权力删除。

用户需要对SBIT标记的目录具备以下权限:

  • x权限:用户具备此权限才能进入目录;
  • r权限:用户具备此权限才能查看文件属性和内容(lscat);
  • w权限:用户具备此权限才能创建、修改、删除文件和子目录;

举例来说,/tmp本身的权限是“drwxrwxrwt”,在这样的权限内容下,任何人都可以在/tmp内新增、修改文件,但仅有该文件/目录的建立者与root能够删除自己的目录或文件。

  1. 以root登入系统,并且进入 /tmp中。

  2. touch test,并且更改test权限成为777.

  3. 以一般用户登入,并进入 /tmp.

  4. 尝试删除test文件。

2.4 设置特殊权限

通常使用 chmod xyz filename 方式来设置filename的权限时,是假设没有SUIDSGIDSBIT。而在三位前增加一位用来表示这些特殊权限:

  • 4为SUID

  • 2为SGID

  • 1为SBIT

3=SGID+SBIT; 5=SUID+SBIT; 6=SUID+SGID; 7=SUID+SGID+SBIT;

例如:test文件权限为默认权限-rw-rw-r--

1
2
3
4
5
hex@hex-PC:/tmp/perm-test$ ls -alh
total 4K
drwxrwxr-x  2 hex  hex  4.0K Oct 26 18:53 .
drwxrwxrwt 40 root root 4.0K Oct 26 17:29 ..
-rw-rw-r--  1 hex  hex     0 Oct 26 18:53 test

为此文件test设置SUID权限,即设置s在用户权限中。因此,在原先的664之前还要加上4。命令如下:

1
chmod 4664 test

查看修改后文件权限为

1
2
3
4
5
hex@hex-PC:/tmp/perm-test$ ls -alh
total 4K
drwxrwxr-x  2 hex  hex  4.0K Oct 26 18:53 .
drwxrwxrwt 40 root root 4.0K Oct 26 17:29 ..
-rwSrw-r--  1 hex  hex     0 Oct 26 18:53 test

2.5 延伸

2.5.1 SUID是否可用于bash脚本?否

不能用在批处理文件(shell脚本)上。这是因为shell脚本只是将很多二进制执行文件调进来执行而已。所以SUID的权限部分,还是要看shell脚本调用进来的程序设置,而不是shell脚本本身。

2.5.2 大写S与大写T说明

chmod命令不进行必要的完整性检查,即使不设置x权限就设置s权限,chmod也不会报错。当ls -l时看到rwS,大写S说明s权限未生效。

  1. S_ISUID的表示方式。所属用户的S_IXUSR(x位)S_ISUID所共用:
    • S_IXUSRS_ISUID共存时,用小写s表示;
    • 当只设置了S_ISUID时,用大写S表示(权限未生效);
  2. S_ISGID的表示方式。所属用户的S_IXGRP(x位)S_ISGID所共用:
    • S_IXGRPS_ISGID共存时,用小写s表示;
    • 当只设置了S_ISGID时,用大写S表示(权限未生效):
  3. S_ISVTX的表示方式。所属用户的S_IXOTH(x位)S_ISVTX所共用:
    • S_IXOTHS_ISVTX共存时,用小写t表示;
    • 当只设置了S_ISVTX时,用大写T表示(权限未生效):

综上:大写字母意味着该位[u|g|o]没有x权限,小写字母意味着该位[u|g|o]有x权限。因为特殊权限都必须具备x权限,所以:

  • 大写意味着权限一定未生效
  • 小写意味着权限不一定生效;(比如,SUID设置在目录;SBIT设置在文件等,仍小写但无效)

2.5.3 区别

S_UIDS_GIDT
权限号(rwx set 755)475527551755
文件对象二进制、可执行文件二进制、可执行文件;目录目录
生效条件文件属主必须先设置x权限文件属组必须先设置x权限- 目录具备w权限,可新建文件
- 目录具备rx权限,才能进入目录
设置命令chmod u+s <bin-exec文件>chmod g+s <bin-exec文件>chmod o+t <目录>
移除命令chmod u-s <bin-exec文件>chmod g-s <bin-exec文件>chmod o-t <目录>
权限显示(4755/-rwsr-xr-x)(2755/-rwxr-sr-x)(1755/-rwxr-xr-t)
生命周期仅在该程序的执行过程中有效同 S_UID文件读写

3.总结

  • 文件具有SUID的特殊权限时,代表用户执行此二进制程序时,在执行过程中用户会暂时具有程序拥有者的权限。
  • 目录具有SGID的特殊权限时,代表用户在这个目录下新建的文件的群组都会与该目录的群组名称相同。
  • 目录具有SBIT的特殊权限时,代表用户在该目录下创建的文件只有自己与root能够删除。

设置权限时,了解cat、ls、执行文件等操作所需的基本权限也很重要。可参考 注2:鸟哥-常见指令需要的基本权限

4.参考

[注1]: 鸟哥-特殊权限SUID说明

[注2]: 鸟哥-常见指令需要的基本权限

分享

Hex
作者
Hex
CloudNative Developer

目录