Linux特殊权限SUID/SGID/Sticky

时间:2021-10-13 15:26:12

1. SUID:运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者(仅对拥有执行权限的二进制程序有效)
  chmod u+s FILE
  chmod u-s FILE
  如果FILE本身原来就有执行权限,则SUID显示为s,否则显示为S

  例如:所有用户都可以执行用于修改用户密码的passwd命令,而用户密码是被保存在/etc/shadow文件中的,但只要仔细的看下就会发现这个文件的默认权限是000,也就是说除了不受系统限制的root管理员用户以外的所有用户都没有查看或编辑该文件的权限。那么把passwd命令加上SUID特殊权限位,便可让普通用户临时获得程序所有者的身份,即以root用户的身份把变更的密码信息写入到shadow文件中

[root@libaoliang ~]# ls -l /etc/shadow
----------. 1 root root 1378 Jun 21 12:44 /etc/shadow
[root@libaoliang
~]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 30768 Nov 24 2015 /usr/bin/passwd

2. SGID 功能一:运行某程序时,相应进程的属组是程序文件自身的属组,而不是启动者所属的基本组(对拥有执行权限的二进制程序设置)
  chmod g+s FILE
  chmod g-s FILE

 SGID 功能二:在该目录中创建的文件自动继承此目录的用户组(只可以对目录设置)

  例如:工作中需要设置一个部门内的共享目录,让所有组内的人都能够读取里面的内容,那么咱们就可以创建部门共享目录后,把该目录设置上SGID特殊权限位,这样任何用户在里面创建的任何文件都会归属于本目录的所有组,而不再是自己的基本用户组。

  [root@libaoliang ~]# cd /tmp/
  [root@libaoliang tmp]#
mkdir sharedDir
  [root@libaoliang tmp]#
ls -ald sharedDir/
  drwxr
-xr-x. 2 root root 4096 Jun 21 19:45 sharedDir/
  [root@libaoliang tmp]#
chmod -Rf 777 sharedDir/
  [root@libaoliang tmp]#
chmod -Rf g+s sharedDir/
  [root@libaoliang tmp]#
ls -ald sharedDir/
  drwxrwsrwx.
2 root root 4096 Jun 21 19:45 sharedDir/

  这样设置好777权限以保证普通用户可以写入文件,并为该目录设置了SGID特殊权限位后,就可以切换至一个普通用户尝试在该目录创建文件,看看新建出来的文件是否会继承上级目录的所有组名称

  [root@libaoliang tmp]# su - xiaobao
  [xiaobao@libaoliang
~]$ cd /tmp/sharedDir/
  [xiaobao@libaoliang sharedDir]$
echo "test SGID" > test
  [xiaobao@libaoliang sharedDir]$
ls -al test
  
-rw-r--r--. 1 xiaobao root 10 Jun 21 19:52 test

  创建的test文件的属主为xiaobao,属组不在是用户xiaobao的基本组,而是继承了 上级(具有SGID权限)目录 的属组。

3.  SBIT(Sticky Bit):在一个公共目录,每个人都可以创建文件,删除自己的文件,但不能删除别人的文件(仅对目录有效)

  chmod o+t
  chmod o-t 

用户xiaobao创建的文件,xiaoliang可以删除
  [xiaobao@libaoliang ~]$ su - xiaoliang  Password:
  [xiaoliang@libaoliang
~]$ cd /tmp/sharedDir/
  [xiaoliang@libaoliang sharedDir]$
ls
  test
  [xiaoliang@libaoliang sharedDir]$
rm test
  
rm: remove write-protected regular file `test'? y
  [xiaoliang@libaoliang sharedDir]$ ls
  [xiaoliang@libaoliang sharedDir]$

  给sharedDir目录加上SBIT权限

  [root@libaoliang ~]# chmod o+t /tmp/sharedDir/
  [root@libaoliang
~]# ls -ald /tmp/sharedDir/
  drwxrwsrwt.
2 root root 4096 Jun 21 20:00 /tmp/sharedDir/

用户xiaobao创建文件test

  [xiaobao@libaoliang sharedDir]$ ls -l
  total
4
  -rw-r--r--. 1 xiaobao root 10 Jun 21 20:00 test

再用xiaoliang删除 xiaobao创建的test文件,已经无法删除

  [xiaoliang@libaoliang sharedDir]$ ls -l
  total
4
  -rw-r--r--. 1 xiaobao root 10 Jun 21 20:00 test
  [xiaoliang@libaoliang sharedDir]$
rm -f test
  
rm: cannot remove `test': Operation not permitted

知识总结

  四位数字表示权限的话,第一位表示特殊权限
  chmod 1755 /backup/test:表示/backup/test的权限是rwx rwx rwt 
  chmod 2755 /backup/test:表示/backup/test的权限是rwx rws rwx
  chmod 4755 /backup/test:表示/backup/test的权限是rws rwx rwx

  练习:配置 在/home/devlopTeam目录下,用户xiaobao,xiaoming,xiaoliang都可以创建,修改文件(可修改其他人创建的文件)删除文件(只能删除自己的文件,不能删除别人的文件)

  ①查看xiaobao,xiaoming,xiaoliang的所属组

  [root@libaoliang ~]# id xiaobao
  uid
=502(xiaobao) gid=502(policeman) groups=502(policeman)
  [root@libaoliang
~]# id xiaoming
  uid
=501(xiaoming) gid=501(xiaoming) groups=501(xiaoming)
  [root@libaoliang
~]# id xiaoliang
  uid
=504(xiaoliang) gid=503(tufei) groups=503(tufei)

  ②将xiaobao,xiaoming,xiaoliang的基本组改为 devlop组 

  [root@libaoliang ~]# usermod -g devlop xiaobao
  [root@libaoliang
~]# usermod -g devlop xiaoming
  [root@libaoliang
~]# usermod -g devlop xiaoliang
  [root@libaoliang
~]# id xiaobao
  uid
=502(xiaobao) gid=5001(devlop) groups=5001(devlop)
  [root@libaoliang
~]# id xiaoming
  uid
=501(xiaoming) gid=5001(devlop) groups=5001(devlop)
  [root@libaoliang
~]# id xiaoliang
  uid
=504(xiaoliang) gid=5001(devlop) groups=5001(devlop

  ③创建devlopTeam目录,并设置SGID 和 SBIT权限

  [root@libaoliang ~]# ls -ld /home/
  drwxr
-xr-x. 16 root root 4096 Jun 15 21:18 /home/
  #由于
/home/目录的属主 属组是root,只有属主才有写权限,所用用root用户创建devlopTeam目录  

   [root@libaoliang ~]# cd /home/
   [root@libaoliang home]# mkdir devlopTeam
   [root@libaoliang home]# ls -ld devlopTeam/
   drwxr-xr-x. 2 root root 4096 Jun 21 20:53 devlopTeam/

  #设置SGID和SBIT权限

   [root@libaoliang home]# chmod 3777 devlopTeam/
   [root@libaoliang home]# ls -ld devlopTeam/
   drwxrwsrwt. 2 root root 4096 Jun 21 20:53 devlopTeam/

  #四位数字表示权限,第一位表示特殊权限,第一位的3表示 具有SGID(2) 和 SBIT(1) 的权限
  # 修改属组为devlop

   [root@libaoliang home]# chown root:devlop devlopTeam/
   [root@libaoliang home]# ls -ld devlopTeam/
   drwxrwsrwt. 2 root devlop 4096 Jun 21 20:57 devlopTeam

  ③现在已经设置完毕,可以用xiaobao创建文件,用xiaolming 和 xiaoliang修改,但是xiaoming和xiaoliang无法删除。

  #xiaobao创建文件,并设置属组可写
  [xiaobao@libaoliang devlopTeam]$
echo "xiaobao创建的文件" >> xiaobaoFile
  [xiaobao@libaoliang devlopTeam]$
ls -l
  total
4
  -rw-r--r--. 1 xiaobao devlop 23 Jun 21 21:02 xiaobaoFile
  [xiaobao@libaoliang devlopTeam]$
chmod 664 xiaobaoFile
  [xiaobao@libaoliang devlopTeam]$
ls -l
  total
4
  -rw-rw-r--. 1 xiaobao devlop 23 Jun 21 21:02 xiaobaoFile
  #用xiaoliang修改xiaobao创建的文件
  [xiaoliang@libaoliang devlopTeam]$
echo "xiaoliang修改xiaobao创建的文件" >> xiaobaoFile
  [xiaoliang@libaoliang devlopTeam]$
cat xiaobaoFile
  xiaobao创建的文件
  xiaoliang修改xiaobao创建的文件
  #用xiaoliang删除xiaobao创建的文件
  
[xiaoliang@libaoliang devlopTeam]$
rm -f xiaobaoFile
  
rm: cannot remove `xiaobaoFile': Operation not permitted
  #xiaoliang无法删除xiaobao创建的文件,xiaobao可以删除自己创建的文件
  [xiaobao@libaoliang devlopTeam]$
rm -f xiaobaoFile
  [xiaobao@libaoliang devlopTeam]$
ls
  [xiaobao@libaoliang devlopTeam]$