unix实际用户ID和有效用户ID解析(部分转贴)

来源:互联网 发布:程序员方向选择 编辑:程序博客网 时间:2024/06/10 17:00

 

问题 :1. 对于unix的文件来说有以下几个id , userID , effective userID ,groupID ,effective groupID,问题是这几个id有什么区别,怎样赋值

  2. unix当中的suid 与 sgid 的作用是什么

 

 

一 . 回答这几个问题

 

1.这四个ID是什么?

userID 与 groupID 比较好理解,就是表示当前的用户是谁,谁在运行这个程序,一般这2个字段在登陆时决定,在一个登陆会话期间, 这些值基本上不改变。(比如用户 foo 登录了一个 shell,那么 userID = foo 、groupID = foo)。

effctiveID与groupID 定了进程在运行时的权限。内核在决定进程是否有文件存取权限时,是采用了进程的有效用户ID来进行判断的。

 

2.它们之间的关系?

那么effctiveID 与 userID 之间的关系呢 ?

一个进程如果没有SUID或SGID位,则euid=uid egid=gid。而如果设置了SUID与SGID,则euid和egid变成被运行的程序的所有者的uid和gid。

(eg : kevin用户的uid和gid分别为204和202,foo用户的uid和gid为 200,201,myfile是属于foo用户的。

1. 如果myfile没有设置SUID,kevin运行myfile程序形成的进程的euid=uid=204,egid=gid=202,内核根据这些值来判断进程对资源访问的限制,其实就是kevin用户对资源访问的权限,和foo没关系。 )

2. 如果myfile设置了SUID,则euid和egid变成被运行的程序的所有者的uid和gid,例如kevin用户运行myfile,euid=200,egid=201,uid=204,gid=202,则这个进程具有它的属主foo的资源访问权限。)

 

        3.看了上面的例子,自己思考下为什么要增加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位时,内核就知道了运行这个程序的时候,应该认为是文件的所有者在运行这个程序。即该程序运行的时候,有效用户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

 

 

三 使用注意:

1. SGID的风险比SUID小得多,所以出于系统安全的考虑,应该尽量用SGID代替SUID的程序,如果可能的话。

2. SUID的优先级比SGID高,当一个可执行程序设置了SUID,则SGID会自动变成相应的egid。

3. 目录的SGID属性使得在该目录下创建的任何文件及子目录属于该目录所拥有的组(还是SGID基本原理来分析)

4. S与s之间区别,s表示有运行权限,而S没有。没有运行权限的S使得SGID与SUID实际变得没有效果(因为程序不能执行,euid与egid不能改变为文件的所有者id)

原创粉丝点击