Linux 文件系统上的特殊权限

简介

Linux的文件权限,远不止rwx那么简单,还有一些特殊权限是用来打破限制和默认的安全上下文规则的,除了之前介绍过的隐藏属性(详见《解决root无法删除文件的问题》),还有几个“显式”的特殊权限。下面就来说说Linux文件系统上的SUIDSGIDSticky权限。

普通权限和安全上下文规则

在说特殊权限前,先来说说耳熟能详的普通权限和安全上下文,毕竟特殊权限就是用来打破这个限制的。

user(rwx)group(rwx)other(rwx)

前提:进程有属主和属组;文件有属主和属组;

  • 任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限;
  • 启动为进程之后,其进程的属主为发起者;进程的属组为发起者所属的组;
  • 进程访问文件时的权限,取决于进程的发起者:
    • 进程的发起者,同文件的属主:则应用文件属主权限;
    • 进程的发起者,属于文件的属组;则应用文件属组权限;
    • 应用文件“其它”权限;

SUID

默认情况下,启动为进程之后,其进程的属主为发起者;进程的属组为发起者所属的组;

一旦某文件被设定了SUID,启动为进程之后,其进程的属主为原程序文件的属主;

注意:不能随便给基础命令赋SUID权限,比如catechovi等,否则任何人都可以使用cat,echovi修改系统上的绝大部分文件,因为这些基础命令的属主正是root

权限设定:

1
2
chmod u+s FILE...
chmod u-s FILE...

SGID

默认情况下,用户创建文件时,其属组为此用户所属的基本组;

一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件所属的组为此目录的属组

权限设定:

1
2
chmod g+s DIR...
chmod g-s DIR...

Sticky

对于一个多人可写的目录,如果设置了sticky,则每个用户仅能删除自己的文件(比如/tmp目录)(一个文件能否被删除,取决于是否有执行权限);

权限设定:

1
2
chmod o+t DIR...
chmod o-t DIR...

权限位映射

跟普通权限一样,特殊权限也需占用权限位。

SUID:user,占据属主的执行权限位;
s:属主拥有x权限
S:属主没有x权限

SGID:group,占据group的执行权限位;
s:group拥有x权限
S:group没有x权限

Sticky:other,占据other的执行权限位;
t:other拥有x权限
T:other没有x权限

SUID SGID STICKY MOD
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

eg:

1
2
3
4
chmod 4777 /tmp/a.txt

# 4的位置就是特殊权限,执行后会分别占据具体位置。
# 由于特殊权限不指定时默认不设置,所以一般的赋权,只使用`ugo`三位。