L016-linux系统文件权限体系实战深入讲解小节
不知道今天能不能写完哈,能写完发出来就是这周发两次小结了,有进步哦,不过L015和L016两节课内容也确实不多,进入正题
上一课学到了chmod、chown、umask,相对于比较基础的命令,那么这节就要接触这两个命令了,虽然老师也说了,不常用!
setuid和setgid
一、setuid
我们先来看看怎么查看一个文件是否有setuid的属性,然后再来总结他的功能把。
[root@moban ~]# ls -l `which passwd` -rwsr-xr-x. 1 root root 30768 Feb 22 2012 /usr/bin/passwd
仔细看,看到黄色背景的s没?对头,这就是setuid的标志,那么可能会问,原来的x怎么办?有x为s,没有x为S,就是大小写。
直接小结:
1)用户对应的前三位的x位上如果有s就表示suid。当x位上没有x的时候,suid就是S。
2)setuid位是让普通用户可以root(或其他)用户的角色运行只有root(或其他)帐号才能运行的程序或命令,或程序命令对应本来没有权限操作的文件等。(注意和su及sudo的区别)
直接看结论文字可能很难理解,那么下面用一个实例来理解一下:
通过给rm命令设置suid加深理解
首先使用传统的方法来解决(sudo)
1)使用sudo
sudo是学过的一种方法(尚方宝剑)
系统管理员:root
普通账户:oldboy
我在oldboy帐号上想删除test.txt
[oldboy@moban oldboy]$ rm -f test.sh rm: cannot remove `test.sh': Permission denied //妈呀,权限不够
这是因为我们普通用户并没有使用“rm”的权限,所以我们可以在sudo中填加“rm”命令:
[root@moban oldboy]# visudo
进入visudo配置文件后,转到第89行(89gg)
oldboy ALL=(ALL) NOPASSWD:ALL,/bin/rm
加入的为/bin/rm(rm的绝对路径)
然后保存退出,再尝试下
[oldboy@moban oldboy]$ sudo rm -f test.sh //成功删除,木有问题
2)现在开始使用setuid(新方法,应用程度更广)
系统管理员:root
普通账户:oldboy
此刻:
我在oldboy帐号上想删除test.txt
[oldboy@moban oldboy]$ rm -f test.sh rm: cannot remove `test.sh': Permission denied //妈呀,权限不够
为啥?
权限不够,什么权限不够?这里一定要注意,跟文件毛关系都没有,跟你的命令有关系
删除用的是“rm”命令,那么查看一下这个rm的权限
[root@moban oldboy]# ll `which rm|tail -1` //用到tail是因为which rm有两行结果,ll只能显示一个,所以用tail -1显示最后一行。 -rwxr-xr-x. 1 root root 57440 Nov 22 2013 /bin/rm
由上面可以看出因为oldboy是普通用户,没有删除权限。那么用什么命令呢?对,就是setuid。
用root赋予rm的setuid权限:
[root@moban oldboy]# chmod u-s `which rm | tail -1` [root@moban oldboy]# ll `which rm | tail -1` -rwsr-xr-x. 1 root root 57440 Nov 22 2013 /bin/rm //由此可以看到了属主的x位变为s了
设置好后,我们用oldboy帐号删除test.sh
[oldboy@moban oldboy]$ rm -f test.sh
OK成功删除
那么再来个小节吧:
suid知识小节:suid修改的是执行的命令,而不是处理的目标文件
[root@moban oldboy]# chmod u+s test.sh //不使用数字加权限 [root@moban oldboy]# ll test.sh -rwSr--r-- 1 root root 0 May 21 23:21 test.sh
下面这段话很重要:
从rm的信息可以看出来rm命令文件是属主是root,也就是说rm有setuid权限的话,其他普通用户使用rm时都是对应的root对rm命令的权限,如果rm的属主是oldboy,那么其他用户使用rm的权限是对应oldbo对rm命令的权限。这点一定要清楚。
那么,如果想知道系统中都有哪些命令有suid权限呢?
[root@moban ~]# find /usr/bin/ -type f -perm 4755 //perm就是find命令里加权限的参数 /usr/bin/crontab /usr/bin/chage /usr/bin/pkexec /usr/bin/passwd /usr/bin/gpasswd /usr/bin/newgrp /usr/bin/at
也可以这样,更清晰,更直观
[root@moban ~]# find /usr/bin/ -type f -perm 4755 -exec ls -l {} ; -rwsr-xr-x. 1 root root 51784 Nov 23 2013 /usr/bin/crontab -rwsr-xr-x. 1 root root 66352 Dec 8 2011 /usr/bin/chage -rwsr-xr-x. 1 root root 27576 Sep 20 2013 /usr/bin/pkexec -rwsr-xr-x. 1 root root 30768 Feb 22 2012 /usr/bin/passwd -rwsr-xr-x. 1 root root 71480 Dec 8 2011 /usr/bin/gpasswd -rwsr-xr-x. 1 root root 36144 Dec 8 2011 /usr/bin/newgrp -rwsr-xr-x. 1 root root 54240 Jan 30 2012 /usr/bin/at
总体结论:
1)suid修改的执行的命令,而不是处理的目标文件。
2)仅对二进制命令程序或程序有效,不能用在shell等类似脚本文件上(因为shell脚本仅仅是调用二进制程序而已,因此,具体权限还需要看二进制命令本身)。
3)二进制命令或程序需要有可执行权限x。
4)suid权限仅在程序执行过程中有效。
5)执行命令的任意系统用户都可以获得该程序命令程序执行期间拥有者的权限
6)suid是一把双刃剑,对系统安全有一定的威胁。系统suid的无用的功能取消suid权利(安全优化)
二、setgid
与sgid不同的是,sgid既可以针对文件也可以针对目录设置!sgid是针对用户组权限修改的。
sgid知识小节
对于文件,sgid的功能如下:
1)sgid仅对二进制命令程序有效。
2)二进制命令或程序需要可执行权限x。
3)执行程序的人以用户可以获得该命令程序执行期间所属组的权限。
对于目录:sgid的功能如下:
用户在此目录下创建文件和目录,具有次目录相同的用户组。
setgid位主要用在目录中,当为某个目录设置了setgid位以后,在该目录中新创建的文件具有该目录的所有者权限,而不是创建该文件的用户的默认所有者,这样,使得在多个用户之间共享目录中的文件变得简单。提示:用八进制数2000表示setgid权限位。
上面,我们把setuid和setgid分别做了总结和说明,下面我们把setuid和setgid一起总结一下,看看他们的区别:
命令形式上的区别:suid是针对用户 sgid针对用户组
setuid和setgid设置说明:
特殊权限位数字权限(八进制)方法
setuid位是设置用八进制的4000,setgid占用的是八进制的2000;比如我们前面所说的chmod 4755 /bin/rm 就是设置的setuid位;
setuid设置方法:
[root@moban admins]# chmod 4755 /bin/rm //设置rm的权限为4755,就把setuid位设置好了。就是一个4
另一种方法:
[root@moban admins]# chmod u+s /bin/rm
setgid设置方法:
[root@moban admins]# chmod 2755 /home/admins/ //设置admins目录的权限为2755,就把setgid设置好了,就是一个2
另一种方法:
[root@moban admins]# chmod g+s /home/admins/
另一种情况
如果需要同时设置setuid和setgid,可以设为6:
[root@moban admins]# chmod 6755 /home/admins/
优先级关系:suid的优先级比sgid高
三、sbit粘滞位
粘滞位在权限中显示为t,有执行权限的显示为T,是在显示在其他用户权限中
那么什么是粘滞位?
系统中自带的粘滞位为根目录下的tmp(经典的粘滞位目录),有了粘滞位以后各用户用户组的小朋友均可以在目录里面创建文件,而且每个人只能管理自己所创建的东西,其他的人是无法操作的。
tmp 是经典的粘滞位目录,特别,谁都有写权限,因此安全成问题,常常的木马第一手跳板地点。
特殊权限为对应的数字:
suid 4000 s
sgid 2000 s
粘滞位:1000 t
chmod7755 test //同时设置suid,sgid和sbit
其实如果想同时设置的话,就是把他们相加。
四、文件属性和文件系统属性的关系
chattr 和 lasttr
这两个命令在之前linux系统优化的时候讲到过,当时是讲到的用’+i‘和’-i‘参数来给命令上锁解锁,起到一个系统防护的作用,那这堂课呢,主要讲的是’+a‘和‘-a’参数,下面我们来一起详细的看吧。
chattr +i
使用chattr +i来锁定命令文件,这样文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件 系统的安全设置有很大帮助。
chattr +a
a:即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文件安全,只有root才能设定这个属性。
那我们来做一个试例吧:
[root@moban home]# cat ceshi.txt ajfksd ajfksd ajfksd [root@moban home]# chattr +a ceshi.txt [root@moban home]# echo ajfksd >> ceshi.txt [root@moban home]# echo ajfksd > ceshi.txt //全部替换,提示没有权限 -bash: ceshi.txt: Operation not permitted
通过上面试例就可以明白,大家都可以在一个文件里面填加,但是修改什么的就还是算了,没有权利!
lsattr
至于lsattr自然是查询设置权限的文件目录了
[root@moban home]# lsattr //一目了然 -------------e- ./lll -----a-------e- ./ceshi.txt -------------e- ./www -------------e- ./oldgirl -------------e- ./kkk -------------e- ./o.txt -------------e- ./test -------------e- ./oldboy -------------e- ./mysql -------------e- ./apache -------------e- ./oldsister -------------e- ./admins
最后可以看一看这个文章,写的非常全面:http://www.ha97.com/5172.html
setfacl与getfacl
单独使某一文件对应某一用户权限,排他性
老师说这个用的很少,所以略过,知道其是做什么用的即可。主做了解就可以了。
感悟:
针对suid以及sgid,工作中尽量不使用,多使用sudo来管理,如果有可能的话我们要查找系统无用suid位的命令等,进行撤除。sS都是suid,sgid(用户位),sgid(用户组位)的标识,和x重合的时候,就是显示小写的字母s。