linux系统如何验证密码
linux系统如何验证密码详细介绍
在 Linux 系统中,密码验证是通过可插拔认证模块(PAM)和加密存储机制协同实现的。以下是详细的技术解析和操作指南:
一、密码验证的核心机制
1.
密码存储与加密
- 存储位置:加密后的密码存储在
/etc/shadow文件中,只有 root 用户可访问。 - 加密算法:
- SHA-512(默认):高强度哈希算法,支持盐值(Salt)和迭代次数。
- Yescrypt(新发行版如 Ubuntu 22.04+):针对暴力破解优化的 Blowfish 变种。
- 格式示例:
$6$salt$hash,其中$6表示 SHA-512,salt是随机生成的盐值,hash是加密后的密码。
2.
PAM 认证流程
PAM 通过配置文件(/etc/pam.d/目录下的服务专属文件)定义验证逻辑,典型流程如下:
- 用户输入密码:通过
login、ssh等服务触发。 - PAM 模块调用:
- auth 阶段:验证身份,例如
pam_unix.so检查密码哈希值。 - account 阶段:检查账户状态(如是否过期)。
- password 阶段:更新密码策略(如复杂度要求)。
- session 阶段:初始化用户会话。
- auth 阶段:验证身份,例如
- 返回验证结果:服务根据 PAM 返回值决定是否允许访问。
二、关键组件与配置
1.
/etc/shadow 文件结构
每行格式为:
plaintext
用户名:加密密码:最后修改时间:最小有效期:最大有效期:警告期:宽限期:失效期:保留
- 加密密码字段:
$6$salt$hash(SHA-512)、$y$salt$hash(Yescrypt)。 - 特殊值:
*:账户锁定。!!:密码过期。
2.
PAM 配置示例
- 服务配置文件:如
/etc/pam.d/sshd(SSH 服务)。 - 模块参数:
pam_cracklib.so:密码复杂度检查,参数包括:minlen=12:最小长度 12 位。dcredit=-1:至少 1 个数字。ocredit=-1:至少 1 个特殊字符。
pam_unix.so:密码存储与验证,参数如sha512指定加密算法。
三、验证流程的技术细节
1.
密码哈希验证
- 用户输入密码:通过终端或网络传输(SSH 加密)。
- 哈希计算:
- 使用与
/etc/shadow中相同的算法和盐值对输入密码进行哈希。 - 示例:
openssl passwd -6 -salt "salt" "user_password"。
- 使用与
- 比对结果:将计算结果与
/etc/shadow中的哈希值比较。
2.
复杂度检查
- pam_cracklib 模块:
- 字典攻击防护:检查密码是否在系统字典中(如
/usr/share/cracklib/pw_dict)。 - 字符类型要求:混合大小写、数字、特殊字符。
- 配置示例:plaintext
password required pam_cracklib.so retry=3 minlen=12 dcredit=-1 ucredit=-1 ocredit=-1
- 字典攻击防护:检查密码是否在系统字典中(如
四、实战操作与验证
1.
验证密码哈希
- 查看用户密码哈希:bash
/etc/shadow username - 手动验证:bash
openssl
2.
配置强密码策略
- 编辑 PAM 配置:bash
/etc/pam.d/common-passwordpassword required pam_cracklib.so -1 -1 -1
password required pam_unix.so sha512
- 生效配置:bash
pam-auth-update
3.
SSH 密码验证配置
- 启用密码登录(默认已启用):bash
/etc/ssh/sshd_configPasswordAuthentication
- 禁用密码登录(推荐):bash
PasswordAuthentication noPubkeyAuthentication
五、安全增强建议
- 密码策略:
- 定期更换:设置密码有效期(
chage -M 90 username)。 - 历史记录:禁止重复使用旧密码(
pam_unix.so remember=5)。
- 定期更换:设置密码有效期(
- 账户锁定:
- 多次失败尝试:使用
pam_tally2.so模块锁定账户。 - 配置示例:plaintext
auth required pam_tally2.so deny=3 unlock_time=300
- 多次失败尝试:使用
- 审计与监控:
- 日志记录:查看
/var/log/auth.log。 - 工具:使用
lastb查看失败登录尝试。
- 日志记录:查看
六、常见问题与排查
- 密码验证失败:
- 检查 PAM 配置:确保
pam_unix.so正确引用/etc/shadow。 - 权限问题:确认
/etc/shadow权限为-rw-------。
- 检查 PAM 配置:确保
- 复杂度策略不生效:
- 检查 pam_cracklib 模块:确保安装了
libpam-cracklib包。 - 字典更新:运行
update-cracklib更新密码字典。
- 检查 pam_cracklib 模块:确保安装了
通过上述机制,Linux 系统实现了从密码存储、验证到策略控制的全流程安全管理。管理员可根据需求灵活调整 PAM 配置,平衡安全性与可用性。