Unix下关于文件权限的说明

9  8  7  6  5  4  3  2  1  0
-  r  w  x  r  -  x  r  -  x

第9位表示文件类型,类型说明:

文件类型 说明
p 管道文件
d 目录文件
l 符号连接文件
- 普通文件
s socket文件
c 字符设备文件
b 块设备文件

第8-6位 文件所有者权限 第5-3位 同组用户权限 第2-0位 其他用户权限

r表示可读 w表示可写 x表示可执行

uid

真实用户ID

gid

真实组ID

euid

有效用户ID

egid

有效组ID

SUID和SGID详细说明

在unix中,内核是通过euid和egid来确定一个进程对于资源的访问权限。

如果一个进程没有SUID和SGID位,那么权限为euid=uid,egid=gid,权限的话就是运行这个程序的用户权限。

如果进程有SUID和SGID位,那么euid和egid为设置的用户权限,uid和gid为实际用户权限,程序运行的时候,内核根据euid和egid来判断进程的资源访问权限。

SUID

该权限仅对二进制程序有效,执行者对于该程序需要拥有可执行权限,权限是在程序执行的过程中有效。

目的:让本来没有相应权限的用户运行这个程序的时候,可以访问他本身没有权限访问的资源。

例子:passwd

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 54256 May 16  2017 /usr/bin/passwd*

$ ls -l /etc/shadow
-rw-r----- 1 root shadow 1042 Jun  1 06:00 /etc/shadow

我们知道用户密码保存在/etc/shadow,这个文件的权限如上,可以看到只有root用户有读写权限,同组只有读权限,其他用户没有任何权限,但是我们在使用passwd这个命令的时候,哪怕普通用户也是可以修改密码,这个就是SUID的作用。

首先/usr/bin/passwd是任何用户都有权限执行的,这个程序设置了SUID,因此所有用户执行这个程序的时候,就拥有了root用户的权限访问系统资源。

SUID的优先级比SGID高,当一个二进制程序设置了SUID,则SGID会变成相应的egid。

SGID

SGID主要用在目录上,其他的和SUID相似。

目的:让程序或者目录拥有所属用户组的权限。

SBIT(Sticky Bit)

针对others设置,和SUID和SGID相似。

目的:只针对目录有效,当用户在该目录下新建文件或目录时,仅有自己和root才有权限进行删除。

具有代表性的 /tmp 目录

$ ll / | grep tmp
drwxrwxrwt  10 root root  4096 Jun  5 15:17 tmp/

设置方法

chmod u+s <filename> 设置SUID位

chmod u-s <filename> 去掉SUID设置

chmod g+s <filename> 设置SGID位

chmod g-s <filename> 去掉SGID设置

chmod o+t <filename> 设置SBIT

  • 对应数字设置

4 为 SUID = u+s 2 为 SGID = g+s 1 为 SBIT = o+t

大写S和T问题

大写S和T是因为标记位没有可执行权限了,这个时候这个设置就相当于一个空权限,没有意义。有这个问题的时候,需要排查修复下。

参考网址

uid gid euid egid详解 - CSDN博客

Linux之特殊权限(SUID/SGID/SBIT) - dyh004 - 博客园