Alex_McAvoy

想要成为渔夫的猎手

Linux 的账号与用户组

【用户标识符】

在登录 Linux 时,输入的是账号,但 Linux 主机并不会直接识别账号名称,而是识别一个 ID 号,账号只是为了方便让用户容易记住而已

每个登录的用户至少会获得两个 ID,一个是用户 ID(UserID,简称 UID),一个是用户组 ID(Group ID,简称 GID),账号与 UID、GID 的对应关系,就分别保存在 /etc/passwd/etc/group

【登录流程】

在 Linux 用户输入账号密码后,系统会进行如下处理:

  1. 寻找 /etc/passwd 中是否有输入的账号,若没有则跳出,若有则将该账号对应的 UID 读出,同时会读出 /etc/group 中所对应的 GID,此外,该账号的主文件夹与 Shell 配置也一并读出
  2. 进入 /etc/shadow 中找到对应的账号与 UID,核对输入的密码是否相同
  3. 若上述步骤执行顺利,则进入 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 内容相同
感谢您对我的支持,让我继续努力分享有用的技术与知识点!