Chinaunix首页 | 论坛 | 博客
  • 博客访问: 244081
  • 博文数量: 137
  • 博客积分: 5005
  • 博客等级: 上校
  • 技术积分: 1360
  • 用 户 组: 普通用户
  • 注册时间: 2005-03-25 09:21
个人简介

每天进步一点点

文章分类

全部博文(137)

文章存档

2016年(1)

2013年(2)

2012年(30)

2011年(42)

2006年(27)

2005年(35)

分类:

2005-11-02 06:40:56

Why we need suid,how do we use suid?

         r    --     读访问 
    w   --    写访问 
    x    --    执行许可 
     s    --   SUID/SGID 
     t     --   sticky位  
                        
 那么 suid/sgid是做什么的? 为什么会有suid位呢?
 要想明白这个,先让我们看个问题:如果让每个用户更改自己的密码?
 用户修改密码,是通过运行命令passwd来实现的。最终必须要修改/etc/passwd文件,
 而passwd的文件的属性是:
  #ls -l /etc/passwd
 -rw-r--r--    1 root     root         2520 Jul 12 18:25 passwd
 
我们可以看到passwd文件只有对于root用户是可写的,而对于所有的他用户来说都是没有写权限的。 那么一个普通的用户如何能够通过运行passwd命令修改这个passwd文件呢? 
为了解决这个问题,SUID/SGID便应运而生。而且AT&T对它申请了专利。 呵呵。

SUID和SGID是如何解决这个问题呢?
 首先,我们要知道一点:进程在运行的时候,有一些属性,其中包括 实际用户ID,实际组ID,有效用户ID,有效组ID等。 实际用户ID和实际组ID标识我们是谁,谁在运行这个程序,一般这2个字段在登陆时决定,在一个登陆会话期间, 这些值基本上不改变。

而有效用户ID和有效组ID则决定了进程在运行时的权限。内核在决定进程是否有文件存取权限时, 是采用了进程的有效用户ID来进行判断的。
 
 知道了这点,我们来看看SUID的解决途径:
 当一个程序设置了为SUID位时,内核就知道了运行这个程序的时候,应该认为是文件的所有者在运行这个程序。即该程序运行的时候,有效用户ID是该程序的所有者。举个例子: 
 [root@sgrid5 bin]# ls -l passwd
 -r-s--s--x    1 root     root        16336 Feb 14  2003 passwd

虽然你以test登陆系统,但是当你输入passwd命令来更改密码的时候,由于passwd设置了SUID位,因此虽然进程的实际用户ID是test对应的ID,但是进程的有效用户ID则是passwd文件的所有者root的ID,因此可以修改/etc/passwd文件。
  
让我们看另外一个例子。 

ping命令应用广泛,可以测试网络是否连接正常。ping在运行中是采用了ICMP协议,需要发送ICMP报文。但是只有root用户才能建立ICMP报文,如何解决这个问题呢?同样,也是通过SUID位来解决。
  [root@sgrid5 bin]# ls -l /bin/ping
  -rwsr-sr-x    1 root     root        28628 Jan 25  2003 /bin/ping 
我们可以测试一下,如果去掉ping的SUID位,再用普通用户去运行命令,看会怎么样。

 [root@sgrid5 bin]#chmod u-s /bin/ping
 [root@sgrid5 bin]# ls -l ping
 -rwxr-xr-x    1 root     root        28628 Jan 25  2003 ping
 [root@sgrid5 bin]#su test
 [test@sgrid5 bin]$ ping byhh.net
 ping: icmp open socket: Operation not permitted


 SUID虽然很好了解决了一些问题,但是同时也会带来一些安全隐患。
 因为设置了 SUID 位的程序如果被攻击(通过缓冲区溢出等方面),那么hacker就可以拿到root权限。
 因此在安全方面特别要注意那些设置了SUID的程序。
 
 通过以下的命令可以找到系统上所有的设置了suid的文件:


 [root@sgrid5 /]# find  / -perm -04000 -type f -ls

 对于这里为什么是4000,大家可以看一下前面的st_mode的各bit的意义就明白了。


 在这些设置了suid的程序里,如果用不上的,就最好取消该程序的suid位。

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