特殊权限:SUID, SGID, STICKY
正常情况下:
1、进程以某用户的身份运行; 进程是发起此进程用户的代理,因此以此用户的身份和权限完成所有操作;
2、权限匹配模型:
(1) 判断进程的属主,是否为被访问的文件属主;如果是,则应用属主的权限;否则进入第2步;
(2) 判断进程的属主,是否属于被访问的文件属组;如果是,则应用属组的权限;否则进入第3步;
(3) 应用other的权限;
SUID:
正常情况下:用户发起的进程,进程的属主是其发起者;因此,其以发起者的身份在运行;
SUID的功用:用户运行某程序时,如果此程序拥有SUID权限,那么程序运行为进程时,进程的属主不是发起者,而是程序文件自己的属主;
chmod u(+|-)sFILE... 例:chmod u+s /tmp/cat
执行/tmp/cat命令可以这样用 ~]$ /tmp/cat /etc/shadow
展示位置:属主的执行权限位
如果属主原本有执行权限,显示为小写s; 否则,显示为大写S;
注意:SUID非常有风险,慎用
如下列演示:由于others用户breeze没有查看的权利,直接用cat查看时cat是以breeze的身份查看的,所以无权查看。/tmp/cat有s权限,
且其属主为root,所以breeze执行"/tmp/cat /etc/shadow"时是以root的身份查看的,所以就能查看成功。
[breeze@yph7 ~]$id
uid=1004(breeze)gid=1004(breeze) 组=1004(breeze) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[breeze@yph7 ~]$ll /etc/shadow
----------. 1root root 2482 12月 15 21:44 /etc/shadow
[breeze@yph7 ~]$cat /etc/shadow
cat: /etc/shadow:权限不够
[root@yph7 tmp]#which cat
/usr/bin/cat
[root@yph7 tmp]#cp /usr/bin/cat /tmp
[root@yph7 tmp]#ll
总用量 56
-rwxr-xr-x. 1root root 54048 12月 16 03:57 cat
[root@yph7 tmp]#chmod u+s /tmp/cat
[root@yph7 tmp]#ll
总用量 56
-rwsr-xr-x. 1root root 54048 12月 16 03:57 cat
[breeze@yph7 ~]$/tmp/cat /etc/shadow
root:$6$aVx67dPp.........G9ylO/2AWEzvMSC60G8y8qkA/:16777:0:99999:7:::
bin:*:16372:0:99999:7:::
daemon:*:16372:0:99999:7:::
others用户对/etc/passwd 没有w权限,那么others用户如何把密码写进/etc/passwd中去的呢?因为/etc/passwd有s权限,
others用户执行passwd命令时是以root身份执行的,所以就能以root身份更写密码了。同样以root身份把密码写到/etc/shadow中。
[root@yph7 tmp]#which passwd
/usr/bin/passwd
[root@yph7 tmp]#ls -l /usr/bin/passwd
-rwsr-xr-x. 1root root 27832 6月 10 2014 /usr/bin/passwd
SGID:
功用:当目录属组有写权限,且有SGID权限时,那么所有属于此目录的属组,且以属组身份在此目录中新建文件或目录时,
新文件的属组不是用户的基本组,而是此目录的属组;
管理文件的SGID权限:
chmod g+|-sFILE...
展示位置:属组的执行权限位
如果属组原本有执行权限,显示为小写s; 否则,显示为大写S;
SGID有s权限时,组成员创建文件时,创建的文件属于成员的这个附加组。
而不是原来的基本组。
[root@yph7 ~]#usermod -G apache gentoo
[root@yph7 ~]#usermod -G apache hadoop
[root@yph7 ~]#id gentoo
uid=4006(gentoo)gid=5003(gentoo) 组=5003(gentoo),2011(apache)
[root@yph7 ~]#id hadoop
uid=2051(hadoop)gid=2001(hadoop) 组=2001(hadoop),2011(apache)
[root@yph7 ~]#mkdir /tmp/text
[root@yph7 ~]#chown .apache /tmp/text;ls -ld /tmp/text
drwxr-xr-x. 2root apache 6 12月 16 04:47/tmp/text
[root@yph7 ~]#chmod g+w /tmp/text;ls -ld /tmp/text
drwxrwxr-x. 2root apache 6 12月 16 04:47/tmp/text
切换到gentoo用户
[gentoo@yph7text]$ cd /tmp/text
[gentoo@yph7text]$ touch a.gentoo
[gentoo@yph7text]$ su - hadoop
密码:
上一次登录:一 12月 14 21:38:17 CST2015从230pxs/4 上
Hello,hadoopWelcome to login,the time is 2015-12-16-05:05:27
[hadoop@yph7 ~]$cd /tmp/text ;touch a.hadoop
[hadoop@yph7text]$ ll
总用量 0
-rw-rw-r--. 1gentoo gentoo 0 12月 16 05:05 a.gentoo
-rw-rw-r--. 1hadoop hadoop 0 12月 16 05:05 a.hadoop--------->创建的文件属主仍属于用户自
己的基本组,而不是附加组apache
root给组增加s权限
[root@yph7 ~]#chmod g+s /tmp/text
[root@yph7 ~]#ls -ld /tmp/text
drwxrwsr-x. 2root apache 36 12月 16 05:05 /tmp/text
用gentoo和Hadoop用户创建文件
[hadoop@yph7text]$ touch b.hadoop
[hadoop@yph7text]$ su - gentoo
密码:
上一次登录:三 12月 16 04:49:54 CST2687pxs/3 上
Hello,gentooWelcome to login,the time is 2015-12-16-05:09:38
[gentoo@yph7 ~]$touch /tmp/text/b.gentoo
[gentoo@yph7 ~]$ls -l /tmp/text
总用量 0
-rw-rw-r--. 1gentoo gentoo 0 12月 16 05:05 a.gentoo
-rw-rw-r--. 1hadoop hadoop 0 12月 16 05:05 a.hadoop
-rw-rw-r--. 1gentoo apache 0 12月 16 05:09 b.gentoo------------>组增加s权限后,组内用户创 建的文件属组就为apache了
-rw-rw-r--. 1hadoop apache 0 12月 16 05:09 b.hadoop
[gentoo@yph7 ~]$rm -rf /tmp/text/a.hadoop------------------>gentoo可以删除hadoop的文件
[flimmer@yph7~]$ su - hadoop
Password:
Last login: WedDec 16 05:05:27 CST 2015 on pts/3
Hello,hadoop Welcometo login,the time is 2015-12-16-05:28:57
[hadoop@yph7 ~]$rm -rf /tmp/text/a.gentoo------------------>hadoop可以删除gentoo的文件
[hadoop@yph7 ~]$ls -l /tmp/text
总用量 0
-rw-rw-r--. 1gentoo apache 0 12月 16 05:09 b.gentoo
-rw-rw-r--. 1hadoop apache 0 12月 16 05:09 b.hadoop
这样,组内用户的问文件组内成员都可以改,w权限不能随便给的,这样相对更安全
但是这样组内成员由于具有w权限,可以随意删除他人文件,也是不***全,如何防止
同组用户删除他人文件呢,这用到了sticky权限
Sticky:
功用:对于属组或全局可写的目录,组内的所有用户或系统上的所有用户对在此目录中都能创建新文件或删除所有的已有文件;
如果为此类目录设置Sticky权限,则每个用户能创建新文件,且只能删除自己的文件;
管理文件的Sticky权限:
chmod o+|-tFILE...
展示位置:其它用户的执行权限位
如果其它用户原本有执行权限,显示为小写t; 否则,显示为大写T;
系统上的/tmp和/var/tmp目录默认均有sticky权限;
[root@yph7 ~]#chmod o+t /tmp/text
[root@yph7 ~]#ls -ld /tmp/text
drwxrwsr-t. 2root apache 36 12月 16 05:29 /tmp/text
[hadoop@yph7 ~]$rm -rf /tmp/text/b.gentoo--------------------hadoop无法删除gentoo的文件,虽然有w权限
rm: 无法删除"/tmp/text/b.gentoo": 不允许的操作
[gentoo@yph7 ~]$rm -rf /tmp/text/b.hadoop----------------------gentoo无法删除hadoop的文件,虽然有w权限
rm: 无法删除"/tmp/text/b.hadoop": 不允许的操作
[gentoo@yph7 ~]$ls -l /tmp/text
总用量 0
-rw-rw-r--. 1gentoo apache 0 12月 16 05:09 b.gentoo
-rw-rw-r--. 1hadoop apache 0 12月 16 05:09 b.hadoop
[gentoo@yph7 ~]$rm -rf /tmp/text/b.gentoo
[gentoo@yph7 ~]$ls -l /tmp/text
总用量 0
-rw-rw-r--. 1hadoop apache 0 12月 16 05:09 b.hadoop----------------gentoo可以删除自己的文件
管理特殊权限的另一方式:
suid sgidsticy 八进制权限
0 0 0 0
0 0 1 1
0 1 0 2
0 1 1 3
1 0 0 4
1 0 1 5
1 1 0 6
1 1 1 7
基于八进制方式赋权时,可于默认的三位八进制数字左侧再加一位八进制数字;
例如:chmod 1777
facl:file access control lists
文件的额外赋权机制:
在原来的u,g,o之外,另一层让普通用户能控制赋权给另外的用户或组的赋权机制;
getfacl命令:查看列表
getfacl FILE...
user:USERNAME:MODE
group:GROUPNAME:MODE
setfacl命令:
赋权给用户:
setfacl -m u:USERNAME:MODE FILE...
赋权级组:
setfacl -m g:GROUPNAME:MODE FILE...
会发现权限上多个加号
撤销赋权:
setfacl -x u:USERNAME FILE...
setfacl -x g:GROUPNAME FILE...
例:
setfacl -mg:mygrp:rw file
撤销facl为:
setfacl -x u:fedora file
具体演示如下:
用户进程先看是否属主权限,再看是否访问列表权限,再看属组,others
对于others用户来说
[breeze@yph7 ~]$touch /tmp/a.breeze
[breeze@yph7 ~]$ls -l /tmp/a.breeze
-rw-rw-r--. 1breeze breeze 0 12月 16 05:53 /tmp/a.breeze
[flimmer@yph7~]$ cat etc/issue > /tmp/a.breeze
-bash:/tmp/a.breeze: Permission denied---------------------flimmer作为others用户没有w权限
[breeze@yph7 ~]$getfacl /tmp/a.breeze
getfacl:Removing leading '/' from absolute path names
# file:tmp/a.breeze
# owner: breeze
# group: breeze
user::rw-
group::rw-
other::r--
[breeze@yph7 ~]$setfacl -m u:flimmer:rw /tmp/a.breeze
[breeze@yph7 ~]$getfacl /tmp/a.breeze
getfacl:Removing leading '/' from absolute path names
# file:tmp/a.breeze
# owner: breeze
# group: breeze
user::rw-
user:flimmer:rw- -----------------------------------多出一行指明了flimmer的权限
group::rw-
mask::rw-
other::r--
[flimmer@yph7~]$ tail -2 /etc/passwd > /tmp/a.breeze
[flimmer@yph7~]$ cat /tmp/a.breeze ---------------------虽然others是只读权限,但仍能写进去
bat2:x:4012:4012::/home/bat2:/bin/bash
bat3:x:4013:4013::/home/bat3:/bin/bash
[breeze@yph7 ~]$setfacl -m u:flimmer:--- /tmp/a.breeze -------把flimmer拉黑
[flimmer@yph7~]$ cat /tmp/a.breeze
cat:/tmp/a.breeze: Permission denied ------flimmer连查看的权利都没有了
对于属组来说
[breeze@yph7 ~]$chmod 644 /tmp/a.breeze
[breeze@yph7 ~]$ls -l /tmp/a.breeze
-rw-r--r--+ 1breeze breeze 78 12月 16 05:57 /tmp/a.breeze -------属组没有w权限的,
[breeze@yph7 ~]$setfacl -m g:apache:rw /tmp/a.breeze -----------给组apache加特权
[breeze@yph7 ~]$id gentoo
uid=4006(gentoo)gid=5003(gentoo) 组=5003(gentoo),2011(apache) --------gentoo属于apache
[gentoo@yph7 ~]$tail -2 /etc/shells > /tmp/a.breeze
[gentoo@yph7 ~]$cat /tmp/a.breeze ----------gentoo属于apache,属组只有r权限,
但apache有特 权仍能改写文件内容
/bin/tcsh
/bin/csh
[flimmer@yph7~]$ getfacl /tmp/a.breeze --------------flimmer被拉黑,但他可以
查看别人的列表,不侵犯隐私?
getfacl:Removing leading '/' from absolute path names
# file:tmp/a.breeze
# owner: breeze
# group: breeze
user::rw-
user:flimmer:---
group::rw-
group:apache:rw-
mask::rw-
other::r--