分类: 系统运维
2012-03-28 13:13:40
每个进程都有相关的6个或更多的ID,如下表所示:
每个进程相关的用户ID和组ID | |
真实用户ID(real user ID) 真实组ID(real group ID) |
我们真实的身份 |
有效用户ID(effective user ID) 有效组ID(effective group ID) 补充组ID(supplementary group ID) |
用于文件权限核查 |
保存的 set-user-ID(saved set-user-ID) 保存的 set-group-ID(saved set-group-ID) |
由exec函数保存 |
通常,用效用户ID和真实用户ID相等,而有效组ID和真实组ID相等。
每个文件都有一个属主和一个所属组。属主由stat结构的st_uid成员指定,而所属组由st_gid成员指定。
当我们执行一个程序文件,进程的有效用户ID常常是真实用户ID,而有效组ID常是真实组ID。然而我们可以为文件模式(st_mode)设置一个特殊的 标志,表示“这个文件执行时,把进程的有效用户ID设置为文件的属主”。类似的,文件模式的另一位可以设置以便有效组ID成为文件的所属组 (st_gid)。在文件模式字的这两个位称为set-user-ID位和set-group-ID位。
举个例子,如果文件的属组是超级用户,而如果文件的set-user-ID被设置,则当程序文件当作一个进程运行时,它便有了超级用户的权限,而不管执行 这个文件的进程的真实用户ID。例如,允许任何人改变他或她的密码的UNIX系统程序passwd,就是一个set-user-ID程序。这是必需的,以 便程序可以把新的密码写入密码文件,通常是/etc/passwd或/etc/shadow,而这些文件只应该对超级用户可写。因为一个运行set- user-ID的进程通常得到额外的权限,所以它必须小心地写。我们会在第8章更深入地讨论这种类型的程序。
回到stat函数,set-user-ID位和set-group-ID位包含在文件的st_mode值里。我们可以用常量S_ISUID和S_ISGID来测试这两个位。