特殊权限 SUID、SGID、Sticky

 

. 前提 

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

 

为何要使用特殊权限?vim

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

特殊权限能够扩展系统基础权限的功能,使得linux权限更增强大灵活.安全

 

在理解特殊权限以前,须要先具有几个关于安全上下文的认知:app

 

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

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

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

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

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

(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权限

相关文章
相关标签/搜索