随着人们对安全意识的逐渐提升,Linux 中的密码策略也变得越来越复杂,导致使用 passwd 改密时需要花费大量时间来应付密码策略。这里回顾一下这艰难的改密之路。
背景
先描述一下我当前的环境,由于是在测试环境中,有大量用于测试的 Linux 主机,而且是所有人共用一个环境。由于 Linux 中的安全策略,导致每隔一段时间都要修改一次密码,否则就无法登录。那么问题来了,如果我改了密码,也就意味着当别人再尝试登录这个节点的时候就必须要知道我设置的新密码是什么。大家一起共同维护一个密码本文档是一个不错的主意。但是由于是测试环境,在没有安全策略的要求下,如果不修改密码或者密码修改为原来的密码对大家是最方便的。
先介绍一种终极改密方法,这个方法要求你当前拥有 root 权限,最好是能在 root 账号下执行命令。
密码文件 /etc/shadow
Linux 中的账号密码都是存在 /etc/shadow
这个文件中,格式如下:
root:$6$O.Tl3mmBnJyGT9OX$B2c0FGTOLQwNMrLjK1T8fnrRRcklh7VUhXyy3YlvHqkjeIIwoRpNeMqL8niu6zxKsmI8euCbhjvCqq.BROeZr/:19682:0:99999:7:::
# root 用户名
# $6$0******$***** 密码加盐散列结果
# 19682 最后一次修改密码的日期
# 0 至少多少天修改一次密码
# 99999 最多多少天修改一次密码
其中 root 后面以 $ 开头的一段文本就是对应的账号密码,当然不是明文,而是通过 sha-1、sha-2 之类的散列算法处理之后的结果,当然无法被还原为原来的结果。但我们可以通过手动生成这段密码文本,然后替换到对应的位置,就能够不使用 passwd 就完成改密。
我们可以使用 openssl
命令生成这段散列密码:
# 生成一段密码散列,散列明文为 123456
> openssl passwd -6 123456
$6$ZsbAR/U7DbhfuPiI$O9z7VzKD6oFQKXm3S8X22tkF200MO9BlqfHF8e.IPaXgAndWPBpeVU.9mvcj2O94.KMVs7yeK5YYnEzB3rzQR1
# -salt 指定盐值,可以不指定
# -6 指定散列类型为 sha256/sha512
上面命令执行后生成的文本就是我们的密码散列了,我们可以将这段文本替换到 /etc/shadow
文件我们想要改密的账户下,就能够完成改密了。这样就能绕过 passwd 的安全策略了。
# 首先用 lsattr 查看 /etc/shadow 文件的权限
> lsattr /etc/shadow
----i---------e------- /etc/shadow
# 如果有 i 选项的话,可以使用 chattr 命令移除改该选型
> chattr -i /etc/shadow
# 在修改密码完成后,可以将属性添加回来
> chattr +i /etc/shadow
passwd 命令遇到的问题
Password has been used already. Choose another.
遇到的最痛苦的一个安全策略了,即密码已被使用,需要设置一个新的密码。如果想绕开这个策略,Linux 旧的密码文件保存在 /etc/security/opasswd 目录下,可以通过删除改文件移除历史用过的密码(root下)
/usr/bin/rm -f /etc/security/opasswd*
BAD PASSWORD: it is based on a dictionary word
这表示你的密码是基于 Linux 的安全策略字典,这个安全策略保存在了 /etc/pam.d/system-auth
文件中,可以通过调整文件中配置策略绕过该问题。
Authentication token manipulation error
root用户或者普通用户修改密码失败 ;报的错误 密码:身份验证令牌操作错误;一般是密码文件的权限的问题,或者是该用户锁定不能修改密码,或者是根目录空间满了。
首先查看磁盘空间是否满了df -hl
,如果满了,查找出占用较大的无用文件清空或删除;常用到命令:
du -lh --max-depth=1 :查看当前目录下各文件大小
du -sh:查看当前目录总的大小
du -sh * | sort -n:统计当前目录下文件大小,并按文件大小排序
du -sk file_name:查看指定的file文件大小
其次可以用lsattr
命令查看存放用户和密码的文件属性lsattr /etc/passwd
、lsattr /etc/shadow
,(i:不得任意更动文件或目录),如果有i选项,则会导致所有的用户都不能修改密码,因为没有权限允许;
可以用chattr命令将i权限撤销 chattr -i /etc/passwd
、chattr -i /etc/shadow
,然后再修改用户密码。
chattr +i /etc/passwd
# 添加 i 选项不得任意修改文件或目录
lsattr /etc/passwd
----i---------e------- /etc/passwd
# 通过 chattr -i 移除 i 属性
chattr -i /etc/passwd
faillock 账户锁定问题解决
examplesystem login: baeldung
The account is locked due to 3 failed logins.
(10 minutes left to unlock)
Password:
在 Linux 下当账户密码输入错误次数过多时,会被认为遇到了暴力破解攻击,在公网环境下当然需要认真对待,通过安装安全组件并部署安全策略来提高安全性。但是在测试环境下安全策略只会影响开发者们的拔刀速度,因此如果有足够的权限的话测试环境下还是禁掉这个安全策略吧。
# 直接使用 faillock 命令可以查看当前被禁用的账号以及登录的 ip
> faillock
ghimi:
When Type Source Valid
2022-06-21 18:32:16 RHOST 192.168.0.22 V
2022-06-21 18:32:29 RHOST 192.168.0.22 V
2022-06-21 18:32:41 RHOST 192.168.0.22 V
user:
When Type Source Valid
2022-06-21 19:12:23 TTY pts/0 V> faillock --user baeldung --reset
# 使用 faillock --reset 命令接触禁用
其他相关的文件
文件路径 | 说明 |
---|---|
/etc/passwd | 保存了一些账户的权限信息,包括权限策略 |
/etc/login.defs | 定义了一些密码过期策略 |
chage -l
查看账户密码过期策略:
root:~# chage -l root
Last password change (最后一次密码修改时间) : Mar 03, 2024
Password expires (密码过期时间) : never
Password inactive (密码失效时间) : never
Account expires (账户过期时间) : never
Minimum number of days between password change (最少修改密码天数) : 0
Maximum number of days between password change (最多修改密码天数): 99999
Number of days of warning before password expires (密码过期多少天前发出告警): 7
passwd -d cina
清除账户密码
passwd -d cina
# 通过 -d 选项可以清除一个账户的密码,后续登录账户时就不需要密码了
参考资料
- Manually generate password for /etc/shadow
- chage Command Examples in Linux
- Linux 修改用户密码
- 如何设置Linux密码复杂度策略?
- How to clear password history in Linux
- How to set password complexity on Linux
- man-faillock