LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 808|回复: 11

对于目录位的权限的疑问

[复制链接]
发表于 2005-8-1 17:19:06 | 显示全部楼层 |阅读模式
多数书上讲,对于目录,权限位的含义如下:
r:可以列出该目录中的文件
w:可以在该目录中创建或删除文件
x:可以搜索或进入该目录

我在实验中发现,对于目录位的权限,单独具有r或者w位是没有用的,可以访问一个目录必须首先具有x位,否则,既不能列出目录中的文件,也不能在目录中创建删除文件。不知是否正确,请大家验证。
发表于 2005-8-1 17:21:39 | 显示全部楼层
那当然。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-1 17:24:32 | 显示全部楼层
不好意思,我刚明白,见笑了。

还有一个问题,suid/guid还有用吗?我在一篇文章里看到在很多系统中suid/guid会被忽略,是否如此?
回复 支持 反对

使用道具 举报

发表于 2005-8-1 17:25:26 | 显示全部楼层
什么意思?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-1 17:30:44 | 显示全部楼层
是说因为安全性的原因,很多供应商不允许实现这一位。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-1 17:56:38 | 显示全部楼层
我在我的系统上作下面的测试:

有两个用户aladdin和guest,位于同一个组aladdin

当前目录下有一个文件和一个目录:
-rwsr-sr-x  1 aladdin aladdin  20 2005-08-01 08:36 suidtest*
d-wx------  2 aladdin aladdin  48 2005-08-01 08:52 tdir/

suidtest是一个脚本,内容如下:
aladdin@debian:~$ cat suidtest
#! /bin/bash

cd tdir
touch test1

这个脚本以aladdin身份可以正确运行,以guest身份不能运行。错误如下:
-bash: cd: tdir: Permission denied
touch: cannot touch `test1': Permission denied
也就是说suid没有起作用。
回复 支持 反对

使用道具 举报

发表于 2005-8-1 18:01:24 | 显示全部楼层
我记得不可以有suid脚本,只能suid binary。
回复 支持 反对

使用道具 举报

发表于 2005-8-1 18:55:19 | 显示全部楼层
精华里有详细的权限分析文章,可以解答你的疑问
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-2 09:25:11 | 显示全部楼层
troll兄说的对。用下面的程序可以通过:

#include <stdlib.h>

int main()
{
        system("cd tdir;touch test1");
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-2 09:37:35 | 显示全部楼层
原文链接:http://www.zdnet.com.cn/develope ... 534,39157162,00.htm

使用UNIX的suid脚本

作者: ZDNet China

尽管我们并不推荐你这么做,但有时候你会觉得有必要来运行在你的权限之外的脚本。特别是非特权用户(例如“nobody”)运行这样的脚本来访问和修改属于根用户(root)的文件。在UNIX系统下,你可以使用文件许可的set-id位,这样脚本就可以获得文件拥有者的权限了。

由于这并不是一个好的做法,所以有些操作系统(如Linux)忽略了脚本语言的set-id位。为了检查你的系统是否允许使用set-id位,我们创建了下面的外壳脚本。我们首先按照普通用户、然后按照根用户的身份来运行这段脚本:
  
#!/bin/sh
echo My effective user id is $EUID

如果你以根用户的身份运行这段脚本,那么你得到的用户id应该为零,否则(作为普通用户运行该脚本)你所得到的用户id为其它值。如果你把文件拥有者改为根用户并使用set-id位,以普通用户身份运行该脚本,并且你得到的用户id为零,那么你的系统就允许suid脚本。

然而,Perl提供一个叫着suidperl的程序,在这种情况下Perl会自动调用该程序。我们在Perl中创建等效测试脚本:

#!/usr/bin/perl
print "My effective user id is $>\n";

分别用根用户和普通身份运行该脚本,应该得到两个不相同的用户id。然后,修改拥有者为根用户(作为root)并使用set-id位:

chownroot.root /tmp/suid.pl
chmod +s /tmp/suid.pl

现在当你以普通用户身份执行该脚本,就会调用suidperl而不是Perl,而且有效用户id是零。

注意:这是一个危险的方法,我们不应该轻易使用它——除非在所有可以安全解决问题的方法都无效的无效的情况下。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表