文件特殊权限分为三种
SetUID SetGID Sticky Bit
SetUID 的功能
只有可执行的二进制程序才能设定SUID权限
命令执行者要对该程序拥有x权限
命令执行者在执行该程序时获得该程序文件的属主身份
SetUID权限只在程序执行的过程中有效,也就是说身份改变只在程序执行过程中有效。
passwd命令用于SetUID权限,所以普通用户可以通过此命令修改自己的密码,既更改shadow文件
-rwsr-xr-x 1 root root 47032 Feb 16 2014 /usr/bin/passwd*
cat命令没有SetUID权限,所以普通用户不能用它查看/etc/shadow文件内容
-rwxr-xr-x 1 root root 47904 Mar 24 2014 /bin/cat*
设定SetUID的方法
4代表SUID 这个权限就是正常权限的4,2,1
chmod 4775 文件名
chmod u+s文件名
取消SetUID的方法
chmod 755 文件名
chmod u-s 文件名
举一个设置时报错的例子:
touch test.sh
-rw-rw-r-- 1 Test Test 0 Apr 2 22:17 test.sh
chmod u+s test.sh
-rwSrw-r-- 1 sim3scm sim3scm 0 Apr 2 22:17 test.sh
之所以是大S是因为 源文件的权限是664没有可执行的x,所以设置SUID也不对。
SetGID的功能
只有可执行的二进制文件才能设置SGID权限
命令执行者要对该程序拥有x权限
命令执行者在执行程序的时候,组身份升级为该程序文件的属组
SetGID权限同样只在该程序执行过程中有效,也就是组身份改变只能在程序执行过程中有效。
[root@Liu-Centos ~]# ll /usr/bin/locate
-rwx--s--x. 1 root slocate 35612 8月 24 2010 /usr/bin/locate
[root@Liu-Centos ~]# ll /var/lib/mlocate/mlocate.db
-rw-r-----. 1 root slocate 1619014 3月 30 06:16 /var/lib/mlocate/mlocate.db
/usr/bin/locate 是可执行的二进制程序,可以赋予SGID权限
执行用户A 对/usr/bin/locate 命令有可执行权限
执行/usr/bin/locate 命令时,组身份会升级为slocate
而slocate组对mlocate.db数据库有r权限
所以普通用户可以用locate命令查询此数据库。
而且sgid还能针对目录起作用,suid只能针对文件起作用
普通用户必须对此目录,也就是有sgid权限的目录,拥有r和x权限,才能进入目录。
普通用户在此目录中的有效组会变成此目录的属组。
若普通用户对此目录拥有w权限时,新建的文件的默认属组是这个目录的属组。
设定Setgid
chmod 2755 文件名
chmod g+s 文件名
chmod 755 文件名
chmod g-s 文件名
[root@Liu-Centos tmp]# mkdir /tmp/Test
[root@Liu-Centos tmp]# chmod 2777 Test/让普通用户可以在这个目录里写东西
[liu@Liu-Centos Test]$ touch abcd
[liu@Liu-Centos Test]$ ls -l abcd
-rw-rw-r--. 1 liu root 0 4月 2 03:16 abcd
Sbit 的功能
sbit粘着位权限只对目录有效果
普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限。
如果没有sbit权限,普通用户因为有w权限,可以删掉该目录下所有文件。
包括其他用户建立的文件。
但是目录一旦设置了粘着位权限,除了root可以删除所有文件。
普通用户就算有w权限,也只能删除自己建立的文件。
不能删除其他用户建立的文件。
[root@Liu-Centos /]# ls -ld /tmp/
drwxrwxrwt. 4 root root 4096 4月 2 03:15 /tmp/谁都可以用,但是不能乱删除
chmod 1755 目录名
chmod o+t目录名
chmod 755目录名
chmod o-t目录名