博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux特殊权限SUID,SGID,sticky
阅读量:2347 次
发布时间:2019-05-10

本文共 4156 字,大约阅读时间需要 13 分钟。

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

比如系统中假如有超过四类人然而每一类人都需要一种独特权限.只有三种独特权限的基础权限系统就会明显不够用.特殊权限可以扩展系统基础权限的功能,使得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=0zhang:x:0:500::/home/zhang:/bin/bash

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

[root@centos2 test]# su - zhang[root@centos2 ~]# whoamiroot[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 -ddrwxrwsrwx. 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总用量 4drwxrwsr-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总用量 16drwxrwxr-x. 2 ming  ming  4096 9月  14 21:35 md1drwxrwxr-x. 2 ming  ming  4096 9月  14 21:35 md2drwxrwxr-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 zd3drwxrwxr-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权限,所以要注意设定好自己目录的权限. 

转载地址:http://hwxvb.baihongyu.com/

你可能感兴趣的文章
Android Studio 加载JNI与so文件
查看>>
Android Handler内存泄漏和解决方法
查看>>
Handler、Looper、MessageQueue、HandlerThread、ActivityThread、Message源码分析
查看>>
Android HandlerThread使用
查看>>
SQLite多线程操作数据库
查看>>
Android的category.LAUNCHER与installLocation设置失效问题
查看>>
2019/7/19每日新闻
查看>>
2019/7/22每日新闻
查看>>
2019/7/23每日新闻
查看>>
2019/7/24每日新闻
查看>>
2019/7/25每日新闻
查看>>
2019/7/26每日新闻
查看>>
2019/7/29每日新闻
查看>>
Android 7.0 APK升级
查看>>
2019/7/30每日新闻
查看>>
2019/8/1每日新闻
查看>>
2019/8/2每日新闻
查看>>
springboot新手脱坑
查看>>
Word在试图打开文件时遇到错误。 请尝试下列方法: 检查文档或驱动器的文件权限。 确保有足够的内存和磁盘空间。 用文本恢复转换器打开文件。
查看>>
linux总结
查看>>