侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 747 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

Linux基础(30)之文件系统上的特殊权限

zze
zze
2019-10-22 / 0 评论 / 0 点赞 / 363 阅读 / 2785 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

回顾安全上下文

一个进程运行时,它拥有的权限取决于发起这个进程的用户的权限,所以这个进程的拥有的权限实际上就是发起该进程用户的权限。即:文件有属主和属组,进程同样有属主和属组。

1、任何一个可执行程序文件能不能启动为进程,取决于发起者对该程序文件是否拥有执行权限;
2、可执行程序文件启动为进程后,该进程的属主为发起者,进程的属组则为发起者的基本组;
3、进程访问文件时的权限,取决于进程的发起者:

  • 如果进程的发起者是要访问文件的属主,则应用该文件属主权限;
  • 如果进程的发起者的属组也是要访问文件的属组,则应用该文件的属组权限;
  • 否则应用文件的“其它”权限;

三种特殊权限

SUID

1、任何一个可执行程序文件能不能启动为进程,取决于发起者对该程序文件是否拥有执行权限;
2、可执行程序文件启动为进程后,该进程的属主为原程序文件的属主

示例

我们已经知道用户密码的配置文件为 /etc/passwd,查看该文件权限:

[root@localhost ~]# ll /etc/passwd
-rw-r--r--. 1 root root 1171 9月  13 15:14 /etc/passwd

可以看到,其它用户只拥有该文件的读权限,但是实际上我们使用普通用户也能通过 passwd 命令来修改密码,也修改了该文件的内容。而普通用户并没有对该文件的写权限,那么它为什么可以被普通用户间接修改呢?
查看 passwd 命令对应的可执行程序文件:

[root@localhost ~]# ls -l `which passwd`
-rwsr-xr-x. 1 root root 27832 6月  10 2014 /usr/bin/passwd

可以看到,passwd 的程序文件的属主执行权限位为 s,则表示该程序文件拥有 SUID 权限,所以任何普通用户都可以启动 passwd 为进程并间接使用 root 用户的身份来访问其它文件,/etc/passwd 文件对 root 用户来说是可写的,所以总结下来就是普通用户执行了 passwd 命令间接使用 root 用户的身份来修改了该文件。

权限的设定

  • chmod u+s FILE...:让文件拥有 SUID 权限;
  • chmod u-s FILE...:取消文件的 SUID 权限;

SGID

默认情况下,每一个用户使用命令来创建一个文件或目录时,被创建文件或目录的属组就为创建者用户所属的基本组。
一旦给了一个目录 SGID 权限,那么任何对此目录有写权限的用户在该目录中创建的目录或文件的属组就为该目录自身的属组,而不是创建者用户所属的基本组。

用户能否删除一个文件,取决于该用户对该文件所在的目录是否拥有写权限。

权限设定

chmod g+s DIR...:让目录拥有 SGID 权限;
chmod g-s DIR...:取消目录的 SGID 权限;

Sticky

Sticky 权限也叫粘滞位权限,对于一个多人可写的目录,如果设置了 Sticky 权限,则每个用户在该目录下只能删除自己的文件。
在 linux 中,/tmp/var/tmp 目录本身就具有 Sticky 权限,所以在该目录中,用户只能删除自己创建的文件。

权限设定

chmod o+t DIR...:让目录拥有 Sticky 权限;
chmod o-t DIR...:取消目录的 Sticky 权限;

特殊权限的八进制

可用八进制数按 SUID SGID STICKY 的顺序来同时表示三种特殊权限,如下:

000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7

在之前给文件或目录设置权限时我们通常使用一个 3 位的八进制数来分别表示属主、属组和其它用户拥有的权限,实际上我们还可以在前面补上一位来表示特殊权限,如 chmod 4666 /tmp/dir1 就是设置 /tmp/dir1 目录拥有 SUID 权限且属主、属组和其它用户同时拥有读写权限。

特殊权限位映射

  • SUID:占据属主的执行权限位,如果属主同时拥有执行权限,则该位 SUID 权限表现为 s,否则为 S
  • SGID:占据属组的执行权限位,如果属组同时拥有执行权限,则该位 SGID 权限表现为 s,否则为 S
  • Sticky:占据其它用户的执行权限位,如果其它用户同时拥有执行权限,则该位 STICKY 权限表现为 t,否则为 T
0

评论区