Linux登录失败处理策略
2024年10月25日...大约 3 分钟
一、密码设置
1. 基本密码修改
$ passwd [用户名] # 不带用户名则修改当前用户密码
2. 设置密码复杂度策略
编辑 /etc/security/pwquality.conf
:
bashCopyminlen = 8 # 最小长度
minclass = 3 # 至少包含小写字母、大写字母、数字、特殊字符中的3类
maxrepeat = 3 # 最多重复3次相同字符
dcredit = -1 # 至少1个数字
ucredit = -1 # 至少1个大写字母
lcredit = -1 # 至少1个小写字母
ocredit = -1 # 至少1个特殊字符
二、登录失败处理策略
1. 服务器终端配置
编辑 /etc/pam.d/system-auth
:
# 添加以下行在首行下
auth required pam_tally2.so onerr=fail deny=3 unlock_time=40 even_deny_root root_unlock_time=30
#不限制root用户 auth required pam_tally2.so deny=5 unlock_time=40 no_magic_root
参数说明:
deny=3
: 连续失败3次后锁定unlock_time=40
: 锁定40秒后自动解锁even_deny_root
: 是否限制root账户root_unlock_time=30
: root账户锁定时间
2. SSH远程登录配置
需要同时修改两个文件:
编辑 /etc/pam.d/sshd
:
# 添加以下行在首行下
auth required pam_tally2.so deny=3 unlock_time=20 even_deny_root root_unlock_time=30
编辑 /etc/pam.d/login
:
# 添加以下行在首行下
auth required pam_tally2.so deny=3 unlock_time=20 even_deny_root root_unlock_time=30
3. 账户锁定管理
1. 查看账户失败登录次数
$ pam_tally2 --user=用户名
2. 解锁账户
方法1: 重置登录失败计数
$ pam_tally2 --user=用户名 --reset
方法2: 解锁用户账户
$ passwd -u 用户名
3. 手动锁定账户
$ passwd -l 用户名
三、安全建议
- 建议移除 root 账户的登录限制(删除
even_deny_root
和root_unlock_time
参数) - 配置文件修改后立即生效,建议:
- 保持一个 root 会话在线
- 新开窗口测试配置
- 确认无误后再关闭原会话
- 定期检查登录失败日志:
# CentOS/RHEL
$ tail -f /var/log/secure
# Ubuntu/Debian
$ tail -f /var/log/auth.log
- 建议同时配置 SSH 密钥登录,提高安全性
这些配置需要 root 权限,修改时要特别小心,建议先在测试环境验证配置的正确性。
四、查看用户剩余解锁时间
#!/bin/bash
# 保存为 check_unlock_time.sh
USER=$1
LOCK_TIME=40 # 你设置的锁定时间
# 获取最后失败登录的时间戳和当前时间戳
LAST_FAILURE=$(pam_tally2 --user=$USER | tail -n1 | awk '{print $4, $5}')
LAST_TS=$(date -d "$LAST_FAILURE" +%s)
NOW_TS=$(date +%s)
# 计算经过的时间和剩余时间
ELAPSED=$((NOW_TS - LAST_TS))
REMAINING=$((LOCK_TIME - ELAPSED))
# 显示状态
echo "用户: $USER"
echo "最后失败时间: $LAST_FAILURE"
if [ $ELAPSED -lt $LOCK_TIME ]; then
echo "距离解锁还剩: $REMAINING 秒"
else
echo "锁定时间已过,可以重新尝试登录"
fi
使用方法:
# 添加执行权限
$ chmod +x check_unlock_time.sh
# 查看指定用户的解锁时间
$ ./check_unlock_time.sh anquanyuan
更简单的方法是直接在命令行计算:
# 获取最后失败时间并计算
$ LAST=$(pam_tally2 --user=anquanyuan | tail -n1 | awk '{print $4, $5}')
$ ELAPSED=$(($(date +%s) - $(date -d "$LAST" +%s)))
$ echo "过去了 $ELAPSED 秒,还剩 $((40 - ELAPSED)) 秒解锁"
赞助
Powered by Waline v3.5.0