Linux是一个多用户操作系统, 在用户管理和权限的设计上很优雅, 本文就将探究一下Linux如何管理用户和用户组的, 下文将介绍与用户和用户组关联的权限问题.
用户和用户组
每个用户都拥有独一无二的名称, 并且有一个数字与之关联, 叫做UID. 每个用户可以属于一个或者多个用户组, 每个用户组同样也有一个独一无二的名称, 与之关联的数字叫做GID. 操作系统使用用户和用户组的目的在于决定系统资源的归属问题和授权的权限.
想要了解操作系统是如何存储用户, 用户密码等信息, 可以查看 /etc/passwd 文件, 其中的每一行都包含了一个用户账户信息, 它由冒号分割为七个字段, 例如我自己的电脑上其中一行的信息如下代码块, 其含义如下解释:
cat /etc/passwdroot:*:0:0:System Administrator:/var/root:/bin/shwhoamiyangls -ldrwx------+ 86 yang staff 2752 1 19 19:27 Downloads
登录名称: 这是用户在进入系统登录时必须输入的名称, 通常该名称也叫做用户名称, 在终端中输入whoami命令行, 可以查看当前的用户名称. 我们也可以把用户名称看成是UID的人类可阅读的标识符, 当我们使用ls命令时, 就可以显示该名称, 其底层的权限会和UID关联上.
加密后密码: 此字段包含一个 13 位的加密密码, 如果启用了影子密码(这是常见的设置),则此字段将被忽略。在这种情况下,/etc/passwd 中的密码字段通常包含字母 *. 这种情况下, 加密后的密码会存储在另外一个文件, 当用户登录时输入用户密码之后, 会使用加密算法计算后的摘要和该文件存储的字符串做对比, 对比一致之后才会登录成功.
UID: 这是该用户的数字标识号。如果此字段的值为 0,则此账户拥有超级用户权限。通常会有一个这样的账户,其登录名是“root”, 其余用户的UID均是大于0的正整数.
GID: 前面我们提到过一个用户可以属于多个用户组, 这里的数字表示的是它加入的第一个用户组的ID, 此用户所属的其他用户组的信息在系统用户组文件中定义的.
备注: 该字段为描述该用户的描述信息.
主目录: 这是用户登录后首先被进入的目录, 此字段将成为“HOME”环境变量的值, 同时该字段也为进入到终端之后的当前目录. 如下图所示:
登录Shell: 一旦用户登录成功,控制权就会转移到此程序上。通常,这会是某个外壳程序,比如 bash,但也可以是任何程序。如果此字段为空,则登录外壳将默认为 /bin/sh,即基本 shell。此字段将成为 SHELL 环境变量的值。如上述的展示的文件中的一行, 表示root用户的shell为 /bin/sh.
/etc/shadow 文件
加密后的密码信息, 存放在该文件中. 由于各种非特权系统工具需要对密码文件中的其他信息具有读取权限,因此该文件必须对所有用户开放读取权限。这为密码破解程序提供了可乘之机,这些程序会尝试对大量可能的密码(例如标准字典单词或人们的名字)进行加密,以查看是否与用户的加密密码相匹配。为防止此类攻击,设计了影子密码文件(/etc/shadow),该文件是一种防止此类攻击的方法。其原理是,所有非敏感的用户信息都存放在可公开读取的密码文件中,而加密密码则保存在影子密码文件中,只有特权程序才能读取该文件。
/etc/group 文件
在Linux系统中, 为了控制对文件和其他系统资源的访问,将用户划分成不同的组是很有用的。用户所属的组集合是由用户在组文件中列出的所属组决定的, 系统中的每个组都会在 /etc/group 文件中有一条对应的记录。每个该行由四个以冒号分隔的字段组成,例如以下示例所示, 其含义如下解释:
cat /etc/groupstaff:*:20:root
组名称: 它是该组的名称, 与密码文件中的登录名一样,我们可以将此视为与数字组标识符相对应的可读(符号)标识符。
加密后的密码: 此字段包含该组的可选密码, 随着多组成员资格的出现,如今在 UNIX 系统中很少使用组密码了。不过,仍可以为一个组设置密码(root用户可以使用 passwd 命令来完成此操作)。
GID: 这是该组的数字标识。通常会有一个组的组标识为 0,名为“root”(类似于 /etc/passwd 文件中用户标识为 0 的记录)。
用户列表: 这是一个以逗号分隔的用户列表,其中包含了属于此组的用户名称。(此列表包含的是用户名,而非用户ID,因为正如前面所提到的,在密码文件中用户ID并不一定是唯一的。)
修改密码
在Linux操作系统中, 可以使用passwd命令行来修改用户的密码, 修改完之后, 对应的/etc/shadow文件中对应的密码信息就会变更.