您的位置:首页 > 运维架构 > Linux

linux下粘滞位引出的SUID和SGID

2017-04-10 10:28 288 查看
    在使用int open(const char *pathname, int flags, mode_t mode)在进行文件打开操作时,其中的第三个参数就是linux下的权限模式,以前也没有很在意这个东西,不就是r,w,x之间的组合吗?后来才发现,这个mode_t并不是我想得那么简单,通过查看内核代码,在types.h文件当中找到了这样的定义:typedef __mode_t mode_t;__STD_TYPE __MODE_T_TYPE __mode_t;  /* Type of file attribute bitmasks.  */    “Type of file attribute bitmasks”,说的就是文件属性当中位屏蔽码的类型,这个类型在许多的结构体当中都有所包含,比如struct stat结构体当中就有。到这里我们搞清楚了mode_t指的是什么了,下面探究一下,有关粘滞位的东东。    对于ls -l显示的权限模式简单介绍一下,比如使用: ls -l /bin/bash显示如下: -rwxr-xr-x 1 root root 818232 2010-04-19 09:51 /bin/bash 
    其中第一列即表示该文件的权限属性。 
    第一个字母"-",表示文件类型。可选的文件类型标识有: 
"-":普通文件 
"d":目录 
"l":符号链接 
"c":字符专门设备文件 
"b":块专门设备文件 
"p":先进先出 
"s":套接字 
    余下的9位每三位划分为一组分别表示所有者权限、所属组权限、其他用户权限。 
    于是可知普通文件/bin/bash的权限集合为: 
所有者(root):rwx;所属组(root):r-x;其他用户:r-x    权限字母表示: 
r:读权限(查看文件中的数据/查看目录的内容) 
w:写/修改权限(修改文件以及删除/在目录内创建或删除对象) 
x:执行权限(执行程序/进入目录)    权限数字表示: 
---: 0 
--x: 1 
-w-: 2 
-wx: 3 
r--: 4 
r-x: 5 
rw-: 6 
rwx: 7 
    故/bin/bash的权限集合的数字表示为:755。    但是在mode_t(比如0022)当中的话,它还有一个最高的为,就是我们所说的粘滞位。    粘滞位(sticky bit)的功能是这样的,当某一个文件设置了这一位的时候,这个可执行程序退出后,操作系统会在内存当中保存该程序的内存映像,这样做是为了节约大型程序的启动时间,但是也要占用系统资源。因此,设置这个粘滞位,到不如把自己的程序写得更好些。这一位可以理解为防止删除位,设置了这一位之后,就算用户对目录具有读写的权限,但也只能添加文件而不能删除文件。    由此引出的两个位是SUID和SGID。    当设置了SUID的文件被执行时,该文件将以所有者的身份运行,也就是说无论谁来执行这个文件,他都有文件所有者的所有权限。如果所有者是root的话,那么执行人就有超级用户的权限了,这样的话,其实是不太安全的,因此不要轻易这么来设置这一位。    下面来说一说SGID,这一位和SUID是类似的,当文件运行的时候,文件执行者就具有文件所属组的权限了。    我们继续来讨论一下这些位的简单使用。    1.粘滞位的应用:^_^[sunny@sunny-laptop ~/test]55$ ls -l

总用量 4

-rw-r--r-- 1 sunny sunny 58 2011-07-08 21:17 fan.c

^_^[sunny@sunny-laptop ~/test]56$ gcc fan.c -o fan.out

^_^[sunny@sunny-laptop ~/test]57$ ls -l

总用量 12

-rw-r--r-- 1 sunny sunny 58 2011-07-08 21:17 fan.c

-rwxr-xr-x 1 sunny sunny 7101 2011-07-08 21:18 fan.out

^_^[sunny@sunny-laptop ~/test]58$ chmod o+t fan.c

^_^[sunny@sunny-laptop ~/test]59$ chmod o+t fan.out

^_^[sunny@sunny-laptop ~/test]60$ ls -l

总用量 12

-rw-r--r-T 1 sunny sunny 58 2011-07-08 21:17 fan.c

-rwxr-xr-t 1 sunny sunny 7101 2011-07-08 21:18 fan.out

^_^[sunny@sunny-laptop ~/test]61$
    说明:粘滞位只对文件有效,而且只能使用与文件其他使用者的最后一个x位的修改,也就是说只能进行chmod o+t或者chmod o-t这样的操作(这一点不太确定,但我认为是正确的)。如果文件的其他用户没有x权限,那么进行chmod o+t的话,最后一位就变成了T,而不是t。    2.SUID位的应用:
root@sunny-laptop:/home/sunny/test# gcc fan.c -o fan.out

root@sunny-laptop:/home/sunny/test# ls -l

总用量 12

-rw-r--r-- 1 root root 45 2011-07-08 21:29 fan.c

-rwxr-xr-x 1 root root 7101 2011-07-08 21:29 fan.out

root@sunny-laptop:/home/sunny/test# chmod u+s fan.out

root@sunny-laptop:/home/sunny/test# chmod u+s fan.c

root@sunny-laptop:/home/sunny/test# ls -l

总用量 12

-rwSr--r-- 1 root root 45 2011-07-08 21:29 fan.c

-rwsr-xr-x 1 root root 7101 2011-07-08 21:29 fan.out

root@sunny-laptop:/home/sunny/test# exit

exit

^_^[sunny@sunny-laptop ~/test]67$ whoami

sunny

^_^[sunny@sunny-laptop ~/test]68$ ls -l

总用量 12

-rwSr--r-- 1 root root 45 2011-07-08 21:29 fan.c

-rwsr-xr-x 1 root root 7101 2011-07-08 21:29 fan.out

^_^[sunny@sunny-laptop ~/test]69$ ./fan.out
hello world
^_^[sunny@sunny-laptop ~/test]70$
    说明:首先,我切换到了root用户下,创建了一个fan.c文件(内容为hello world程序),然后编译生成了fan.out文件。并将这两个文件的suid位进行了设置。退出root用户,执行fan.out文件,结果正确运行(其实/usr/bin/passwd也就是样的)。这个SUID位只对文件有效,并且只修改文件的所有者的权限,关于小s和大S(s和S)的区别就是,当文件所有者开始有x权限时,执行chmod u+x之后就会成为小s,否则就是大S。    3.SGID的应用:    相信弄懂了SUID的人,对这个也是能够理解的。SGID只针对用户组和目录适用。但是当我在测试的时候,发现了一个问题惊人的问题:用root创建的一个空目录,居然用普通用户就可以删除了。经过研究,发现原来是ubuntu搞的鬼,因为我用的是ubuntu,而ubuntu为了方便用户,故意这么设置的。呵呵,这个可不是我的错了。有关SGID的测试以后补上来。    小结:如果本来在x位上设置了x的时候,设置这些位将会显示小写的(s,s,t),否则会显示为大写的(S,S,T)。这三位如果转化为8进制表示的话,分别对应的是4(SUID),2(SGID),1(sticky bit),0(什么也不是),这样的话,就解决了我开始的疑问了。    4000:set uid on execution    2000:set gid on execution    1000:set sticky bit


<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>

阅读(1907) | 评论(0) | 转发(0) |

0
上一篇:Ubuntu10.04下C连接mysql数据库

下一篇:静默安装Oracle数据库10g篇

相关热门文章
欢迎xiaoyu_linux在ChinaUnix...

linux设备驱动之USB数据传输分...

浅析usb转serial串口设备在lin...

[原创]到目前为止,Linux下最...

Red Hat Linux 的主要系统目录...

linux 常见服务端口

xmanager 2.0 for linux配置

【ROOTFS搭建】busybox的httpd...

openwrt中luci学习笔记

什么是shell

linux dhcp peizhi roc

关于Unix文件的软链接

求教这个命令什么意思,我是新...

sed -e "/grep/d" 是什么意思...

谁能够帮我解决LINUX 2.6 10...

给主人留下些什么吧!~~

评论热议
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: