Red Hat Enterprise Linux 6.4网络操作系统详解
上QQ阅读APP看书,第一时间看更新

5.3 任务3 修改文件与目录的默认权限与隐藏权限

由前面的内容我们知道一个文件有若干个属性,包括读、写、执行(r、w、x)等基本权限,以及是否为目录(d)与文件(-)或者是连接档等方面的属性。修改属性的方法在前面介绍过了(chgrp、chown、chmod)。除了基本的r、w、x权限外,在Linux的Ext2/Ext3文件系统下,我们还可以设定系统的隐藏属性。系统的隐藏属性可使用chattr来设定,而以lsattr来查看。

另外,最重要的属性是设定文件不可修改的特性。让文件的拥有者都不能进行修改。这个属性相当重要,尤其是在安全机制方面(security)。

5.3.1 子任务1 理解文件的预设权限(umask)

现在我们已经知道了如何建立或者是改变一个目录或文件的属性,不过,当建立一个新的文件或目录时,其默认权限会是什么?这个默认权限与umask有密切关系。umask就是指定目前用户在建立文件或目录时候的权限默认值。那么如何得知或设定umask呢?请看下面的命令及运行结果:

        [root@RHEL6~]# umask
        0022        <==与一般权限有关的是后面的三个数字
        [root@RHEL6~]# umask  -S
        u=rwx, g=rx, o=rx

查阅默认权限的方式有两种,—种可以直接输入umask,就可以看到数字形态的权限设定显示;另一种则是加入-S(Symbolic)这个选项,就会以符号类型的方式来显示出权限了。不过令人奇怪的是,umask怎么会有四组数字呢?不是只有三组吗?没错,第一组是特殊权限用的,我们稍后就会讲到,先看后面的三组即可。

在默认权限的属性上,目录与文件是不一样的。我们知道x权限对于目录是非常重要的。但是一般文件的建立则不应该有执行的权限。因为一般文件通常是用于数据的记录,当然不需要执行的权限了。因此,预设的情况如下。

• 若使用者建立文件,则预设没有可执行(x)权限,即只有rw这两个项目,也就是最大为666,预设权限如下:-rw-rw-rw-。

• 若用户建立目录,则由于x与是否可以进入此目录有关,因此默认为所有权限均开放,即为777,预设权限如下:drwxrwxrwx。

要注意的是,umask的分值指的是该默认值需要减掉的权限,因为r、w、x分别是4、2、1分,所以当要去掉能写入的权限时,umask的分值就输入2;当要去掉能读的权限时,umask的分值就输入4;要去掉读与写的权限时,umask的分值就输入6;要去掉执行与写入的权限时,umask的分值就输入3。

提示:5分是什么?就是读与执行的权限。

如果以上面的例子来说明,因为umask为022,所以user并没有被拿掉任何权限,不过group与others的权限被拿掉了2(也就是w这个权限),那么当使用者进行不同操作会形成不同的等式。

• 建立文件时:

        (-rw-rw-rw-) -(-----w--w-)=-rw-r--r--

• 建立目录时:

        (drwxrwxrwx) -(d----w--w-)=drwxr-xr-x

下面来测试一下。

        [root@RHEL6~]# umask
        0022
        [root@www ~]# touch test1
        [root@RHEL6~]# mkdir test2
        [root@RHEL6~]# 11
        -rw-r--r--1 root root     0  Sep  27  00:25  test1
        drwxr-xr-x 2 root root  4096  Sep  27  00:25  test2

5.3.2 子任务2 利用umask

如果你跟同学在用一部主机工作时,因为你们在设计同一个专题,所以老师根据你们的账号建立好了相同群组的状态,并且将/home/class/目录作为你们两个人的专题目录。想象一下,是否会出现你所制作的文件无法被同学编辑的情况?如果真这样就比较麻烦了。

但是这种状况可能会经常发生。从上面的案例来看,testl的权限是644。也就是说,如果umask的值为022,那么新建的数据只有用户自己具有写的权限,同群组的人只有读的权限,这样就无法共同制作专题。

因此,当我们需要新建文件给同群组的使用者共同编辑时,umask的群组就不能去掉2这个写的权限。这时umask的值应该是002,才能使新建的文件的权限是-rw-rw-r--。那么如何设定umask呢?方法十分简单,直接在umask后面输入002就可以了。命令运行情况如下:

        [root@RHEL6~]# umask 002
        [root@RHEL6~]# touch test3
        [root@RHEL6~]# mkdir test4
        [root@RHEL6~]# 11
        -rw-rw-r--1 root root    0 Sep 27 00:36 test3
        drwxrwxr-x 2 root root   4096 Sep 27 00:36 test4

umask对于新建文件来说,与目录的默认权限有很大关系。这个概念可以用在任何服务器上面,尤其是用在你架设的文件服务器(File Server)上,比如Samba Server或者FTP Server。

思考:假设你的umask为003,在此情况下建立的文件与目录的权限是怎样的?

分析:umask为003,所以去掉的权限为--------wx,则文件和目录的权限可按如下方式计算。

• 文件:

        (-rw-rw-rw-) -(-----w--w-)=-rw-rw-r--

• 目录:

        (drwxrwxrwx) -(d----w--w-)=drwxrwxr--

关于umask与权限的计算方式中,有的书中喜欢使用二进制的方式来进行AND与NOT的计算,不过,还是感觉上面这种计算方式比较容易。

提示:有的人喜欢使用文件的默认属性666与目录的默认属性777与umask进行相减来计算文件属性,这是不对的。以上面例题来看,如果使用默认属性相加减,则文件属性变成668-003=663,即-rw-rw--wx,这可就完全不对了。想想看,原本文件就已经去除了x这个默认属性了,怎么可能突然间又冒出来了呢?所以,这个地方一定要特别小心。

在预设的情况中,root的umask会去掉比较多的属性,root的umask默认是022,这是基于安全考虑的。至于一般使用者,通常他们的umask为002,即保留同群组的写入权力。其实,关于预设umask的设定可以参考/etc/bashrc这个文件的内容。

5.3.3 子任务3 设置文件的隐藏属性

1.chattr

功能说明:改变文件的属性。

语法:chattr[-RV][-v<版本编号>][+/-/=<属性>][文件或目录...]

这项指令可改变存放在ext2文件系统上的文件或目录的属性,这些属性共有以下8种模式。

•a:系统只允许在这个文件之后追加数据,不允许任何进程覆盖或截断这个文件。如果目录具有这个属性,系统将只允许在这个目录下建立和修改文件,而不允许删除任何文件。

•b:不更新文件或目录最后存取的时间。

•c:将文件或目录压缩后存放。

•d:将文件或目录排除在倾倒操作之外。

•i:不得任意改动文件或目录。

•s:隐秘地删除文件或目录。

•S:即时更新文件或目录。

•u:预防意外删除。

常数参数作用如下。

-R:递归处理,将指定目录下的所有文件及子目录一并处理。

-v<版本编号>:设置文件或目录的版本。

-V:显示指令执行的过程。

+<属性>:开启文件或目录的该项属性。

-<属性>:关闭文件或目录的该项属性。

=<属性>:指定文件或目录的该项属性。

请看下面的范例。

范例:请尝试到/tmp目录下建立文件,并加入i的参数,尝试删除看看。

        [root@RHEL6~]#cd    /tmp
        [root@RHEL6 tmp]#touch attrtest               <==建立一个空文件
        [root@RHEL6 tmp]#chattr  +i attrtest          <==给予i的属性
        [root@RHEL6 tmp]#rm attrtest                  <==尝试删除看看
        rm:remove write-protected regular empty file `attrtest'? y
        rm:cannot remove 'attrtest':Operation not permitted    <==不认可操作
        #可以看到,连root也没有办法将这个文件删除,所以应抓紧解除设定

范例:请将该文件的i属性取消。

        [root@RHEL6 tmp]# chattr -i attrtest

这个指令很重要,尤其是在系统的数据安全方面。其中,最重要的是+i与+a这两个属性。由于这些属性是隐藏的,所以需要用lsattr才能看到。

此外,如果是log file这种登录文档,就更需要+a这个可以增加但是不能修改与删除旧有数据的参数了。

2.lsattr(显示文件的隐藏属性)

语法:

        [root@RHEL6~]# lsattr [-adR]文件或目录

选项与参数如下。

•-a:将隐藏文件的属性也显示出来。

•-d:如果接的是目录,仅列出目录本身的属性而非目录内的文件名。

•-R:连同子目录的数据也一并列出来。

例如:

        [root@RHEL6 tmp]# chattr  +aij attrtest
        [root@RHEL6 tmp]# lsattr attrtest
        ----ia---j---  attrtest

使用chattr设定文件的属性后,可以利用lsattr命令来查阅隐藏的属性。不过,这两个指令在使用上必须特别小心,否则会造成很大的困扰。

5.3.4 子任务4 设置文件的特殊权限

我们前面一直提到关于文件的重要权限,那就是rwx这三个读、写、执行的权限。但是,/tmp和/usr/bin/passwd的权限却比较特殊。下面先看一下它们有何不同。

     [root@RHEL6~]# ls   -ld   /tmp; ls    -l   /usr/bin/passwd
     drwxrwxrwt. 30 root root 4096 1月  22 15:33 /tmp
     -rwsr-xr-x. 1 root root 30768 2月  172012 /usr/bin/passwd

不是应该只有rwx吗?怎么还有其他的特殊权限(s跟t)?但事实上确实有。

1.Set UID

当s这个标志出现在文件拥有者的x权限上时,例如刚刚提到的/usr/bin/passwd这个文件的权限状态-rwsr-xr-x,此时就被称为Set UID,简称为SUID的特殊权限。那么SUID的权限对于一个文件来说,其特殊功能是什么呢?

s或S(SUID, Set UID):可执行的文件搭配这个权限,便能得到特权,任意存取该文件的所有者能使用全部的系统资源。应注意具备SUID权限的文件,黑客经常利用这种权限,以SUID配上root账号拥有者,无声无息地在系统中开扇后门,供日后进出使用。

SUID有如下的限制与功能。

• SUID权限仅对二进制程序(binary program)有效。

• 执行者对于该程序需要具有x的可执行权限。

• 本权限仅在执行该程序的过程中有效(run-time)。

• 执行者将具有该程序拥有者(owner)的权限。

为了更好地理解SUID的概念,让我们举个例子来说明。在Linux系统中,我们将所有账号的密码都记录在/etc/shadow这个文件里面,这个文件的权限为-r--------1 root root,意思是这个文件仅有root账户可读且可以强制写入。既然这个文件仅有root账户可以修改,那么用户Bobby这个一般账号使用者能否自行修改自己的密码呢?你可以使用自己的账号输入passwd这个指令来看看,会发现能够修改自己的密码。为什么呢?

既然/etc/shadow不能让Bobby这个一般账户去存取,为什么Bobby还能够修改这个文件内的密码呢?这就是SUID的功能了。通过上述的功能说明,我们可以知道以下几点。

• Bobby对于/usr/bin/passwd程序来说是具有x权限的,表示Bobby能执行passwd命令。

• passwd的拥有者是root这个账户。

• Bobby执行passwd命令的过程中会暂时获得root账户的权限。

•/etc/shadow就可以被Bobby所执行的passwd命令所修改。

思考:如果Bobby使用cat去读取/etc/shadow,是否能够读取?

分析:因为cat不具有SUID的权限,所以Bobby执行cat/etc/shadow时,是不能读取/etc/shadow目录的。

2.Set GID

当s标志出现在文件拥有者权限的x项时称为SUID,而当s标志出现在属组权限的x项时则称为Set GID,即SGID。

s或S(SGID, Set GID)设置在文件上面,其效果与SUID相同,只不过将文件所有者换成用户组,该文件就可以任意存取整个用户组所能使用的系统资源。

举例来说,让我们用下面的指令来观察具有SGID权限的文件。

        [root@RHEL6~]# ls   -l   /usr/bin/locate
        -rwx--s--x 1 root slocate 23856 Mar 152007 /usr/bin/locate

与SUID不同的是,SGID可以针对文件或目录来设定。如果是针对文件来说,SGID有如下的功能。

• SGID对二进制程序有用。

• 程序执行者对于该程序来说需具备x的权限。

• 执行者在执行的过程中将会获得该程序群组的支持。

举例来说,上面的/usr/bin/locate这个程序可以去搜寻/var/lib/mlocate/mlocate.db这个文件的内容,mlocate.db的权限如下:

        [root@RHEL6~]# 11    /usr/bin/locate      /var/lib/mlocate/mlocate.db
        -rwx--s--x 1 root slocate 23856 Mar 152007 /usr/bin/locate
        -rw-r-----1 root slocate 3175776 Sep 28 04:02
        /var/lib/mlocate/mlocate.db

与SUID非常类似,若使用bobby这个账号去执行locate命令时,Bobby将会取得slocate群组的支持,因此就能够读取mlocate.db。

除了binary program之外,事实上SGID也能够用在目录上,这也是非常常见的一种用途。当一个目录设定了SGID的权限后,将具有如下的功能。

• 用户若对于此目录具有r与x的权限时,该用户能够进入此目录。

• 用户在此目录下的有效群组(effective group)将会变成该目录的群组。

• 用途:若用户在此目录下具有w的权限,就可以新建文件,则该新文件的群组与此目录的群组相同。

SGID对于项目开发来说非常重要,因为这涉及群组权限的问题。

3.Sticky Bit

Sticky Bit(SBIT)目前只针对目录有效,对于文件没有效果。

在Linux系统中,/tmp和/var/tmp目录供所有用户暂时存取文件,每位用户都拥有完整的访问该目录的权限,即所有用户都可以浏览、删除和移动该目录下的文件。

从管理的角度出发,如果要求只有用户自己和root才有权限删除和移动该用户已建立的文件,其他用户不能删除这些已建立的文件,怎么办?答案就是使用SBIT。

举例来说,当甲用户在A目录里具有群组或其他人的身份,并且拥有该目录写的权限,这表示甲用户对该目录内任何人建立的目录或文件均可进行删除/更名/搬移等动作。不过,如果将A目录加上了SBIT的权限项目时,则甲只能够针对自己建立的文件或目录进行删除/更名/移动等动作,而无法删除他人的文件。

举例来说,我们的/tmp目录本身的权限是drwxrwxrwt,在这样的权限内容下,任何人都可以在/tmp内新增、修改文件,但仅有该文件/目录建立者与root能够删除自己的目录或文件。

做一做:①以root登录系统,并且进入/tmp当中;②用touch test及相关命令更改test权限为777; ③以一般使用者身份登录,并进入/tmp目录;④尝试删除test这个文件。

4.设定SUID/SGID/SBIT权限

前面介绍过SUID与SGID的功能,那么如何配置文件权限使其具有SUID与SGID的权限呢?这就需要使用前面刚刚学过的用数字更改权限的方法了。我们知道以数字方式更改权限的方式为三个数字的组合,那么如果在这三个数字之前再加上一个数字,最前面的那个数字就代表这几个的权限了。其中4为SUID,2为SGID,1为SBIT。

假设要将一个文件权限-rwsr-xr-x改为-rwsr-xr-x,由于s在用户权力中,所以是SUID,因此,在原先的755之前还要加上4,也就是用chmod 4755 filename来设定。请参考下面的范例。

注意:该范例只是练习而已,所以使用同一个文件来设定,你必须了解SUID不是用在目录上,而SBIT不是用在文件上。

        [root@RHEL6~]# cd  /tmp
        [root@RHEL6 tmp]# touch test                  <==建立一个测试用文件
        [root@RHEL6 tmp]# chmod 4755 test; ls -l test   <==加入具有SUID的权限
        -rwsr-xr-x 1 root root 0 Sep 29 03:06 test
        [root@RHEL6 tmp]# chmod 6755 test; ls -l test   <==加入具有SUID/SGID的权限
        -rwsr-sr-x 1 root root 0 Sep 29 03:06 test
        [root@RHEL6 tmp]# chmod 1755 test; ls -l test   <==加入SBIT的功能
        -rwxr-xr-t 1 root root 0 Sep 29 03:06 test
        [root@RHEL6 tmp]# chmod 7666 test; ls -l test   <==具有空的SUID/SGID权限
        -rwSrwSrwT 1 root root 0 Sep 29 03:06 test

上面最后一条命令使用时要特别小心。怎么会出现大写的S与T呢?不都是小写的吗?因为s与t都是取代x这个权限的,我们下达的是7666,也就是说,user、group以及others都没有x这个可执行的标志(权限666),所以,这个S、T代表的就是“空的”。为什么呢?SUID是表示该文件在执行的时候具有文件拥有者的权限,但是文件拥有者都无法执行了,哪里来的权限给其他人使用?当然就是空的了。

除了数字法之外,我们可以通过符号法来设置权限。其中SUID为u+s,而SGID为g+s, SBIT则是o+t。请看下面的范例(设定权限为-rws--x--x):

        [root@RHEL6 tmp]# chmod u=rwxs, go=x test; ls   -l   test
        -rws--x--x 1 root root 0 Aug 18 23:47 test

再在上述的文件权限中加上SGID与SBIT。

        [root@RHEL6 tmp]# chmod g+s, o+t test; ls    -l    test
        -rws--s--t 1 root root 0 Aug 18 23:47 test