临时小驻

求仁得仁,复无怨怼。

认识 Linux 文件的特殊权限

2018-10-25 00:45:00 +0800

Linux 里文件权限分三类:

  • 基本权限:可读 r、可写 w、可运行 x
  • 特殊权限:Set-UID (SUID)、Set-GID (SGID)、Sticky-Bit (SBIT)
  • 隐藏权限:本文不介绍

通过 ls 命令我们可以看到一组文件标志,显示有 10 项,实际有 13 项。

$ ls -ld /bin/ls
-rwxr-xr-x 1  root root 126584 Mar  3  2017 /bin/ls

$ ls -ld /usr/bin/passwd
-rwsr-xr-x 1  root root  54256 May 17  2017 /usr/bin/passwd

$ ls -ld /tmp
drwxrwxrwt 11 root root   4096 Oct 25 00:17 /tmp

显示的 10 项含义如下:

文件类型
所有者读  所有者写  所有者执行+SUID
组用户读  组用户写  组用户执行+SGID
其他人读  其他人写  其他人执行+SBIT

第 4 位的合并情况如下:

owner x SUID 显示结果
0 0 -
1 0 x
0 1 S
1 1 s

第 7 位的合并情况如下:

group x SGID 显示结果
0 0 -
1 0 x
0 1 S
1 1 s

第 10 位的合并情况如下:

other x SBIT 显示结果
0 0 -
1 0 x
0 1 T
1 1 t

跟基本权限类似,特殊权限可以用 chmod 命令设置:

chmod u+s  # 设置 SUID
chmod g+s  # 设置 SGID
chmod o+t  # 设置 SBIT

这些权限是什么意思呢?

SUID 只对可执行程序文件有效。
任何用户的进程在调用 exec 系列函数载入了该映像文件时,会将进程的 euid 和 suid 设为该文件所有者的 uid。

SGID 对可执行程序文件和目录有效。
应用在可执行程序文件上时,类似于 SUID,任何用户运行该程序都会将 egid 和 sgid 设为该文件的 gid。
应用在目录上时,任何用户在此目录下创建的文件、目录,都会将其 uid、gid 设为该目录的 uid、gid,而非创建者的 uid、gid。所创建的目录也会设置 SGID 位。

SBIT 只对目录有效。
设置了 SBIT 位的目录,里面的文件,只有 root、目录所有者、文件所有者可以移动、删除,同组用户和其他用户即使有 w 权限也不可。

关于进程的各项 UID 本文不做介绍。

SBIT 的效果可参见下例:

$ cd /tmp
$ sudo touch test
$ sudo chmod 0777 test
$ ls -ld test
-rwxrwxrwx 1 root root 2 Oct 25 00:36 a
$ echo aaa > test
$ rm test
rm: cannot remove 'test': Operation not permitted
$ sudo rm test

原文链接 https://blog.xupu.name//p/2018-10-the-special-permissions-of-linux-files/

如无特别指明,本站原创文章均采用 CC BY-NC-ND 4.0 许可,转载或引用请注明出处,更多许可信息请查阅这里