SUID
SUID
只能对文件设置
- 只对二进制可执行文件有效
- 执行者对文件有
x
权限,在执行此程序期间获取到程序所有者的身份
普通的文件权限
1 | -rwxrwxr-x |
设置了SUID
位的文件权限,拥有者的x
变为s
。
1 | -rwsrwxr-x |
设置方法
1 | chmod 4xxx <name> |
做一个实验验证,创建两个测试用户test-1 test-2
,登陆到test-1
并在家目录创下创建一个文件data.log
。
1 | ============ |
切换到/tmp
目录,建立一个读取data.log
的脚本,并为其分配755
权限。
1 |
|
1 | $ chmod 755 readlog.sh |
现在切换到test-2
用户,执行一下这个脚本看一下
1 | $ su test-2 |
肯定是没有权限读取的,切回test-1
用户,给脚本设置SUID
位,然后再切回test-2
并执行脚本
1 | $ su test-1 |
此时依然无法读取,说明对于shell
脚本,SUID
的设置是没有作用的。
这里我切到test-1
写一段go
程序,并编译成二进制文件。
1 | package main |
1 | $ go build readlog.go |
切回test-2
,执行这个二进制文件,没有权限。
1 | $ /tmp/readlog |
我们切回test-1
并给这个二进制文件设置SUID
位,再切回test-2
执行,已经可以读取到test-1
用户家目录下的文件了,说明这个执行过程中test-2
用户获取到了test-1
的身份。
1 | $ chmod 4755 readlog |
SGID
SGID
可以对文件或目录设置
文件
- 对二进制文件有效
- 执行者对文件有
x
权限,在执行期间获取到程序所属群组的权限
目录
- 对目录有
r
和x
权限的用户可以进入目录 - 用户在此目录下的有效群组将会变为该目录的群组
- 若用户在此目录具有
w
权限,则其创建的文件的所属群组与此目录的所属群组相同
- 对目录有
普通文件权限
1 | -rwxrwxr-x |
设置了SGID
权限,所属组的x
变为s
1 | -rwxrwsr-x |
设置方法
1 | chmod 2xxx <name> |
建立一个测试群组,创建一个目录并分配到这个群组上
1 | $ groupadd sgid-test |
切换到test-1
在这个目录创建一个文件试试看
1 | $ su test-1 |
这时创建的文件属于test-1
用户和test-1
分组
切回管理员账户并给改目录设置SGID
,再用test-1
创建一个文件试一下
1 | $ su - |
可以看到这时test-1
创建的文件属于test-1
用户和sgid-test
分组
SBIT
SBIT
只能对目录设置,设置了该权限之后,对此目录有w
和x
权限的用户,在该目录内创建的文件之后用户自己与root
有权限删除。
1 | drwxrwxrwt. 8 root root 177 Mar 14 16:55 tmp |
test-1
在/tmp
创建文件并给予全部权限,再切到test-2
对其进行一些操作
1 | $ echo "test" > /tmp/test.txt |
空权限
1 | $ ls -l |
此文件的所有者、所属组及其他人均没有x
权限,此时设置SUID
、SGID
、SBIT
来看一下
1 | $ chmod 7644 s-test |
可以发现对于没有x
权限的文件设置这三种属性,则x
权限位分别变为S
、S
和T