一、用户与组
在讨论进程凭证之前,我们先来搞清楚用户与组的概念。每个用户都拥有一个唯一的用户名和一个与之相关的数值型用户标识符(UID),一个用户可以隶属于一个或者多个组。每个组也都有唯一的名称和一个组标识符(GID)。用户与组的主要用途包括以下两个方面:确定各种系统资源的所有权 和 对赋予进程访问上述资源的权限加以控制。
1. 密码文件:/etc/passwd
针对系统中每个用户账号,系统密码文件/etc/passwd会专列一行进行描述,每行有7个字段,分别代表以下所述:
- 登录名:被视为人类可读的标识符,与数字用户标识符对应。
- 经过加密的密码:长度13字符,超过长度不允许登录,如果系统启用shadow密码,系统不会在/etc/passwd文件中解析该字段,以"x"字符占位,经过加密处理的密码实际上存储到shadow密码文件中。如果/etc/passwd文件中密码字段为空,该账户就无需密码登录,即便是启用了shadow密码
- 用户ID(UID):用户数值型ID,允许同一用户ID对应多个不同的用户名,这样多个用户便可以以不同的密码访问相同的资源。
- 组ID(GID):
- 注释:描述性文字
- 主目录:用户登录后所处的初始路径
- 登录shell:一般是/bin/bash
2. shadowm密码文件:/etc/shadow
在unix中,之前/etc/passwd中维护所有的用户信息,包括加密处理的密码,因为许多非特权级别系统工具需要读取密码文件中其他的信息,密码文件不得不对所有的用户开放读取权限,这就为密码破解工具提供了可乘之机,他们可以利用同样的工具将可能的密码经过加密得出的加密密码与/etc/passwd中对应的加密密码比对,从而有可能获取密码。为了防止类似攻击,/etc/shadow出现了。
其理念是:用户的所有非敏感信息存放于“人人可读”的密码文件中,而经过加密处理的密码则有shadow密码文件单独维护,仅供具有特权的程序读取。
/etc/shadow 文件内容
登录名:经过加密的密码:其他字段
3. 组文件:/etc/group
系统中的每个组在组文件/etc/group中都对应着一条记录,每条记录包含4个字段。
组名:加密密码:组ID:用户列表
4. 获取用户与组的信息
- 从密码文件/etc/passwd中获取记录
上述函数分别以登录名和UID为参数,返回密码文件中对应的记录信息:
仅当未启用shadow密码的情况下,pw_passwd字段才会包含有效信息。确定shadow密码是否启用,可以在调用getpwnam(name)之后,紧接着调用getspnam(name),看看是否会返回一条shadow密码记录。
注意: getpwnam和getpwuid返回的指针指向由静态分配而成的内存,故二者不可重入。因为getpw函数在程序中自定义一块静态存储区,每调用一次getpw函数,这个静态存储区就会被重写一次,比如以下代码示例:
int main(int argc,char *argv[]) {
struct passwd *mistr;
struct passwd *rootstr;
if(NULL == (mistr=getpwnam("michael"))<