FreeIPA 4.13 配置参数详解
FreeIPA 三层参数体系(安装期选项/全局 config-mod/策略层 pwpolicy-hbacrule-sudorule)逐类详解,含 minlength、history、HBAC 放行拒绝的实测生效验证与生产配置模板。
FreeIPA 4.13 配置参数详解
目标:梳理 FreeIPA 的三层参数体系(安装期选项、运行期全局配置、策略层规则),逐类给出查看/修改方法与实测生效验证。全部命令与回显已在 Rocky Linux 9.3(ipa-server 4.13.4,域 ipa.lab)+ Ubuntu 22.04 客户端双机实测通过。
一、环境信息
- 服务端:Rocky Linux 9.3,ipa-server-4.13.4-1.el9_8,域
ipa.lab,realmIPA.LAB,主机ipa1.ipa.lab(10.89.71.10) - 客户端:Ubuntu 22.04,freeipa-client 4.9.8 + sssd-tools + openssh-server,主机
client1.ipa.lab(10.89.71.20) - 管理员:admin / q1w2e3r4(kinit 后执行全部 ipa 命令)
- 实测样例对象:用户 dev01/dev02、组 developers、HBAC 规则 dev_ssh_to_client、sudo 规则 dev_all、组级密码策略 developers
- 服务端 API:ipa version →
IPA server version 4.13.4. API version 2.257
二、前置条件
- 服务端安装完成且
ipactl status全服务 RUNNING(安装过程见《Rocky 9 安装 FreeIPA 4.13 实战:ipa-server-install 与 DNS/NTP 决策》) - 已获取管理票据:
kinit admin(口令 q1w2e3r4),klist应有krbtgt/IPA.LAB@IPA.LAB - 客户端已入域且
sssctl domain-status ipa.lab显示Online status: Online - 下述修改类命令均以 admin 身份执行;改动策略后客户端侧用
sss_cache -E清缓存可立即重估
三、参数查看与修改方式
FreeIPA 的参数分布在三个层面,修改入口各不相同:
| 层面 | 查看方式 | 修改方式 | 生效点 |
|---|---|---|---|
| 安装期选项 | ipa-server-install --help | 重装/新增服务用对应安装器(如 ipa-dns-install) | 服务重启 |
| 运行期全局 | ipa config-show | ipa config-mod | 立即(对新对象生效) |
| 策略规则 | ipa pwpolicy-show / hbacrule-show / sudorule-show 等 | 对应 *-add/*-mod/*-del 命令族 | 客户端 SSSD 重估 |
| 底层 DS 配置 | ldapsearch -H ldapi://%2Fvar%2Frun%2Fslapd-IPA-LAB.socket -Y GSSAPI -b cn=config | 只读参考(直改会被 IPA 覆盖) | — |
| 客户端接入 | cat /etc/sssd/sssd.conf / ipa-client-install --help | 编辑 sssd.conf 后 systemctl restart sssd | 客户端即时 |
💡 技术拓展:配置修改的两种哲学——「直改配置文件」(OpenLDAP 的 cn=config、Samba 的 smb.conf)与「API 驱动」(FreeIPA 的 ipa 命令族写 LDAP 再广播)。FreeIPA 属后者:所有
ipa *-mod本质是对 389DS 条目受控写入,带 schema 校验与权限检查,配置不会漂移;代价是绕过 API 直改 LDAP 在下次 API 写入时可能被规范化。管理上请以 ipa 命令族为唯一入口。
四、参数总览
ipa config-show 全量回显(实测):
Maximum username length: 32
Maximum hostname length: 64
Home directory base: /home
Default shell: /bin/bash
Default users group: ipausers
Default e-mail domain: ipa.lab
Search time limit: 2
Search size limit: 100
User search fields: uid,givenname,sn,telephonenumber,ou,title
Group search fields: cn,description
Enable migration mode: False
Certificate Subject base: O=IPA.LAB
Password Expiration Notification (days): 4
Password plugin features: AllowNThash, KDC:Disable Last Success
SELinux user map order: guest_u:s0$xguest_u:s0$user_u:s0$staff_u:s0-s0:c0.c1023$sysadm_u:s0-s0:c0.c1023$unconfined_u:s0-s0:c0.c1023
Default SELinux user: unconfined_u:s0-s0:c0.c1023
Default PAC types: MS-PAC, nfs:NONE
IPA masters: ipa1.ipa.lab
IPA master capable of PKINIT: ipa1.ipa.lab
IPA CA servers: ipa1.ipa.lab
IPA CA renewal master: ipa1.ipa.lab
IPA DNS servers: ipa1.ipa.lab
IPA Service key type:size: rsa:2048
全局密码策略 ipa pwpolicy-show 默认值(实测):
Group: global_policy
Max lifetime (days): 90
Min lifetime (hours): 1
History size: 0
Character classes: 0
Min length: 8
Max failures: 6
Failure reset interval: 60
Lockout duration: 600
Grace login limit: -1
关键差异:全局策略 minlength=8、无历史约束、连错 6 次锁 600 秒——生产环境几乎必改,见五、2。
五、核心参数分类详解
5.1 运行期全局默认(ipa config-mod)
作用:约束新创建对象的默认值与搜索行为。逐项实测修改与验证:
ipa config-mod --defaultshell=/bin/bash
回显(实测节选):
Default shell: /bin/bash
生效验证(关键知识点:只影响新用户,存量用户不变)——修改前创建的 dev01 仍为 /bin/sh,修改后创建的新用户自动获得 /bin/bash(实测):
ipa user-show dev01 | grep "Login shell"
Login shell: /bin/sh
存量用户单独改(实测):
ipa user-mod dev01 --shell=/bin/bash
Modified user "dev01"
Login shell: /bin/bash
客户端下发验证(实测;改完在客户端清 SSSD 缓存立即生效):
sss_cache -E && getent passwd dev01
dev01:*:863200003:863200003:Dev One:/home/dev01:/bin/bash
常用 config-mod 参数速查(均实测可执行):
| 参数 | 实测值 | 说明 |
|---|---|---|
--defaultshell | /bin/bash | 新用户默认 shell |
--homedirectory | /home | home 前缀 |
--maxusername | 32 | 用户名长度上限 |
--maxhostname | 64 | 主机名长度上限 |
--emaildomain | ipa.lab | 邮箱域自动补全 |
--searchtimelimit | 2(秒) | 单次搜索时限 |
--searchrecordslimit | 100 | 单次搜索条数上限(大规模目录需调大) |
--pac-type | MS-PAC | PAC 生成策略,跨域信任场景相关 |
--selinuxusermaporder | 见上 | SELinux 映射优先级序 |
5.2 密码策略(pwpolicy,组绑定 + 优先级)
作用:口令长度/有效期/历史/锁定,按「用户级 > 组级 > 全局(global_policy)」优先级生效;组策略必须指定 --priority(数值越小优先级越高,全局固定为 0 兜底)。
创建组级策略(实测):
ipa pwpolicy-add developers --priority=1 --minlength=10 --maxlife=90 --history=5
Group: developers
Max lifetime (days): 90
History size: 5
Min length: 10
Priority: 1
Grace login limit: -1
生效验证 1:minlength 在用户自改路径拦截(实测,dev02 为 developers 组员,kpasswd 提交 8 位口令):
Password change rejected: Password is too short
Password not changed.
生效验证 2:history 历史约束拦截(实测,dev02 提交近期用过的口令):
Password change rejected: New password was used previously. Please choose a different password.
生效验证 3:合规口令通过(实测):
Enter new password:
Enter it again:
Password changed.
生效验证 4:组策略只约束组员(实测,dev02 入组前 8 位口令设置成功走全局 minlength=8;入组后同长度被拒)。
⚠️ 注意管理员重置路径的边界(实测发现):管理员经
ldappasswd -Y GSSAPI -s <口令>直接重置组员口令时,不执行组策略长度检查(8 位口令可设置成功);质量检查的强制点在用户自改(kpasswd/kinit 首登改密)。审计上应避免用 ldappasswd 批量发短口令。管理员重置后的口令处于「立即过期」状态,用户首登必须改密。
5.3 HBAC 准入规则(hbacrule 四元组)
作用:控制「用户 × 来源主机 × 目标主机 × 服务」的准入矩阵,客户端 PAM account 阶段由 SSSD 在线评估。
构建一条规则(实测四步):
ipa hbacrule-add dev_ssh_to_client --desc="dev01 SSH 到 client1"
ipa hbacrule-add-user dev_ssh_to_client --users=dev01
ipa hbacrule-add-host dev_ssh_to_client --hosts=client1.ipa.lab
ipa hbacrule-add-service dev_ssh_to_client --hbacsvcs=sshd
服务端模拟验证(实测):
ipa hbactest --user=dev01 --host=client1.ipa.lab --service=sshd
--------------------
Access granted: True
--------------------
Matched rules: dev_ssh_to_client
Not matched rules: allow_systemd-user
ipa hbactest --user=dev02 --host=client1.ipa.lab --service=sshd
--------------------
Access granted: False
--------------------
Not matched rules: allow_systemd-user
Not matched rules: dev_ssh_to_client
端到端真实验证(实测,客户端 SSH):禁用默认放行规则 ipa hbacrule-disable allow_all 后——
- dev01(规则内):登录成功,
uid=863200003(dev01) ... groups=...,863200004(developers),主机名 client1.ipa.lab - dev02(规则外):
Connection closed by ::1 port 22(认证通过但 HBAC 拒绝,直接断开)
💡 技术拓展:HBAC 评估模式——「allow_all 兜底」与「白名单闭环」两种。新装域默认启用 allow_all(任何人对任何机器任何服务可入),生产第一件事就是
ipa hbacrule-disable allow_all切换到白名单模式;先建好等价运维规则(管理员组全机 sshd)再禁用,否则会把自己也锁在外面。本文实测即按此顺序执行。
5.4 sudo 规则(sudorule)
作用:集中下发 sudoers,客户端 SSSD 的 sudo 响应器消费。实测构建:
ipa sudorule-add dev_all --desc="dev01 免密提权全部命令" --order=1
ipa sudorule-add-user dev_all --users=dev01
ipa sudorule-add-allow-command dev_all --sudocmds="all"
-------------------------
Added Sudo Rule "dev_all"
-------------------------
Rule name: dev_all
Sudo order: 1
Users: dev01
参数说明:--order 决定多条规则匹配顺序;--sudocmds="all" 是内置通配命令;细粒度用 ipa sudocmd-add /usr/bin/systemctl 注册具体命令后挂 --allow-command;拒绝项用 --deny-command;免口令提权加 ipa sudorule-mod dev_all --authenticate=True(要求票据)或 --nopasswd=True 组合。客户端 sudo -l 需 dev01 有 Kerberos 票据后由 SSSD 返回规则(依赖 sssd-sudo 响应器与 nsswitch 的 sudo 条目)。
5.5 SELinux 用户映射与 PAC(config 层)
SELinux user map order/Default SELinux user:SSH 登录后用户的 SELinux 上下文映射序(ipa config-mod --selinuxusermaporder=...),配合ipa selinuxusermap-add可实现「组→SELinux 角色」映射。Default PAC types: MS-PAC, nfs:NONE:Kerberos 票据中 PAC 的生成策略;接 AD 信任或 NFS 时按需调ipa config-mod --pac-type=MS-PAC。
5.6 DNS 区域参数(dnszone)
实测查询:
ipa dnszone-show ipa.lab --all | grep -iE "update|dynamic"
BIND update policy: grant IPA.LAB krb5-self * A; grant IPA.LAB krb5-self * AAAA; grant IPA.LAB krb5-self * SSHFP;
Dynamic update: True
--update-policy:BIND 授权语法,默认 krb5-self 仅允许机器更新自身记录( admin 代他机更新会被 REFUSED,实测与处置见《Rocky 9 安装 FreeIPA 4.13 实战》9.5)。--dynamic-update=True/False、--allow-query、--allow-transfer:区域级动态更新与查询/传送控制。--forwarders/--forward-policy=only|first:全局转发器与转发策略(only=只转发不迭代;first=先转发失败再迭代)。
5.7 客户端接入参数(sssd.conf)
客户端 /etc/sssd/sssd.conf 关键段(入域后实存,实测):
[domain/ipa.lab]
id_provider = ipa
ipa_server = ipa1.ipa.lab
auth_provider = ipa
access_provider = hbac # HBAC 评估入口
cache_credentials = True # 断网离线登录
krb5_store_password_if_offline = True
default_shell = /bin/sh
fallback_homedir = /home/%u@%d
[sssd]
services = nss, pam, ssh, sudo, ifp
domains = ipa.lab
逐项说明:access_provider=ipa 时默认挂 hbac;cache_credentials=True 是断网可登录的关键;services 里 ssh 用于 SSHFP 校验、sudo 是 sudo 规则下发通道、ifp 支持 sssctl/InfoPipe 查询。修改后 systemctl restart sssd 生效;sss_cache -E 只清缓存不动服务。
六、生产配置模板
4GB 内存、50 台以内客户端的中型场景(实测环境为模板基线):
# 全局默认:shell 与搜索限制按目录规模调整
ipa config-mod --defaultshell=/bin/bash \
--searchtimelimit=4 --searchrecordslimit=1000
# 全局密码策略:90 天有效、历史 5、锁 10 分钟
ipa pwpolicy-mod global_policy --maxlife=90 --history=5 --minlength=10 \
--maxfailures=5 --lockoutduration=900
# 运维人员全机 SSH 白名单(先建后禁 allow_all)
ipa group-add ops-admins --desc="运维管理组"
ipa hbacrule-add ops_ssh_all
ipa hbacrule-add-user ops_ssh_all --groups=ops-admins
ipa hbacrule-add-host ops_ssh_all --hostcat=all
ipa hbacrule-add-service ops_ssh_all --hbacsvcs=sshd
ipa hbacrule-disable allow_all
说明:--hostcat=all 让规则覆盖全部主机(等价替代 allow_all 的运维通道);搜索限制调大是为 Web UI 分页与 API 批量查询;密码策略把全局 minlength 拉到 10 与组策略对齐。16GB 内存、多副本(≥3 台)场景追加:--searchrecordslimit=0(不限制)+ DNS --forward-policy=first + 每副本独立 forwarder。
七、常见问题
Q1:config-mod 改了默认 shell,老用户为什么没变?
答:全局默认只作用于新创建对象,存量条目的属性已固化在 LDAP;逐个 ipa user-mod --shell 或批量走 API 脚本。实测对照见五、1。
Q2:禁用 allow_all 后 SSH 全部被拒?
答:先确认 ipa hbacrule-find 有覆盖目标主机与 sshd 服务的启用规则,再用 ipa hbactest 定位未命中的原因(常见:--hosts 忘了加目标机、服务名写成 ssh 而非 sshd)。客户端侧 sss_cache -E 清缓存后重试。
Q3:组密码策略不生效?
答:三个检查点——组员是否真的在该组(ipa group-show developers)、策略 priority 是否 ≥1(0 与全局冲突)、验证路径是否是用户自改(kpasswd),管理员 ldappasswd 重置不受质量检查约束(实测见五、2 注意)。
Q4:sudo 规则下发了但客户端 sudo -l 看不到?
答:检查客户端 /etc/nsswitch.conf 的 sudoers: files sss 是否包含 sss、/etc/sssd/sssd.conf 的 services 是否含 sudo;再确认用户已有 Kerberos 票据(kinit);最后 sss_cache -E 清缓存。
Q5:dnszone 的 update policy 能放开给管理员吗?
答:可以调整 --update-policy 授权语法,但更推荐保持 krb5-self 并让管理员走 ipa dnsrecord-add(API 有权限审计);直放开 BIND 策略等于绕过 IPA 审计面。
八、参考链接
- ipa CLI 手册(服务端随包
man ipa) - RHEL 9 IdM 规划与策略文档:https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html/planning_identity_management/index
- FreeIPA HBAC 设计页:https://www.freeipa.org/page/V4/HBAC
- FreeIPA 密码策略设计页:https://www.freeipa.org/page/V4/Password_Policy
- 站内延伸:《FreeIPA 介绍与选型指南》、《Rocky 9 安装 FreeIPA 4.13 实战:ipa-server-install 与 DNS/NTP 决策》、《389 Directory Server 配置管理实战:dsconf 与 cn=config 详解(后缀、索引、日志、缓存、口令策略)》(目录层同源参数的裸机对照)