2.1 用户名和密码
和用户账号相关的两个重要文件
当我们登录 Linux 系统时,需要输入用户名和密码。虽然我们输入的是用户名,但其实 Linux 主机并不直接认识我们的用户名,它只认识 ID,用户名只是为了让人们更容易记住而已。
UID,User ID,用户 ID GID,Group ID,用户组 ID
今天,我们就来了解下 Linux 是如何辨认每个用户的。
1. 流程
当我们通过 ssh
命令输入用户名和密码的时候,Linux 系统会做以下工作:
先查找
/etc/passwd
里是否有输入的用户名如果没有,则退出
如果有,那就将该用户名对应的 UID 和 GID(在
/etc/group
中)取出来,同时也会取出该用户的 home 目录和 shell 设置
核对密码表
/etc/shadow
Linux 会根据用户名,从
/etc/shadow
里找出对应的密码进行校验如果校验成功,则会进入 shell 管理的阶段
上面提到了两个和用户账号相关的重要文件:
/etc/passwd
:管理着用户名、UID 和 GID/etc/shadow
:专门管理着密码
2. /etc/passwd
/etc/passwd
2.1 文件内容
比如,在阿里云上,运行命令 cat /etc/passwd
,会显示如下内容:
2.2 文件格式
文件 /etc/passwd
里的每一行就代表一个账号,有几行就代表系统中有几个账号。
每行以冒号:
为分隔符,分为 7 列,如下:
1
账号名称
2
密码
值都为 x
3
UID
0 是系统管理员 1~999 是系统账号,通常是不可登录的 1000+ 是可登录的账号,给一般用户用的
4
GID
和 /etc/group
有关,用来规范组名的
5
用户信息说明
一般没啥用 但是如果提供了 figure 功能,这个字段可以提供很多信息
6
home 目录
当用户登录成功之后,就会自动进入到 home 目录里
7
shell
当用户登录系统之后,就会获取一个 shell 来和
系统的内核进行沟通,以完成用户的操作任务。
eg.
- /bin/sync
- /sbin/shutdown
- /sbin/halt
- /bin/false
- /sbin/nologin
为不可登录的系统账号准备的
- /bin/bash
可正常登录的用户
如果将一般用户的 UID 改成 0,那他也就具有 root 的权限了。不过,非常不建议这么做。
2.3 文件权限
很多程序的运行都和权限有关,而权限又和 UID 和 GID 相关,所以各个程序都要读取 /etc/passwd
来了解不同账号的权限,所以它的权限需要设置成 -rw -r--r--
。
早期的 Unix 系统,密码是存在 /etc/passwd
文件里的,虽然也有加密,但因为这个文件的特性是所有的程序都能读取,这就导致密码容易被窃取进而被暴力破解出来,所以后来就将密码移到了 /etc/shadow
文件里,该文件的权限是 -rw-------
或者 ----------
,即只有 root 才能读写。
3. /etc/shadow
/etc/shadow
3.1 文件内容
比如,在阿里云上,运行命令 cat /etc/shadow
,会显示如下内容:
3.2 文件格式
每行以冒号:
为分隔符,分为 9 列,如下:
1
账号名称
2
密码
是经过编码的密码(摘要)
3
最近修改密码的日期
整数,是以1970年1月1日作为1而累加的
4
密码不可被修改的天数
相对于第3个字段 若是0则表示密码可以随时修改
5
密码需要重新修改的天数
相对于第3个字段 如果是99999(即273年)则表示不强制
6
密码需要修改期限前的警告天数
相对于第5个字段
7
密码过期后的账号宽限时间
相对于第5个字段 虽然密码过期但是该账号还是能执行其它任务的 不过如果密码过期了,当我们登录系统时, 系统会强制要求必须要重新设置密码之后 才能继续使用,这就是密码过期特性 如果在密码过去的n天后,用户还是没有登录 更改密码,那么这个账号的密码就会失效
8
账号失效日期
账号在此日期之后,将无法再使用
9
保留字段
要想知道 shadow 使用的加密机制,可以使用 authconfig
命令查询。如下:
3.3 密码忘了,怎么办?
如果是一般用户,可以让系统管理员帮忙。他可以直接重置我们的密码而不需要知道旧密码,即以 root 的身份使用 passwd
命令。
如果是 root 用户,那可以使用各种可行的方法进入 Linux 后再去修改。比如重新启动系统之后进入单人维护模式,系统会主动给予 root 权限的 bash 接口,此时再以 passwd
命令修改密码即可。或者以 Live CD 启动后挂载根目录去修改 /etc/shadow
,将里面 root 的密码字段清空,再重新启动之后,root 不用密码即可登录,登录后再用 passwd
命令设置 root 的密码即可。
Last updated