zoukankan      html  css  js  c++  java
  • Linux学习之CentOS(八)----文件与目录的默认权限与隐藏权限(转)

    文件与目录的默认权限与隐藏权限

    一个文件有若干个属性, 包括读写运行(r, w, x)等基本权限,及是否为目录 (d) 与文件 (-) 或者是连结档 (l) 等等的属性! 要修改属性的方法在前面也约略提过了(chgrpchownchmod) ,本小节会再加强补充一下!

    除了基本r, w, x权限外,在Linux的Ext2/Ext3文件系统下,我们还可以配置其他的系统隐藏属性, 这部份可使用 chattr 来配置,而以 lsattr 来查看,最重要的属性就是可以配置其不可修改的特性!让连文件的拥有者都不能进行修改! 这个属性可是相当重要的,尤其是在安全机制上面 (security)!

    文件默认权限:umask

    OK!那么现在我们知道如何创建或者是改变一个目录或文件的属性了,不过, 你知道当你创建一个新的文件或目录时,他的默认权限会是什么吗?呵呵!那就与 umask 这个玩意儿有关了!那么 umask 是在搞什么呢?基本上, umask 就是指定 『目前使用者在创建文件或目录时候的权限默认值』, 那么如何得知或配置 umask 呢?他的指定条件以底下的方式来指定:

    [root@www ~]# umask
    0022             <==与一般权限有关的是后面三个数字!
    [root@www ~]# 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 分,所以罗!也就是说,当要拿掉能写的权限,就是输入 2 分,而如果要拿掉能读的权限,也就是 4 分,那么要拿掉读与写的权限,也就是 6 分,而要拿掉运行与写入的权限,也就是 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@www ~]# umask
    0022
    [root@www ~]# touch test1
    [root@www ~]# mkdir test2
    [root@www ~]# ll 
    -rw-r--r-- 1 root root     0 Sep 27 00:25 test1
    drwxr-xr-x 2 root root  4096 Sep 27 00:25 test2
    复制代码

    umask的利用与重要性:专题制作

    想像一个状况,如果你跟你的同学在同一部主机里面工作时,因为你们两个正在进行同一个专题, 老师也帮你们两个的帐号创建好了相同群组的状态,并且将 /home/class/ 目录做为你们两个人的专题目录。 想像一下,有没有可能你所制作的文件你的同学无法编辑?果真如此的话,那就伤脑筋了!

    这个问题很常发生啊!举上面的案例来看就好了,你看一下 test1 的权限是几分? 644 呢!意思是『如果 umask 订定为 022 ,那新建的数据只有使用者自己具有 w 的权限, 同群组的人只有 r 这个可读的权限而已,并无法修改喔!』这样要怎么共同制作专题啊!您说是吧!

    所以,当我们需要新建文件给同群组的使用者共同编辑时,那么 umask 的群组就不能拿掉 2 这个 w 的权限! 所以罗, umask 就得要是 002 之类的才可以!这样新建的文件才能够是 -rw-rw-r-- 的权限模样喔! 那么如何配置 umask 呢?简单的很,直接在 umask 后面输入 002 就好了!

    [root@www ~]# umask 002
    [root@www ~]# touch test3
    [root@www ~]# mkdir test4
    [root@www ~]# ll 
    -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 时, 都是很重要的观念!这牵涉到你的使用者是否能够将文件进一步利用的问题喔!不要等闲视之!

    在默认的情况中, root 的 umask 会拿掉比较多的属性,root 的 umask 默认是 022 , 这是基於安全的考量啦~至於一般身份使用者,通常他们的 umask 为 002 ,亦即保留同群组的写入权力! 其实,关於默认 umask 的配置可以参考 /etc/bashrc 这个文件的内容,不过,不建议修改该文件。

    文件隐藏属性:

    什么?文件还有隐藏属性?光是那九个权限就快要疯掉了,竟然还有隐藏属性,真是要命~ 但是没办法,就是有文件的隐藏属性存在啊!不过,这些隐藏的属性确实对於系统有很大的帮助的~ 尤其是在系统安全 (Security) 上面,重要的紧呢!不过要先强调的是,底下的chattr命令只能在Ext2/Ext3的文件系统上面生效, 其他的文件系统可能就无法支持这个命令了。底下我们就来谈一谈如何配置与检查这些隐藏的属性吧!

    chattr (配置文件隐藏属性)

    复制代码
    [root@www ~]# chattr [+-=][ASacdistu] 文件或目录名称
    选项与参数:
    +   :添加某一个特殊参数,其他原本存在参数则不动。
    -   :移除某一个特殊参数,其他原本存在参数则不动。
    =   :配置一定,且仅有后面接的参数
    
    A  :当配置了 A 这个属性时,若你有存取此文件(或目录)时,他的存取时间 atime
         将不会被修改,可避免I/O较慢的机器过度的存取磁碟。这对速度较慢的计算机有帮助
    S  :一般文件是非同步写入磁碟的(原理请参考第五章sync的说明),如果加上 S 这个
         属性时,当你进行任何文件的修改,该更动会『同步』写入磁碟中。
    a  :当配置 a 之后,这个文件将只能添加数据,而不能删除也不能修改数据,只有root 
         才能配置这个属性。 
    c  :这个属性配置之后,将会自动的将此文件『压缩』,在读取的时候将会自动解压缩,
         但是在储存的时候,将会先进行压缩后再储存(看来对於大文件似乎蛮有用的!)
    d  :当 dump 程序被运行的时候,配置 d 属性将可使该文件(或目录)不会被 dump 备份
    i  :这个 i 可就很厉害了!他可以让一个文件『不能被删除、改名、配置连结也无法
         写入或新增数据!』对於系统安全性有相当大的助益!只有 root 能配置此属性
    s  :当文件配置了 s 属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘
         空间,所以如果误删了,完全无法救回来了喔!
    u  :与 s 相反的,当使用 u 来配置文件时,如果该文件被删除了,则数据内容其实还
         存在磁碟中,可以使用来救援该文件喔!
    注意:属性配置常见的是 a 与 i 的配置值,而且很多配置值必须要身为 root 才能配置
    
    #请尝试到/tmp底下创建文件,并加入 i 的参数,尝试删除看看。
    [root@www ~]# cd /tmp
    [root@www tmp]# touch attrtest     <==创建一个空文件
    [root@www tmp]# chattr +i attrtest <==给予 i 的属性
    [root@www tmp]# rm attrtest        <==尝试删除看看
    rm: remove write-protected regular empty file `attrtest'? y
    rm: cannot remove `attrtest': Operation not permitted  <==操作不许可
    # 看到了吗?呼呼!连 root 也没有办法将这个文件删除呢!赶紧解除配置!
    
    请将该文件的 i 属性取消!
    [root@www tmp]# chattr -i attrtest
    复制代码

    这个命令是很重要的,尤其是在系统的数据安全上面!由於这些属性是隐藏的性质,所以需要以 lsattr 才能看到该属性呦!其中,个人认为最重要的当属 +i 与 +a 这个属性了。+i 可以让一个文件无法被更动,对於需要强烈的系统安全的人来说, 真是相当的重要的!里头还有相当多的属性是需要 root 才能配置的呢!

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

    lsattr (显示文件隐藏属性)

    复制代码
    [root@www ~]# lsattr [-adR] 文件或目录
    选项与参数:
    -a :将隐藏档的属性也秀出来;
    -d :如果接的是目录,仅列出目录本身的属性而非目录内的档名;
    -R :连同子目录的数据也一并列出来! 
    
    [root@www tmp]# chattr +aij attrtest
    [root@www tmp]# lsattr attrtest
    ----ia---j--- attrtest
    复制代码

    使用 chattr 配置后,可以利用 lsattr 来查阅隐藏的属性。不过, 这两个命令在使用上必须要特别小心,否则会造成很大的困扰。例如:某天你心情好,突然将 /etc/shadow 这个重要的密码记录文件给他配置成为具有 i 的属性,那么过了若干天之后, 你突然要新增使用者,却一直无法新增!别怀疑,赶快去将 i 的属性拿掉吧!

    文件特殊权限: SUID, SGID, SBIT

    [root@www ~]# ls -ld /tmp ; ls -l /usr/bin/passwd
    drwxrwxrwt 7 root root 4096 Sep 27 18:23 /tmp
    -rwsr-xr-x 1 root root 22984 Jan  7  2007 /usr/bin/passwd

    不是应该只有 rwx 吗?还有其他的特殊权限( s 跟 t )啊?啊.....头又开始昏了~ @_@ 因为 s 与 t 这两个权限的意义与帐户和进程较为相关!底下的说明先看看就好,如果看不懂也没有关系, 先知道s放在哪里称为SUID/SGID以及如何配置即可!

    Set UID

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

    • SUID 权限仅对二进位程序(binary program)有效;
    • 运行者对於该程序需要具有 x 的可运行权限;
    • 本权限仅在运行该程序的过程中有效 (run-time);
    • 运行者将具有该程序拥有者 (owner) 的权限。

    讲这么硬的东西你可能对於 SUID 还是没有概念,没关系,我们举个例子来说明好了。 我们的 Linux 系统中,所有帐号的密码都记录在 /etc/shadow 这个文件里面,这个文件的权限为:『-r-------- 1 root root』,意思是这个文件仅有root可读且仅有root可以强制写入而已。 既然这个文件仅有 root 可以修改,那么鸟哥的 vbird 这个一般帐号使用者能否自行修改自己的密码呢? 你可以使用你自己的帐号输入『passwd』这个命令来看看,嘿嘿!一般使用者当然可以修改自己的密码了!

    唔!有没有冲突啊!明明 /etc/shadow 就不能让 vbird 这个一般帐户去存取的,为什么 vbird 还能够修改这个文件内的密码呢? 这就是 SUID 的功能啦!藉由上述的功能说明,我们可以知道

    1. vbird 对於 /usr/bin/passwd 这个程序来说是具有 x 权限的,表示 vbird 能运行 passwd;
    2. passwd 的拥有者是 root 这个帐号;
    3. vbird 运行 passwd 的过程中,会『暂时』获得 root 的权限;
    4. /etc/shadow 就可以被 vbird 所运行的 passwd 所修改。

    但如果 vbird 使用 cat 去读取 /etc/shadow 时,他能够读取吗?因为 cat 不具有 SUID 的权限,所以 vbird 运行 『cat /etc/shadow』 时,是不能读取 /etc/shadow 的。我们用一张示意图来说明如下:

    SUID程序运行的过程示意图
    图4.4.1、SUID程序运行的过程示意图

    另外,SUID 仅可用在binary program 上, 不能够用在 shell script 上面!这是因为 shell script 只是将很多的 binary 运行档叫进来运行而已!所以 SUID 的权限部分,还是得要看 shell script 呼叫进来的程序的配置, 而不是 shell script 本身。当然,SUID 对於目录也是无效的~这点要特别留意。

    Set GID

    当 s 标志在文件拥有者的 x 项目为 SUID,那 s 在群组的 x 时则称为 Set GID, SGID 罗!是这样没错!^_^。 举例来说,你可以用底下的命令来观察到具有 SGID 权限的文件喔:

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

    SGID 对二进位程序有用;与 SUID 不同的是,SGID 可以针对文件或目录来配置!如果是对文件来说, SGID 有如下的功能:

    • 程序运行者对於该程序来说,需具备 x 的权限;
    • 运行者在运行的过程中将会获得该程序群组的支持!

    举例来说,上面的 /usr/bin/locate 这个程序可以去搜寻 /var/lib/mlocate/mlocate.db 这个文件的内容 (详细说明会在下节讲述), mlocate.db 的权限如下:

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

    除了 binary program 之外,事实上 SGID 也能够用在目录上,这也是非常常见的一种用途! 当一个目录配置了 SGID 的权限后,他将具有如下的功能:与 SUID 非常的类似,若我使用 vbird 这个帐号去运行 locate 时,那 vbird 将会取得 slocate 群组的支持, 因此就能够去读取 mlocate.db 啦!非常有趣吧!

    • 使用者若对於此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
    • 使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
    • 用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。

    SGID 对於专案开发来说是非常重要的!因为这涉及群组权限的问题。

    Sticky Bit

    这个 Sticky Bit, SBIT 目前只针对目录有效,对於文件已经没有效果了。 SBIT 对於目录的作用是:

    • 当使用者对於此目录具有 w, x 权限,亦即具有写入的权限时;
    • 当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件

    换句话说:当甲这个使用者於 A 目录是具有群组或其他人的身份,并且拥有该目录 w 的权限, 这表示『甲使用者对该目录内任何人创建的目录或文件均可进行 "删除/更名/搬移" 等动作。』 不过,如果将 A 目录加上了 SBIT 的权限项目时, 则甲只能够针对自己创建的文件或目录进行删除/更名/移动等动作,而无法删除他人的文件。

    举例来说,我们的 /tmp 本身的权限是『drwxrwxrwt』, 在这样的权限内容下,任何人都可以在 /tmp 内新增、修改文件,但仅有该文件/目录创建者与 root 能够删除自己的目录或文件。这个特性也是挺重要的啊!你可以这样做个简单的测试:

    1. 以 root 登陆系统,并且进入 /tmp 当中;
    2. touch test,并且更改 test 权限成为 777 ;
    3. 以一般使用者登陆,并进入 /tmp;
    4. 尝试删除 test 这个文件!

    SUID/SGID/SBIT 权限配置

     现在你应该已经知道数字型态更改权限的方式为『三个数字』的组合, 那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字就代表这几个权限了!

    • 4 为 SUID
    • 2 为 SGID
    • 1 为 SBIT

    假设要将一个文件权限改为『-rwsr-xr-x』时,由於 s 在使用者权限中,所以是 SUID ,因此, 在原先的 755 之前还要加上 4 ,也就是:『 chmod 4755 filename 』来配置!此外,还有大 S 与大 T 的产生喔!参考底下的范例啦!

    复制代码
    [root@www ~]# cd /tmp
    [root@www tmp]# touch test                  <==创建一个测试用空档
    [root@www tmp]# chmod 4755 test; ls -l test <==加入具有 SUID 的权限
    -rwsr-xr-x 1 root root 0 Sep 29 03:06 test
    [root@www tmp]# chmod 6755 test; ls -l test <==加入具有 SUID/SGID 的权限
    -rwsr-sr-x 1 root root 0 Sep 29 03:06 test
    [root@www tmp]# chmod 1755 test; ls -l test <==加入 SBIT 的功能!
    -rwxr-xr-t 1 root root 0 Sep 29 03:06 test
    [root@www 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@www 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@www tmp]# chmod g+s,o+t test; ls -l test
    -rws--s--t 1 root root 0 Aug 18 23:47 test
    复制代码

    观察文件类型:file

    如果你想要知道某个文件的基本数据,例如是属於 ASCII 或者是 data 文件,或者是 binary , 且其中有没有使用到动态函式库 (share library) 等等的资讯,就可以利用 file 这个命令来检阅喔! 举例来说:

    复制代码
    [root@www ~]# file ~/.bashrc
    /root/.bashrc: ASCII text  <==告诉我们是 ASCII 的纯文字档啊!
    [root@www ~]# file /usr/bin/passwd
    /usr/bin/passwd: setuid ELF 32-bit LSB executable, Intel 80386, version 1 
    (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for 
    GNU/Linux 2.6.9, stripped
    # 运行档的数据可就多的不得了!包括这个文件的 suid 权限、兼容於 Intel 386
    # 等级的硬件平台、使用的是 Linux 核心 2.6.9 的动态函式库连结等等。
    [root@www ~]# file /var/lib/mlocate/mlocate.db
    /var/lib/mlocate/mlocate.db: data  <== 这是 data 文件!
    复制代码

    透过这个命令,我们可以简单的先判断这个文件的格式为何喔!

  • 相关阅读:
    HTB-靶机-Charon
    第一篇Active Directory疑难解答概述(1)
    Outlook Web App 客户端超时设置
    【Troubleshooting Case】Exchange Server 组件状态应用排错?
    【Troubleshooting Case】Unable to delete Exchange database?
    Exchange Server 2007的即将生命周期,您的计划是?
    "the hypervisor is not running" 故障
    Exchange 2016 体系结构
    USB PE
    10 months then free? 10个月,然后自由
  • 原文地址:https://www.cnblogs.com/qzqdy/p/7991880.html
Copyright © 2011-2022 走看看