Linux进程uid与euid用法解析
时间:2014-09-20 01:17 来源:linux.it.net.cn 作者:it
在linux中与进程有关的两个知识点,即用户的uid与euid的相关内容,这是linux中很重要的内容
Linux进程,用户的uid与euid。
在linux操作系统中,对可执行文件设置 setuid 权限时,将对运行该文件的进程授予基于文件属主的访问权限。
该访问权限不是基于正在运行可执行文件的用户。
使用此特殊权限,用户可以访问通常只有属主才可访问的文件和目录。
可以使用chmod u+s 或chmod g+s来设置二进制的可执行文件的euid。setuid只能对二进制的可执行设置。
一 进程的uid和euid
linux系统中每个进程都有2个ID,分别为用户ID(uid)和有效用户ID(euid),UID一般表示进程的创建者(属于哪个用户创建),而EUID表示进程对于文件和资源的访问权限(具备等同于哪个用户的权限)。
C语言中,可以通过函数getuid()和geteuid()来获得进程的两个ID值。
当一个用户登陆系统时,系统会将UID和EUID都赋值为/etc/passwd文件中的UID,一般情况下2个ID是相同的,但是某些情况下会出现2个ID不同的情况。
gid和egid同理。
以下一段C代码将解释区别:"printid.c"
复制代码代码示例:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main(void)
{
printf(" UID\t= %d\n", getuid());
printf(" EUID\t= %d\n", geteuid());
printf(" GID\t= %d\n", getgid());
printf(" EGID\t= %d\n", getegid());
return EXIT_SUCCESS;
}
编译之:
复制代码代码示例:
root@jbxue:~> gcc -o printid printid.c
执行:
复制代码代码示例:
root@it:~> ./printid
Real UID = 1000
Effective UID = 1000
Real GID = 100
Effective GID = 100
看看/etc/passwd里uid和gid:
复制代码代码示例:
root@it:~> cat /etc/passwd | grep aguo | awk -F":" '{print "uid:"$3 "\tgid:"$4}'
uid:1000 gid:100
以上是相同的例子。
下面演示uid和euid不同的例子。
首先,修改一下文件属性,setuid或setgid
root@jbxue:~> chmod u+s printid #这样一来,文件在执行阶段具有文件所有者的权限。
还可以再补充一个:
root@jbxue:~> chmod g+s printid #这样一来,文件在执行阶段具有文件所属组的权限。
其次,变成其他用户,再来试验一下,比如变成root;
复制代码代码示例:
linux-x9rc:/home/aguo # ./printid
Real UID = 0
Effective UID = 1000
Real GID = 0
Effective GID = 100
uid和euid是有区别的!
以上演示环境:
OS:SuSE Desktop Linux 11
gcc:4.3.2
顺便补充:
perl里面的特殊变量$<、$>表示uid euid; $(、$)表示gid egid。
只是,$(和$)会存储一个列表,第一位表示的才是gid和egid,这个是perl的设置,不在本文讨论范围中。
二 passwd 实例
【关于linux的passwd命令】
passwd命令是用来修改用户登陆密码的,用来记录用户登陆密码的文件为/etc/shadow,该文件只有root用户具有访问权限,如下所示:
复制代码代码示例:
root@it:~$
root@it:~$ cd /etc
root@it:/etc$ ls -l shadow
-rw-r----- 1 root shadow 978 2009-02-22 21:25 shadow
root@it:/etc$
矛盾之处:出于安全考虑,不允许普通用户查看并修改shadow文件;但是如果这样普通用户就无法为自己修改密码。
Linux系统使用setuid来解决此问题:
如果一个程序被设置了setuid位,那么它无论被哪个用户启用,都会具备程序所有者的权限。
而passwd程序的所有者是root用户,passwd的权限如下所示,那么任何用户执行该程序,程序的EUID就会变成root用户的EUID,而不是执行该程序的UID。
例如:
复制代码代码示例:
root@it:/etc$ cd /usr/bin
root@it:/usr/bin$ ls -l passwd
-rwsr-xr-x 1 root root 32988 2008-06-10 02:10 passwd
root@it:/usr/bin$
root@it:/usr/bin$
因此,普通用户通过passwd程序修改shadow文件内容,完成密码修改,是没有问题的。
(责任编辑:IT)
在linux中与进程有关的两个知识点,即用户的uid与euid的相关内容,这是linux中很重要的内容 Linux进程,用户的uid与euid。
在linux操作系统中,对可执行文件设置 setuid 权限时,将对运行该文件的进程授予基于文件属主的访问权限。 使用此特殊权限,用户可以访问通常只有属主才可访问的文件和目录。 可以使用chmod u+s 或chmod g+s来设置二进制的可执行文件的euid。setuid只能对二进制的可执行设置。
一 进程的uid和euid C语言中,可以通过函数getuid()和geteuid()来获得进程的两个ID值。
当一个用户登陆系统时,系统会将UID和EUID都赋值为/etc/passwd文件中的UID,一般情况下2个ID是相同的,但是某些情况下会出现2个ID不同的情况。
以下一段C代码将解释区别:"printid.c"
复制代码代码示例:
#include <stdlib.h>
int main(void)
return EXIT_SUCCESS;
编译之:
复制代码代码示例:
root@jbxue:~> gcc -o printid printid.c
执行:
复制代码代码示例:
root@it:~> ./printid
Real UID = 1000 Effective UID = 1000 Real GID = 100 Effective GID = 100
看看/etc/passwd里uid和gid:
复制代码代码示例:
root@it:~> cat /etc/passwd | grep aguo | awk -F":" '{print "uid:"$3 "\tgid:"$4}'
uid:1000 gid:100 以上是相同的例子。
下面演示uid和euid不同的例子。
其次,变成其他用户,再来试验一下,比如变成root;
复制代码代码示例:
linux-x9rc:/home/aguo # ./printid
Real UID = 0 Effective UID = 1000 Real GID = 0 Effective GID = 100
uid和euid是有区别的!
顺便补充:
复制代码代码示例:
root@it:~$
root@it:~$ cd /etc root@it:/etc$ ls -l shadow -rw-r----- 1 root shadow 978 2009-02-22 21:25 shadow root@it:/etc$
矛盾之处:出于安全考虑,不允许普通用户查看并修改shadow文件;但是如果这样普通用户就无法为自己修改密码。
例如:
复制代码代码示例:
root@it:/etc$ cd /usr/bin
root@it:/usr/bin$ ls -l passwd -rwsr-xr-x 1 root root 32988 2008-06-10 02:10 passwd root@it:/usr/bin$ root@it:/usr/bin$ 因此,普通用户通过passwd程序修改shadow文件内容,完成密码修改,是没有问题的。 (责任编辑:IT) |