【用户标识符】
在登录 Linux 时,输入的是账号,但 Linux 主机并不会直接识别账号名称,而是识别一个 ID 号,账号只是为了方便让用户容易记住而已
每个登录的用户至少会获得两个 ID,一个是用户 ID(UserID,简称 UID),一个是用户组 ID(Group ID,简称 GID),账号与 UID、GID 的对应关系,就分别保存在 /etc/passwd
和 /etc/group
中
【登录流程】
在 Linux 用户输入账号密码后,系统会进行如下处理:
- 寻找
/etc/passwd
中是否有输入的账号,若没有则跳出,若有则将该账号对应的 UID 读出,同时会读出/etc/group
中所对应的 GID,此外,该账号的主文件夹与 Shell 配置也一并读出 - 进入
/etc/shadow
中找到对应的账号与 UID,核对输入的密码是否相同 - 若上述步骤执行顺利,则进入 Shell 控管阶段
【用户账号】
/etc/passwd 文件结构
在 /etc/passwd
中,每一行都代表一个账号,字段之间用 :
分隔
各字段具体含义如下:
字段 | 含义 |
---|---|
账号名称 | 用户账号名 |
密码 | 早期的 UNIX 系统密码即位于该字段上,但由于安全性问题, 后将这个字段的密码数据改放到 /etc/shadow 中 |
UID | 通过字段范围来表示不同用户权限 0 为系统管理员,1~499 为系统账号,500~65535 为可登录账号 |
GID | 该字段与 /etc/group 有关 |
用户信息说明列 | 解释该账号的意义 |
主文件夹 | 用户主文件夹 |
Shell | 用户指定的 Shell |
需要说明的是,对于 UID 字段来说,除了 0 以外,其他的 UID 权限与特性并没有不同,默认 500 以下的数字让给系统作为保留账号只是一个习惯
但由于系统上启动的某些服务不希望使用 root 来执行,而希望使用较小的权限来执行,所以需要提供运行这些程序的所有者账号,这些系统账号通常是不可登录的,因此也才会有 /sbin/nologin
这个特殊的存在
根据系统账号的由来,通常系统账号分为两种:
- 1~99:由 distributions 自动创建的系统账号
- 100~499:若用户有系统账号需求时,可以使用的账号的 UID
/etc/shadow 文件结构
在 /etc/shadow
中,每一行同样都代表一个账号,字段之间也用 :
分隔
各字段具体含义如下:
字段 | 含义 |
---|---|
账号名称 | 用户账号名,与 /etc/passwd 对应 |
密码 | 用户账号对应的密码,目前常采用 MD5 进行加密 |
最近变动密码的日期 | 以 1970 年 1 月 1 日作为 1 来累加 |
密码不可被变更的天数 | 该账号密码在最近一次更改后,需要几天才可更改 若为 0 则表示随时可更改 |
密码需要重新更改的天数 | 指定最近一次更改密码后,在多少天需要更改密码 若未在这个天数内更改,账号密码会变为过期特性 即系统会强制要求重新设置密码才能登陆 若为 99999 则表示没有强制更改要求 |
密码更改期限前的警告天数 | 用户主文件夹 |
密码过期后的宽限时间 | 密码过期多少天后,该账号密码才会失效 |
账号失效日期 | 以 1970 年 1 月 1 日作为 1 来累加,到达设定日期后账号会失效 |
保留字段 | 保留以待日后有新功能加入时使用 |
对于最近变动密码的日期和账号失效日期来说,假设若想知道 2008-09-04 的累计日数,可通过如下代码进行计算:
1 | echo $( ($(date --date=="2008/09/04" + %s) / 86400 + 1 ) ) |
需要说明的是,如果一般用户的密码忘记了,可以联系系统管理员使用 root 用户来重设密码;如果 root 用户的密码忘记了,一般可通过重启系统进入用户维护模式,在系统给予 root 权限的 bash 接口中使用 passwd
命令修改密码即可
【用户组】
/etc/group 文件结构
/etc/group
记录了 GID 与组名的对应关系,每一行都代表一个用户组,字段之间用 :
分隔
各字段具体含义如下:
字段 | 含义 |
---|---|
用户组名称 | 用户组名 |
用户组密码 | 与 /etc/passwd 类似,目前密码已移至 /etc/gshadow 中 |
GID | 用户组的 ID/etc/passwd 中 GID 字段对应的用户组名 |
该用户组支持的账号名称 | 一个账号可加入多个用户组,若想将某个账号加入该用户组 将账号填入该字段即可,账号间使用 , 分隔 |
关于账号相关文件之间的 UID 和 GID 的对应,以及密码相关性,如下所示
/etc/gshadow 文件结构
/etc/gshadow
记录了用户组以及其对应的密码,每一行都代表一个用户组,字段之间用 :
分隔
各字段具体含义如下:
字段 | 含义 |
---|---|
用户组名称 | 用户组名 |
用户组密码 | 用户组的密码,若该字段值为 ! 说明该用户组无用户组管理员 |
GID | 与 /etc/group 内容相同 |
该用户组支持的账号名称 | 与 /etc/group 内容相同 |