zoukankan      html  css  js  c++  java
  • Linux 特殊权限

    普通权限管理详细说明

    一,特殊权限:SUID,SGID,STICKY

    1,SUID

    • 默认情况下,用户发起的进程的属主是其发起者,因此,进程以发起者的身份去访问别的资源。

      SUID的作用:用户执行某个程序文件时,如果此程序文件拥有SUID权限,则此进程的属主不是其发起者,而是这个程序文件的属主。

      SUID权限的风险很大!

    • 管理文件的SUID权限:chmod u+|-s FILE...

      展示位置:属主的执行权限位。

      • 原来属主有执行权限:显示为小写的s。
      • 原来属主没有执行权限:显示为大写的S。

      例子:非root用户是无法使用/bin/cat命令查看/etc/shadow文件的内容的。

      拷贝/bin/cat到/home/ys/bin下,给/home/ys/bin/cat加上SUID后,就可以使用/home/ys/bin/cat命令,查看/etc/shadow文件的内容了。

      # ll /etc/shadow
      ----------. 1 root root 1674 Dec 24 17:19 /etc/shadow
      # su - ys
      $ cat /etc/shadow
      cat: /etc/shadow: Permission denied
      # ll /bin/cat
      -rwxr-xr-x. 1 root root 54160 Oct 31  2018 /bin/cat
      # cp /bin/cat /home/ys/bin/
      # ll /home/ys/bin/
      -rwxr-xr-x. 1 root root 54160 Dec 24 18:17 cat
      # su - ys
      $ /home/ys/bin/cat /etc/shadow
      /home/ys/bin/cat: /etc/shadow: Permission denied
      $ sudo chmod u+s /home/ys/bin/cat
      $ ll /home/ys/bin/cat
      -rwsr-xr-x. 1 root root 54160 Dec 24 18:17 /home/ys/bin/cat
      $ /home/ys/bin/cat /etc/shadow > /dev/null
      $ echo $?
      0
      
    • 由于没有个用户都可以修改自己的密码,所以程序/bin/passwd就必须有SUID权限。因为修改密码要修改/etc/passwd文件,这个文件只有root用户才有写权限。所以普通用户运行/bin/passwd,就必须用root的身份运行,才能够修改/etc/passwd文件。

      $ ll /bin/passwd
      -rwsr-xr-x. 1 root root 27832 Jun 10  2014 /bin/passwd
      $ ll /etc/passwd
      -rw-r--r--. 1 root root 2643 Dec 23 21:38 /etc/passwd
      

    2, SGID

    • SetGID(SGID)对文件的作用
      同 SUID 类似,对于文件来说,SGID 具有如下几个特点:
      SGID 只针对可执行文件有效,换句话说,只有可执行文件才可以被赋予 SGID 权限,普通文件赋予 SGID 没有意义。
      用户需要对此可执行文件有 x 权限;
      用户在执行具有 SGID 权限的可执行文件时,用户的群组身份会变为文件所属群组;
      SGID 权限赋予用户改变组身份的效果,只在可执行文件运行过程中有效;
      其实,SGID 和 SUID 的不同之处就在于,SUID 赋予用户的是文件所有者的权限,而 SGID 赋予用户的是文件所属组的权限,就这么简单。

    就以本节开头的 locate 命令为例,可以看到,/usr/bin/locate 文件被赋予了 SGID 的特殊权限,这就意味着,当普通用户使用 locate 命令时,该用户的所属组会直接变为 locate 命令的所属组,也就是 slocate。

    我们知道,locate 命令是用于在系统中按照文件名查找符合条件的文件的,当执行搜索操作时,它会通过搜索 /var/lib/mlocate/mlocate.db 这个数据库中的数据找到答案,我们来看看此数据库的权限:
    [root@localhost ~]# ll /var/lib/mlocate/mlocate.db
    -rw-r-----. 1 root slocate 1838850 1月20 04:29 /var/lib/mlocate/mlocate.db

    可以看到,mlocate.db 文件的所属组为 slocate,虽然对文件只拥有 r 权限,但对于普通用户执行 locate 命令来说,已经足够了。一方面,普通用户对 locate命令拥有执行权限,其次,locate 命令拥有 SGID 权限,这使得普通用户在执行 locate 命令时,所属组身份会变为 slocate,而 slocate 对 mlocate.db 数据库文件拥有 r 权限,所以即便是普通用户,也可以成功执行 locate 命令。
    再次强调,无论是 SUID,还是 SGID,它们对用户身份的转换,只有在命令执行的过程中有效,一旦命令执行完毕,身份转换也随之失效。

    • SetGID(SGID)对目录的作用
      用户fedora和gentoo都在组mageedu里。目录/tmp/test的属组是mageedu。

      让fedora用户在目录/tmp/test下创建文件a.fedora,a.fedora文件的属组是用户fedora的基本组,也就是fedora。

      让gentoo用户在目录/tmp/test下创建文件a.gentoo,a.gentoo文件的属组是用户gentoo的基本组,也就是gentoo。

      有个需求,希望同一组的用户,在某个目录下创建的文件,组里的成员都有权限修改。上面的2个用户虽然都在组mageedu里,但是创建文件时,默认的属组是用户的基本组,有没有一个办法,让创建文件的属组自动是此目录的属组呢?SGID就登场了!

    • SGID用途:设置在目录的属组上。效果是,在此目录下创建的文件的属组,是此目录的属组,而不是用户的基本组了

      # ll -d /tmp/test
      drwxrwxr-x. 2 ys mageedu 6 Dec 24 19:16 /tmp/test
      # id fedora
      uid=1005(fedora) gid=1005(fedora) groups=1005(fedora),5000(mageedu)
      # id gentoo
      uid=1004(gentoo) gid=1004(gentoo) groups=1004(gentoo),1001(za1),5000(mageedu)
      # su - fedora
      Last login: Thu Dec 19 21:35:48 CST 2019 on pts/2
      $ cd /tmp/test
      $ touch a.fedora
      $ ll
      -rw-rw-r--. 1 fedora fedora 0 Dec 24 19:24 a.fedora
      # su - gentoo
      Last login: Tue Dec 24 17:19:49 CST 2019 on pts/2
      $ cd /tmp/test
      $ touch a.gentoo
      $ ll
      -rw-rw-r--. 1 fedora fedora 0 Dec 24 19:24 a.fedora
      -rw-rw-r--. 1 gentoo gentoo 0 Dec 24 19:33 a.gentoo
      # chmod g+s /tmp/test
      # ll -d /tmp/test
      drwxrwsr-x. 2 ys mageedu 38 Dec 24 19:33 /tmp/test
      # su - fedora
      Last login: Tue Dec 24 19:23:49 CST 2019 on pts/1
      $ cd /tmp/test
      $ touch b.fedora
      $ ll
      -rw-rw-r--. 1 fedora fedora  0 Dec 24 19:24 a.fedora
      -rw-rw-r--. 1 gentoo gentoo  0 Dec 24 19:33 a.gentoo
      -rw-rw-r--. 1 fedora mageedu 0 Dec 24 19:35 b.fedora
      # su - gentoo
      Last login: Tue Dec 24 19:33:15 CST 2019 on pts/1
      $ cd /tmp/test
      $ touch b.gentoo
      $ ll
      -rw-rw-r--. 1 fedora fedora  0 Dec 24 19:24 a.fedora
      -rw-rw-r--. 1 gentoo gentoo  0 Dec 24 19:33 a.gentoo
      -rw-rw-r--. 1 fedora mageedu 0 Dec 24 19:35 b.fedora
      -rw-rw-r--. 1 gentoo mageedu 0 Dec 24 19:35 b.gentoo
      # su - ys
      Last login: Tue Dec 24 19:14:42 CST 2019 from 10.247.236.90 on pts/1
      $ cd /tmp/test
      $ touch a.ys
      $ ll
      -rw-rw-r--. 1 fedora fedora  0 Dec 24 19:24 a.fedora
      -rw-rw-r--. 1 gentoo gentoo  0 Dec 24 19:33 a.gentoo
      -rw-rw-r--. 1 ys     mageedu 0 Dec 24 19:38 a.ys
      -rw-rw-r--. 1 fedora mageedu 0 Dec 24 19:35 b.fedora
      -rw-rw-r--. 1 gentoo mageedu 0 Dec 24 19:35 b.gentoo
      [ys@localhost test]$ id ys
      uid=1000(ys) gid=1000(ys) groups=1000(ys),10(wheel)
      
    • 管理文件的GUID权限:chmod g+|-s FILE...

      展示位置:属组的执行权限位。

      • 原来属主有执行权限:显示为小写的s。
      • 原来属主没有执行权限:显示为大写的S。

    3,Sticky

    • 如果某个用户拥有对某个目录的写权限,则他可以删除这个目录里的任何文件,也就是可以删除此目录里别的用户创建的文件。

      有个需求,不希望自己创建的文件被别的用户删除掉。Sticky登场了!

    • Sticky用途:设置在目录的other上。效果是,在此目录下文件,只有是自己创建的才可以删除。

      $ ls -ld /tmp/test
      drwxrwsr-x. 2 ys mageedu 70 Dec 24 19:59 /tmp/test
      $ pwd
      /tmp/test
      $ ll
      -rw-rw-r--. 1 fedora fedora  0 Dec 24 19:24 a.fedora
      -rw-rw-r--. 1 ys     mageedu 4 Dec 24 19:50 a.ys
      -rw-rw-r--. 1 fedora mageedu 4 Dec 24 19:51 b.fedora
      -rw-rw-r--. 1 gentoo mageedu 4 Dec 24 19:50 b.gentoo
      -rw-rw-r--. 1 fedora mageedu 0 Dec 24 19:51 c.fedora
      -rw-rw-r--. 1 gentoo mageedu 0 Dec 24 19:51 c.gentoo
      [fedora@localhost test]$ whoami
      fedora
      [fedora@localhost test]$ rm a.ys
      [fedora@localhost test]$ rm b.gentoo
      [fedora@localhost test]$ ll
      -rw-rw-r--. 1 fedora fedora  0 Dec 24 19:24 a.fedora
      -rw-rw-r--. 1 fedora mageedu 4 Dec 24 19:51 b.fedora
      -rw-rw-r--. 1 fedora mageedu 0 Dec 24 19:51 c.fedora
      -rw-rw-r--. 1 gentoo mageedu 0 Dec 24 19:51 c.gentoo
      用户fedora可以删除别的用户创建的文件。
      修改此目录的Sticky
      # chmod o+t /tmp/test
      # ll -d /tmp/test
      drwxrwsr-t. 2 ys mageedu 70 Dec 24 19:59 /tmp/test
      # su - gentoo
      Last login: Tue Dec 24 19:50:46 CST 2019 on pts/1
      $ cd /tmp/test
      $ ll
      -rw-rw-r--. 1 fedora fedora  0 Dec 24 19:24 a.fedora
      -rw-rw-r--. 1 fedora mageedu 4 Dec 24 19:51 b.fedora
      -rw-rw-r--. 1 fedora mageedu 0 Dec 24 19:51 c.fedora
      -rw-rw-r--. 1 gentoo mageedu 0 Dec 24 19:51 c.gentoo
      $ rm a.fedora
      rm: remove write-protected regular empty file ‘a.fedora’? y
      rm: cannot remove ‘a.fedora’: Operation not permitted
      $ rm c.gentoo
      $ ll
      -rw-rw-r--. 1 fedora fedora  0 Dec 24 19:24 a.fedora
      -rw-rw-r--. 1 fedora mageedu 4 Dec 24 19:51 b.fedora
      -rw-rw-r--. 1 fedora mageedu 0 Dec 24 19:51 c.fedora
      修改sticky后,就不能删除别的用户创建的文件了,只可以删除自己创建的文件。
      
    • 系统上/tmp和/var/tmp目录,默认都有sticky权限。

    • 管理文件的GUID权限:chmod o+|-t FILE...

      展示位置:other的执行权限位。

      • 原来属主有执行权限:显示为小写的t。
      • 原来属主没有执行权限:显示为大写的T。

    四,管理特殊权限的另一种方法:

    suid sgid sticy 八进制权限
    0 0 0 0
    0 0 1 1
    0 1 0 2
    0 1 1 3
    1 0 0 4
    1 0 1 5
    1 1 0 6
    1 1 1 7

    又组成了一组,类似rwx的权限位。

    所以,可在默认的3位八进制数字的左侧再加一位八进制数字,来表示各种组合。

    chmod 1777 FILE...

    chmod 4777 FILE...

    ...

    二,文件访问权限列表(file access control list)

    文件除了有user,group,other的权限控制外,还有一个更灵活的权限控制机制。

    可以针对某个文件,让特定的某些用户,或组访问。

    这个功能就叫facl

    1,查看文件的额外访问权限:getfacl files

    下面的/tmp/test/a.fedora没有额外的权限控制,所以别的用户无法修改此文件。

    $ ll a.fedora
    -rw-rw-r--. 1 fedora fedora  0 Dec 24 19:24 a.fedora
    $ getfacl /tmp/test/a.fedora
    getfacl: Removing leading '/' from absolute path names
    # file: tmp/test/a.fedora
    # owner: fedora
    # group: fedora
    user::rw-
    group::rw-
    other::r--
    

    2,给文件添加额外的权限控制:setfacl -m user/group:user/group:xxx files

    给/tmp/test/a.fedora添加额外的权限控制。赋予用户ys可以修改此文件的权限。

    赋予权限后再other的可执行权限位的后面多了个加号。

    $ whoami
    fedora
    $ setfacl -m user:ys:rw a.fedora
    $ getfacl a.fedora
    # file: a.fedora
    # owner: fedora
    # group: fedora
    user::rw-
    user:ys:rw-
    group::rw-
    mask::rw-
    other::r--
    
    $ ll
    -rw-rw-r--+ 1 fedora fedora  0 Dec 24 19:24 a.fedora
    $ whoami
    ys
    $ echo 111 >> a.fedora
    $ cat a.fedora
    111
    

    给/tmp/test/a.fedora添加额外的权限控制。赋予组mageedu可以修改此文件的权限。

    $ whoami
    fedora
    $ setfacl -m group:mageedu:rw a.fedora
    $ getfacl a.fedora
    # file: a.fedora
    # owner: fedora
    # group: fedora
    user::rw-
    user:ys:rw-
    group::rw-
    group:mageedu:rw-
    mask::rw-
    other::r--
    $ id gentoo
    uid=1004(gentoo) gid=1004(gentoo) groups=1004(gentoo),1001(za1),5000(mageedu)
    $ whoami
    gentoo
    $ cd /tmp/test
    $ ll
    -rw-rw-r--+ 1 fedora fedora  4 Dec 24 22:10 a.fedora
    $ echo 44444 >> a.fedora
    $ cat a.fedora
    111
    44444
    

    3,删除文件的额外权限控制:setfacl -x user/group files

    $ getfacl a.fedora
    # file: a.fedora
    # owner: fedora
    # group: fedora
    user::rw-
    user:ys:rw-
    group::rw-
    group:mageedu:rw-
    mask::rw-
    other::r--
    $ setfacl -x user:ys a.fedora
    $ getfacl a.fedora
    # file: a.fedora
    # owner: fedora
    # group: fedora
    user::rw-
    group::rw-
    group:mageedu:rw-
    mask::rw-
    other::r--
    $ setfacl -x group:mageedu a.fedora
    $ getfacl a.fedora
    # file: a.fedora
    # owner: fedora
    # group: fedora
    user::rw-
    group::rw-
    mask::rw-
    other::r--
    

    4,Linux的权限判断逻辑:

    • 首先判断启动进程的用户是否和file的user相同?

      • 相同:使用第一组rwx
      • 不相同:判断启动进程的用户是否在file的额外可访问用户的列表里面?
        • 在额外可访问用户的列表里面:使用额外可访问用户的rwx
        • 不在额外可访问用户的列表里面:判断启动进程的用户是否在file的group里面?
          • 在group里面:使用第二组rwx
          • 不在group里面:判断启动进程的用户是否在file的额外可访问组的列表里面?
            • 在额外可访问组里面:使用额外可访问组的rwx
            • 不在额外可访问组里面:使用第三组rwx
    • 如果某个文件的other权限是可写的,但是额外权限是不可写的,则也是不可写的。

    • 验证:

      $ ll
      -rw-rw-rw-. 1 fedora mageedu  4 Dec 24 19:51 b.fedora
      $ su - ys
      Last login: Tue Dec 24 22:10:28 CST 2019 on pts/2
      $ cd /tmp/test
      $ echo "im ys" > b.fedora
      $ cat b.fedora
      im ys
      $ setfacl -m user:ys:--- b.fedora
      $ getfacl b.fedora
      # file: b.fedora
      # owner: fedora
      # group: mageedu
      user::rw-
      user:ys:---
      group::rw-
      mask::rw-
      other::rw-
      $ ll
      -rw-rw-rw-+ 1 fedora mageedu  6 Dec 24 22:37 b.fedora
      $ su - ys
      Last login: Tue Dec 24 22:36:43 CST 2019 on pts/2
      $ cd /tmp/test
      $ echo 3232 >> b.fedora
      -bash: b.fedora: Permission denied
      
    # c/c++ 学习互助QQ群:877684253 ![](https://img2018.cnblogs.com/blog/1414315/201811/1414315-20181106214320230-961379709.jpg) # 本人微信:xiaoshitou5854
  • 相关阅读:
    mysql 存储过程中的 prepare语句(存储过程中动态增减表字段)
    MYSQL创建分区时候报错
    mysql存储过程调试方法
    磁力块[分块]
    区间最优覆盖问题[差分]
    区间最优覆盖问题[差分]
    导弹防御[差分]
    导弹防御[差分]
    CF10D LCIS[动态规划]
    CF10D LCIS[动态规划]
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/12093991.html
Copyright © 2011-2022 走看看