linux特殊权限SUID,SGID,sticky

一、为什么要使用特殊权限?

比如系统中假如有超过四类人然而每一类人都需要一种独特权限.只有三种独特权限的基础权限系统就会明显不够用.特殊权限可以扩展系统基础权限的功能,使得linux权限更加强大灵活

二、SUID

  • chmod   u[+-]s   文件  或  用数字表示   chmod 4755 文件
-rwsr-xr-x. 1 root root 30768 2月  22 2012 /usr/bin/passwd
  • 在普通三位数字权限位之前,用4代表添加的SUID位
  • 文件属主的x权限,用s代替.表示被设置了SUID
  • 如果属主位没有x权限,会显示为大写S,表示有故障(权限无效)
  • chmod 0xxx .... 可以删除文件的SUID(无法删除目录的SUID)
  • 启动为进程之后,其进程的属主为原程序文件的属主;
  • 只能作用在二进制程序上,不能作用在脚本上,且设置在目录上无意义 ;
  • 执行suid权限的程序时,此用户将继承此程序的所有者权限; 

1)SUID工作原理

  •  前提:

linux中有一个二进制程序vim,属主属组均为root
linux中有一个系统文件/etc/shadow,属主属组均为root
我们创建一个普通用户叫zm
zm具有对vim的执行权限
zm 不具有对/etc/shadow的任何权限

  •  默认情况下

zm执行vim,系统创建一个vim进程,进程的属主属组取程序发起者,也就是zm:zm
vim进程访问/etc/shadow,由于进程属主属组是zm:zm,与/etc/shadow的属组属主都不匹配,所以被拒绝访问.

  •  给vim设置SUID之后

zm执行vim.系统创建一个vim进程,进程的属主取vim的属主,属组取程序发起者,就是root:zm
vim进程访问/etc/shadow,由于进程属主是root,与/etc/shadow的属主匹配,所以被允许编辑.

2)例子

passwd命令是linux系统中用来修改密码的命令.系统中所有用户都可以使用.而passwd命令改密码的行为是通过修改/etc/shadow文件来实现 

  • 首先查看一下/etc/shadow的文件权限  (可见普通用户对它没有任何权限;那为什么普通用户可以改密码呢?)
----------. 1 root root 908 7月  18 20:18 /etc/shadow
  • 查看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进程被关闭.

3)例子

给命令vim添加SUID,可以让普通用户自己把自己变为超级用户.

给vim加个SUID 

[root@centos2 test]# ls -l /usr/bin/vim
-rwsr-xr-x. 1 root root 1967072 4月   5 2012 /usr/bin/vim
[root@centos2 test]# 

登陆普通用户zhang;通常情况下zhang启动vim后,系统会创建一个以当前用户zhang为属主属组的vim进程,
此时vim进程的属主属组为zhang:zhang,由于无论是属主还是属组都不具有对/etc/passwd的编辑权限,所以这个vim进程无权编辑/etc/passwd.;而给/usr/bin/vim设置了SUID之后,zhang或任何用户启动vim程序时,系统创建的vim进程的属主则是取了/usr/bin/vim这个程序文件自身的属主root;所以此时vim进程的属主属组为root:zhang. 系统检查发现正好匹配了/etc/passwd的属主,于是放行vim进程.


[zhang@centos2 ~]$ vim /etc/passwd   #修改uid=0
zhang:x:0:500::/home/zhang:/bin/bash

退出再次登陆;可以看出当前的用户是root

[root@centos2 test]# su - zhang
[root@centos2 ~]# whoami
root
[root@centos2 ~]# 

验证。首先找一个属主属组都为root且o位无w的文件

[root@centos2 ~]# find / -name haha -type f -exec ls -l {} \;
-rw-r--r--. 1 root zhang 0 9月  14 22:18 /tmp/haha
[root@centos2 ~]# 
[root@centos2 tmp]# cd /tmp/
[root@centos2 tmp]# mv haha didi
[root@centos2 tmp]# find / -name didi -type f -exec ls -l {} \;
-rw-r--r--. 1 root zhang 0 9月  14 22:18 /tmp/didi
[root@centos2 tmp]# 


改名成功,说明ok

三SGID

  • chmod   g[+-]s   文件或目录  或  用数字表示   chmod 2755 文件或目录
-rwxr-sr-x. 1 root root 0 9月  14 21:14 test
  • 在普通三位数字权限位之前,用2代表添加的SGID位
  • 文件属组的x权限,用s代替.表示被设置了SGID
  • 如果属组位没有x权限,会显示为大写S,表示有故障(权限无效)
  • chmod 0755 DIR/FILE 删除文件的SGID,(目录不受影响)
  • 注:作用在二进制程序上时:执行sgid权限的程序时,此用户将继承此程序的所属组权限
  • 注:作用于目录上时:此文件夹下所有用户新建文件都自动继承此目录的用户组. 

1)例子

普通用户zhang在/tmp中创建一个目录叫zhangdir,添加SGID.权限777

[zhang@centos2 zhangdir]$ chmod 2777 /tmp/zhangdir/
[zhang@centos2 zhangdir]$ ll -d
drwxrwsrwx. 2 zhang zhang 4096 9月  14 21:53 .
[zhang@centos2 zhangdir]$ 

切换到普通用户ming,在zhangdir目录中创建一个文件和一个目录

[ming@centos2 ~]$ cd /tmp/zhangdir/
[ming@centos2 zhangdir]$ mkdir mingdir
[ming@centos2 zhangdir]$ ll
总用量 4
drwxrwsr-x. 2 ming zhang 4096 9月  14 22:00 mingdir
[ming@centos2 zhangdir]$ 

可以看出,ming在zhangdir目录下创建的文件和目录都自动继承了zhangdir的属组

而且新目录的权限也继承了SGID.;所以设定了SGID的目录中的所有新建文件和目录都会自动属于zhang组.

四、sticky

  • chmod   o[+-]t   目录  或  用数字表示   chmod 1755 目录
-rwx--x--t. 1 root root 0 9月  14 21:20 caiwu
  • 在普通数字权限位前,用1代表添加Sticky位 
  • 文件属组的x权限,用t代替.表示被设置了sticky
  • 如果其他用户位没有x权限,会显示为大写T,表示有故障(权限无效)
  • 对于一个多人可写的目录,如果设置了sticky,则每个用户仅能删除和改名自己的文件或目录;
  • 只能作用在目录上.普通文件设置无意义,且会被linux内核忽略
  • 用户在设置Sticky权限的目录下新建的目录不会自动继承Sticky权限 

1)例子

目的:希望在系统中创建一个很多用户可以共同使用的目录,但是要求用户之间不能互相删除改变对方的文件.

首先:创建一个777的/test/dir目录;分别用zhang和ming用户在/test/dir目录创建自己的文件和目录;可是任何用户都可以删除里面的内容。如何解决呢?

[root@centos2 dir]# ll
总用量 16
drwxrwxr-x. 2 ming  ming  4096 9月  14 21:35 md1
drwxrwxr-x. 2 ming  ming  4096 9月  14 21:35 md2
drwxrwxr-x. 2 ming  ming  4096 9月  14 21:35 md3
-rw-rw-r--. 1 ming  ming     0 9月  14 21:34 mf1
-rw-rw-r--. 1 zhang zhang    0 9月  14 21:34 zd1
-rw-rw-r--. 1 zhang zhang    0 9月  14 21:34 zd2
-rw-rw-r--. 1 zhang zhang    0 9月  14 21:34 zd3
drwxrwxr-x. 2 zhang zhang 4096 9月  14 21:34 zf1
[root@centos2 dir]# 

要给/tmp这个文件夹设定一个Sticky位.

[root@centos2 test]# chmod 1777 dir/
[root@centos2 test]# ll -d dir/
drwxrwxrwt. 6 root root 4096 9月  14 21:35 dir/
[root@centos2 test]# 

到这尝试登陆普通用户到这个目录下删除mf1等文件和目录。删除不了说明生效了。

注:普通用户在设定了Sticky位的目录下创建的子目录不会继承这个Sticky权限,所以要注意设定好自己目录的权限. 

你可能感兴趣的:(日常笔记)