07 — 密码策略与安全加固

7.1 密码策略概述

FreeIPA 的密码策略是全局策略 + 用户组策略的组合:

全局默认策略 (global_policy)
    │
    └── 可被组策略覆盖
           │
           ├── 开发组策略 → 相对宽松(开发环境)
           ├── 运维组策略 → 更严格(生产环境)
           └── 管理员组策略 → 最严格

7.2 查看当前密码策略

# 查看全局密码策略
ipa pwpolicy-show
 
# 查看某个用户组的密码策略
ipa pwpolicy-show --group=operations
 
# 查看某个用户当前生效的密码策略
ipa pwpolicy-find --user=zhangsan

7.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 sshd

7.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/access

7.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
EOF

7.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 端口