一、为什么要使用特殊权限?
比如系统中假如有超过四类人然而每一类人都需要一种独特权限.只有三种独特权限的基础权限系统就会明显不够用.特殊权限可以扩展系统基础权限的功能,使得linux权限更加强大灵活
二、SUID
- chmod u[+-]s 文件 或 用数字表示 chmod 4755 文件
-rwsr-xr-x. 1 root root 30768 2月 22 2012 /usr/bin/passwd
- 在普通三位数字权限位之前,用4代表添加的SUID位
- 文件属主的x权限,用s代替.表示被设置了SUID
- 如果属主位没有x权限,会显示为大写S,表示有故障(权限无效)
- chmod 0xxx .... 可以删除文件的SUID(无法删除目录的SUID)
- 启动为进程之后,其进程的属主为原程序文件的属主;
- 只能作用在二进制程序上,不能作用在脚本上,且设置在目录上无意义 ;
- 执行suid权限的程序时,此用户将继承此程序的所有者权限;
1)SUID工作原理
- 前提:
linux中有一个二进制程序vim,属主属组均为root
linux中有一个系统文件/etc/shadow,属主属组均为root
我们创建一个普通用户叫zm
zm具有对vim的执行权限
zm 不具有对/etc/shadow的任何权限
- 默认情况下
zm执行vim,系统创建一个vim进程,进程的属主属组取程序发起者,也就是zm:zm
vim进程访问/etc/shadow,由于进程属主属组是zm:zm,与/etc/shadow的属组属主都不匹配,所以被拒绝访问.
- 给vim设置SUID之后
zm执行vim.系统创建一个vim进程,进程的属主取vim的属主,属组取程序发起者,就是root:zm
vim进程访问/etc/shadow,由于进程属主是root,与/etc/shadow的属主匹配,所以被允许编辑.
2)例子
passwd命令是linux系统中用来修改密码的命令.系统中所有用户都可以使用.而passwd命令改密码的行为是通过修改/etc/shadow文件来实现
- 首先查看一下/etc/shadow的文件权限 (可见普通用户对它没有任何权限;那为什么普通用户可以改密码呢?)
----------. 1 root root 908 7月 18 20:18 /etc/shadow
- 查看passwd文件权限信息
-rwsr-xr-x. 1 root root 30768 2月 22 2012 /usr/bin/passwd
不难发现passwd这个程序的属主位的执行位不是x而是s,说明passwd被设置了特殊权限SUID.;于是普通用户运行passwd命令,系统创建的passwd进程的属主由默认为"程序发起者"变为了passwd的属主;而passwd的属主是root,所以普通用户其实是在用root的权限修改/etc/shadow文件.最后passwd命令执行结束,passwd进程被关闭.
3)例子
给命令vim添加SUID,可以让普通用户自己把自己变为超级用户.
给vim加个SUID
[root@centos2 test]# ls -l /usr/bin/vim
-rwsr-xr-x. 1 root root 1967072 4月 5 2012 /usr/bin/vim
[root@centos2 test]#
登陆普通用户zhang;通常情况下zhang启动vim后,系统会创建一个以当前用户zhang为属主属组的vim进程,
此时vim进程的属主属组为zhang:zhang,由于无论是属主还是属组都不具有对/etc/passwd的编辑权限,所以这个vim进程无权编辑/etc/passwd.;而给/usr/bin/vim设置了SUID之后,zhang或任何用户启动vim程序时,系统创建的vim进程的属主则是取了/usr/bin/vim这个程序文件自身的属主root;所以此时vim进程的属主属组为root:zhang. 系统检查发现正好匹配了/etc/passwd的属主,于是放行vim进程.
[zhang@centos2 ~]$ vim /etc/passwd #修改uid=0
zhang:x:0:500::/home/zhang:/bin/bash
退出再次登陆;可以看出当前的用户是root
[root@centos2 test]# su - zhang
[root@centos2 ~]# whoami
root
[root@centos2 ~]#
验证。首先找一个属主属组都为root且o位无w的文件
[root@centos2 ~]# find / -name haha -type f -exec ls -l {} \;
-rw-r--r--. 1 root zhang 0 9月 14 22:18 /tmp/haha
[root@centos2 ~]#
[root@centos2 tmp]# cd /tmp/
[root@centos2 tmp]# mv haha didi
[root@centos2 tmp]# find / -name didi -type f -exec ls -l {} \;
-rw-r--r--. 1 root zhang 0 9月 14 22:18 /tmp/didi
[root@centos2 tmp]#
改名成功,说明ok
三SGID
- chmod g[+-]s 文件或目录 或 用数字表示 chmod 2755 文件或目录
-rwxr-sr-x. 1 root root 0 9月 14 21:14 test
- 在普通三位数字权限位之前,用2代表添加的SGID位
- 文件属组的x权限,用s代替.表示被设置了SGID
- 如果属组位没有x权限,会显示为大写S,表示有故障(权限无效)
- chmod 0755 DIR/FILE 删除文件的SGID,(目录不受影响)
- 注:作用在二进制程序上时:执行sgid权限的程序时,此用户将继承此程序的所属组权限
- 注:作用于目录上时:此文件夹下所有用户新建文件都自动继承此目录的用户组.
1)例子
普通用户zhang在/tmp中创建一个目录叫zhangdir,添加SGID.权限777
[zhang@centos2 zhangdir]$ chmod 2777 /tmp/zhangdir/
[zhang@centos2 zhangdir]$ ll -d
drwxrwsrwx. 2 zhang zhang 4096 9月 14 21:53 .
[zhang@centos2 zhangdir]$
切换到普通用户ming,在zhangdir目录中创建一个文件和一个目录
[ming@centos2 ~]$ cd /tmp/zhangdir/
[ming@centos2 zhangdir]$ mkdir mingdir
[ming@centos2 zhangdir]$ ll
总用量 4
drwxrwsr-x. 2 ming zhang 4096 9月 14 22:00 mingdir
[ming@centos2 zhangdir]$
可以看出,ming在zhangdir目录下创建的文件和目录都自动继承了zhangdir的属组
而且新目录的权限也继承了SGID.;所以设定了SGID的目录中的所有新建文件和目录都会自动属于zhang组.
四、sticky
- chmod o[+-]t 目录 或 用数字表示 chmod 1755 目录
-rwx--x--t. 1 root root 0 9月 14 21:20 caiwu
- 在普通数字权限位前,用1代表添加Sticky位
- 文件属组的x权限,用t代替.表示被设置了sticky
- 如果其他用户位没有x权限,会显示为大写T,表示有故障(权限无效)
- 对于一个多人可写的目录,如果设置了sticky,则每个用户仅能删除和改名自己的文件或目录;
- 只能作用在目录上.普通文件设置无意义,且会被linux内核忽略
- 用户在设置Sticky权限的目录下新建的目录不会自动继承Sticky权限
1)例子
目的:希望在系统中创建一个很多用户可以共同使用的目录,但是要求用户之间不能互相删除改变对方的文件.
首先:创建一个777的/test/dir目录;分别用zhang和ming用户在/test/dir目录创建自己的文件和目录;可是任何用户都可以删除里面的内容。如何解决呢?
[root@centos2 dir]# ll
总用量 16
drwxrwxr-x. 2 ming ming 4096 9月 14 21:35 md1
drwxrwxr-x. 2 ming ming 4096 9月 14 21:35 md2
drwxrwxr-x. 2 ming ming 4096 9月 14 21:35 md3
-rw-rw-r--. 1 ming ming 0 9月 14 21:34 mf1
-rw-rw-r--. 1 zhang zhang 0 9月 14 21:34 zd1
-rw-rw-r--. 1 zhang zhang 0 9月 14 21:34 zd2
-rw-rw-r--. 1 zhang zhang 0 9月 14 21:34 zd3
drwxrwxr-x. 2 zhang zhang 4096 9月 14 21:34 zf1
[root@centos2 dir]#
要给/tmp这个文件夹设定一个Sticky位.
[root@centos2 test]# chmod 1777 dir/
[root@centos2 test]# ll -d dir/
drwxrwxrwt. 6 root root 4096 9月 14 21:35 dir/
[root@centos2 test]#
到这尝试登陆普通用户到这个目录下删除mf1等文件和目录。删除不了说明生效了。
注:普通用户在设定了Sticky位的目录下创建的子目录不会继承这个Sticky权限,所以要注意设定好自己目录的权限.