linux文件权限

来源:岁月联盟 编辑:exp 时间:2012-07-03
linux文件权限 这几天闲的蛋疼,写点东东出来,百分之八十是引用哦。一,文件类型,拥有者,拥有组,其他人权限ls -l都会用吧,之后会很很多行。然后:这种表示方法一共有十位“9 8 7 6 5 4 3 2 1 0 - r w x r - x r - x  www.2cto.com  第9位表示文件类型,可以为p、d、l、s、c、b和-: p表示命名管道文件 d表示目录文件 l表示符号连接文件 -表示普通文件 s表示socket文件 c表示字符设备文件 b表示块设备文件  第8-6位、5-3位、2-0位分别表示文件所有者的权限,同组用户的权限,其他用户的权限, 其形式为rwx: 
 其实在UNIX的实现中,文件权限用12个二进制位表示,如果该位置上的值是 1,表示有相应的权限: 11 10 9 8 7 6 5 4 3 2 1 0 S G T r w x r w x r w x 第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-0位对应于上面的三组rwx位。 11 10 9 8 7 6 5 4 3 2 1 0 上面的-rwsr-xr-x的值为: 1 0 0 1 1 1 1 0 1 1 0 1 -rw-r-Sr--的值为: 0 1 0 1 1 0 1 0 0 1 0 0 
 给文件加SUID和SUID的命令如下: chmod u+s filename 设置SUID位 chmod u-s filename 去掉SUID设置 chmod g+s filename 设置SGID位 chmod g-s filename 去掉SGID设置  另外一种方法是chmod命令用八进制表示方法的设置。如果明白了前面的12位权限表示法也  www.2cto.com  很简单
 二、SUID,SGID和Sticky Bit的详细解析   我们经常看到,很多时候,用如4656这样的方法设置一个文件的权限,怎么会是四位呢?这就关系到Set UID,Set GID,Sticky Bit: Set UID   会创建s与t权限,是为了让一般用户在执行某些程序的时候,能够暂时具有该程序拥有者 的权限。举例来说,我们知道,账号与密码的存放文件其实是 /etc/passwd与 /etc/shadow 。而 /etc/shadow文件的权限是“-r--------”。它的拥有者是root。在这个权限中,仅有 root可以“强制”存储,其他人是连看都不行的。    但是,偏偏笔者使用dmtsai这个一般身份用户去更新自己的密码时,使用的就是 /usr/bin/passwd程序,却可以更新自己的密码。也就是说,dmtsai这个一般身份用户可以存 取 /etc/shadow密码文件。这怎么可能?明明 /etc/shadow就是没有dmtsai可存取的权限。 这就是因为有s权限的帮助。当s权限在user的x时,也就是类似 -r-s--x--x,称为Set UID ,简称为SUID,这个UID表示User的ID,而User表示这个程序(/usr/bin/passwd)的拥有者 (root)。那么,我们就可以知道,当dmtsai用户执行 /usr/bin/passwd时,它就会“暂时 ”得到文件拥有者root的权限。    SUID仅可用在“二进制文件(binary file)”,SUID因为是程序在执行过程中拥有文件 拥有者的权限,因此,它仅可用于二进制文件,不能用在批处理文件(shell脚本)上。这是 因为shell脚本只是将很多二进制执行文件调进来执行而已。所以SUID的权限部分,还是要看  www.2cto.com  shell脚本调用进来的程序设置,而不是shell脚本本身。当然,SUID对目录是无效的。这点 要特别注意。 Set GID   进一步而言,如果s的权限是在用户组,那么就是Set GID,简称为SGID。SGID可以用在两 个方面。文件:如果SGID设置在二进制文件上,则不论用户是谁,在执行该程序的时候,它的有效用 户组(effective group)将会变成该程序的用户组所有者(group id)目录:如果SGID是设置在A目录上,则在该A目录内所建立的文件或目录的用户组,将会是此A 目录的用户组。一般来说,SGID多用在特定的多人团队的项目开发上,在系统中用得较少。 Sticky Bit:    这个Sticky Bit当前只针对目录有效,对文件没有效果。SBit对目录的作用是:“在具 有SBit的目录下,用户若在该目录下具有w及x权限,则当用户在该目录下建立文件或目录时 ,只有文件拥有者与root才有权力删除”。换句话说:当甲用户在A目录下拥有group或other 的项目,且拥有w权限,这表示甲用户对该目录内任何人建立的目录或文件均可进行“删除/重 命名/移动”等操作。不过,如果将A目录加上了Sticky bit的权限,则甲只能够针对自己建 立的文件或目录进行删除/重命名/移动等操作。举例来说,/tmp本身的权限是“drwxrwxrwt”,在这样的权限内容下,任何人都可以在 /tmp 内新增、修改文件,但仅有该文件/目录的建立者与root能够删除自己的目录或文件。这个特 性也很重要。可以这样做个简单测试:
 1. 以root登入系统,并且进入 /tmp中。2. touch test,并且更改test权限成为777。3. 以一般用户登入,并进入 /tmp。4. 尝试删除test文件。更多关于SUID/SGID/Sticky Bit的介绍,我们会在第11章中再次提及,当前,先有简单的概 念即可。  www.2cto.com  SUID/SGID/SBIT权限设置   前面介绍过SUID与SGID的功能,那么,如何打开文件使其成为具有SUID与SGID的权限呢? 这就需要使用数字更改权限了。现在应该知道,使用数字更改权限的方式为“3个数字”的组 合,那么,如果在这3个数字之前再加上一个数字,最前面的数字就表示这几个属性了(注: 通常我们使用chmod xyz filename的方式来设置filename的属性时,则是假设没有SUID、 SGID及Sticky bit)。 4为SUID2为SGID1为Sticky bit   假设要将一个文件属性改为“-rwsr-xr-x”,由于s在用户权限中,所以是SUID,因此,在 原先的755之前还要加上4,也就是使用“chmod 4755 filename”来设置。此外,还有大S与 大T的产生。参考下面的范例(注意:下面的范例只是练习而已,所以笔者使用同一个文件来 设置,必须知道,SUID不是用在目录上,SBIT不是用在文件上)。 [root@linux ~]# cd /tmp[root@linux tmp]# touch test[root@linux tmp]# chmod 4755 test; ls -l test-rwsr-xr-x 1 root root 0 Jul 20 11:27 test[root@linux tmp]# chmod 6755 test; ls -l test-rwsr-sr-x 1 root root 0 Jul 20 11:27 test[root@linux tmp]# chmod 1755 test; ls -l test-rwxr-xr-t 1 root root 0 Jul 20 11:27 test[root@linux tmp]# chmod 7666 test; ls -l test-rwSrwSrwT 1 root root 0 Jul 20 11:27 test # 这个例子要特别小心。怎么会出现大写的S与T呢?不都是小写的吗?# 因为s与t都是取代x参数的,但是,我们是使用# 7666。也就是说,user、group以及others都没有x这个可执行的标志# (因为666)。所以,S、T表示“空的”。# SUID是表示“该文件在执行时,具有文件拥有者的权限”,但文件# 拥有者都无法执行了,哪里来的权限给其他人使用呢?当然就是空的 理解上面这些有个很重要的东西,那就是进程属性,实际ID,有效ID,等等的。有几个例子,ping这个命令,它本来只有ROOT权限才可以执行的,为什么随便一个普通用户都可以执行。就是因为上面这些东西。  www.2cto.com  三、文件隐藏属性    文件有隐藏属性,隐藏属性对系统有很大的帮助。尤其是在系统安全(Security)方面, 非常重要。下面我们就来谈一谈如何设置与检查这些隐藏的属性。chattr(设置文件隐藏属性)root@linux ~]# chattr [+-=][ASacdistu] 文件或目录名参数:+ : 增加某个特殊参数,其他原本存在的参数不动。- : 删除某个特殊参数,其他原本存在的参数不动。= : 设置一定,且仅有后面接的参数A : 当设置了A属性时,这个文件(或目录)的存取时间atime(access)将不可被修改,可    避免例如手提电脑有磁盘I/O错误的情况发生。S : 这个功能有点类似sync。就是将数据同步写入磁盘中。可以有效地避免数据流失。a : 设置a之后,这个文件将只能增加数据,而不能删除,只有root才能设置这个属性。c : 这个属性设置之后,将会自动将此文件“压缩”,在读取的时候将会自动解压缩,但在 存储的时候,将会先进行压缩后再存储(对于大文件有用)。d : 当执行dump(备份)程序的时候,设置d属性将可使该文件(或目录)具有转储功效。i : i的作用很大。它可以让一个文件“不能被删除、改名、设置连接,也无法写入或新增数 据”。对于系统安全性有相当大的帮助。j : 当使用ext3文件系统格式时,设置j属性将会使文件在写入时先记录在journal中。但是 ,当文件系统设置参数为data=journalled时,由于已经设置日志了,所以这个属性无效。s : 当文件设置了s参数时,它将会从这个硬盘空间完全删除。u : 与s相反,当使用u来设置文件时,则数据内容其实还存在磁盘中,可以用来还原删除. 注意:这个属性设置上,比较常见的是a与i的设置值,而且很多设置值必须要root才能设置。 范例:  www.2cto.com   [root@linux ~]# cd /tmp[root@linux tmp]# touch attrtest[root@linux tmp]# chattr +i attrtest[root@linux tmp]# rm attrtestrm: remove write-protected regular empty file `attrtest'? yrm: cannot remove `attrtest': Operation not permitted   www.2cto.com  # 看到了吗?连root也没有办法删除这个文件。赶紧解除设置。[root@linux tmp]# chattr -i attrtest 这个命令很重要,尤其是在系统的安全性方面。由于这些属性是隐藏的,所以需要用lsattr 才能看到。笔者认为,最重要的是 +i属性,因为它可以让一个文件无法被更改,对于需要很 高系统安全性的人来说,相当重要。还有相当多的属性是需要root才能设置的。此外,如果 是登录文件,就更需要 +a参数,使之可以增加但不能修改与删除原有的数据。将来提到登录 文件时,我们再来介绍如何设置它。 lsattr(显示文件的隐藏属性)[root@linux ~]# lsattr [-aR] 文件或目录参数:-a : 将隐藏文件的属性也显示出来。-R : 连同子目录的数据也一并列出来。范例:[root@linux tmp]# chattr +aij attrtest[root@linux tmp]# lsattr  www.2cto.com  ----ia---j--- ./attrtest 使用chattr设置后,可以利用lsattr来查看隐藏属性。不过,这两个命令在使用上必须要特 别小心,否则会造成很大的困扰。例如,某天你心情好,突然将 /etc/shadow这个重要的密 码记录文件设置为具有i属性,那么,过了若干天之后,突然要新增用户,却一直无法新增。 怎么办?将i的属性去掉即可。  作者 L_yangliu