/etc/{passwd,shadow,group,sudoers}文件

-- TOC --

这4个Linux系统文件,包含了每个用户的登录目录,登录命令,密码,以及所属组的关系,sudo权限信息。

/etc/passwd

passwd文件中没有password,只有x。这是因为此文件任何用户都可读,有一定安全隐患,因此密码就不保存在这个文件了。

$ cat /etc/passwd | grep xinlin
xinlin:x:1000:1000:xinlin,,,:/home/xinlin:/bin/bash

用户名:x:uid:gid:comments:宿主目录:登录命令

常见的一个trick,在这个文件中修改登录命令,比如不使用bash,而是sh,或者恶作剧一点,使用python3等任意程序。有一些伪用户(psuedousers),它们的登录命令为空,或这为/sbin/nologin,不允许登录。

/etc/shadow

影子文件,用户的密码信息存放在这个文件中,当然,密码不会明文存放,而是hash后的值。同/etc/passwd文件一样,/etc/shadow也同样使用冒号:来作为分隔符。

$ sudo cat /etc/shadow | grep xinlin
xinlin:$6$W/Ikecc1H30O1AYc$zZytKVqcx6lXYEzSukPF6OlLB2en87wTc4TLlB5cKhoDeHVVuixohCnZi0AlbyZFDS8RFgtDET62f/mYaQnYD1:18942:0:99999:7:::

用户名:加密密码:最后一次修改时间:最小修改时间间隔:密码有效期:密码需要变更前的警告天数:密码过期后的宽限时间:账号失效时间:保留字段

除了前2个字段,后面的字段貌似一般用不到,如果要修改密码,请参考passwd命令

加密密码是一种hash值,而且还包含一些非hash的字段,具体请参考这里:https://man7.org/linux/man-pages/man3/crypt.3.html。当密码为!!*都是不允许登录,root账户没有密码不能使用,没有密码时,shadow文件内保存!

注意,这串密码产生的乱码不能手工修改,如果手工修改,系统将无法识别密码,导致密码失效。很多软件透过这个功能,在密码串前加上 "!"、"*" 或 "x" 使密码暂时失效。

关于密码时间,全都是一个数字,这个数字是自1970年1月1日起的天数。

计算密码最后修改时间的具体日子:

$ date -d '1970-01-01 16907 days'
2016年 04月 16日 星期六 00:00:00 CST

最小修改间隔时间,也就是说,该字段规定了从第 3 字段(最后一次修改密码的日期)起,多长时间之内不能修改密码。如果是 0,则密码可以随时修改;如果是 10,则代表密码修改后 10 天之内不能再次修改密码。此字段是为了针对某些人频繁更改账户密码而设计的。

密码有效期,为了强制要求用户变更密码,这个字段可以指定距离第 3 字段(最后一次更改密码)多长时间内需要再次变更密码,否则该账户密码进行过期阶段。 该字段的默认值为 99999,也就是 273 年,可认为是永久生效。如果改为 90,则表示密码被修改 90 天之后必须再次修改,否则该用户即将过期。管理服务器时,通过这个字段强制用户定期修改密码。

忘记密码怎么办?

对于普通账户的密码遗失,可以通过 root 账户解决,它会重新给你配置好指定账户的密码,而不需知道你原有的密码(利用 root 的身份使用 passwd 命令即可)。

如果 root 账号的密码遗失,则需要重新启动进入Linux系统救援模式,系统会提供 root 权限的 bash 接口,此时可以用 passwd 命令修改账户密码。也可以通过挂载根目录(比如用U盘启动Ubuntu Try),修改 /etc/shadow,将账户的 root 密码清空的方法,此方式可使用 root 无法密码即可登陆,建议登陆后使用 passwd 命令配置 root 密码。

/etc/group

这个文件里面存放组id和组成员信息。

$ sudo cat /etc/group | grep xinlin
adm:x:4:syslog,xinlin
cdrom:x:24:xinlin
sudo:x:27:xinlin
dip:x:30:xinlin
plugdev:x:46:xinlin
lpadmin:x:120:xinlin
lxd:x:132:xinlin
xinlin:x:1000:
sambashare:x:133:xinlin

/etc/sudoers

一般使用Linux系统,都不会一直使用root账户,以防止不小心敲错了命令,带来不可挽回的损失。给某些用户增加sudo权限,是个比较好的方法:

# in /etc/sudoers
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
xinlin  ALL=(ALL)  NOPASSWD:ALL

以上配置如果没有NOPASSWD:,在sudo的时候,就需要密码。

本文链接:https://cs.pynote.net/sf/linux/sys/202111112/

-- EOF --

-- MORE --