07 — 密码策略与安全加固
7.1 密码策略概述
FreeIPA 的密码策略是全局策略 + 用户组策略的组合:
全局默认策略 (global_policy)
│
└── 可被组策略覆盖
│
├── 开发组策略 → 相对宽松(开发环境)
├── 运维组策略 → 更严格(生产环境)
└── 管理员组策略 → 最严格
7.2 查看当前密码策略
# 查看全局密码策略
ipa pwpolicy-show
# 查看某个用户组的密码策略
ipa pwpolicy-show --group=operations
# 查看某个用户当前生效的密码策略
ipa pwpolicy-find --user=zhangsan7.3 修改全局密码策略
# 设置全局默认密码策略
ipa pwpolicy-mod global_policy \
--minlength=12 \ # 最小长度 12
--minclasses=4 \ # 至少包含 4 类字符(大写、小写、数字、特殊字符)
--maxfail=5 \ # 连续失败 5 次锁定
--failinterval=900 \ # 失败计数窗口(15 分钟)
--lockouttime=600 \ # 锁定时间(10 分钟)
--minlife=1 \ # 最短使用时间(1 小时)
--maxlife=90 \ # 最长使用时间(90 天)
--history=10 \ # 记住 10 个历史密码
--maxrepeat=3 \ # 最多连续重复 3 个字符
--maxsequence=4 # 最多连续递增/递减 4 个字符参数说明
| 参数 | 说明 | 推荐值 |
|---|---|---|
--minlength | 密码最小长度 | 12 |
--minclasses | 最少字符类别数(大写/小写/数字/特殊) | 3-4 |
--maxfail | 连续失败次数上限 | 5 |
--failinterval | 失败计数重置窗口(秒) | 900(15分钟) |
--lockouttime | 账户锁定时间(秒) | 600(10分钟) |
--minlife | 密码最短使用时间(小时),防频繁修改 | 1 |
--maxlife | 密码最长使用时间(天) | 90 |
--history | 历史密码记忆数量 | 10 |
--maxrepeat | 同一字符最大连续重复次数 | 2 |
--maxsequence | 最大连续递增/递减序列长度(如 abcd) | 3 |
7.4 创建用户组级密码策略
管理员组策略(最严格)
# 创建管理员组
ipa group-add admins --desc="系统管理员"
# 设置管理员密码策略
ipa pwpolicy-add admins \
--minlength=16 \
--minclasses=4 \
--maxfail=3 \
--failinterval=600 \
--lockouttime=1800 \
--minlife=0 \
--maxlife=60 \
--history=24 \
--priority=10普通用户组策略
# 普通员工策略(适中)
ipa pwpolicy-add developers \
--minlength=10 \
--minclasses=3 \
--maxfail=8 \
--failinterval=900 \
--lockouttime=300 \
--minlife=1 \
--maxlife=90 \
--history=5 \
--priority=50
--priority越小优先级越高。用户属于多个组时,取优先级最高的策略。
7.5 强制用户修改密码
# 方式一:设置密码过期时间
ipa user-mod zhangsan --setattr=krbPasswordExpiration="20260809235959Z"
# 方式二:通过密码策略过期自动触发(推荐)
# 设置 maxlife=90,用户 90 天后自动被要求修改密码
# 查看用户密码过期时间
ipa user-show zhangsan --all | grep krbPasswordExpiration
# 强制用户在首次登录时修改密码(入职场景)
# 创建用户后立即设置密码已过期
ipa user-mod zhangsan --password
# 交互式输入临时密码,勾选"首次登录修改密码"7.6 安全加固清单
7.6.1 管理员账户安全
# 1. admin 仅用于系统管理,不用于日常登录
# 2. 为日常管理创建受限管理员角色(参见第 06 章 RBAC)
# 3. admin 密码使用高强度密码(16位+)
ipa user-mod admin --password
# 4. 记录 admin 使用审计日志7.6.2 会话安全
# 限制 Kerberos 票据生命周期
# 编辑 /etc/krb5.conf(在 FreeIPA 服务器上)
# [libdefaults]
# ticket_lifetime = 10h ← 默认 24h,改为 10h
# renew_lifetime = 7d ← 可续期 7 天
docker exec freeipa-server bash -c "cat /etc/krb5.conf"7.6.3 禁用不安全的认证方式
# 在客户端 /etc/ssh/sshd_config 中:
# PermitRootLogin no ← 禁止 root SSH 登录
# PasswordAuthentication yes ← 保留密码认证(Kerberos 需要)
# PubkeyAuthentication yes ← 允许密钥认证
# ChallengeResponseAuthentication no ← 禁用挑战响应
sudo systemctl restart sshd7.6.4 审计日志收集
# 客户端 SSSD 日志
sudo journalctl -u sssd -f
# SSH 登录日志
sudo tail -f /var/log/auth.log
# FreeIPA 服务器审计日志
docker logs freeipa-server 2>&1 | grep -E "krb5kdc|ns-slapd|error"
# 查看 FreeIPA 目录服务访问日志
docker exec freeipa-server tail -f /var/log/dirsrv/slapd-THINKMETA-SITE/access7.7 账户锁定处理
用户被锁定后
# 查看用户状态
ipa user-status zhangsan
# 解锁用户
ipa user-unlock zhangsan
# 批量查看被锁定的用户
ipa user-find --all | grep -B 5 "krbLoginFailedCount: [1-9]"防止暴力破解
# Fail2Ban 集成(在 FreeIPA 宿主机上)
sudo apt install -y fail2ban
# 创建 FreeIPA 专用的 jail 配置文件
sudo tee /etc/fail2ban/jail.d/freeipa.conf << 'EOF'
[freeipa-webui]
enabled = true
port = https,http
filter = freeipa-webui
logpath = /var/log/httpd/error_log
maxretry = 5
bantime = 3600
EOF7.8 生产环境安全配置模板
以下是推荐的生产环境安全配置:
#!/bin/bash
# security-hardening.sh — 安全加固一键脚本
echo "=== FreeIPA 安全加固 ==="
# 1. 全局密码策略
echo "--- 设置全局密码策略 ---"
ipa pwpolicy-mod global_policy \
--minlength=14 \
--minclasses=4 \
--maxfail=5 \
--failinterval=900 \
--lockouttime=1800 \
--minlife=1 \
--maxlife=90 \
--history=12 \
--maxrepeat=2 \
--maxsequence=3
# 2. 管理员密码策略
echo "--- 设置管理员密码策略 ---"
ipa pwpolicy-add admins \
--minlength=18 \
--minclasses=4 \
--maxfail=3 \
--lockouttime=3600 \
--maxlife=60 \
--history=24 \
--priority=5
# 3. 服务账号密码策略(永不过期但超长密码)
echo "--- 设置服务账号策略 ---"
ipa group-add service-accounts --desc="服务账号"
ipa pwpolicy-add service-accounts \
--minlength=24 \
--minclasses=4 \
--maxfail=3 \
--lockouttime=3600 \
--maxlife=0 \ # 0 = 永不过期
--priority=10
# 4. 创建审计日志转发(可选)
# 规划将所有 FreeIPA 日志集中收集到日志服务器
echo "=== 安全加固完成 ==="7.9 重要安全提醒
| ⚠️ 安全事项 | 说明 |
|---|---|
| admin 密码 | 离线保存,避免明文记录在脚本中 |
| 定期审计 | 每月检查一次用户列表,清理僵尸账号 |
| Kerberos 票据 | 票据过期后需要重新 kinit,这是安全特性不是 bug |
| 备份 | 定期备份 /data/docker-space/ipa-data/(参见第 09 章) |
| Web UI 证书 | 自签名证书会被浏览器警告,生产环境建议替换为正式证书 |
| 防火墙 | 仅允许内网 IP 段访问 FreeIPA 端口 |