更改用户id 和组id

转自  http://blog.csdn.net/todd911/article/details/16370577

在unix系统中,特权是基于用户和组ID的,当程序需要增加特权,或需要访问当前并不允许访问的资源时,我们需要更换自己

用户ID或组ID,使的新ID具有合适的特权或访问权限。与此类似,当程序需要降低其特权或阻止对某些资源的访问时,也需要

更换用户ID或组ID,从而使新ID不具有相应特权或访问这些资源的能力。

可以用setuid函数设置实际用户ID和有效ID,与此类似,可以使用setgid函数设置实际组ID和有效组ID。

[cpp] view plaincopy

  1. #include <unistd.h>
  2. int setuid(uid_t uid);
  3. int setgid(gid_t gid);
  4. //两个函数返回值:若成功则返回0,出错则返回-1。

POSIX.1包含了两个函数seteuid和setegid,它们类似于setuid和setgid,但是只更改有效用户ID和有效组ID。

[cpp] view plaincopy

  1. #include <unistd.h>
  2. int seteuid(uid_t uid);
  3. int setegid(gid_t gid);
  4. //两个函数返回值,若成功则返回0,出错则返回-1.

关于改变用户ID的规则如下:(用户ID所说明的一切都适用于组ID)

1.若进程具有超集用户特权,则setuid函数将实际用户ID,有效用户ID,以及保存的设置用户ID设置为uid。

2.若进程没有超级用户特权,但是uid等于实际用户ID或保存的设置用户ID,则setuid只将有效用户ID设置为uid,不改变实际用户ID

和保存的设置用户ID。

3.如果上面两个条件都不满足,则将errno设置为EPERM,并返回-1.

关于内核所维护的三个用户ID,还要注意下列几点:

1.只有超级用户进程可以更改实际用户ID,通常实际用户ID是在用户登录时,由login程序设置的,而且永远不会改变它。

2.仅当对程序文件设置了设置用户ID位后,exec函数才会设置有效用户ID。任何时候都可以调用setuid,将有效用户ID设置为实际

用户ID或保存的设置用户ID。自然,不能将有效用户ID设置为任何随机值。

3.保存的设置用户ID是由exec复制有效用户ID而来的,如果设置了文件的设置用户ID,则在exec根据文件的用户ID设置了进程的有效

用户ID后,将这个副本保存起来。

下表列出了改变这三个用户ID的不同方法。

下面通过一个例子说明保存的设置用户ID的用法。

man程序可能要执行许多其他命令,以处理包含需显示手册页的文件。为了防止被欺骗运行错误的命令或重写错误的文件,man命令

不得不在两种权限之间切换:运行man命令用户的权限,以及拥有man可执行文件用户的权限。下面是其工作步骤:

1.man程序文件是由名为man的用户拥有的,并且其设置用户ID位已设置。当我们exec此程序时,关于用户ID得到:

实际用户ID=我们的用户ID

有效用户ID=man

保存的设置用户ID=man

2.man程序访问需要的配置文件和手册页,这些文件是由名为man的用户所拥有的,因为有效用户ID是man,所以

可以访问这些文件。

3.在man代表我们运行任一命令后,它调用setuid。因为我们不是超级用户进程,所以仅仅改变有效用户ID。此时:

实际用户ID=我们的用户ID

有效用户ID=我们的用户ID(已改变)

保存的设置用户ID=man

现在,man进程是以我们的用户ID作为其有效用户ID而运行的。它可以代表我们安全地执行任意过滤器程序。

4.当执行完过滤器操作后,man调用setuid(euid),其中euid是用户man的数值用户ID。因为setuid的参数等于

保存的设置用户ID,所以这种调用时允许的。现在得到:

实际用户ID=我们的用户ID

有效用户ID=man(已改变)

保存的设置用户ID=man

5.因为man程序的有效用户ID是man,所以现在它可对其文件进行操作。

//这个步骤好复杂啊...

时间: 2024-12-20 01:00:18

更改用户id 和组id的相关文章

【转】linux 设置用户id 设置组id

[转]转自 linux 设置用户id 设置组id 最近看apue,简单记录对设置用户id理解(设置组id同理). 1. 相关的id好像很多,共有哪些? 文件2个id 2个位: 拥有者id             拥有者组id 设置用户id位         设置组id位 进程6个或更多的id(如果有附加组id): 实际用户id             实际组id       (仅仅标志我们是谁,不参与文件访问权限检测) 有效用户id             有效组id        (用于文件访

Linux id 命令 - 显示用户id和组id信息

要登入一台计算机,我们需要一个用户名.用户名是一个可以被计算机识别的身份.基于此,计算机会对使用这个用户名的登陆的人应用一系列的规则.在Linux系统下,我们可以使用 id 命令. 什么是 id 命令 id 命令可以显示真实有效的用户 ID(UID) 和组 ID(GID).UID 是对一个用户的单一身份标识.组 ID(GID)则对应多个UID. 如何使用 id 命令 id 命令已经默认预装在大多数 Linux 系统中.要使用它,只需要在你的控制台输入id.不带选项输入 id 会显示如下.结果会使

进程控制(十一)---更改进程的用户ID和组ID

Linux提供了setuid函数和seteuid函数来更改与进程相关的用户ID,和进程相关的用户ID有“实际用户ID.有效用户ID和保存的设置用户ID” ====================================================== 函数原型: 函数参数: uid:要设置的用户ID 返回值: 调用成功时返回 0 调用失败时返回 -1 ==================================================== 当进程的有效用户ID是roo

文件模式设置用户ID/设置组ID/sticky bit

S_ISUID  (04000)  set-user-ID (set process effective user ID on execve(2))S_ISGID  (02000)  set-group-ID  (set  process effective group ID on execve(2); mandatory locking, as described in fcntl(2); take a new file's group from parent directory, as de

linux下进程的实际用户ID(有效组)和有效用户ID(有效组ID)

实际用户ID(实际组ID):标识当前用户(所属组)是谁,当用户登陆时取自口令文件. 有效用户ID(有效组ID):用来决定我们(当前进程)对文件的访问权(即实际该进程的是以那个用户运行的). 一般情况下,进程的有效用户ID等于进程的实际用户ID,进程的有效用户组ID等于进程的实际用户组ID. 但是当可执行程序文件的文件模式(st_mode)中设置了“设置-用户-ID(set_user_id)位”时,进程的有效用户ID等于该可执行文件的拥有者ID. 同样的如果可执行文件的文件模式(st_mode)中

设置用户ID和设置组ID

与一个进程关联的ID有6个或更多,如下图所示: 与每个进程相关联的用户ID和组ID 实际用户ID 实际组ID 我们实际是谁 有效用户ID 有效组ID 附加组ID 用于文件访问权限检索 保存的设置用户ID 保存的设置组ID 由exec函数保存 实际用户ID和实际组ID标识我们究竟是谁,这两个字段在登录时取自口令文件中的登录项.通常,在一个登录会话间这些值并不改变,但是超级用户进程有方法改变它们. 有效用户ID,有效组ID以及附加组ID决定了我们的文件访问权限. 保存的设置的用户ID和保存的设置组I

linux用户配置文件passwd和密码配置文件shadow,用户管理,组管理

一.linux和windows互传文件 1.安装支持包:lrzsz yum -y install   lrzsz putty工具 不支持lrzsz 2.rz windows文件fail2ban-0.8.14.tar.gz 到linux 当前目录 3.sz baidu.png 传输文件从linux 到 windows 二. 用户配置文件和密码配置文件 1.用户配置文件 ls /etc/passwd [[email protected]_46_188_centos ~]# cat /etc/pass

linux用户及群组学习总结

用户信息文件:etc/passwd 用户影子文件:etc/shadow 用户组信息文件:etc/group 用户组影子文件:etc/gshadow root的家目录是:etc/root 普通用户的家目录:etc/home/用户名/ 用户的邮箱:var/spool/mail/用户名/ 用户模版目录:etc/skel/             新建用户目录下的文件从这里复制 新增用户默认值文件:/etc/default/useradd /etc/login.defs             shad

Linux实际用户(组)ID,有效用户(组)ID,设置用户(组)ID

实际用户(组)ID: 标识用户是谁,这两个字段在登录时取自口令文件中的登录项. 有效用户(组)ID: 决定了对文件的访问权限,通常有效用户(组)ID等于实际用户(组)ID,谁运行有效ID就等于谁的实际ID,与文件的所有者无关. 如果设置了设置用户(组)ID位,那么有效用户(组)ID则等于文件的所有者(组)ID,这时有效ID与文件所有者ID有关了. 例如: /usr/bin/password,该程序需要写口令文件,但是口令文件只有超级用户才具有写权限,所以需要设置设置用户ID位, 那么当普通用户执