zoukankan      html  css  js  c++  java
  • (转)Linux 文件目录特殊权限设定(SUID,SGID,SBIT)

    原文:https://blog.csdn.net/leshami/article/details/77184029

    Linux文件及目录的权限设定,除了我们孰知的读写执行(rwx)之外,还有一些特殊的权限设定用来满足特定的目录。这些特殊权限的设定主要是SUID,SGID以及SBIT。这几个值并非一个单独的rwx,而是在文件或目录上的x权限上做动作,来达到实现文件或目录特殊权限的目的。本文主要描述这3个特殊权限的用法以及umask。

    一、文件类型及权限

    1、文件类型

    如下示例文件,

    [root@desktop ~]# ###演示环境
    [root@desktop ~]# more /etc/redhat-release 
    Red Hat Enterprise Linux Server release 7.2 (Maipo)
    
    crw--w----. 1 root tty 4, 1 Jul  7 09:12 /dev/tty1
    brw-rw----. 1 root disk 8, 1 Jul  7 09:11 /dev/sda1
    lrwxrwxrwx. 1 root root      3 Oct 14  2016 ex -> vim
    srwx------. 1 root  root      0 Mar 10 16:08 mongodb-27001.sock
    drwx------. 2 root  root  4.0K Oct 14  2016 keyring-GLsfkK
    -rw-r--r--. 1 root root  49K Oct 14  2016 install.log
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    通过上面列出的文件描述,我们将最左边部分按9-0进行表示,如下 
    9876543210

    则相应的表示位的含义如下:

    第9位 
       表示文件类型,可以为p、d、l、s、c、b和-: 
          p表示命名管道文件 
          d表示目录文件 
          l表示符号连接文件 
          -表示普通文件 
          s表示socket文件 
          c表示字符设备文件 
          b表示块设备文件

    第8-6位 
       表示当前文件的属主(所有者)

    第5-3位 
       表示文件的属组(用户组)

    第2-0位 
       表示其它组所拥有的权限

    2、权限

    权限的表现形式为rwx: 
       r表示可读,可以读出文件的内容 
       w表示可写,可以修改文件的内容 
       x表示可执行,可运行这个程序,对于目录为可以进入该目录

    二、SUID,SGID,Sticky Bit

    特殊权限指的是针对第一点描述的rwx权限之外的权限,即x执行权限可以发生变化为s或者S等。 
    由于文件存在属主与属组,因此也就有属主与属组的s或者S权限。

    1、SUID

    SUID 是 Set User ID的缩写 
    SUID: 当运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者; 
      chmod u+s FILE 
      chmod u-s FILE 
      如果FILE本身原来就有执行权限,则SUID显示为s;否则显示S; 
      简言之,当我们启动某个二进制程序,该程序调用了其他非对象,此对象非启动者所有,也不具备相应权限时,此时无法成功执行。但是当我们为这个二进制程序赋予了SUID,则被调用的这个对象会被临时赋予该对象的所有者权限

    下面直接演用鸟哥的示例来描述这个问题

    # ls -hltr /usr/bin/passwd /etc/shadow 
    -rwsr-xr-x. 1 root root 31K Feb 22 2012 /usr/bin/passwd ###权限为rws 
    ———-. 1 root root 950 Aug 25 2016 /etc/shadow

    密码文件/etc/shadow只有root用户拥有修改权限,那其他用户是如何修改自身密码的呢,那就是由于命令passwd拥有SUID权限 
      a、vbird 对於 /usr/bin/passwd 这个程序来说是具有 x 权限的,表示 vbird 能运行 passwd; 
      b、passwd 的拥有者是 root 这个帐号; 
      c、vbird 运行 passwd 的过程中,会『暂时』获得 root 的权限; 
      d、/etc/shadow 就可以被 vbird 所运行的 passwd 所修改。 
    但如果 vbird 使用 cat 去读取 /etc/shadow 时,他能够读取吗?因为 cat 不具有 SUID 的权限,所以 vbird 运行 『cat /etc/shadow』 时,是不能读取 /etc/shadow 的。 
    如下示意图来说明: 
    这里写图片描述

    对于上面的情形,假定希望vbird用户能够通过cat访问/etc/shadow,肿么实现呢,那就是赋予s权限啊

    # ls -hltr /bin/cat
    -rwxr-xr-x. 1 root root 48K Nov 22  2013 /bin/cat
    # chmod u+s /bin/cat
    # ls -hltr /bin/cat 
    -rwsr-xr-x. 1 root root 48K Nov 22  2013 /bin/cat   ###属主的x权限变成了s权限
    $ cat /etc/shadow | head -3
    root:$6$3KDwLJ7Cb.J2.ZMcmhHqThe/YvQ1tQtQOZX5gfbyOg/N.jl7OBzV.ZAzVzA/:17163:0:99999:7:::
    bin:*:15980:0:99999:7:::
    daemon:*:15980:0:99999:7:::
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    STID使用示例:添加非oracle用户到dba, oinstall组

    2、SGID

    SGID 是 Set Group ID的缩写,SUID是在文件的所有者级别,而SGID则是在用户组级别生效,即 
      SGID 对二进制程序有用; 
      程序运行者对于该程序来说,需具备 x 的权限; 
      运行者在运行的过程中将会获得该程序用户组权限

    SGID: 运行某程序时,相应进程的属组是程序文件自身的属组,而不是启动者所属的基本组; 
      chmod g+s FILE 
      chmod g-s FILE

    对于具有SGID的目录,除了可执行的二进制程序外,支持一些群组特性。 
    假定当前服务器存在用户组 dbateam以及用户oracle mysql sybase 
    现在希望这个3个用户能够共享某一个特定的挂载目录,都有相应的权限进行读写以及能够编辑读写其他用户创建的文件

    ###以下创建一个组以及三个用户,并将组作为用户的附加组
    # groupadd dbateam 
    # useradd mysql -G dbateam
    # useradd oracle -G dbateam
    # useradd sybase -G dbateam
    
    ###创建一个目录并挂载
    # mkdir -pv /dbateam   
    # mount /dev/sdb1 /dbateam
    # ls -hltr / |grep dbateam
    drwxr-xr-x    2 root root 4.0K Aug 14 17:17 dbateam
    
    # ### Author : Leshami QQ/Weixin : 645746311
    # ### Blog  : http://blog.csdn.net/leshami
    
    ###更改目录的属组为dbateam
    # chown -R :dbateam /dbateam/
    # ls -hltr / |grep dbateam
    drwxr-xr-x.  2 root dbateam    6 Aug 14 17:17 dbateam
    
    ###使用创建的用户登陆并测试目录权限,如下,无写权限
    [root@desktop ~]# su - sybase
    [sybase@desktop ~]$ echo "sysbase">/dbateam/sybase.01
    -bash: /dbateam/sybase.01: Permission denied
    
    [root@desktop ~]# su - oracle
    [oracle@desktop ~]$ echo "oracle">/dbateam/oracle.01
    -bash: /dbateam/oracle.01: Permission denied
    
    ###对目录授予写入权限
    [root@desktop ~]# chmod g+w /dbateam/
    [root@desktop ~]# ls -hltr / |grep dbateam
    drwxrwxr-x.  2 root dbateam    6 Aug 14 17:17 dbateam
    
    ###再次写入文件,此时成功
    [sybase@desktop ~]$ echo "sysbase">/dbateam/sybase.01
    [sybase@desktop ~]$ ls -hltr /dbateam/sybase.01
    -rw-rw-r--. 1 sybase sybase 8 Aug 14 17:25 /dbateam/sybase.01  
    ###如上,此时文件的属主和属组都是sybase,非附加组,也就是说其他用户可以读取,但是无法修改
    
    ###下面为目录设定SGID,如下,目录属组权限变为rws
    [root@desktop ~]# chmod g+s /dbateam/
    [root@desktop ~]# ls -hltr / |grep dbateam
    drwxrwsr-x.  2 root dbateam  22 Aug 14 17:25 dbateam
    
    ###再次写入一个文件
    [sybase@desktop ~]$ echo "sybase02" >/dbateam/sybase.02
    [sybase@desktop ~]$ ls -hltr /dbateam/
    total 8.0K
    -rw-rw-r--. 1 sybase sybase  8 Aug 14 17:25 sybase.01
    -rw-rw-r--. 1 sybase dbateam 9 Aug 14 17:30 sybase.02
    ###如上,此时文件sybase.02的所属组变成了dbateam,而不是先前的sybase,此时其他用户可以进行修改。
    
    ###其他用户尝试修改
    [oracle@desktop ~]$ echo "add oracle comment" >>/dbateam/sybase.02
    [oracle@desktop ~]$ more /dbateam/sybase.02
    sybase02
    add oracle comment
    [oracle@desktop ~]$ ls -hltr /dbateam
    total 8.0K
    -rw-rw-r--. 1 sybase sybase  8 Aug 14 17:25 sybase.01
    -rw-rw-r--. 1 sybase dbateam 28 Aug 14 17:32 sybase.02
    
    通过上面的例子得知,
    当目录的属组具备了s权限后,该目录下创建的文件不再以用户自身的属组(基本组)作为文件的属组,而是上级目录的属组
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    3、Sticky Bit

    Sticky Bit: 在一个公共目录,每个都可以创建文件,删除自己的文件,但不能删除别人的文件; 
    chmod o+t DIR 
    chmod o-t DIR

    ###针对前面的示例,在公共目录dbateam中,需要设定在该目录创建文件的用户只能删除自身的文件,而不能删除其他用户创建的文件
    [root@desktop ~]# chmod o+t /dbateam
    [root@desktop ~]# ls -hltr / |grep dbateam
    drwxrwsr-t.  2 root dbateam  38 Aug 14 17:30 dbateam
    
    ###下面使用sybase用户创建文件
    [sybase@desktop ~]$ echo "don't touch">>/dbateam/sybase.03
    
    ###下面使用oracle用户来删除文件
    [oracle@desktop ~ ]$ cd /dbateam
    [oracle@desktop dbateam]$ ls -hltr
    -rw-rw-r--. 1 sybase sybase  8 Aug 14 17:25 sybase.01
    -rw-rw-r--. 1 sybase dbateam 28 Aug 14 17:32 sybase.02
    -rw-rw-r--. 1 sybase dbateam 12 Aug 15 09:08 sybase.03
    [oracle@desktop dbateam]$ rm -rf sybase.03
    rm: cannot remove ‘sybase.03’: Operation not permitted  ###此处提示没有权限
    [oracle@desktop dbateam]$ echo "Oraclefile">oracle.01
    [oracle@desktop dbateam]$ rm oracle.01      ###此处可以删除自身创建的文件
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    4、基于数字方法权限设定

    对于文件目录的权限设定,可以基于数字的方法设定,如以下: 
    r:4 
    w:2 
    x:1

    由于有了特殊权限位,因此在rwx的基础之上,又增加了一个新的位,即除了前面描述的方法之外,基于数字方法设定也可以。 
    SUID:4 
    SGID:2 
    SBIT:1

    假设要将一个文件权限改为『-rwsr-xr-x』时,由于s在使用者权限中,所以是 SUID ,因此, 在原先的 755 之前还要加上 4 ,也就是:『 chmod 4755 filename 』来配置! 
    此外,还有大 S 与大 T 的产生喔!大 S 与大 T 是由于被设定的文件或目录上的user, group 以及 others 都没有 x 这个可运行的标志( 因为 666 嘛 ),所以,这个 S, T 代表的就是『空的』啦!即文件或目录的拥有者都无法运行了,哪里来的权限给其他人使用?当然就是空的啦! ^_^

    演示
    ###创建一个临时目录
    [root@desktop ~]# mkdir -pv /tmp/project
    mkdir: created directory ‘/tmp/project’
    [root@desktop ~]# ls -hltr /tmp |grep project
    drwxr-xr-x. 2 root root  6 Aug 15 09:28 project
    
    ###为临时目录配置SUID,如下属主位置产生了s
    [root@desktop ~]# chmod 4755 /tmp/project/
    [root@desktop ~]# ls -hltr /tmp |grep project
    drwsr-xr-x. 2 root root  6 Aug 15 09:28 project
    
    ###修改目录权限为4766
    [root@desktop ~]# chmod 4766 /tmp/project/
    [root@desktop ~]# ls -hltr /tmp |grep project
    drwsrw-rw-. 2 root root  6 Aug 15 09:28 project
    
    ###再次修改目录权限,此时产生了大S和大T,因为属组和其他组没有x权限
    [root@desktop ~]# chmod 7766 /tmp/project/
    [root@desktop ~]# ls -hltr /tmp |grep project
    drwsrwSrwT. 2 root root  6 Aug 15 09:28 project
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    三、umask

    umask指的就是文件或目录的默认权限。当我们登陆到服务器之后,需要创建文件或者目录,缺省的情况下,会为当前文件或目录设定一个权限,那这个权限到底是什么呢?那就由umask的值来确定。我们知道,基于文件或目录的权限包含了所属用户,所属组以及其他组,因此,至少需要三个位来设定。结合上面描述的SUID,SGID,SBIT这组,也就是说需要4个位来设定umask。下面直接通过演示来理解umask的用法及作用。

    当前umask为0022,也就是说新创建的目录和文件需要减掉0022这些权限
    即需要减掉-----w--w-,因此新创建的目录和文件的权限应当如下:
    
    文件: (-rw-rw-rw-) - (-----w--w-) = -rw-r--r--
    目录: (drwxrwxrwx) - (-----w--w-) = drwxr-xr-x
    
    ###演示
    [root@desktop ~]# umask
    0022
    [root@desktop ~]# echo "test mask">/tmp/project/umask.01
    [root@desktop ~]# ls -hltr /tmp/project/
    total 4.0K
    -rw-r--r--. 1 root root 10 Aug 15 09:43 umask.01
    
    假定umask 为 0003 ,所以拿掉的权限为 --------wx,因此:
    文件: (-rw-rw-rw-) - (--------wx) = -rw-rw-r--
    目录: (drwxrwxrwx) - (--------wx) = drwxrwxr--
    
    [root@desktop ~]# umask 0003
    [root@desktop ~]# umask
    0003
    [root@desktop ~]# mkdir -pv /tmp/temp01
    mkdir: created directory ‘/tmp/temp01’
    [root@desktop ~]# ls -hltr /tmp |grep temp
    drwxrwxr--. 2 root root  6 Aug 15 09:55 temp01
    
    既然umask有4个位,能否在第一位也设定值呢,答案是否定的。无法设定特殊位。
    [root@desktop ~]# umask 4003
    -bash: umask: 4003: octal number out of range
    [root@desktop ~]# umask 1003
    -bash: umask: 1003: octal number out of range
    [root@desktop ~]# umask 7003
    -bash: umask: 7003: octal number out of range
  • 相关阅读:
    UIWebView 视频播放获取开始播放和结束播放通知
    显示图像数据的高级接口 UIImage
    如何跳到系统设置里的WiFi界面
    Objective-C 去掉NSString 前后中空格
    iOS 属性修饰符的区别
    iOS 线程锁同步机制
    XCode 6 以后使用编程处理一些图片效果
    iOS 精益编程
    iOS7以后UITextView 技巧
    2016年12月英语六级阅读真题及答案 第3套
  • 原文地址:https://www.cnblogs.com/liujiacai/p/9508554.html
Copyright © 2011-2022 走看看