Chinaunix首页 | 论坛 | 博客
  • 博客访问: 344425
  • 博文数量: 62
  • 博客积分: 1441
  • 博客等级: 上尉
  • 技术积分: 615
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-15 02:26
文章分类

全部博文(62)

文章存档

2015年(4)

2011年(6)

2010年(19)

2009年(9)

2008年(8)

2007年(4)

2006年(12)

分类: BSD

2010-06-16 01:16:47

前言:作为一个 Unix 的系统管理员,在对文件进行权限分配的时候,会遇到三个比较特殊的权限概念:设

置用户ID(setuid)、设置组ID(setgid)和粘连位(sticky bit),不知道各位是如何去学习并理解这三

个特殊权限的,我到现在为止还没有完全搞清楚这三个权限的使用,经过一段时间的反复学习,现在基本了

解了 setuid 的使用方法,为防止自己遗忘,也为了方便自己的日后使用,现在将 setuid 这个权限的使用

方法记录下来,如果大家感觉我总结出来的文章能够让大家少走弯路,本人将感到无比荣幸。

×××××××××××××
setuid
×××××××××××××

在《FreeBSD 技术内幕》一书中这样说到:setuid,如果将该位应用到可执行文件上,那么执行这个文件时

使用的权限是文件用户所有者的有效用户权限,而不是执行这个文件的用户组的权限。

为搞清这句话的确切含义,我们先用一个自己编译的简单的 .c 来说明这个问题。

我们首先以普通用户的身份登录到系统中,然后打开3个终端,其中一个使用 su 命令切换到 root 身份下,

我们且称为 A 窗口;另一个为属于 wheel 组的用户,我们且称为 B 窗口;另一个不属于任何系统组的用户

,且称为 C 窗口。

在某目录下,我们建立一个测试用的 .c 文件 test.c,文件内容如下:

test.c
-------------------
# include
int main ()
{
  int a;
 
  printf("Please enter a number:\n");
  scanf("%i",&a);

  printf("%i\n",a);
  return 0;
}
-------------------

而后编译:

cc -o test test.c

在 A 窗口中将其设置为 754 的权限,并将其用户及组更改为 root:wheel,相关命令如下:

# chmod 754 test && chown root:wheel test

检查后文件属性如下:

-rwxr-xr--  1 root    wheel   4947  6 16 13:21 test

此时我们在窗口 B 中是无法执行该文件的,因为没有权限

> ./test
./test: Permission denied.

现在,我们将其文件属性改为 4755,也就是给它设置了 setuid 权限,那么检查属性和执行文件后的结果如

下:

-rwsr-xr-x  1 root    wheel    29  6 16 01:05 test

> ./test
Please enter a number

而后通过 C 窗口来检查 test 文件是以什么身份运行的:

ps aux | grep test

可以看到如下结果:

root        9930  0.0  0.0  3164   840  p3  S+    1:31PM   0:00.00 ./test

这样就可以看到,当一个非 root 身份的用户在执行该程序时,并不是登录用户的 ID ,而是 root

这样,基本能验证 setuid 的使用方法。

一个应用实例:了解了 setuid 的作用后,我们可以将他应用到实际操作当中。

在 Unix 系统中,只有 root 用户及 operator 组的用户能够关机,通过下面的操作,我们能再次体会到

setuid 的作用。

首先检查 shutdown 文件属性:

# ls -l /sbin/shutdown
-r-sr-x---  1 root  operator  10756  5  1  2009 /sbin/shutdown

现在我们看到 shutdown 命令已经被设置为 4550 的权限了,然后我们在执行该命令:

> shutdown
/sbin/shutdown: Permission denied.

会看到提示权限不足。而后添加我当前使用的用户名到 /etc/group 文件的 operator 组中后再次执行该命令:

> shutdown
usage: shutdown [-] [-h | -p | -r | -k] [-o [-n]] time [warning-message ...]

便可以看到,我现在不 su 到 root 身份下也可以执行关机操作了。

后来我也试验了一些其他的可执行文件,从而理解并掌握了 setuid 权限的使用方法,不知道大家是否也理

解了?


×××××××××××××
setuid
×××××××××××××

未完

×××××××××××××
sticky bit
×××××××××××××

一直没有在 FreeBSD 上试成功过这个部分的内容,可能是因为我比较笨的原因吧。今天无聊跑 debian 上又试了一下,手册中的内容得到了验证,下面把这部分的内容添加上去,免得哪天又给忘了。

环境介绍:

debian:/home/luokyo/fuck$ uname -a
Linux debian 2.6.26-2-amd64 #1 SMP Tue Jan 12 22:12:20 UTC 2010 x86_64 GNU/Linux

测试用帐户:luokyo, fuck(有点‘愤’的风格)

测试用目录:/home/luokyo/fuck

测试用文件:luokyo

首先,我们使用 luokyo 帐户在自己的 home 目录下创建一个目录,名为 fuck,并为其设置sticky bit 权限:

chmod 1777 fuck
ls -l
total 20
drwxrwxrwt 2 luokyo luokyo 4096 2010-08-14 17:40 fuck

也使 fcuk 用户进入该目录,并创建一个新文件:

debian:/home/luokyo/fuck$ touch fuck
debian:/home/luokyo/fuck$ ls
fuck  luokyo

然后用 luokyo 用户删除 fuck 文件

rm fuck
rm: remove write-protected regular empty file `fuck'? y
ls
luokyo

可以看到,luokyo 用户在 fuck 目录中的操作不受影响,但反之,用户 fuck 在 fuck 目录中的操作就没有那么顺利了:

rm fuck
rm: remove write-protected regular empty file `fuck'? y
ls
luokyo
touch test
ls
luokyo  test

再用 fuck 用户删除 test 文件:

debian:/home/luokyo/fuck$ rm test
rm: remove write-protected regular empty file `test'? y
rm: cannot remove `test': Operation not permitted
debian:/home/luokyo/fuck$ ls
luokyo  test

这个权限让我想起 FTP 中的一个常见的权限设置:某人在其服务器中共享出一个目录,仅希望自己可以删除目录的文件及文件夹,其他用户可以添加自己的文件或文件夹,但不能对其所有的东西进行修改。当然,如果是使用 FTP 的话,可以通过其他方式得到这样的权限,该权限的设置能使某用户的某目录也能拥有一样的效果,对于本地用户来说,也是一个不错的功能。


今天闲来无事,把一块闲置的120G IDE 硬盘安装在我专门整系统的电脑里,也专门试了下sticky bit,终于成功了。

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