深入理解linux文件权限|深入理解linux文件权限 SUID、SGID、SBIT
细心的小伙伴们,一定会发现,根目录下面的tmp目录的权限与其他不同,后面权限出现了t。这就是我们的题目中提到的特殊文件权限。其实,Linux的文件权限除了rwx之外,还有s和t两个特殊权限。详见如下分析。
具体的例子如下:
[test@localhost ~]$ ll `which wall`
-r-xr-sr-x. 1 root tty 15344 Jun 102014 /usr/bin/wall
[test@localhost ~]$
Set-user Identification(SUID) 当s这个标志出现在文件所有者x权限的位置时,被称为Set UID,简称SUID。
这个特殊权限的作用如下:
-
- SUID权限仅对二进制程序(binary program)有效
-
- 执行者对于该程序需要具有x的可执行权限
-
- 本权限仅在执行该程序的过程中有效(run-time)
-
- 执行者将具有该程序拥有者(owner)的权限
eg:
[test@localhost /etc]$ ls -lrt /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 102014 /usr/bin/passwd
[test@localhost /etc]$
如例子中显示passwd的用户所有者的x权限位置为s,也就是设置了SUID特殊权限。系统中的用户密码保存在/etc/shadow文件中,而这个文件的权限是----------。用户修改密码是将密码写入shadow文件,不仅root用户可以修改密码,普通用户也是可以修改自己的密码的,没有写入权限却可以修改密码,就是因为有这个SUID功能;因为/usr/bin/passwd所有用户都有执行权限,当用户执行passwd命令时,获取到root权限,借助root的权力,修改shadow文件。
注意:SUID只能运行在二进制的程序上,可以理解为是系统中的一些命令,不能用在脚本上,不能设置目录的SUID,即使用上也是无效的Set-group identification(SGID) 当s这个标志出现在文件所属用户组x权限的位置时,被称为Set GID,简称SGID。如文章开头的/usr/bin/wall命令
同SUID一样,SGID获取该程序所属用户组的权限。
SGID有几点需要大家注意一下:
-
- SGID对二进制程序有用;
-
- 程序执行者对于该程序来说,需具备x权限;
-
- SGID只要用在目录上(将目录设置SGID权限,在此目录下新建文件,该文件同目录属组相同),这点在创建共享目录时特别实用。
最具有代表的就是/tmp目录,任何人都可以在/tmp内增加、修改文件(因为权限全是rwx),但仅有该文件/目录创建者与root能够删除自己的目录或文件
注意:SBIT对文件不起作用SUID/SGID/SBIT权限设置 同rwx权限设置基本一致,使用chmod命令,也有两种方式,一种是字符,一种是数字方式。
- 4为SUID = u+s
- 2为SGID = g+s
- 1为SBIT = o+t
二进制值 | 八进制值 | 描述 |
---|---|---|
000 | 0 | 所有位都清零 |
001 | 1 | 粘着位置零 |
010 | 2 | SGID位置零 |
011 | 3 | 粘着位和SGID位置零 |
100 | 4 | SUID位置零 |
101 | 5 | 粘着位和SUID位置零 |
110 | 6 | SGID和SUID位置零 |
111 | 7 | 所有位置零 |
先看SUID的作用及设置。
新建测试目录,并新建passwd和testdir目录
[root@localhost ~]$ cd sst/
[root@localhost ~/sst]$ ls
[root@localhost ~/sst]$ cp /usr/bin/passwd .
[root@localhost ~/sst]$ mkdir testidr
[root@localhost ~/sst]$ ll
总用量 28
-rwxr-xr-x 1 root root 27832 Mar 19 15:48 passwd
drwxrwxr-x 2 root root6 Mar 19 15:48 testidr
[root@localhost ~/sst]$
切换用户test,并修改test的密码
[root@localhost ~/sst]$ su test
密码:
[root@localhost sst]$ ./passwd
更改用户 test1的密码 。
为 test 更改 STRESS 密码。
(当前)UNIX 密码:
新的 密码:
重新输入新的 密码:
passwd: 鉴定令牌操作错误
[test@localhost sst]$
从上面例子中,发现test并能修改自己的密码,因为没有权限把密码吸入到/etc/shadow中,这就用到SUID特殊权限。
[test@localhost ~/sst]$ ll
总用量 28
-rwxr-xr-x 1 root root 27832 Mar 19 16:05 passwd
drwxrwxr-x 2 root root6 Mar 19 15:48 testidr
[test@localhost ~/sst]$ sudo chmod u+s passwd
[test@localhost ~/sst]$ ./passwd
更改用户 test 的密码 。
为 test 更改 STRESS 密码。
(当前)UNIX 密码:
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[test@localhost ~/sst]$
把SUID权限去掉,用数字方式来设置
[test@localhost ~/sst]$ sudo chmod 0755 passwd
[test@localhost ~/sst]$ ll
总用量 28
-rwxr-xr-x 1 root root 27832 Mar 19 16:05 passwd
drwxrwxr-x 2 root root6 Mar 19 15:48 testidr
[test@localhost ~/sst]$
数字方式,将八进制数字加到标准3位八进制值之前(组成4位八进制值)再看看SGID的作用及设置 下面以testdir目录为例
[test@localhost ~/sst]$ ll
总用量 28
-rwxr-xr-x 1 root root 27832 Mar 19 16:05 passwd
drwxrwxr-x 2 root root6 Mar 19 15:48 testidr
[test@localhost ~/sst]$ ll testidr/
总用量 0
[test@localhost ~/sst]$ sudo chmod 757 testidr/
[test@localhost ~/sst]$ ll
总用量 28
-rwxr-xr-x 1 root root 27832 Mar 19 16:05 passwd
drwxr-xrwx 2 root root6 Mar 19 15:48 testidr
当前任何用户对此目录都有写入权限,就在这个目录下创建文件或目录,并查看它们的权限
[test@localhost ~/sst]$ touch testidr/file_sgid
[test@localhost ~/sst]$ mkdir testidr/dir_sgid
[test@localhost ~/sst]$ ll testidr/
总用量 0
drwxrwxr-x 2 test test 6 Mar 19 16:32 dir_sgid
-rw-rw-r-- 1 test test 0 Mar 19 16:32 file_sgid
[test@localhost ~/sst]$
此时创建的文件及目录的所有者都是创建者本身。
给testdir目录设置SGID权限,再创建目录和文件
[test@localhost ~/sst]$ sudo chmod g+s testidr/
[sudo] password for test:
[test@localhost ~/sst]$ ll
总用量 28
-rwxr-xr-x 1 root root 27832 Mar 19 16:05 passwd
drwxr-srwx 3 root root37 Mar 19 16:32 testidr
[test@localhost ~/sst]$ touch testidr/file_sgid_new
[test@localhost ~/sst]$ mkdir testidr/dir_sgid_new
[test@localhost ~/sst]$ ll testidr/
总用量 0
drwxrwxr-x 2 test test 6 Mar 19 16:32 dir_sgid
drwxrwsr-x 2 test root 6 Mar 19 16:37 dir_sgid_new
-rw-rw-r-- 1 test test 0 Mar 19 16:32 file_sgid
-rw-rw-r-- 1 test root 0 Mar 19 16:37 file_sgid_new
[test@localhost ~/sst]$
从上例中,可以看出dir_sgid_new和file_sgid_new的所属组为root,也就是它们上层目录testdir目录的所属用户组。这个应用在一个项目的共同开发上,是很方便的。
还原testdir权限
[test@localhost ~/sst]$ sudo chmod g-s testidr
[sudo] password for test:
[test@localhost ~/sst]$ ll
总用量 28
-rwxr-xr-x 1 root root 27832 Mar 19 16:05 passwd
drwxr-xrwx 4 root root76 Mar 19 16:37 testidr
[test@localhost ~/sst]$
最后来看SBIT的作用及设置 模拟一种场景,一个普通用户在testdir目录下创建文件,登录另一个用户删除这个文件
[test@localhost ~/sst]$ ll
总用量 28
-rwxr-xr-x 1 root root 27832 Mar 19 16:05 passwd
drwxr-xrwx 4 root root76 Mar 19 16:37 testidr
[test@localhost ~/sst]$ rm -rf testidr/*
[test@localhost ~/sst]$ ll testidr/
总用量 0
[test@localhost ~/sst]$ touch testidr/test_file
[test@localhost ~/sst]$ ll testidr/
总用量 0
-rw-rw-r-- 1 test test 0 Mar 19 16:48 test_file
[test@localhost ~/sst]$ su test1
密码:
[test1@localhost sst]$ ll testidr/
总用量 0
-rw-rw-r-- 1 test test 0 Mar 19 16:48 test_file
[test1@localhost sst]$ rm -rf testidr/test_file
[test1@localhost sst]$
上面例子中,虽然其他用户对test_file只有只读权限,但由于test_file所在目录对其他人是全部权限,所以,其他用户时可以删除这个文件的。
下面加上SBIT权限,看结果
[test@localhost ~/sst]$ sudo chmod o+t testidr/
[sudo] password for test:
[test@localhost ~/sst]$ ll
总用量 28
-rwxr-xr-x 1 root root 27832 Mar 19 16:05 passwd
drwxr-xrwt 2 root root6 Mar 19 16:50 testidr
[test@localhost ~/sst]$ touch testidr/file_sbit
[test@localhost ~/sst]$ su test1
密码:
[test1@localhost sst]$ rm -f testidr/file_sbit
rm: 无法删除"testidr/file_sbit": 不允许的操作
[test1@localhost sst]$
即file_sbit文件不允许test1删除,也就是SBIT设置生效
还原SBIT权限
[test@localhost ~/sst]$ sudo chmod o-t testidr/
[test@localhost ~/sst]$ ll
总用量 28
-rwxr-xr-x 1 root root 27832 Mar 19 16:05 passwd
drwxr-xrwx 2 root root22 Mar 19 16:55 testidr
[test@localhost ~/sst]$
两个注意事项
- 用数字方式修改目录的特殊权限,不起作用
设置权限:
[test@localhost ~/sst]$ ll
总用量 28
-rwxr-xr-x 1 root root 27832 Mar 19 16:05 passwd
drwxr-xrwx 2 root root22 Mar 19 16:55 testidr
[test@localhost ~/sst]$ sudo chmod 4755 passwd
[test@localhost ~/sst]$ sudo chmod 3755 testidr/
[test@localhost ~/sst]$ ll
总用量 28
-rwsr-xr-x 1 root root 27832 Mar 19 16:05 passwd
drwxr-sr-t 2 root root22 Mar 19 16:55 testidr
[test@localhost ~/sst]$
去掉权限:
[test@localhost ~/sst]$ sudo chmod 0755 passwd
[test@localhost ~/sst]$ sudo chmod 0755 testidr
[test@localhost ~/sst]$ ll
总用量 28
-rwxr-xr-x 1 root root 27832 Mar 19 16:05 passwd
drwxr-sr-x 2 root root22 Mar 19 16:55 testidr
[test@localhost ~/sst]$
发现用这种方式增加三个特殊权限没有问题,对文件去掉特殊权限也没问题;但是对于目录,只去掉SBIT权限,对SGiD为去掉。这是Centos7环境 的结果,不知道问题出现在哪里,如果大神了解其中的原因,请留言沟通
- 有些权限设置之后会有S和T
将文件的用户组x权限去掉,目录的其他用户权限去掉
[test@localhost ~/sst]$ ll
总用量 28
-rwxr-xr-x 1 root root 27832 Mar 19 16:05 passwd
drwxr-xr-x 2 root root22 Mar 19 16:55 testidr
[test@localhost ~/sst]$ sudo chmod u-x passwd
[test@localhost ~/sst]$ sudo chmod o-x testidr
[test@localhost ~/sst]$ ll
总用量 28
-rw-r-xr-x 1 root root 27832 Mar 19 16:05 passwd
drwxr-xr-- 2 root root22 Mar 19 16:55 testidr
[test@localhost ~/sst]$
passwd设置SUID权限,testdir设置SBIT权限
[test@localhost ~/sst]$ sudo chmod u+s passwd
[test@localhost ~/sst]$ sudo chmod o+t testidr
[test@localhost ~/sst]$ ll
总用量 28
-rwSr-xr-x 1 root root 27832 Mar 19 16:05 passwd
drwxr-xr-T 2 root root22 Mar 19 16:55 testidr
[test@localhost ~/sst]$
从例子中看到,小s和t变成大S和T,这是因为他们的位置上没有x权限。特殊权限设置的前提是必须在有执行权限,所以设置特殊权限后,如果为大写S和T,请检查是否有执行权限。
参考文献:http://www.opsers.org/base/learning-linux-the-day-that-the-special-privileges-suid-sgid-sbit.html#toc-2
推荐阅读
- 深入理解Go之generate
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- 由浅入深理解AOP
- 逻辑回归的理解与python示例
- Linux下面如何查看tomcat已经使用多少线程
- 【1057快报】深入机关,走下田间,交通普法,共创文明
- Beego打包部署到Linux
- 生发知识,带你深入了解
- 「按键精灵安卓版」关于全分辨率脚本的一些理解(非游戏app)
- 深入理解|深入理解 Android 9.0 Crash 机制(二)