特殊权限之SUID、SGID、STICKY

特殊权限

       在系统中,难免有一些比较特殊的用户或文件目录,但是普通的权限有不能解决我们的需求,于是就有特殊权限帮我们解决这个问题

特殊权限有三个:SUID、SGID、STICKY

     首先,先说说安全上下文:

进程以某用户的身份运行,那么进程将会以此用户身份去完成所有操作。

     然后,权限的匹配过程:

1.进程的属主(发起者),是否为被访问的文件的属主,如果是,则应用属主的权限对文件进行操作,否则进入第二步

  2.判断进程的属主是否为被访问的文件的属组,如果是,则应用该权限,否则应用other的权限。

    最后,特殊权限将打破这一匹配过程。具体如下:

SUID:超级属主

     用户运行某程序时,如果发现其拥有SUID权限,那么程序运行转换为进程时,其进程的属主(发起者)不是真实的发起者,而是拥有SUID权限程序的属主。

      当我们看都某文件或目录的第一个3位权限最后一位为S时,那么当用户运行命令对其执行是,进程的属主则是其文件上的属主。

     

    SUID权限管理

chmod  u+/-  S  FILE...
[root@localhost testdir]# ls -l
-rw-r--r-- 1 root root 0 Jul 25 18:20 aaa    //原有权限

[root@localhost testdir]# chmod u+s aaa     //加上SUID权限
[root@localhost testdir]# ls -l
-rwSr--r-- 1 root root 0 Jul 25 18:20 aaa         //第一个三位权限的最后一位为大写S

[root@localhost testdir]# chmod u-s aaa       //取消对文件的SUID
[root@localhost testdir]# ls -l
-rw-r--r-- 1 root root 0 Jul 25 18:20 aaa       //恢复默认

     SUID实战解析

              1.让lii用户能查看magedu用户的家目录

[root@localhost ~]# cp /bin/ls /testdir/ls            
//复制/bin/ls 到另一个目录,这样能完成实验的需求

[root@localhost ~]# chmod u+s /testdir/ls          
  //然后给复制过去的ls 加上SUID权限,使得我们一会好应用此权限去访问其他用户的家目录
  
[root@localhost ~]# ls -l /testdir/ls                
  //查看复制过去的ls里有s权限(注意:此时系统用的是默认的/bin/ls,我把原有的ls别名删除了)
-rwsr-xr-x 1 root root 117048 Jul 25 18:51 /testdir/l       
[lii@localhost home]$ ls -l magedu/                  

ls: cannot open directory magedu/: Permission denied  
  //用其他用户登录,在家目录中查看别的用户的家目录是不允许的
  //权限不够,因为系统原有的/bin/ls  没有SUID权限。
  
[lii@localhost home]$ /testdir/ls -a magedu/  
.  ..  .bash_history  .bash_logout  .bash_profile.bashrc  .gnome2           
 //当我们使用复制过去并添加SUID的ls命令查看别的用户的家目录时是可以的。因为这个ls的属主是root,root用户查看任何一个用户的家目录都是可以的,所以,这就是SUID的作用。

 

结论:SUID对文件进行授权SUID之后,任何一个用户使用其授权的SUID的二进制文件访问时,使用的是其二进制文件的属主来对其访问的。

注意:在添加s权限时,原文件必须要有执行权限(x),如果没有添加SUID之后显权限位显示为大S则表示SUID权限没成功,必须为小s。

SGID:超级组

       当目录属组有写权限时,且有SGID权限时,那么所有属于此目录的属组的用户(以此目录的属组为附加组的用户),并且以属组身份在此目录中新建文件或目录是,新建的文件或目录不是用户的本组,而是此目录的属组。

    SGID权限管理

chmod  g+/-  S  FILE...
[root@localhost /]# ls -ld /testdir/SGID       
drwxr-xr-x 2 root root 4096 Jul 25 19:19 /testdir/SGID  
[root@localhost /]# chmod g+s /testdir/SGID      //给目录添加SGID权限
[root@localhost /]# ls -ld /testdir/SGID
drwxr-sr-x 2 root root 4096 Jul 25 19:19 /testdir/SGID
[root@localhost /]# chmod g-s /testdir/SGID      //给目录减去SGID权限
[root@localhost /]# ls -ld /testdir/SGID
drwxr-xr-x 2 root root 4096 Jul 25 19:19 /testdir/SGID

    SGID实战解析

1.将目录设定SGID,让其他用户在此目录创建文件或目录是属主不变,属组为目录的属组。

[root@localhost /]# ls -ld /testdir/sgid                //查看原有目录权限
drwx-wxr-x 2 root root 4096 Jul 25 19:37 /testdir/sgid
[root@localhost /]# chmod g+s /testdir/sgid  
    //对目录增加s权限,(注意此前一定要有w权限才能创建文件,这是普通权限对目录的含义)
[root@localhost /]# ls -ld /testdir/sgid               //查看目录信息
drwx-wsr-x 2 root root 4096 Jul 25 19:37 /testdir/sgid
[root@localhost /]# su - lii                            //切换用户之后在目录内创建文件
[lii@localhost ~]$ touch /testdir/sgid/lii.txt
[root@localhost /]# ls -l /testdir/sgid/lii.txt     
-rw-r--r-- 1 lii root 0 Jul 25 19:39 /testdir/sgid/lii.txt 
   //查看创建的文件的属主属组  属主为lii,属组则为root,因为sgid目录具有SGID权限。

结论:1.对目录进行赋权SGID时,在其目录中创建文件的用户必须是其目录的属组的成员。

         2.当sgid作用在目录上时,在目录内新建的文件或目录的所属组自动继承该目录的所属组

         3.在具有SGID权限的目录中创建文件时,目录的属组一定要有写(w)权限,因为这样才能对其目录创建文件。、

2.对二进制可执行文件添加SGID权限,让其他用户能使用其有SGID权限的二进制程序对文件进行操作

 

[root@localhost ~]# chmod g+s /bin/cat        //二进制可执行文件/bin/cat加上SGID权限
[root@localhost ~]# ls -l /bin/cat
-rwxr-sr-x 1 root root 48568 May 11 16:59 /bin/cat
[root@localhost ~]# ls -l /etc/shadow
----r----- 1 root magedu 1051 Jul 25 12:28 /etc/shadow    
      //查看shadow文件的属组为magedu,属组权限为可读
[root@localhost ~]# su - lii                                    
[lii@localhost ~]$ cat /etc/shadow
cat: /etc/shadow: Permission denied
     //切换到lii用户执行cat访问shadow文件,提示权限不不够,因为此时shadow文件的属组为magedu,而cat的属组为root,所以cat的SGID在这里并不能生效。

[root@localhost ~]# chown :root /etc/shadow   
      //将shadow文件属组更改为root,再用lii用户查看shadow文件,查看成功。
[root@localhost ~]# su - lii
[lii@localhost ~]$ cat /etc/shadow
root:$6$npNlJrmB$T5JD58gi9xVAkEudYZlhixv8BCjd316Q6mR/xvOi7gibuS8BpMuxTgrPpZyFoyTu31WQGB9algduVjYux7b8g0:17007:0:99999:7:::
bin:*:15980:0:99999:7:::
daemon:*:15980:0:99999:7:::

 

    结论:对二进制文件设定SGID时,其他用户引用的是该二进制文件的属组,所以在其他用户使用其二进制文件访问其他文件时,其文件的属组必须和二进制文件的属组一致才能进行访问,

    注意:在添加s权限时,原文件必须要有执行权限(x),如果没有添加SGID之后显权限位显示为大S则表示SGID权限没成功,必须为小s。

STICKY:其他用户权限

   对于属组可写或全局可写的目录,所在组内的用户或系统上的所有用户在此目录创建或删除文件,如果为此类目录设置sticky权限,则每个用户能创建新文件,但只能删除属主为自己的文件

    STICKY权限管理

chmod  o+/- t FILE…

[root@localhost /]# ls -ld /testdir/STICKY       
drwxr-xr-x 2 root root 4096 Jul 25 19:19 /testdir/STICKY 
[root@localhost /]# chmod o+t /testdir/STICKY      //给目录添加STICKY权限
[root@localhost /]# ls -ld /testdir/STICKY
drwxr-sr-t 2 root root 4096 Jul 25 19:19 /testdir/STICKY
[root@localhost /]# chmod o-t /testdir/STICKY      //给目录减去STICKY权限
[root@localhost /]# ls -ld /testdir/STICKY
drwxr-xr-x 2 root root 4096 Jul 25 19:19 /testdir/STICK

STICKY实战解析

对/testdir/sticky目录设定sticty权限,并让所有用户创建在其内创建文件是自动属于目录的属组,最后让目录内的文件所有用户能看,只能删除自己的,也只能编辑有属组有w权限的文件

     

[

root@localhost testdir]#  chmod o=rwx,g=rwx,u= /testdir/sticky/    
[root@localhost testdir]# ll -d /testdir/sticky/
d---rwxrwx 2 root root 4096 Jul 25 14:13 /testdir/sticky/
 //给文件创建指定权限,组和其他用户都要有执行权限和读权限,因为我们要满足题目的属组为目录属组和让目录内的文件用户只能删除自己的,并只能更改其文件属组为目录属组的文件(并且还要有写权限)
 
[root@localhost testdir]# chmod o+t /testdir/sticky/
[root@localhost testdir]# ll -d /testdir/sticky/
d---rwxrwt 2 root root 4096 Jul 25 14:13 /testdir/sticky/
[root@localhost testdir]# chmod g+s /testdir/sticky/
[root@localhost testdir]# ll -d /testdir/sticky/
d---rwsrwt 2 root root 4096 Jul 25 14:22 /testdir/sticky/
//给目录添加SGID和STICKY权限
[root@localhost testdir]# touch /testdir/sticky/root1
[lii@localhost ~]$ touch /testdir/sticky/lii1
[magedu@localhost ~]$ touch /testdir/sticky/magedu1
[magedu@localhost ~]$ ls /testdir/sticky/ -l
-rw-rw-r-- 1 lii    root 0 Jul 25 14:19 lii1
-rw-rw-r-- 1 magedu root 0 Jul 25 14:19 magedu1
-rw-r--r-- 1 root   root 0 Jul 25 14:18 root1
   //三个用户分别创建一个文件,属主为用户本身,属组为root,因为上面我们对目录添加了SGID,会自动把属组更改为目录属组,完成一半。
[magedu@localhost ~]$ vi /testdir/sticky/root2 
[magedu@localhost ~]$ vi /testdir/sticky/lii1   
   //可以编辑lii1文件,因为此文件的属组有写权限,如果没有也不能修改。但如果有执行权限,也不不能删除其文件,因为此文件的父目录设定了sticky权限。
[magedu@localhost ~]$ rm -f /testdir/sticky/lii1    
    //不能删除其他用户的文件,如果其余属组的权限有的话课以修改和查看,但不能删除别人的。
rm: cannot remove `/testdir/sticky/lii1': Operation not permitted
[magedu@localhost ~]$ rm -f /testdir/sticky/root1        //也不能删除
rm: cannot remove `/testdir/sticky/root1': Operation not permitted
//用magedu账户登入第一行为编辑root2文件,而root2文件属组为root但是没有写权限所以不能修改,只能看。

结论:1.sticky的作用为当给目录设定sticky权限后,此内文件所有用户只能删除属主为用户本身的文件,

         2.所有用户能对此目录创建文件,但如果要修改或查看其他人的文件取决于其他文件对用户本身设定的权限。

原创文章,作者:Lii,如若转载,请注明出处:http://www.178linux.com/28359

评论列表(1条)

  • 马哥教育
    马哥教育 2016-08-08 15:09

    文章整体层次清晰,有理论,有实践,通过实践对文件权限有了深刻的认识和理解。