深入理解linux的权限设置和SUID,SGID,粘滞位

转自:http://www.diybl.com/course/6_system/linux/Linuxjs/20081020/150812.html



当您最初登录时,将启动一个新的 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”标志,在目录内创建的任何文件系统对

象将继承目录的组所有者。当您需要创建一个属于同一组的一组人使用的目录树时,这种特殊的

功能很管用。只需要这样做:

  

  # 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 的

粘滞位,而您还可以发现粘滞位在其它情况下也很管用。

set uid ;set gid;sticky bit区别

每一个文件有所有者及组编号,set uid ;set gid可以改变用户对文件具有的权限:写和执行.

setuid: 在执行时具有文件所有者的权限.
setgid: 设置目录. 一个目录被标上setgid位,此目录下创建的文件继承该目录的属性.
sticky bit: 该位可以理解为防删除位. 设置sticky bit位后,就算用户对目录具有写权限,但也只能添加文件而不能删除文件。


如何设置:

操作这些标志与操作文件权限的命令是一样的, 都是 chmod. 有两种方法来操作,
1) chmod u+s temp -- 为temp文件加上setuid标志. (setuid 只对文件有效,U=用户)
chmod g+s tempdir -- 为tempdir目录加上setgid标志 (setgid 只对目录有效,g=组名)
chmod o+t temp -- 为temp文件加上sticky标志 (sticky只对文件有效)

2) 采用八进制方式. 这一组八进制数字三位的意义如下,
abc
a - setuid位, 如果该位为1, 则表示设置setuid
b - setgid位, 如果该位为1, 则表示设置setgid
c - sticky位, 如果该位为1, 则表示设置sticky

设置后, 可以用 ls -l 来查看. 如果本来在该位上有x, 则这些特殊标志显示为小写字母 (s, s, t). 否则, 显示为大写字母 (S, S, T)
如:

rwsrw-r-- 表示有setuid标志 (rwxrw-r--:rwsrw-r--)
rwxrwsrw- 表示有setgid标志 (rwxrwxrw-:rwxrwsrw-)
rwxrw-rwt 表示有sticky标志 (rwxrw-rwx:rwxrw-rwt)






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值