zoukankan      html  css  js  c++  java
  • 鸟哥笔记-专题一:Linux文件的权限rwx、特殊权限sst、隐藏权限ia

    编辑

    鸟哥笔记-专题一:Linux文件的权限rwx、特殊权限sst、隐藏权限ia

    ==========================================================================================

    目录:

    一、Linux文件和目录的权限

    二、Linux文件和目录的特殊权限

    三、Linux文件和目录的隐藏权限

    ==========================================================================================

    正文:

    一、Linux文件和目录的权限
    1、可读可行可执行(r,w,x),目录文件和链接(d,-,l)
    Linux文件权限的内容我们可以知道一个文件有若干个属性, 包括读写执行(r, w,x)等基本权限,及是否为目录 (d) 与文件 (-) 或者是链接文件 (l) 等等的属性!
    形如:
    drwxrwxrwx 777
    r—权重4
    w—权重2
    x—权重1

    7=4+2+1,即为有rwx权限。


    2、要修改属性的方法(chmod,chown,chgrp)

    修改权限
    chmod 770 1.txt
    chmod u+w 1.txt
    修改拥有者、组
    chown lisi.myweb 1.txt
    只修改所属组可以用
    chgrp myweb 1.txt

    小结:

    chmod:改变文件的权限,SUID,SGID,SBIT等等的特性。
    chown:改变文件拥有者。
    chgrp:改变文件所属群组。

    3、默认权限(umask)
    umask 就是指定 “目前使用者在创建文件或目录时候的权限默认值”, 那么如何得知或设置 umask 呢?
    (1)得知默认权限umask的值:
    [root@study ~]# umask
    0022 # 与一般权限有关的是后面三个数字!
    [root@study ~]# umask -S
    u=rwx,g=rx,o=rx

    如果以上面的例子来说明的话,因为 umask 为 022 ,所以 user 并没有被拿掉任何权限,不过 group 与 others 的权限被拿掉了 2 (也就是 w 这个权限),那么当使用者:

    创建文件时:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
    创建目录时:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x

    root用户的umask默认值为022,普通用户的umask默认值为002。

    (2)修改umask的值:
    当我们需要新建文件给同群组的使用者共同编辑时,那么 umask 的群组就不能拿掉 2 这个 w 的权限! 所以啰, umask 就得要是 002 之类的才可以!这样新建的文件才能够是 -rw-rw-r-- 的权限模样喔! 那么如何设置 umask 呢?简单的很,直接在 umask 后面输入 002就好了!
    [root@study ~]# umask 002
    [root@study ~]# touch test3
    [root@study ~]# mkdir test4
    [root@study ~]# ll -d test[34]           # 中括号 [ ] 代表中间有个指定的字符,而不是任意字符的意思
    -rw-rw-r--. 1 root root 0 6月 16 01:12 test3
    drwxrwxr-x. 2 root root 6 6月 16 01:12 test4

    二、Linux文件和目录的特殊权限
    文件特殊权限: SUID, SGID, SBIT
    特殊权限( s,s,t )

    小结SUID、SGID、SBIT
    1、SUID-4s的作用是B运行二进制文件时,获得其拥有者A的权限。举例/usr/bin/passwd的权限状态:“-rwsr-xr-x root root ”,其他用户B运行该二进制程序时,具有拥有者A root的权限rwx。
    2、SGID-2s的作用是2种
    (1)对二进制文件,A运行时,A获得其群组G的权限。举例/usr/bin/locate的权限状态:“-rwx--s--x 1 root slocate”,对/var/lib/mlocate/mlocate.db:“-rw-r----- 1 root slocate”有slocate组的r--权限
    (2)对文件夹,用于专案开发,不同用户A、B拉入同一myproject组,在同一个project文件夹下“drwxrwx--- 2 root project”,A可以开发B新建的文件。
    3、SBIT-1t的作用是防止A用户删除B用户的文件。例如:/test1权限为“-rwxr-xr-t 1 root root”只有拥有者和root才可以删除。

    1、Set UID (s表示,仅对二进制文件有用)
    (1)SUID针对二进制文件:chmod 4551 xxx
    /usr/bin/passwd 这个文件的权限状态:“-rwsr-xr-x”,此时就被称为Set UID,简称为 SUID的特殊权限。

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

    (2)SUID应用场景:
    Linux系统中,所有帐号的密码都记录在/etc/shadow这个文件里面,这个文件的权限为:“---------- 1 root root”,意思是这个文件仅有root可读且仅有root可以强制写入而已。
    明明/etc/shadow就不能让dmtsai这个一般帐户去存取的,为什么dmtsai还能够修改这个文件内的密码呢?这就是SUID的功能啦!

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

     

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

    2、Set GID(第二个s表示,对二进制文件、目录有用)
    (一)对二进制文件
    (1)SGID如果是对二进制文件来说,SGID有如下的功能:
      1、SGID对二进制程序有用;
      2、程序执行者对于该程序来说,需具备x的权限;
      3、执行者在执行的过程中将会获得该程序群组的支持!

    (2)SGID应用场景:(针对二进制文件:chmod 2711 xxx)如:/usr/bin/locate
      [root@VM_0_17_centos ~]# ll /usr/bin/locate /var/lib/mlocate/mlocate.db
      -rwx--s--x 1 root slocate 40K Apr 11 2018 /usr/bin/locate
      -rw-r----- 1 root slocate 6.8M Mar 23 03:30 /var/lib/mlocate/mlocate.db

    (二)对目录
    (1)如果是对文件夹来说,SGID有如下功能:
      1、使用者若对于此目录具有r与x的权限时,该使用者能够进入此目录;
      2、使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
      用途:若使用者在此目录下具有w的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。
    对于专案开发来说是非常重要的!因为这涉及群组权限的问题。

    (2)SGID应用场景:(针对目录:chmod 2770 xxx)
    假设系统中有两个帐号,分别是alex与arod,这两个人除了自己群组之外还共同支持一个名为project的群组。假设这两个用户需要共同拥有/srv/ahome/ 目录的开发权,且该目录不许其他人进入查阅。请问该目录的权限设置应为何?
      目标:了解到为何专案开发时,目录最好需要设置SGID的权限!
      前提:多个帐号支持同一群组,且共同拥有目录的使用权!
      需求:需要使用root的身份来进行chmod,chgrp等帮用户设置好他们的开发环境才行!这也是管理员的重要任务之一!
    1)要先制作出这两个帐号的相关数据:
      [root@study ~]# groupadd project # 增加新的群组
      [root@study ~]# useradd -G project alex # 创建alex帐号,且支持project
      [root@study ~]# useradd -G project arod # 创建arod帐号,且支持project
      [root@study ~]# id alex # 查阅alex 帐号的属性
      uid=1001(alex) gid=1002(alex) groups=1002(alex),1001(project) # 确实有支持!
      [root@study ~]# id arod
      uid=1002(arod) gid=1003(arod) groups=1003(arod),1001(project) # 确实有支持!
    2)然后开始来解决我们所需要的环境:
    ①首先创建所需要开发的专案目录
      [root@study ~]# mkdir /srv/ahome
      [root@study ~]# ll -d /srv/ahome
      drwxr-xr-x. 2 root root 6 Jun 17 00:22 /srv/ahome
    ②从上面的输出结果可发现alex与arod都不能在该目录内创建文件,因此需要进行权限与属性的修改。 由于其他人均不可进入此目录,因此该目录的群组应为project,权限应为770才合理。
      [root@study ~]# chgrp project /srv/ahome
      [root@study ~]# chmod 770 /srv/ahome
      [root@study ~]# ll -d /srv/ahome
      drwxrwx---. 2 root project 6 Jun 17 00:22 /srv/ahome
      # 从上面的权限结果来看,由于 alex/arod 均支持 project,因此似乎没问题了!
      但是,alex在/srv/ahome目录下创建的文件的群组是alex,arod并能查看和编辑!
    ③加入 SGID的权限在里面
      [root@study ~]# chmod 2770 /srv/ahome
      [root@study ~]# ll -d /srv/ahome
      drwxrws---. 2 root project 17 Jun 17 00:23 /srv/ahome
      现在再使用alex去创建一个文件,并且查阅文件权限。发现工作组编程了project。到此,专案开发权限设置大功告成。
      此目录的权限最好是“2770”,所属文件拥有者属于root即可,至于群组必须要为两人共同支持的project 这个群组才行!

    3、Sticky Bit(t表示,仅对目录有用)
    这个 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 这个文件!

    4、SUID/SGID/SBIT 权限设置
    前面介绍过 SUID 与 SGID 的功能,那么如何设置文件使成为具有 SUID 与 SGID 的权限呢?这就需要第五章的数字更改权限的方法了! 现在你应该已经知道数字体态更改权限的方式为“三个数字”的组合, 那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字就代表这几个权限了!
    4 为 SUID
    2 为 SGID
    1 为 SBIT

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

    [root@study ~]# cd /tmp
    [root@study tmp]# touch test # 创建一个测试用空档
    [root@study tmp]# chmod 4755 test; ls -l test # 加入具有 SUID 的权限
    -rwsr-xr-x 1 root root 0 Jun 16 02:53 test
    [root@study tmp]# chmod 6755 test; ls -l test # 加入具有 SUID/SGID 的权限
    -rwsr-sr-x 1 root root 0 Jun 16 02:53 test
    [root@study tmp]# chmod 1755 test; ls -l test # 加入 SBIT 的功能!
    -rwxr-xr-t 1 root root 0 Jun 16 02:53 test
    [root@study tmp]# chmod 7666 test; ls -l test # 具有空的 SUID/SGID 权限
    -rwSrwSrwT 1 root root 0 Jun 16 02:53 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@study tmp]# chmod u=rwxs,go=x test; ls -l test
    -rws--x--x 1 root root 0 Jun 16 02:53 test
    # 承上,加上 SGID 与 SBIT 在上述的文件权限中!
    [root@study tmp]# chmod g+s,o+t test; ls -l test
    -rws--s--t 1 root root 0 Jun 16 02:53 test

    三、Linux文件和目录的隐藏权限
    1、隐藏权限(i,a)
    除了基本r, w, x权限外,在Linux传统的Ext2/Ext3/Ext4文件系统下,我们还可以设置其他的系统隐藏属性, 这部份可使用 chattr 来设置,而以 lsattr 来查看,最重要的属性就是可以设置其不可修改的特性!让连文件的拥有者都不能进行修改! 这个属性可是相当重要的,尤其是在安全机制上面 (security)!比较可惜的是,在 CentOS 7.x 当中利用 xfs 作为默认文件系统, 但是 xfs 就没有支持所有的 chattr 的参数了!仅有部份参数还有支持而已!

    2、lsattr (显示文件隐藏属性)
    [root@study tmp]# lsattr attrtest
    --S-ia---------- attrtest
    使用 chattr 设置后,可以利用 lsattr 来查阅隐藏的属性。

    3、chattr (设置文件隐藏属性)

    chattr +a 1.txt # 设置隐藏属性a后,可增加数据,但root也无法删除该文件。
    chattr -a 1.txt # 取消隐藏属性a。

    i属性:均不可改增删(包括root也不能)。
    a属性:可增,不可改删(包括root也不能)。
    个人认为最重要的当属 +i 与 +a 这个属性了。+i 可以让一个文件无法被更动,对于需要强烈的系统安全的人来说, 真是相当的重要的!里头还有相当多的属性是需要 root 才能设置的呢!

    4、隐藏属性设置的通用语法格式

    [root@study ~]# chattr [+-=][ASacdistu] 文件或目录名称
    选项与参数:
    + :增加某一个特殊参数,其他原本存在参数则不动。
    - :移除某一个特殊参数,其他原本存在参数则不动。
    = :设置一定,且仅有后面接的参数
    A :当设置了 A 这个属性时,若你有存取此文件(或目录)时,他的存取时间 atime 将不会被修改,可避免 I/O 较慢的机器过度的存取磁盘。(目前建议使用文件系统挂载参数处理这个项目)
    S :一般文件是非同步写入磁盘的(原理请参考[前一章sync](../Text/index.html#sync)的说明),如果加上 S 这个属性时,当你进行任何文件的修改,该更动会“同步”写入磁盘中。
    a :当设置 a 之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有root 才能设置这属性
    c :这个属性设置之后,将会自动的将此文件“压缩”,在读取的时候将会自动解压缩,但是在储存的时候,将会先进行压缩后再储存(看来对于大文件似乎蛮有用的!)
    d :当 dump 程序被执行的时候,设置 d 属性将可使该文件(或目录)不会被 dump 备份
    i :这个 i 可就很厉害了!他可以让一个文件“不能被删除、改名、设置链接也无法写入或新增数据!”对于系统安全性有相当大的助益!只有 root 能设置此属性
    s :当文件设置了 s 属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘空间,所以如果误删了,完全无法救回来了喔!
    u :与 s 相反的,当使用 u 来设置文件时,如果该文件被删除了,则数据内容其实还存在磁盘中,可以使用来救援该文件喔!
    注意1:属性设置常见的是 a 与 i 的设置值,而且很多设置值必须要身为 root 才能设置
    注意2:xfs 文件系统仅支持 AadiS 而已

     

  • 相关阅读:
    Scala控制抽象
    【转】ZooKeeper详细介绍和使用第一节
    zookeeper入门系列讲解
    最全面的 Spring 学习笔记
    MySQL 字符串拼接详解
    细说Python2.x与3​​.x版本区别
    【转】微信公众开发URL和token填写详解
    【转】Java代码操作Redis的sentinel和Redis的集群Cluster操作
    Java正则表达式的使用和详解(下)
    Java正则表达式的使用和详解(上)
  • 原文地址:https://www.cnblogs.com/andy9468/p/12448760.html
Copyright © 2011-2022 走看看