Chinaunix首页 | 论坛 | 博客
  • 博客访问: 894153
  • 博文数量: 299
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2493
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-21 10:07
个人简介

Linux后台服务器编程。

文章分类

全部博文(299)

文章存档

2015年(2)

2014年(297)

分类: LINUX

2014-05-12 17:26:59

当您最初登录时,将启动一个新的 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 的粘滞位,

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


难以理解的第一位


总结本章,我们最后来看一看数字模式的难以理解的第一位数。您可以看到,这个第一位数

用来设置 stickysuid 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 数字模式权限设置的含义。

阅读(1043) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~