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
文件的权限如下
|
|
shadow
文件所有者是root
,权限为0640
。在这个权限中,仅有root可以存储,其他人是连看都不行的。
现有普通用户hex
也有更新自身密码的需求,即使用/usr/bin/passwd
命令,存取/etc/shadow
密码文件。
这是因为/usr/bin/passwd
的文件权限如下
|
|
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权限:用户具备此权限才能查看文件属性和内容(
ls
与cat
); - w权限:用户具备此权限才能创建、修改、删除文件和子目录;
举例来说,/tmp
本身的权限是“drwxrwxrwt”,在这样的权限内容下,任何人都可以在/tmp内新增、修改文件,但仅有该文件/目录的建立者与root能够删除自己的目录或文件。
以root登入系统,并且进入 /tmp中。
touch test,并且更改test权限成为777.
以一般用户登入,并进入 /tmp.
尝试删除test文件。
2.4 设置特殊权限
通常使用 chmod xyz filename
方式来设置filename
的权限时,是假设没有SUID
、SGID
及SBIT
。而在三位前增加一位用来表示这些特殊权限:
4为
SUID
2为
SGID
1为
SBIT
3=
SGID
+SBIT
; 5=SUID
+SBIT
; 6=SUID
+SGID
; 7=SUID
+SGID
+SBIT
;
例如:test
文件权限为默认权限-rw-rw-r--
|
|
为此文件test
设置SUID
权限,即设置s在用户权限中。因此,在原先的664
之前还要加上4。命令如下:
|
|
查看修改后文件权限为
|
|
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权限未生效。
S_ISUID
的表示方式。所属用户的S_IXUSR(x位)
为S_ISUID
所共用:- 当
S_IXUSR
和S_ISUID
共存时,用小写s表示; - 当只设置了
S_ISUID
时,用大写S表示(权限未生效);
- 当
S_ISGID
的表示方式。所属用户的S_IXGRP(x位)
为S_ISGID
所共用:- 当
S_IXGRP
和S_ISGID
共存时,用小写s表示; - 当只设置了
S_ISGID
时,用大写S表示(权限未生效):
- 当
S_ISVTX
的表示方式。所属用户的S_IXOTH(x位)
为S_ISVTX
所共用:- 当
S_IXOTH
和S_ISVTX
共存时,用小写t表示; - 当只设置了
S_ISVTX
时,用大写T表示(权限未生效):
- 当
综上:大写字母意味着该位[u|g|o]没有x
权限,小写字母意味着该位[u|g|o]有x
权限。因为特殊权限都必须具备x
权限,所以:
- 大写意味着权限一定未生效;
- 小写意味着权限不一定生效;(比如,SUID设置在目录;SBIT设置在文件等,仍小写但无效)
2.5.3 区别
S_UID | S_GID | T | |
---|---|---|---|
权限号(rwx set 755) | 4755 | 2755 | 1755 |
文件对象 | 二进制、可执行文件 | 二进制、可执行文件;目录 | 目录 |
生效条件 | 文件属主必须先设置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]: 鸟哥-常见指令需要的基本权限