进程管理2
1、用户和组:
进程是和用户和组关联的,用户id和组id分别是C语言的uid_t和gid_t类型表示.数字表示和可读字符串之间的映射关系
是通过用户空间的/etc/passwd和/etc/group两个文件完成的,内核只处理数字表示形式.
在Unix系统中,一个进程的用户ID和组ID代表这个进程可以执行哪些文件操作以及向其他进程发送信号的能力.进程以
合适的用户和组运行,最好的方式是遵循“最小权限”的原则.这个要求是变化的:如果进程在前期需要以root用户的权限
运行,那么后面不需要root权限了,那么就应该在后面尽可能采用权限更小的用户权限运行.
1)一个进程的 real user ID 是指运行此进程的用户角色的 ID.
2)一个进程的 effective user ID 是指此进程目前实际有效的用户 ID(也就是权限的大小),effective user ID 主要用来
校验权限时使用,比如打开文件、创建文件、修改文件、向别的进程发信号,等等.
如果一个进程是以 root 身份来运行的,那么上面这两个 ID 可以用 setuid/seteuid 随便修改,但是如果一个进程是以普通
用户身份来运行的,那么上面这两个 ID 一般来说是相同的,并且也不能随便修改.只有一种情况例外:
此进程的可执行文件的权限标记中,设置了“设置用户 ID”位!
3)设置用户id是文件权限的一个标记,可以通过
chmod s /path/to/file
来设置用户id位.一旦用了这个命令之后,再执行这个文件,那么生成的进程的 effective user ID 就变成了这个可执行文件
的 owner user ID(属主用户 ID).
4)保存的设置用户id,是程序在执行exec一个setuid程序(设置了设置用户id标记位的文件)之前的有效用户id,这样可以保存
通过保存的设置用户id来恢复之前的有效用户的id
当一个用户登录的时候,login程序会把真实的用户ID和有效的用户ID设置成/etc/passwd文件中指定的UID,当一个进程fork的
时候,子进程会从父进程那继承它.真实UID和真实GID标识进程的真实所有者,会影响到发送信号的权限.
2、改变实际用户(组)ID 和保存设置的用户(组)ID
Cpp代码
- #include <sys/types.h>
- #include <unistd.h>
-
- int setuid(uid_t uid);
- int setgid(gid_t gid);
#include <sys/types.h>
#include <unistd.h>
int setuid(uid_t uid);
int setgid(gid_t gid);
setuid是用来设置当前进程的有效id.如果当前用户的有效id是root,那么实际用户id和保存设置的用户id也会被同时设置为uid,
root用户可以为uid提供任何值,从而将所有三种用户id都设置成uid了.非root用户只允许将实际用户id和保存设置的用户id最为
uid的实际参数传递,也就是有效用户id只能是这两种的一个值.
成功返回0,错误返回-1,并设置errno:
EAGAIN: uid的值和实际用户id的值不同,把uid设置为real user id会让用户超过他的NRPOC限制(它指定了一个用户可以拥有的
进程数).
EPERM:用户不是root,uid既不是有效也不是保存用户ID.
上面的讨论也适合setgid.
3、改变有效用户或者组id:
Linux提供了两个POSIX所定义的函数来改变当前进程的有效用户id和组id的值:
Cpp代码
- #include <sys/types.h>
- #include <unistd.h>
-
- int seteuid(uid_t euid);
- int setegid(gid_t egid);
|