Linux的特殊权限

  linux中除了有常见的读写执行三种常见的权限外,还有3中特殊的权限,分别是SUID,SGID,Striky。在了解特殊权限之前,先解释一下安全上下文的概念。

  安全上下文:进程运行时能够访问那些资源或文件,不取决与进程文件的属主属组,而取决与运行该命令的用户身份的UID和GID,以该身份获取各种系统资源。

  特殊权限位:  

  SUID:对一个可执行文件,不是以发起者身份来获取资源,而是以可执行文件的属主身份来执行,也就是说无论谁来执行这个文件,他都有文件所有者的特权。如果所有者是 root 的话,那么执行人就有超级用户的特权了。

  SUID: 运行某程序是,相应进程的属主是程序文件自身的属主,而不是启动者。

    chmod u+s FILE
    chmod u-s FILE
    如果FILE本身原来就有执行权限,则显示为s;否则显示S

    eg.

       -r--------. 1 root root 865 7月  26 02:17 /etc/shadow
    -rwxr-xr-x. 1 root root 54048 6月  10 2014 /bin/cat
    
            有一个叫hadoop的用户,在hadoop用户下

    [hadoop@RedHat ~]$ cat /etc/shadow
    cat: /etc/shadow: Permission denied

    cat进程启动起来以后,是以hadoop的身份运行的。而hadoop没有访问/etc/shadow这个文件的权限。所以访问不到。

    [root@RedHat data]# chmod u+s /bin/cat   
    [root@RedHat data]# ll /bin/cat
    -rwsr-xr-x. 1 root root 54048 Jun 10 2014 /bin/cat

    再切换到hadoop用户下,

    [hadoop@RedHat ~]$ cat /etc/shadow      
    root:$6$DotZtyMiripQ.7bt$d171YFkJIRCfK/9G3A1qBLfOo4/ya6zZWxqyU5qEgaqE0hcM89Ig61:16585:0:99999:7:::     bin:*:16231:0:99999:7:::     daemon:*:16231:0:99999:7:::     adm:*:16231:0:99999:7:::     lp:*:16231:0:99999:7:::     ....     访问成功,在设置SUID后,cat进程起来以后,不在以hadoop的身份运行,而是以cat文件自身的属主root来运行,而root用户对/etc/shadow具有访问权限。

  应用场景:

    写一个脚本获取某些系统的属性的时候,就必须给SUID权限。   

    [root@RedHat data]# ll /usr/bin/passwd
    -rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd

    普通用户也要能修改自身的登录密码,所以必须给SUID权限。

 

  SGID:对于一个可执行文件,不是以发起者身份来获取资源,而是以可执行文件的属组的身份来执行。也就是说该文件具有所属组的特权,任意存取这个组所能使用的系统资源。若一个目录设置了SGID,则所有被复制到这个目录下的文件,其所属组都会被重设为和这个目录一样,除非在复制时文件时加上-p参数,才能保留原来所属组的群组设置。

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

  eg.

   假设有develop, team, hadoop, hbase, hive几个用户要在一个公共目录/tmp/project/下,建一个文件,相互都能访问,相互而且能编辑。

在root用户下
[root@RedHat tmp]# mkdir project
[root@RedHat tmp]# groupadd developteam
[root@RedHat tmp]# chown -R :developteam /tmp/project/
[root@RedHat tmp]# usermod -a -G developteam hadoop
[root@RedHat tmp]# usermod -a -G developteam hive
[root@RedHat tmp]# usermod -a -G developteam hbase
[root@RedHat tmp]# id hadoop
uid=1002(hadoop) gid=1002(hadoop) groups=1002(hadoop),1005(development),1007(developteam)
hadoop有developteam组权限

在hadoop用户下
[hadoop@RedHat project]$ touch a.hadoop
[hadoop@RedHat project]$ ll
-rw-rw-r--. 1 hadoop hadoop 0 7月  26 03:05 a.hadoop

在hbase用户下
[hbase@RedHat project]$ touch a.hbase
[hbase@RedHat project]$ ll
-rw-rw-r--. 1 hadoop hadoop 0 7月  26 03:05 a.hadoop
-rw-rw-r--. 1 hbase  hbase  0 7月  26 03:06 a.hbase

新建的文件a.hadoop a.hbase都是属于用户的基本组,相互之间没有写权限。

给/tmp/project目录添加SGID权限
[root@RedHat project]# chmod g+s /tmp/project/
[root@RedHat project]# ls -ld .
drwxrwsr-x. 2 root developteam 4096 Jul 26 03:06 .

在hadoop用户下
[hadoop@RedHat project]$ touch b.hadoop
[hadoop@RedHat project]$ ll
-rw-rw-r--. 1 hadoop hadoop      0 7月  26 03:05 a.hadoop
-rw-rw-r--. 1 hbase  hbase       0 7月  26 03:06 a.hbase
-rw-rw-r--. 1 hadoop developteam 0 7月  26 03:07 b.hadoop

在hbase用户下
[hbase@RedHat project]$ touch b.hbase
[hbase@RedHat project]$ ll
-rw-rw-r--. 1 hadoop hadoop      0 7月  26 03:05 a.hadoop
-rw-rw-r--. 1 hbase  hbase       0 7月  26 03:06 a.hbase
-rw-rw-r--. 1 hadoop developteam 0 7月  26 03:07 b.hadoop
-rw-rw-r--. 1 hbase  developteam 0 7月  26 03:07 b.hbase

发现新建的文件b.hadoop和b.hbase都属于developteam组。hadoop和hbase可以访问修改对方创建的文件。但是这样又有个缺陷,那就是hadoop和hbase能够删除对方建立的文件。

  

  STICKY:粘滞位,通常对于目录而言。通常对于全局公共目录来说,让该目录具有Sticky后,删除只属于自己的文件有效(但是仍能编辑修改别人的文件,除了root)。不能根据安全上下文获取对别人的文件的写权限。
  Sticky:在一个公共目录,每个都可以创建文件,删除自己的文件,但不能删除别人的文件;
    chmod o+t DIRECTORY
    chmod o-t DIRECTORY

给/tmp/project目录添加Sticky权限
[root@RedHat project]# chmod o+t /tmp/project/
[root@RedHat project]# ls -ld .
drwxrwsr-t. 2 root developteam 4096 Jul 26 03:15 .

  这三位特殊权限组成一个八进制的权限位s,u,t,用二进制表示:

  SUID SGID STICKY 最靠前的权限位
  000
  001
  ...
  110
  111

  chmod 1755 /backup/test,标红的表示特殊权限位。

练习:新建一个公司的开发组developteam。有三个成员hadoop hbase hive,在工程目录/tmp/projct下,可以创建文件,可以访问修改其他组员创建的文件,可以
删除自己创建的文件,但是不能删除其他组员创建的文件
useradd hadoop
useradd hbase
useradd hive
groupadd developteam

usermod -a -G developteam hadoop
usermod -a -G developteam hive
usermod -a -G developteam hbae

mkdir /tmp/project/
#chmod g+w /tmp/project
chomd g+s /tmp/project
drwxrwsr-x. 2 root development 4096 6月 29 23:10 /tmp/project/
chomd o+t /tmp/project
drwxrwsr-t. 2 root development 4096 6月 29 23:10 /tmp/project/

su hbase
cd /tmp/project
touch a.habse
ls -l a.habse
-rw-rw-r--. 1 hbase development 0 6月 29 23:10 a.hbase

su hadoop
cd /tmp/project
touch a.hadoop
ls -l a.hadoop
-rw-rw-r--. 1 hadoop development 0 6月 29 23:10 a.hadoop

posted @ 2015-07-25 19:21  christian.badguy  阅读(362)  评论(0编辑  收藏  举报