分类:
2012-02-24 07:01:55
原文地址:linux文件权限学习 包括 特殊权限 作者:sunjiangang-ok
1. Linux使用9个权限位来标识
chmod:更改文件权限
chgrp:修改文件所属组
chown:修改文件拥有者
2. 目录的读、写和执行权限含义
对于文件的读写执行的含义,都比较了解,对于目录的权限和文件的权限是不一样的。
目录的读权限位意味着可以列出其中的内容;写权限位意味着可以在该目录中创建文件,如果不希望其他用户在你的目录中创建文件,可以取消相应的写权限位;执行权限位则意味着搜索和访问该目录,因此在创建目录的时候一般都是具有可执行权限的。
如果把同组用户或其他用户针对某一目录的权限设置为--x,那么他们将无法列出该目录中的文件。如果该目录中有一个执行位置位的脚本或程序,只要用户知道它的路径和文件名,仍然可以执行它。用户不能够进入该目录并不妨碍他的执行。
3. 特殊权限介绍
名称 |
suid |
sgid |
sbit(粘滞位) |
出现位置 |
--- --- --- |
--- --- --- |
--- --- --- |
表示 |
S s |
S s |
T t |
8进制表示 |
4 |
2 |
1 |
小结:如果本来在x位上设置了x的时候,设置这些位将会显示小写的(s,s,t),否则会显示为大写的(S,S,T)。这三位如果转化为8进制表示的话,分别对应 的是4(SUID),2(SGID),1(sticky bit),0(什么也不是)。
4. suid
suid的设置出现在文件拥有者的x位置上,如果之前用户有x权限,设置suid后,x就会成为s(小写的s);如果之前没有x权限,即-,设置之后就会成为S(大写S)。
一般suid使用在脚本文件上的。
例如,/usr/bin/passwd的文件权限为:
这个脚本的所属主和所属组为root。我们当然可以以root的用户的身份执行它,但是如果在某种场合,普通用户也需要执行这个脚本来修改自己的密码的时候,也需要调用这个脚本,于是,我们设置了suid位,也就是我们看到的那样,在所属主的标志位上有个s。这样一来,其他人有读取和执行的权限,而且可以假如我们现在有个普通用户名为sunny,现在切换到sunny,执行此脚本,表面上我们看是执行成功了,其实我们是借助root用户的身份来执行它的,而不是sunny,这就是suid的作用。
5. suid也会失效吗?
在对suid进行测试的时候,发现在linux不同发行版本中,suid有可能失效。
测试一
环境:centos6.2
步骤:
(1)使用root用户进行如下操作:
(2)切换到普通用户,执行a.out程序。
说明:可见执行的结果并不是我们预期的“root”,所以这里的suid位标识貌似失效了。
测试二
环境:ubuntu 11.04
步骤:
(1) 在root下进行:
(2) 切换到普通用户下,进行执行:
说明:这次的执行结果达到了我们预期的效果,普通用户是以root身份进行程序的执行的。
小结:为什么第一种的情况是失效的呢?但是/usr/bin/passwd的执行确实成功的。这个问题我暂时没有搞清楚。具体可以参考uid和euid的区别:
总之,suid仅用在二进制文件中,对于shell脚本文件和目录是不起作用的。
6. sgid
如果s出现在用户组的x位置上,那么这一位可以用在文件或者目录上。一,如果sgid用在了A目录上,则在A目录内建立的文件或者目录的用户组,将会是A目录的用户组。二,如果这个sgid出现在二进制文件上的话,不管用户是谁,在执行该程序的时候,它的有效用户组将会变成此文件的用户组。
7. sbit
这个就是粘滞位,这一位只针对目录和对文件的效果是不一样的。
当某一个文件设置了这一位的时候,这个可执行程序退出后,操作系统会在内存当中保存该程序的内存映像,这样做是为了节约大型程序的启动时间,但是也要占用系统资源。因此,设置这个粘滞位,到不如把自己的程序写得更好些。
对于目录而言,这一位可以理解为防止删除位。例如sunny用户创建了一个目录A,并且给这个目录设置了sbit位,这个目录的权限是rwxrwxrwt,设置了这一位之后,就算所有用户对目录具有读写的权限,但也只有sunny用户和root用户对其中创建的文件或者目录进行删除。其他用户只能在其中添加,而不能删除。
/tmp/目录就是设置了这个标识位。假如现在有一个普通用户abc,然后在tmp目录中创建了一个文件test,然后将这个文件的权限修改为777,之后切换到其他的普通用户sunny,用sunny去删除这个文件test,发现时删除不了的。
8. 为什么引入suid,sgid和sbit特殊权限
为了防止未授权的用户访问你的文件,你可以在文件的权限位上做文章,修改自己文件的权限位,这样可以让让整个系统更加的安全。有时候,自己的某个文件需要别人来使用。比如,Linux下的passwd脚本应该是所有人都可以使用的,但是这个文件时root组,root用户的,这个时候,我们就通过设置suid位来让其他用户来使用这个命令了。
9. 关于umask
umask的值总共是有4位的,其中最高的那一位只能是0。下面是后三位取值的讨论。
对于文件来说,这一数字的最大值分别是6。系统不允许你在创建一个文本文件时就赋予它执行权限,必须在创建后用chmod命令增加这一权限。目录则允许设置执行权限,这样针对目录来说,umask中各个数字最大可以到7。
目录只有在有可执行权限的情况下才能打开,因而在同一umask值的情况下,建立的目录要比文件多一个“执行”的权限,因此建立目录的时候是从777中减去umask,而建立文件的时候,是从666中减去umask的值。
10. root都无法删除文件
有时候可以使用chattr命令修改文件的属性,让root都无法删除。
测试:
11. root创建的空目录可以被普通用户删除?
其实这个是不行的,经过测试,我得出的结论是这样的:文件能不能被删除是需要看它的父目录是不是有可写的权限,和文件属主是没有关系的。
参考资料:
(1)
(2)
(3)
(4)