文件特殊权限SUID和SGID和SBIT
前言
特殊权限尽量少修改! 不安全!
(很久以前写的一篇学习笔记, 一直没有整理
作用
给执行该文件的用户临时赋予另一个用户(组)的权限。
比如设置密码
1 | ll /etc/shadow /usr/bin/passwd |
/etc/shadow
文件只能被root
用户修改。
但是借助passwd
命令, 普通用户可以临时变成root
来执行这个passwd
命令,
进而修改/etc/shadow
文件。
切换用户 SUID
只有可以执行的二进制程序才能设定SUID
权限。SUID
可以看成是Switch User ID
(一个瞎猜), 就是切换用户ID
.
- 创建两个文件
file1
和file2
- 添加
SUID
权限, 或者chmod u+s file
- 取消
SUID
权限, 或者chmod u-s file
1 | # 1. 创建两个文件 |
可以看到x
执行权限的位置被s
替换了。4755
和4655
的区别在于文件本身有没有x
执行权限。
并且可以得知s=S+x
, 并且注意!!! 大写S
是没有意义的。
只有小写s
才能被执行, 才能正确设定SUID
权限。
切换用户组 SGID
和SUID
一样, 区别在于用户会临时赋予文件所属用户组group
的身份, 而不是用户user
身份。Switch Group ID
比如**locate
命令**
1 | ll /usr/bin/locate /var/lib/mlocate/mlocate.db |
/var/lib/mlocate/mlocate.db
文件只能被slocate
组查看。
但是借助locate
命令, 普通用户可以临时变成slocate
来执行这个locate
命令,
进而查看/var/lib/mlocate/mlocate.db
文件。
除了和SUID
差不多的功能外。SGID
对目录还有另一个功能。
就是进入该目录后, 用户的用户组会变成SGID对应的用户组。
root
用户创建test
目录并赋予777
权限ahao
用户在test
目录下创建file1
root
用户为test
目录赋予SGID
权限ahao
用户在赋予SGID
的test
目录下创建file2
1 | # 1. root用户创建test目录并赋予777权限 |
可以看到赋予SGID
后, ahao
用户创建的file2
的所属组是root
。
防止被删除 sticky bit ( SBIT )
除了user
的SUID
、group
的SGID
外, 还有other
的sticky bit
。
sticky bit
有两个要求
- 只对目录有效。
- 文件权限为
rwxrwxrwx
, 也就是777
的权限。
比如/tmp
目录。
那么任何用户都能对目录下的文件进行读写执行操作, 这是很不安全的。
比如一个目录, 允许用户(other
)创建文件(写权限), 拥有了写权限的用户也同样拥有了删除权限。
也就是说在777
权限的目录下, A
用户创建的文件可能被B
用户删除。sticky bit
就是为了解决这个问题。
赋予目录sticky bit
后。
- 只有
root
有删除权限。 - 其他用户只能删除自己创建的文件。
- 其他用户拥有写权限。
下面举个例子
root
用户创建test
目录并赋予777
权限。root
用户创建file
文件。ahao
用户删除file
文件成功, 因为ahao
用户对test
目录有w写权限。root
用户对test
目录赋予sticky bit
权限。root
用户创建file
文件。ahao
用户删除file
文件失败, 即使ahao
用户对test
目录有w写权限。
1 | # 1. root用户创建test目录并赋予777权限 |
如果不能删除, 那我能不能覆盖掉呢? echo '' > file
我在Ubuntu
尝试了不能, 但是以前在CentOS
试过好像可以.
检查系统新增的SUID和SGID文件
1 | # 1. 先查找所有拥有SUID(4)和SGID(2)的文件 |