Linux的用户和组
每个用户都有一个唯一的用户名和一个与之相对应的数值型用户标识符UID。用户可以隶属于一个或者多个组。而每个组也拥有一个唯一的名称和一个数值型组标识符GID。
为什么要费劲周折去设立用户和组呢?
用途一:确定系统资源的所有权;用途二:对赋予进程访问上述资源的权限加以控制。
那么系统是怎么为用户设置组并且保存组的信息的呢?涉及到三个文件。
(1)密码文件:/etc/passwd
记录格式:用冒号分割
登录名:经过加密的个人密码:用户ID:组ID:注释:主目录:登录shell
(2)shadow密码文件:/etc/shadow
为了安全考虑,将一些敏感信息放在shadow文件进行单独保存,只有特权进程才能访问,其余非敏感信息(人人可读)放在密码文件中。
(3)组文件:/etc/group
记录格式:用冒号分割
组名:经过加密处理的组密码:组ID:用户列表
对用户所属各组信息的定义有两部分组成:密码文件中相应用户记录的组ID(用户最初的属组);组文件列出的用户所属各组(并发多属组)。
密码加密和用户认证
UNIX系统采用单向加密算法对密码进行加密,单向意味着无法还原。加密算法被封装于crypt()函数之中。所以说,UNIX系统的用户认证就是通过对明文加密,然后比对加密后的密文。
crypt函数第一个参数是明文字符串;第二个参数是来自密文的前两个字符的字符串[a-zA-Z0-9/. 一共64种字符],用来扰动DES加密算法。返回值为密文。第二个参数经常传的是密文字符串,因为只有前两个有效,所以不用将前两个取出来再传。
进程凭证
1、实际用户ID和实际组ID
登录shell从密码文件读取第三字段(用户ID)和第四字段(组ID)来确定进程的实际用户ID和实际组ID。当创建新进程 的时候,会从父进程继承这些内容。
2、有效用户ID和有效组ID
当进程想要进行各种操作的时候,将结合有效用户ID、有效组ID连通辅助组ID一起来确定授予进程的权限。有效组ID不是从组文件来的。有效ID只是让我们获取了一些特权。通常有效ID和实际ID是相等的,但是我们可以改变有效ID来获取一些权限。
(1)set-User-ID和Set-Group-ID
第一种方法去设置有效用户ID和有效组ID。set-user-ID程序会将进程的有效用户ID设置为可执行文件的用户ID。set-group-ID程序会将进程的有效组ID设置为可执行文件的有效组ID。与其他文件一样,可执行文件的用户ID和组ID决定了该文件的所有权。
(2)调用一些系统调用