http://huxl007.blog.163.com/blog/static/120186788200951894712219/
http://blog.csdn.net/lonelycloud/article/details/469545
当您最初登录时,将启动一个新的 shell 进程。您已经知道,但是您可能还不知道这个新的 shell
进程(通常是 bash)使用您的用户标识运行。照这样,bash 程序可以访问所有属于您的文件和
目录。事实上,作为用户,我们完全依靠其它程序来代表我们执行操作。因为您启动的程序继承了
您的用户标识,因此它们不能访问任何不允许您访问的文件系统对象。
例如,一般用户不能直接修改 passwd 文件,因为“write”标志已经对除“root 用户”以外的每个用户关闭:
$ ls -l /etc/passwd
-rw-r--r-- 1 root wheel 1355 Nov 1 21:16 /etc/passwd
但是,一般用户确实需要在他们需要改变其密码的任何时候,能够修改 /etc/passwd(至少间
接地)。但是,如果用户不能修改该文件,究竟怎样完成这个工作呢?
Suid
幸好,Linux 权限模型有两个专门的位,叫做“suid”和“sgid”。当设置了一个可执行程序
的“suid”这一位时,它将代表可执行文件的所有者运行,而不是代表启动程序的人运行。
现在,回到 /etc/passwd 问题。如果看一看 passwd 可执行文件,我们可以
看到它属于 root 用户:
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root wheel 17588 Sep 24 00:53 /usr/bin/passwd
您还将注意到,这里有一个 s 取替了用户权限三元组中的一个 x。这表明,对于这个特殊程序,
设置了 suid 和可执行位。由于这个原因,当 passwd 运行时,它将代表 root 用户执行(
具有完全超级用户访问权),而不是代表运行它的用户运行。又因为 passwd 以 root 用户访
问权运行,所以能够修改 /etc/passwd 文件,而没有什么问题。
suid/sgid 告诫说明
我们看到了 suid 怎样工作,sgid 以同样的方式工作。它允许程序继承程序的组所有权,而不
是当前用户的程序所有权。
这里有一些关于 suid 和 sgid 的其它的但是很重要的信息。首先,suid 和 sgid 占据与 ls -l 清单中 x 位相同的空间。如果还设置了 x 位,则相应的位表示为 s(小写)。但是,
如果没有设置 x 位,它将表示为 S(大写)。
另一个很重要的提示:在许多环境中,suid 和 suid 很管用,但是不恰当地使用这些位可能使
系统的安全遭到破坏。最好尽可能地少用“suid”程序。passwd 命令是为数不多的必须使用
“suid”的命令之一。
改变 suid 和 sgid
设置和除去 suid 与 sgid 位相当简单。这里,我们设置 suid 位:
# chmod u+s /usr/bin/myapp
此处,我们从一个目录除去 sgid 位。我们将看到 sgid 位怎样影响下面几屏中
的目录:
# chmod g-s /home/drobbins
权限和目
到此为止,我们从常规文件的角度来看权限。当从目录的角度看权限时,情况有一点不同。目录使
用同样的权限标志,但是它们被解释为表示略微不同的含义。
对于一个目录,如果设置了“read”标志,您可以列出目录的内容;“write”表示您可以在目
录中创建文件,“execute”表示您可以进入该目录并访问内部的任何子目录。没有“execute”
标志,目录内的文件系统对象是不可访问的。没有“read”标志,目录内的文件系统对象是不可
查看的,但是只要有人知道磁盘上对象的完整路径,就仍然可以访问目录内的对象。
目录和 sgid
如果启用了目录的“sgid”标志,在目录内创建的任何文件系统对象将继承目录
的组。当您需要创建一个属于同一组的一组人使用的目录树时,这种特殊的功能
很管用。只需要这样做:
# mkdir /home/groupspace
# chgrp mygroup /home/groupspace
# chmod g+s /home/groupspace
现在,mygroup 组中的所有用户都可以在 /home/groupspace 内创建文件或目录,同样,他
们也将自动地分配到 mygroup 的组所有权。根据用户的 umask 设置,新文件系统对象对于
mygroup 组的其他成员来说,可以或不可以是可读、可写或可执行的。
目录和删除
缺省情况下,Linux 目录以一种不是在所有情况下都很理想的方式表现。一般来说,只要对一个
目录有写访问权,任何人都可以重命名或删除该目录中的文件。对于个别用户使用的目录,这种行
为是很合理的。
但是,对于很多用户使用的目录来说,尤其是 /tmp 和 /var/tmp,这种行为可能会产生麻烦。
因为任何人都可以写这些目录,任何人都可以删除或重命名任何其他人的文件 — 即使是不属于
他们的!显然,当任何其他用户在任何时候都可以输入“rm -rf /tmp/*”并损坏每个人的文
件时,很难把 /tmp 用于任何有意义的文件。
所幸,Linux 有叫做“粘滞位”(sticky bit)的东西。当给 /tmp 设置了粘滞位(用
chmod +t),唯一能够删除或重命名 /tmp 中文件的是该目录的所有者(通常是 root 用户)
、文件的所有者或 root 用户。事实上,所有 Linux 分发包都缺省地启用了 /tmp 的粘滞位,
而您还可以发现粘滞位在其它情况下也很管用。
难以理解的第一位
总结本章,我们最后来看一看数字模式的难以理解的第一位数。您可以看到,这个第一位数
用来设置 sticky、suid 和 sgid 位:
suid
|
sgid
|
sticky
|
模式数字
|
on
|
on
|
on
|
7
|
on
|
on
|
off
|
6
|
on
|
off
|
on
|
5
|
on
|
off
|
off
|
4
|
off
|
on
|
on
|
3
|
off
|
on
|
off
|
2
|
off
|
off
|
on
|
1
|
off
|
off
|
off
|
0
|
这里有一个怎样用 4 位数字模式来设置一个目录的权限的示例,该目录将由一个工作组使用:
# chmod 1775 /home/groupfiles
请想一想
1755 数字模式权限设置的含义。
=======================================
=======================================
=======================================
一、Linux下关于文件权限的表示方法和解析
SUID 是 Set User ID, SGID 是 Set Group ID的意思。
Linux下可以用ls -l 命令来看到文件的权限。用ls命令所得到的表示法的格式是类似这样的:-rwxr-xr-x 。下面解析一下格式所表示的意思。
这种表示方法一共有十位:
9 8 7 6 5 4 3 2 1 0
- r w x r - x r - x
第9位表示文件类型,可以为p、d、l、s、c、b和-:
p表示命名管道文件
d表示目录文件
l表示符号连接文件
-表示普通文件
s表示socket文件
c表示字符设备文件
b表示块设备文件
第8-6位、5-3位、2-0位分别表示文件所有者的权限,同组用户的权限,其
他用户的权限,其形式为rwx:
r表示可读,可以读出文件的内容
w表示可写,可以修改文件的内容
x表示可执行,可运行这个程序
没有权限的位置用-表示
例子:
ls -l myfile显示为:
-rwxr-x--- 1 foo staff 7734 Apr 05 17:07 myfile
表示文件myfile是普通文件,文件的所有者是foo用户,而foo用户属于staff
组,文件只有1个硬连接,长度是7734个字节,最后修改时间4月5日17:07。
所有者foo对文件有读写执行权限,staff组的成员对文件有读和执行权限,其他的用户对这个文件没有权限。 如果一个文件被设置了SUID或SGID位,会分别表现在所有者或同组用户的权限的可执行位上。例如:
1、-rwsr-xr-x 表示SUID和所有者权限中可执行位被设置
2、-rwSr--r-- 表示SUID被设置,但所有者权限中可执行位没有被设置
3、-rwxr-sr-x 表示SGID和同组用户权限中可执行位被设置
4、-rw-r-Sr-- 表示SGID被设置,但同组用户权限中可执行位没有被社
其实在Linux的实现中,文件权限用12个二进制位表示,如果该位置上的值是
1,表示有相应的权限:
11 10 9 8 7 6 5 4 3 2 1 0
S G T r w x r w x r w x
第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-0位对应于上面
的三组rwx位。
11 10 9 8 7 6 5 4 3 2 1 0
上面的-rwsr-xr-x的值为: 1 0 0 1 1 1 1 0 1 1 0 1
-rw-r-Sr--的值为: 0 1 0 1 1 0 1 0 0 1 0 0
给文件加SUID和SUID的命令如下:
chmod u+s filename 设置SUID位
chmod u-s filename 去掉SUID设置
chmod g+s filename 设置SGID位
chmod g-s filename 去掉SGID设置
另外一种方法是chmod命令用八进制表示方法的设置。如果明白了前面的12位
权限表示法也很简单。
二、SUID和SGID的详细解析
由于SUID和SGID是在执行程序(程序的可执行位被设置)时起作用,而可执行位只对普通文件和目录文件有意义,所以设置其他种类文件的SUID和SGID位是没有多大意义的。
首先讲普通文件的SUID和SGID的作用。例子:
如果普通文件myfile是属于foo用户的,是可执行的,现在没设SUID位,ls命令显示如下:
-rwxr-xr-x 1 foo staff 7734 Apr 05 17:07 myfile
任何用户都可以执行这个程序。UNIX的内核是根据什么来确定一个进程对资源的访问权限的呢?是这个进程的运行用户的(有效)ID,包括user id和group id。用户可以用id命令来查到自己的或其他用户的user id和group id。
除了一般的user id 和group id外,还有两个称之为effective 的id,就是有效id,上面的四个id表示为:uid,gid,euid,egid。内核主要是根据euid和egid来确定进程对资源的访问权限。
一个进程如果没有SUID或SGID位,则euid=uid egid=gid,分别是运行这个程序的用户的uid和gid。例如kevin用户的uid和gid分别为204和202,foo用户的uid 和gid为200,201,kevin运行myfile程序形成的进程的euid=uid=204,egid=gid= 202,内核根据这些值来判断进程对资源访问的限制,其实就是kevin用户对资源访问的权限,和foo没关系。
如果一个程序设置了SUID,则euid和egid变成被运行的程序的所有者的uid和gid,例如kevin用户运行myfile,euid=200,egid=201,uid=204,gid=202,则这个进程具有它的属主foo的资源访问权限。
SUID的作用就是这样:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。passwd就是一个很鲜明的例子。
SUID的优先级比SGID高,当一个可执行程序设置了SUID,则SGID会自动变成相应的egid。
下面讨论一个例子:
Linux系统有一个/dev/kmem的设备文件,是一个字符设备文件,里面存储了核心程序要访问的数据,包括用户的口令。所以这个文件不能给一般的用户读写,权限设为:cr--r----- 1 root system 2, 1 May 25 1998 kmem
但ps等程序要读这个文件,而ps的权限设置如下:
-r-xr-sr-x 1 bin system 59346 Apr 05 1998 ps
这是一个设置了SGID的程序,而ps的用户是bin,不是root,所以不能设置SUID来访问kmem,但大家注意了,bin和root都属于system组,而且ps设置了SGID,一般用户执行ps,就会获得system组用户的权限,而文件kmem的同组用户的权限是可读,所以一般用户执行ps就没问题了。但有些人说,为什么不把ps程序设置为root用户的程序,然后设置SUID位,不也行吗?这的确可以解决问题,但实际中为什么不这样做呢?因为SGID的风险比SUID小得多,所以出于系统安全的考虑,应该尽量用SGID代替SUID的程序,如果可能的话。
下面来说明一下SGID对目录的影响。SUID对目录没有影响。
如果一个目录设置了SGID位,那么如果任何一个用户对这个目录有写权限的话,他在这个目录所建立的文件的组都会自动转为这个目录的属主所在的组,而文件所有者不变,还是属于建立这个文件的用户。