FreeIPA 4.13 配置参数详解

FreeIPA 三层参数体系(安装期选项/全局 config-mod/策略层 pwpolicy-hbacrule-sudorule)逐类详解,含 minlength、history、HBAC 放行拒绝的实测生效验证与生产配置模板。

FreeIPAFreeIPAKerberos389 Directory Server2026/10/28

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,realm IPA.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-showipa 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/homehome 前缀
--maxusername32用户名长度上限
--maxhostname64主机名长度上限
--emaildomainipa.lab邮箱域自动补全
--searchtimelimit2(秒)单次搜索时限
--searchrecordslimit100单次搜索条数上限(大规模目录需调大)
--pac-typeMS-PACPAC 生成策略,跨域信任场景相关
--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 审计面。

八、参考链接