本次记录Linux特殊权限SUID、SGID、SBIT相关知识及使用实例等。
由于SUID和SGID涉及到系统安全,所以对它们知识点的掌握尤为重要。
SUID是Set User ID,SGID是Set Group ID的意思。
Linux下可以用ls �Cl命令来查看文件的权限。用ls命令所得到的表示法的格式是类似这样的:-rwxr-xr-x 这种方法共有十位
9 8 7 6 5 4 3 2 1 0
- r w x r - x r - x
第9位表示文件类型,可以为-、d、b、s、c、l、p
第8-6位、5-3位、2-0位分别表示文件所有者的权限,同组用户的权限,其他用户权限,其形式为rwx。
r表示可读,可读出文件的内容
w表示可写,可修改文件的内容
x表示可执行,可运行这个文件
没有权限的位置用-表示
例子:
ls -l myfile显示为:
-rwxr-x--- 1 foo staff 7734 Aug 05 17:18 myfile
表示文件myfile是普通文件,文件的所有者是foo用户,而foo用户属于staff组,文件只有1个硬连接,长度是7734个字节,最后修改时间8月5日17:18。
所有者foo对文件有读写执行权限,staff组的成员对文件有读和执行权限,其他用户对文件没有权限。
1. SUID权限
仅对二进制程序有效,执行者对该程序需要有x执行权限,在程序运行过程中,执行者拥有程序拥有者(owner)的权限。
例如:
普通用户执行passwd命令。
首先查看passwd命令的绝对路径及文件权限:
我们发现passwd的拥有者是root,且拥有者权限里面本应是x的那一例显示的是s,这说明此命令具有SUID权限。同时发现普通用户没有w权限,所以按理来说普通用户是不能执行这个命令的,因为这个命令修改了密码肯定是要写文件的。
进一步分析,实际上passwd这个命令会操作/etc/shadow这个文件,因为密码都是放在这里,查看密码文件权限:
发现权限为000,(注意:root用户对所有文件都是有rw权限的,对所有目录都是有rwx权限的),这意味着普通用户确实不能读或写这个文件。不过因为passwd命令具有SUID权限,所以普通用户执行这个命令时,当系统生成对应的进程后,这个进程就拥有了/usr/bin/passwd文件拥有者root的权限。
上面的操作在要输入密码时按CTRL+Z,回车。
查看进程树:可以发现确实passwd的权限不是bash而是root!
这种文件会在原权限值(假设是0755)之前加上4000,记为4755。通过chmod u+/-s FileName设定。
2. SGID权限
SGID权限可以应用在目录或可执行文件上。
1) 对于文件:
SGID对于二进制程序有用,程序执行者要有x权限,执行者在执行过程中会获得该程序用户组(group)的权限(相当于临时加入了程序的用户组)。
例如:
普通用户使用locate命令。
发现用户组权限中应该出现x的位置显示s,表示这个命令具有SGID权限。而普通用户只有x权限而没有rw权限。locate这个命令,实际上会去访问 /var/lib/mlocate/mlocate.db这个文件。
此文件对于普通用户没有任何权限。所以理论上普通用户执行locate命令是不行的。不过因为locate命令有SGID权限,所以运行locate生成进程时,这个进程会得到locate命令的用户组权限,相当于Allen这个用户被临时加入了用户组slocate内。于是就对mlocate.db这个文件有r权限,可以访问了。
2) 对于目录:
用户对于此目录具有r与x的权限时,可以进入目录;
用户在此目录下的有效用户组会变成该目录的用户组;
若用户在此目录下具有w的权限(可以新建文件),则用户所创建的新文件的用户组与此目录的用户组相同。实用于一组开发人员共用资源的场景。
实例:
一个团队想在Linux某个目录下协同做Cloud项目,那么每个团队成员都得对这个目录下的所有文件具有rwx权限。
于是我们首先新建一个名为cloudgrp的用户组,再新建几个账号,且每个账号的用户组都附加cloudgrp这个组。
然后新建文件夹,根据文件夹默认umask权限计算得出此文件夹权限为drwxr-xr-x。
可以看出只有root用户能在此文件夹新建文件,而其他用户没有写权限。须把目录权限设为775,且其属组更改为cloudgrp组,让属于这个组的其他用户有写文件权限。
现在账户developer可以新建文件,且文件的所有者和用户组都会是developer,这样的话诸如techusr等无法访问这个文件,无法达到协同工作的目标。
所以我们需要给这个目录加入SGID权限,之后任意一个用户创建的文件,文件用户组都会是cloudgrp。
文件夹会在原权限值(假设是0775)之前加上2000,记为2775。通过chmod g+/-s FileName设定。
3. Sticky Bit权限
作用于目录:若一个目录的Sticky bit被设置,那么只有这个目录的owner或root用户才能对目录中的文件或子目录进行删除和重命名。
该位可以理解为防删除位,一个文件是否可以被某用户删除,主要取决于该文件所属的组是否对该用户具有写权限。如果没写权限,则这个目录下的所有文件都不能被删除,同时也不能添加新的文件。如果希望用户能够添加文件但同时不能删除文件,则可以对文件使用Sticky bit位。设置该位后,就算用户对目录具有写权限,也不能删除该文件。
实例:
我们新建目录,且把一个文件复制到该目录下,此文件对所有人开放权限。
添加Sticky bit后,文件夹会在原权限值(假设是0755)之前加上1000,记为1755。通过chmod o+/-t FileName设定。
现在目录的权限变为:
尽管developer.b文件所有人有全部权限,但现在只有owner或root对其进行重命名和删除。
它可以保护文件,这也是 /tmp有Stick bit的原因。