zoukankan      html  css  js  c++  java
  • 特殊权限 SUID、SGID、Sticky

     

    . 前提 

    本篇主要讲解SUID, SGID, Sticky三个权限的基本原理和应用.

     

    为什么要使用特殊权限?

    比如系统中假如有超过四类人然而每一类人都需要一种独特权限.只有三种独特权限的基础权限系统就会明显不够用.

    特殊权限可以扩展系统基础权限的功能,使得linux权限更加强大灵活.

     

    在理解特殊权限之前,需要先具备几个关于安全上下文的认知:

     

    前提:进程有属主和属组;文件有属主和属组;

    (1) 任何一个可执行程序文件能不能启动为进程:取决于发起者对程序文件是否拥有执行权限;

    (2) 启动为进程之后,其进程的属主为发起者;进程的属组为发起者所属的组;

    (3) 进程访问文件时的权限,取决于进程的发起者:

    (a) 进程的发起者,同文件的属主:则应用文件属主权限;

    (b) 进程的发起者,属于文件的属组;则应用文件属组权限;

    (c) 应用文件“其它”权限; 

    . SUID 

    1. 权限设定方法:

      1. 字母表示法:

    chmod u+s FILE...

    chmod u-s FILE...

     

    1. 数字表示法:

    chmod 4755 FILE 添加SUID权限到二进制程序文件(添加到DIR无意义)

     

    在普通三位数字权限位之前,4代表添加的SUID

     

    chmod 0xxx .... 可以删除文件的SUID(无法删除目录的SUID)  

    1. 文件权限表示:

          # ll f1
          -rwsr-xr-x. 1 root root 0 Nov 17 20:18 f1

           文件属主的x权限,s代替.表示被设置了SUID

          如果属主位没有x权限,会显示为大写S,表示有故障(权限无效) 

    1. SUID相关说明:

      1. 启动为进程之后,其进程的属主为原程序文件的属主;
      2. 只能作用在二进制程序上,不能作用在脚本上,且设置在目录上无意义 ;
      3. 执行suid权限的程序时,此用户将继承此程序的所有者权限;  
    1. SUID工作原理

     

    1. 环境前提:
      1. linux中有一个二进制程序cat,属主属组均为root
      2. linux中有一个系统文件/etc/shadow,属主属组均为root
      3. 我们创建一个普通用户叫user1
      4. user1具有对cat的执行权限
      5. user1 不具有对/etc/shadow的任何权限

     

    1. 默认情况下
      1. user1执行cat,系统创建一个cat进程,进程的属主属组取程序发起者,也就是user1:user1
      2. cat进程访问/etc/shadow,由于进程属主属组是user1:user1,/etc/shadow的属组属主都不匹配,所以被拒绝访问.

     

    1. cat设置SUID之后
      1. user1执行cat.系统创建一个cat进程,进程的属主取cat的属主,属组取程序发起者,就是root:user1
      2. cat进程访问/etc/shadow,由于进程属主是root,/etc/shadow的属主匹配,所以被允许访问.  
    1. 举例说明:

    passwd命令是linux系统中用来修改密码的命令.系统中所有用户都可以使用.

    passwd命令改密码的行为是通过修改/etc/shadow文件来实现.

     

    看一下/etc/shadow的文件权限:

        # ll /etc/shadow
        ----------. 1 root root 1771 Nov 16 17:06 /etc/shadow 

     

    可见/etc/shadow对普通用户没有任何权限.

    所以普通用户默认无法使用文本编辑器打开或者编辑这个文件.

     

    那为什么通过passwd这个命令就可以编辑呢?

     

    ls命令查看passwd命令的源文件信息:

        # ls -l /usr/bin/passwd
        -rwsr-xr-x. 1 root root 30768 2月  22 2012 /usr/bin/passwd 

     

    我们发现passwd这个程序的属主位的执行位不是x而是s,说明passwd被设置了特殊权限SUID.

     

    于是普通用户运行passwd命令,系统创建的passwd进程的属主由默认为"程序发起者"变为了passwd的属主

    passwd的属主是root,所以普通用户其实是在用root的权限修改/etc/shadow文件.最后passwd命令执行结束,passwd进程被关闭. 

     

    1. 做个实验:

    给命令vim添加SUID,可以让普通用户自己把自己变为超级用户.

     

    看一下vim的原权限

        #ll /usr/bin/vim
        -rwxr-xr-x. 1 root root 2289640 Aug  2 08:45 /usr/bin/vim 

     

    vim加个SUID

        # chmod u+s /usr/bin/vim 

     

    权限变为

        -rwsr-xr-x. 1 root root 2289640 Aug  2 08:45 /usr/bin/vim

     

     

    现在用普通用户登录

        # su quintin 

     

    尝试使用vim编辑系统账户文件/etc/passwd

        $ vim /etc/passwd 

     

    找到自己的用户名一行

     

      

    修改第三列自己的uid0

    rootuid不用改.

     

    然后保存,提示只读文件,使用w!强制保存,成功!

       

    我们知道普通用户quintinvim是有执行权限的,而对/etc/passwd则没有编辑权限.

     

    通常情况下quintin启动vim,系统会创建一个以当前用户quintin为属主属组的vim进程,

    此时vim进程的属主属组为quintin:quintin,由于无论是属主还是属组都不具有对/etc/passwd的编辑权限,

    所以这个vim进程无权编辑/etc/passwd.

     

    而给/usr/bin/vim设置了SUID之后,quintin或任何用户启动vim程序时,

    系统创建的vim进程的属主则是取了/usr/bin/vim这个程序文件自身的属主root,

    所以此时vim进程的属主属组为root:quintin. 系统检查发现正好匹配了/etc/passwd的属主,于是放行vim进程.

     

    其他文本编辑器同理.

     

    退出vim并重新登陆quintin帐户

     

    这时发现命令提示符已完全变为root,而且系统认为我就是root

     因为linux只通过uid判断超级管理员,quintin帐户把自己的uid变成了超级管理员一样的0,

    所以重新登陆之后,quintin具有了root的身份.

     

    测试:

    找一个属主属组都为rootother位无w的文件

        # ll /app/f11
        -rw-r--r--.  1 root root   0 Nov 17 20:18 f11 

     

    改个名字

        # mv f11 f1 

     成功.

     

    .  SGID 

    1. 权限设定方法:

      1. 字母表示法

    chmod g+s DIR/FILE...

    chmod g-s DIR/FILE...

     

    1. 数字表示法 :

    chmod 2755  DIR/FILE 添加SGID到目录或文件

    在普通数字权限位前,2代表添加SGID

    chmod 0755 DIR/FILE 删除文件的SGID,(目录不受影响)

    chmod 755 DIR/FILE 同上 

    1. 文件权限表示:

        # ll /app/f1
        -rwxr-sr-x. 1 root root 0 Nov 17 20:18 /app/f1 

    文件属组的x权限,s代替.表示被设置了SGID

    如果属组位没有x权限,会显示为大写S,表示有故障(权限无效) 

     

    1. SGID相关说明:

      1. 作用在二进制程序上时:

    执行sgid权限的程序时,此用户将继承此程序的所属组权限

    1. 作用于目录上时:

    此文件夹下所有用户新建文件都自动继承此目录的用户组. 

    1. SGID实例:

      1. 作用在二进制程序上时,原理同SUID,只是由user位变为group.
      2. 作用于目录上时演示:

     

    普通帐户quintin/tmp中创建一个目录叫quintindir,添加SGID.权限777

     

            $ chmod 2777 quintindir/
            $ ll -d quintindir/
            drwxrwsrwx. 2 quintin quintin 6 Nov 18 14:42 quintindir/ 

     

    切换到普通用户user1,quintindir目录中创建一个文件和一个目录

            $ touch user1file
            $ mkdir user1dir
            $ ll
            -rw-rw-r--. 1 user1 quintin 0 Nov 18 14:47 user1file
            drwxrwsr-x. 2 user1 quintin 6 Nov 18 14:47 user1dir 

     

    结果显示,user1quintindir目录下创建的文件和目录都自动继承了quintindir的属组

    而且新目录的权限也继承了SGID.

    所以设定了SGID的目录中的所有新建文件和目录都会自动属于quintin.

     

     

    . Sticky粘滞位 

    1. 权限设定方法:

      1. 字母表示法:

    chmod o+t DIR...

    chmod o-t DIR...

    chmod +t DIR...

    1. 数字表示法:

    chmod 1755 DIR

    在普通数字权限位前,1代表添加Sticky 

    1. 文件权限表示:

           

             # ll -d tmp
                drwxrwxrwt. 2 root root 19 Nov 17 20:02 tmp 

     

            文件other位的x权限,t代替.表示被设置了Sticky

            如果other位没有x权限,会显示为大写T,表示有故障(权限无效) 

    1. Sticky相关说明:

      1. 对于一个多人可写的目录,如果设置了sticky,则每个用户仅能删除和改名自己的文件或目录
      2. 只能作用在目录上.普通文件设置无意义,且会被linux内核忽略
      3. 用户在设置Sticky权限的目录下新建的目录不会自动继承Sticky权限 
    1. Sticky实例: 

    1. 目的:

    我希望在系统中创建一个很多用户可以共同使用的目录,但是要求用户之间不能互相删除改变对方的文件. 

    1. 实现:

    root用户先创建一个777权限目录/app/tmp

    普通用户quintinwang分别在其中创建几个文件和目录

     

     

    这时候有个问题,就是目录中的任何用户都可以随意删除其他人的文件.

    所以root要给/tmp这个文件夹设定一个Sticky.

            # chmod 1777 tmp
            # ll -d tmp
            drwxrwxrwt. 5 root root 97 Nov 20 00:49 tmp 

     

    设定完毕可见目录tmpother权限中的x位已经显示为t.说明已设定成功. 

    1. 测试

    切换到quintin用户,进入/app/tmp目录

    尝试删除或改名用户wang的文件或目录

     

    改名文件

          [quintin@centos7 /app/tmp]$ mv wangf1 aaa
          mv: cannot move ‘wangf1’ to ‘aaa’: Operation not permitted 

     

    改名目录

          [quintin@centos7 /app/tmp]$ mv wangd1 bbb
          mv: cannot move ‘wangd1’ to ‘bbb’: Operation not permitted 

     

    移动文件

          [quintin@centos7 /app/tmp]$ mv wangf1 qdir1/
          mv: cannot move ‘wangf1’ to ‘qdir1/wangf1’: Operation not permitted 

     

    删除文件

          [quintin@centos7 /app/tmp]$ rm -f wangf1
          rm: cannot remove ‘wangf1’: Operation not permitted 

     

    删除目录

          [quintin@centos7 /app/tmp]$ rm -f wangf1
          rm: cannot remove ‘wangf1’: Operation not permitted 

     

    以上所有操作均提示Operation not permitted,表Sticky权限已发挥作用.

    1. 提示:

    普通用户在设定了Sticky位的目录下创建的子目录不会继承这个Sticky权限,所以要注意设定好自己目录的权限. 

     

    . 总结: 

    1. 作用范围及功能:

      1. SUID:作用于文件(二进制程序)

    此用户将继承此程序的所有者权限

     

    1. SGID:作用于文件(二进制程序)和目录
      1. 对于文件:

    此用户将继承此程序的所属组权限.

    1. 对于目录:

    此文件夹下所有用户新建文件都自动继承此目录的用户组.

     

    1. Sticky:作用于目录

    设定后,目录中的用户只能删除、移动或改名自己的文件或目录

     

     

    二进制文件

    目录

    SUID

    此用户将继承此程序的所有者权限

    无意义

    SGID

    此用户将继承此程序的所属组权限

    此目录下所有用户新建文件都自动继承此目录的用户组

    Sticky

    无意义

    目录中每个用户仅能删除、移动或改名自己的文件或目录

     

    1. 添加权限方法及注意事项:

     

    1. 字母权限法很灵活,无论目录还是文件都可以随意添加删除超级权限

    chmod u+s ... 添加SUID

    chmod g+s ... 添加SGID

    chmod +s ...同时添加SUIDSGID

    chmod -s ...同时删除SUIDSGID

    chmod o+t ...添加Sticky

    chmod +t ...同上

     

    1. 数字权限表示法添加/删除时:
      1. 数字权限法可以同时删除文件的所有三种超级权限

    chmod 0755 FILE

    chmod  755 FILE

    1. 数字权限法只能删除目录的Sticky.不能删除目录的SUIDSGID.
    2. 数字权限法每次只能设置一种超级权限.添加权限时:

    对于文件,会删除掉原有的其他超级权限.

    对于目录,添加SUIDSGID,Sticky会被删除.

     

    1. 所有表示为大写字母的权限均为无效(故障)权限,因为缺少了相应的x权限.

     

    1. 几个权限位映射参考:

    SUID: user, 占据属主的执行权限位;

    s: 属主拥有x权限

    S:属主没有x权限

    SGID: group,  占据group的执行权限位;

    s: group拥有x权限

    S:group没有x权限

    Sticky: other, 占据ohter的执行权限位;

    t: other拥有x权限

    T:other没有x权限

     

  • 相关阅读:
    vue视图更新---this.$set方法
    v-bind绑定属性样式——class的三种绑定方式
    摸鱼玩PS
    introduce to reinforcement learning ppt
    difference between sparse_softmax_cross_entropy_with_logits and softmax_cross_entropy_with_logits
    Tensorflow Keras tutotrials01
    一句话
    String字符串相关方法
    算是日记吧
    骑行入门
  • 原文地址:https://www.cnblogs.com/Q--T/p/7864795.html
Copyright © 2011-2022 走看看