深入理解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。
这个特殊权限的作用如下:
    1. SUID权限仅对二进制程序(binary program)有效
    1. 执行者对于该程序需要具有x的可执行权限
    1. 本权限仅在执行该程序的过程中有效(run-time)
    1. 执行者将具有该程序拥有者(owner)的权限
SUID的目的是:让本来没有响应权限的用户运行这个程序时,可以访问他没有权限访问的资源。
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有几点需要大家注意一下:
    1. SGID对二进制程序有用;
    1. 程序执行者对于该程序来说,需具备x权限;
    1. SGID只要用在目录上(将目录设置SGID权限,在此目录下新建文件,该文件同目录属组相同),这点在创建共享目录时特别实用。
Sticky Bit(SBIT) 这个权限就是针对其他用户设置。SBIT目前只针对目录有效,对于目录的作用是,当用户在该目录下建立文件或目录时,仅有自己与root才有权限删除。
最具有代表的就是/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 所有位置零
【深入理解linux文件权限|深入理解linux文件权限 SUID、SGID、SBIT】以下都是例子,验证设置相应权限是否达到相应效果:
先看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

    推荐阅读