1、SUID


使用SUID肯定满足一下几点:
1.SUID只对二进制文件有效
2.调用者对该文件有执行权
3.在执行过程中,调用者会暂时获得该文件的所有者权限
4.该权限只在程序执行的过程中有效
我们用passwd来举例,我们知道每个账户都能够修改自己的密码。

[hehe@vincent 1]$ which passwd
/usr/bin/passwd
[hehe@vincent 1]$ ll /usr/bin/passwd 
-rwsr-xr-x. 1 root root 30768 2月  22 2012 /usr/bin/passwd

passwd的拥有者是root,且拥有者权限里面本应是x的那一列显示的是s,这说明这个命令具有SUID权限。
因为改密码会写/etc/shadow文件,我们来看一下/etc/shadow文件的权限

[hehe@vincent 1]$ ll /etc/shadow
---------- 1 root root 1088 8月  14 03:28 /etc/shadow

发现权限是000,(注意:root用户对所有文件都是有rw权限的,对所有目录都是有rwx权限的),这意味着普通用户确实不能独读或写这个文件。
不过因为passwd命令具有SUID权限,所以普通用户执行这个命令时,当系统生成对应的进程后,这个进程就拥有了/usr/bin/passwd文件拥有者root的权限。
我们来切换到普通账户使用passwd,然后Ctrl+Z打断。然后用PS查看进程发现权限为root。

[vinc@vincent 1]$ ps axu | grep passwd | grep -v grep
root      88233  0.0  0.1 168088  1916 pts/0    T    04:06   0:00 passwd

另外例如ping命令

[root@server120 ~]# ls -al /bin/ping
-rwsr-xr-x. 1 root root 40760 9月 26 2013 /bin/ping

因为需要root权限才能打开网络套接字。

2、SGID


SGID对于二进制程序和目录有用
程序执行着要有x权限
执行者在执行过程中会获得改程序用户组的权限
1)当作用于文件时

[root@vincent 1]# which locate
/usr/bin/locate
[root@vincent 1]# ll /usr/bin/locate 
-rwx--s--x 1 root slocate 38464 10月 10 2012 /usr/bin/locate

发现用户组权限中应该出现x的位置显示的s,表示这个命令具有SGID权限。而普通用户只有x权限而没有rw权限。
locate这个命令,实际上会去访问/var/lib/mlocate/mlocate.db这个文件。

[root@vincent 1]# ll /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 4248718 8月  14 03:26 /var/lib/mlocate/mlocate.db

这个文件对于普通用户没有任何权限。所以理论上普通用户执行locate命令是不行的。
不过因为locate命令有SGID权限,所以运行locate生成进程时,这个进程会得到locate命令的用户组权限,相当于pstar这个用户被临时加入了用户组slocate。
于是就对mlocate.db这个文件有了r权限,可以访问了!
2)当作用于目录时
当用户对某一目录有写和执行权限时,该用户就可以在该目录下建立文件,如果该目录用SGID修饰,则该用户在这个目录下建立的文件都是属于这个目录所属的组。

 

3、SBIT


正常情况下一个目录的other权限为r-x,如果没有r权限的话,进入目录无法执行ls

[vinc@vincent 1]$ ls
ls: 无法打开目录.: 权限不够

而如果没有x权限的话,无法cd到目录下

[vinc@vincent opt]$ cd 1
bash: cd: 1: 权限不够

SBIT出现在其他用户权限的执行位上,它只能用来修饰一个目录。当某一个目录拥有SBIT权限时,则任何一个能够在这个目录下建立文件的用户,该用户在这个目录下所建立的文件,只有该用户自己和root可以删除,其他用户均不可以。

[root@vincent opt]# ls -ld /tmp/
drwxrwxrwt. 14 root root 4096 8月  14 03:26 /tmp/

我们看到/tmp就是这种文件。
我们来实验一下:
将/opt/1目录设置SBIT

[hehe@vincent 1]$ ls -ld /opt/1
drwsr-srwt 2 vinc vinc 4096 8月  14 04:27 /opt/1

在目录下新建文件,将权限修改为777,发现hehe目录无法删除。

[root@vincent 1]# touch 1
[root@vincent 1]# ls
1
[root@vincent 1]# chmod 777 1
[root@vincent 1]# su hehe
[hehe@vincent 1]$ rm -f /opt/1/1 
rm: 无法删除"/opt/1/1": 不允许的操作

那么如何设置权限呢
设置和查看SUID/SGID/SBIT权限的方法:
SUID是4   SGID是2  SBIT是1
chmod 4755 filename
第一个7代表的就是这三个特殊命令,后面的755是普通权限。上面的命令把filename这个文件加入了SUID权限。
查看特殊权限的方法就是普通的ls命令:
SUID会在所属用户权限本应是x的地方显示s
SGID会在所属用户组权限本应是x的地方显示s
SBIT在其它用户权限本应是x的地方显示t