8.11 进程控制_更改用户ID和组ID

来源:互联网 发布:手机版淘宝网首页 编辑:程序博客网 时间:2024/04/27 07:49

      在UNIX系统中,特权是基于用户和组ID的。

  • #include <unistd.h>
  • int setuid(uid_t uid);
  • int setgid(gid_t gid);

返回值:若成功则返回0,若出错则返回-1

      setuid函数设置实际用户ID和有效用户ID,setgid函数设置实际组ID和有效组ID。

      关于谁能更改ID有若干规则:

  • 若进程具有超级用户特权,则setuid函数将实际用户ID、有效用户ID,以及保存的设置用户ID设置为uid。
  • 若进程没有超级用户特权,但是uid等于实际用户ID或保存的设置用户ID,则setuid只将有效用户ID设置为uid。不改变实际用户ID和保存的设置用户ID。
  • 如果上面两个条件都不满足,则将errno设置为EPERM,并返回-1。

      在这里假定_POSIX_SAVED_IDS为真。如果没有提供这种功能,则上面所说的关于保存的设置用户ID部分都无效。

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

  • 只有超级用户进程可以更改实际用户ID。通常,实际用户ID是在用户登录时,由login(1)程序设置的,而且永远不会改变它。
  • 仅当对程序文件设置了设置用户ID位时,exec函数才会设置有效用户ID。任何时候都可以调用setuid,将有效用户ID设置为实际用户ID或保存的设置用户ID。
  • 保存的设置用户ID是exec复制有效用户ID而得来的。

      getuid和geteuid函数只能获得实际用户ID和有效用户ID的当前值,而不能获得所保存的设置用户ID的当前值。

Figure 8.18. Ways to change the three user IDs

ID

exec

setuid(uid)

set-user-ID bit off

set-user-ID bit on

superuser

unprivileged user

real user ID

unchanged

unchanged

set to uid

unchanged

effective user ID

unchanged

set from user ID of program file

set to uid

set to uid

saved set-user ID

copied from effective user ID

copied from effective user ID

set to uid

unchanged

 

  • #include <unistd.h>
  • int setreuid(uid_t ruid, uid_t euid);
  • int setregid(uid_t rgid, uid_t egid);
  • int seteuid(uid_t uid);
  • int setegid(uid_t gid);

返回值:若成功返回0,若出错则返回-1

      setregid函数是交换实际用户ID和有效用户ID的值。seteuid和setegid它们只更改有效用户ID和有效组ID。

      一个非特权用户可将其有效用户ID设置为其实际用户ID或其保存的设置用户ID。对于一个特权用户,则可将有效用户ID设置为uid。

Figure 8.19. Summary of all the functions that set the various user IDs