知识储备
权限模型
对于某个文件而言,Linux对3类对象分别定义了3种不同的权限;
3类对象:属主u、属组g、其他o
3种权限:读权限r、写权限w、执行权限x
A目录中有a.txt这个文件,用户能否删除这个文件取决于用户是否对A目录有写权限,而不是对a.txt有没有写权限,谨记!
进程的安全上下文
每个进程也有属主、属组,进程需要访问的文件也有属主、属组
默认情况下进程的属主是进程发起者这个用户
进程的属组是这个用户的基本组
其实除了rwx3类权限,Linux下还有特殊的权限模型SUID、SGID、STICKY
进程的安全上下文
任何一个用户能否把某个可执行程序文件启动为进程?
取决于用户对该文件是否有 执行[x] 权限
程序启动为进程后,此进程的属主默认是该用户,属组默认是该用户所在的基本组,即发起者决定
进程可能会访问修改其他文件,那么进程的访问权限,取决于属主的访问权限
进程的属主,同文件属主,则应用文件属主的权限;
进程的属主,同文件属组,则应用文件属组的权限;
否则,应用其他用户的权限。
SUID
先看一个修改密码的例子
修改密码后最终会存储在/etc/shadow文件中,虽然用户有passwd命令的执行权限,那么用户A在执行passwd进程后,进程的属主是A属组是A,而上图看出来shadow文件的权限为000,参考上文所说的进程的安全上下文,是没有权限修改密码的,那么为何我们能修改密码成功呢?
查看一下passwd这个可执行程序文件的权限,是否和平常的文件有区别?
所谓的s权限其实就是3种特殊权限中的SUID了;
任何用户来执行这个程序时,产生的进程的属主不再是发起者,而是这个可执行程序文件的本身属主来发起,就拥有了高权限,这就是SUID机制。这里A用户执行passwd实际上进程属主不再是A而是root所以能修改密码了,你懂得;
任何一个可执行程序文件能不能启动为进程;取决于发起者对程序文件是否有x权限;
启动为进程后,其属主不再是发起者,而是程序文件自己的属主;这种机制即SU ID
SUID权限如何设定呢?
Chmod u+s File....
Chmod u-s File....
请注意,在权限位上可能会出现s和S,其意义实际上不一样
s:属主原本拥有x权限
S:属主原本无x权限
SGID
默认情况下,用户A创建一个文件其属主是A,属组是A的基本组这没有问题。如果在一个公共目录中,大家创建各自的文件想实现协同工作,但是由于系统的这种默认机制显然A用户访问B用户的文件会被禁止,因为不在一个组呀!
那么如何实现呢?借助SGID就可以解决这个协同工作的!
默认情况下,用户创建文件时,属主为自身,属组为用户的基本组;
当某个目录设定为SGID权限后,则对此目录拥有写权限的用户在此目录中创建的文件属组为目录的属组,而非用户的基本组
SGID的权限设定
Chmod g+s Directory...
Chmod g-s Directory...
s、S区别同SUID
STICKY
当我们解决了SGID的原理之后,那么要考虑一个问题,在一个协同工作目录中,用户是可以删除别人的文件的[删除的原则在知识储备处已经阐述],那么如何实现协同工作场景各用户可以互相编辑文件但是不允许删除别人的文件,只允许删除自己的文件呢?
这就是3种特殊权限中最后一种STICKY了,也在一定程度上确保了安全性
对公共可写目录,每个人都可以写自己的文件,但是不能删除别人的权限
STICKY的权限设定
chmod o+t Directory...
chmod o-t Directory...
本文出自 “蓝色仓库” 博客,请务必保留此出处http://bluebox.blog.51cto.com/8852456/1691887
[8-30]Linux文件系统上的特殊权限(SUID、SGID、Sticky)
原文地址:http://bluebox.blog.51cto.com/8852456/1691887