拓冰建站拓冰建站
首页 / 资讯中心 / 正文

FreeIPA 部署实战:统一认证、Kerberos 与 AD 信任

1. 先把这件事想明白为什么要自建一套 FreeIPA1.1 从三台机器三个密码的真实窘境说起我接手过一个小团队的环境十几台 Linux 服务器每台都有自己的/etc/passwd。听起来没什么直到有人离职——运维要先在群里问这台机器谁装过然后挨个 SSH 进去userdel -r还要顺手清掉/etc/sudoers.d里散落的授权文件。更麻烦的是密码轮换公司要求三个月改一次结果就是一份 Excel 表格在群里传来传去谁改过、谁没改没人说得清。这类环境的病根只有一个身份没有唯一可信源。每台机器都是一个独立的小王国账号、密码、权限各自为政。业务少的时候靠人肉能撑机器一多、人员一流动管理成本就是指数级上涨的。FreeIPA 就是来干这件事的。它是 Red Hat 主导的一套开源身份管理集成方案把 LDAP 目录、Kerberos 认证、DNS、CA 证书这几样东西打成一个包对外只暴露一套命令和一个 Web 控制台。你在这套系统里建一个用户几十台机器就能同时认这个人;你在这套系统里收回权限所有机器上的授权也会同步失效。这篇搭建教程我尽量写得细一点从主机名怎么改、DNS 怎么配到ipa-server-install里每一个交互问题到底在问什么都会逐条拆开讲——因为我自己踩过的坑九成都埋在环境准备这一步。1.2 FreeIPA 在技术栈里到底扮演什么角色很多人第一次接触 FreeIPA会把它理解成一个带界面的 LDAP。这个理解不算错但漏掉了最关键的部分。FreeIPA 真正的定位是身份 策略 审计三位一体的域控系统只不过它面向的是 Linux/Unix 生态而不是 Windows。它内部其实是由一堆成熟组件粘合起来的组件在 FreeIPA 里的职责单独用它的痛点389 Directory Server存用户、组、主机、策略的 LDAP 后端只解决数据存哪儿不解决认证MIT Kerberos KDC单点登录、票据签发、免密认证配置繁琐强依赖 DNS SRV 记录BIND bind-dyndb-ldap内置 DNSSRV 记录随服务自动生成手工维护 SRV 极易出错Dogtag PKI内部 CA签发主机证书、用户证书证书生命周期管理完全靠手工SSSD客户端侧认证代理与缓存需要自己写一堆配置拼 LDAPKerberoscertmonger证书到期自动续签没有它证书过期就是定时炸弹我打个比方单独用 LDAP Kerberos 手工拼装像是自己买零件攒一台车——发动机、变速箱、底盘都是好东西但你要自己解决接口匹配、线路走线、调校的问题。FreeIPA 做的是原厂整车它把sssd.conf、krb5.conf、证书模板、DNS 区域文件这些东西全部按最佳实践预置好了你只需要填几个参数就能跑起来。更值钱的是那套统一的ipa命令行。用户管理、主机管理、HBAC 访问控制、sudo 规则、密码策略、证书签发全都在一个命令体系里权限模型也是一致的。这意味着你写自动化脚本的时候不用在四种工具之间来回切换。1.3 部署拓扑和主机规格怎么定FreeIPA 的部署规模分三档选错了后期迁移成本很高所以开工前先对号入座场景规模建议拓扑主机配置说明30 台机器以内试验/小团队单机部署2 核 4G磁盘 40G单点故障可接受务必做好备份30-300 台机器主 1 副本每台 4 核 8G磁盘 60G副本同时承担查询负载300 台以上 / 多机房3 副本起步每个副本 4 核 8G 起副本数量建议奇数便于仲裁这里有几个常被忽略的点。第一副本不是备份。很多人觉得我布了两台副本就高枕无忧了但误删一个用户删除操作会同步到所有副本。真正的兜底手段是ipa-backup导出的离线备份这个后面会详细讲。第二磁盘 I/O 比 CPU 重要。389 DS 是典型的写少读多且对 fsync 敏感的服务跑在廉价共享存储上会明显卡顿。虚拟机的话尽量选本地 SSD或者至少保证 IOPS 别低于 3000。第三目录分离。如果条件允许把/var/lib/dirsvc单独挂一个盘因为 LDAP 数据库尤其是开启了审计日志之后增长会比你想的快。我见过一个两百人规模的环境跑了两年/var分区被日志撑爆直接导致服务起不来。第四动手前先打快照。无论虚拟机还是物理机装之前一定留一个干净的快照。FreeIPA 安装失败后的清理非常麻烦涉及十几个服务和配置文件的回滚能直接回滚快照就不要硬扛。1.4 域名和 Realm 的设计一开始就要定死这块我单独拎出来说因为它是不可逆的。安装完成后改域名基本等于重建。规则是这样的假设你的 DNS 域名是corp.example.com那么Domain域corp.example.com这是 LDAP 的根后缀也是客户端加域时填的域Realm领域CORP.EXAMPLE.COMKerberos 的 Realm通常是域名全大写选域名的三个建议一是不要用.local结尾。这是给 mDNS 预留的会和一堆服务冲突。二是不建议直接用公网顶级域名做内网域除非你确实拥有它并做好了内外网视图分离。三是如果你打算和 AD 建信任关系两边域名必须不同否则直接卡死在第一步。这一点在做中长期规划时特别重要很多公司是先上了 FreeIPA半年后老板说要和 AD 打通这时候改域名就是灾难。我个人的习惯是用一个明显带内网标识的子域比如idm.internal.example.com或者干脆用一个公司内部约定的独立域名空间。名字长一点无所谓脚本里都是变量写一次就行。2. 环境准备九成的安装失败都埋在这一步2.1 主机名和 DNS 解析必须一次做对FreeIPA 对主机名的要求是近乎偏执的这不是设计者矫情而是 Kerberos 的硬性约束Service Principal Name 里绑定的就是 FQDN主机名一乱票据就签不出来。DNS 同理客户端找 KDC 靠的是_kerberos._tcp这类 SRV 记录解析不到就直接认证失败。所以在安装前请把这几条逐字检查一遍# 1. 设置静态主机名必须是完整域名 hostnamectl set-hostname ipa.corp.example.com # 2. 验证短名和长名都能正确解析 hostname # 期望输出短名ipa hostname -f # 期望输出全名ipa.corp.example.com # 3. 检查 /etc/hosts这是最容易配错的地方 cat /etc/hosts/etc/hosts的标准写法是这样127.0.0.1 localhost localhost.localdomain ::1 localhost localhost.localdomain 192.168.10.10 ipa.corp.example.com ipa这里有两个致命陷阱注意127.0.0.1那一行千万不能写成127.0.0.1 ipa.corp.example.com也不能出现127.0.1.1 ipa.corp.example.com这种写法。这会让安装器认为你的主机 IP 是回环地址Kerberos KDC 绑定失败报错信息还特别含糊能折腾你半天。注意ipa.corp.example.com必须映射到这台机器的真实网卡 IP而不是127.0.0.1。用ip addr确认一遍别信ifconfig的老输出。如果你打算让 FreeIPA 自建内置 DNS这是推荐做法省去手工维护 SRV 记录的麻烦那么正反向解析的规划也要提前想好。正向区域是corp.example.com反向区域就是网段反过来比如10.168.192.in-addr.arpa。反向区域别偷懒跳过很多应用在做主机名反解时会用到缺了它后期会冒出一堆莫名其妙的告警。2.2 时间同步、防火墙、SELinux 三件套时间同步是 Kerberos 的生命线。Kerberos 默认允许的时间偏差是 5 分钟300 秒超过就直接拒绝认证。表现症状通常是密码明明是对的就是登录不上然后你看日志才会发现Clock skew too great。# 配置 chrony指向你现有的时间源 vi /etc/chrony.conf # 添加或修改 server 行例如 # server ntp.internal.example.com iburst systemctl enable --now chronyd chronyc sources -v chronyc trackingchronyc tracking里的System time那一行偏差最好控制在几十毫秒以内。虚拟机有个经典坑宿主机挂了、或者虚拟机被长按关机再恢复时钟可能突然跳好几个小时SSSD 缓存跟着乱掉。如果环境里虚拟机多建议开启宿主机的时钟同步功能。防火墙端口FreeIPA 用到的比想象中多我整理成表端口协议用途80 / 443TCPWeb 界面、证书注册、HTTP 服务389 / 636TCPLDAP / LDAPS88TCP UDPKerberos 认证464TCP UDPKerberos 改密kpasswd749TCPKerberos 管理kadmin仅副本同步用53TCP UDPDNS123UDPNTP用 firewalld 的话有现成的服务定义省得一条条敲firewall-cmd --permanent --add-servicefreeipa-ldap firewall-cmd --permanent --add-servicefreeipa-ldaps firewall-cmd --permanent --add-servicedns firewall-cmd --permanent --add-servicentp firewall-cmd --reload firewall-cmd --list-allSELinux 不要关。网上很多教程图省事直接setenforce 0这是给未来埋雷。FreeIPA 全套包都有现成的 SELinux 策略保持enforcing反而能避免权限乱飞的问题。如果安装过程中真的遇到 SELinux 拦截正确做法是看ausearch -m avc -ts recent定位然后针对性放行而不是一刀切关闭。2.3 系统版本和仓库选择推荐 RHEL 系RHEL 8/9、Rocky Linux、AlmaLinux、CentOS Stream 都可以。原因是 FreeIPA 的包在这些发行版里是官方维护的版本跟得紧idm:DL1这个模块化仓库里的组件兼容性经过了充分测试。Debian/Ubuntu 系列也能装freeipa-server包是有的但我实际用下来的感受是版本偏旧、坑更多尤其是内置 DNS 和 Dogtag 的版本组合容易出问题。如果团队没有强制的发行版要求别给自己找麻烦。RHEL 8 及以后需要先启用模块# 查看可用模块流 dnf module list idm # 启用 DL1 流 dnf module enable idm:DL1 -y # 安装服务端含内置 DNS 支持 dnf install -y ipa-server ipa-server-dns bind-dyndb-ldap如果后续打算和 AD 建信任还要多装一个包dnf install -y ipa-server-trust-ad samba-client samba-common-tools这个包建议在安装阶段就一起装上别等到要用的时候再补。原因是ipa-adtrust-install会改动 LDAP 的 schema 和一些服务配置事后补装虽然也能跑通但多一次服务重启和一次风险。磁盘方面给个参考值/var至少 40G生产环境建议 60G 起/boot1G剩下的给根目录。如果/var和/是同一个分区记得给整个根分区留够空间因为 LDAP 数据库、审计日志、备份文件全在里面。一切就绪之后打一个快照。我再强调一次这一步能救你半小时到半天的时间。3. 服务端安装实操从零到能登录控制台3.1 一条命令和它背后的十几个参数FreeIPA 的服务端安装核心就是一条ipa-server-install。它可以全交互式跑也可以带参数非交互跑。我的建议是第一次装一定用交互模式把每个问题看清楚理解它在问什么;等熟练了再上非交互脚本做批量部署。非交互的完整命令长这样先给你一个整体印象ipa-server-install \ --realmCORP.EXAMPLE.COM \ --domaincorp.example.com \ --hostnameipa.corp.example.com \ --ds-password目录管理员密码 \ --admin-passwordIPA管理员密码 \ --setup-dns \ --forwarder223.5.5.5 \ --forwarder223.6.6.6 \ --mkhomedir \ --unattended下面把关键参数一个个掰开说因为漏掉任何一条后面的行为都会不一样。--realm和--domain前面已经讲过是全大写和全小写的关系。--hostname会自动取hostname -f的结果但如果你的主机名设置有问题显式指定能避免误判。--ds-password是Directory Manager的密码也就是 LDAP 的超级管理员相当于cnDirectory Manager。这个账号权限极高能直接操作 LDAP 数据日常运维不要用它只留作应急。--admin-password是 IPA 管理员用户admin的密码这才是你日常该用的账号。两个密码策略上建议不同长度都别低于 12 位含大小写、数字、符号。生产环境用密码文件读入会更安全--ds-password$(cat /root/.ds_pass)。--setup-dns是安装内置 BIND。强烈建议加上哪怕你公司已经有 DNS 服务器了。原因很直接Kerberos 需要一堆 SRV 记录_kerberos._tcp、_ldap._tcp、_kpasswd._udp等等FreeIPA 在服务启动时会自动往自己的区域里写这些记录还会随副本增减动态更新。你自己手工维护这套 SRV几乎必然会出错。--forwarder指定上游 DNS。FreeIPA 的内置 DNS 只负责自己区域的解析其他域名要转发出去。可以指定多个重复用这个参数即可。如果你想让它完全不转发纯内网隔离环境用--no-forwarders。这两个选项是互斥的。注意如果你的环境里有内网 DNS 需要解析的域名比如git.internal.example.com那么转发器一定要指向那个内网 DNS而不是公网 DNS否则加了域之后客户端反而解析不了内部资源。--mkhomedir让用户在首次登录时自动创建家目录。不加的话用户 SSH 登录进去会发现自己挂在一个不存在或者只有 root 才能写的目录下体验极差。这个参数在服务端装完后也会写入客户端的默认配置。3.2 交互模式下每个问题的真实含义不带--unattended跑的话你会依次被问到这些问题我把它们对应的实际影响列出来提示问题正确回答背后的含义Existing BIND configuration detected按实际情况检测到旧 DNS 配置会提示是否覆盖Do you want to configure integrated DNS (BIND)?yes是否启用内置 DNS建议 yesServer host nameipa.corp.example.com从hostname -f自动带出不对就说明主机名有问题Please confirm the domain namecorp.example.comLDAP 根后缀Please provide a realm nameCORP.EXAMPLE.COMKerberos 领域自动大写Directory Manager password强密码LDAP 超管密码IPA admin password另一个强密码日常管理账号密码Do you want to configure DNS forwarders?yes用内置 DNS 就必须配转发Do you want to search for missing reverse zones?yes自动补反向区域省事Please provide the IP address to be used按实际多网卡时会出现选对外服务的那个NetBIOS domain nameCORP改名信任时才用得上默认即可Do you want to configure chrony with NTP server or pool address?no如果已配好别让它覆盖你已有的时间配置Continue to configure the system with these values?yes最后的确认务必回头核对一遍最后这个确认环节一定要认真看。我在这一步抓到过自己两次错误一次是主机名带了个拼错的域名一次是反向区域写成了另一个网段。这时候按no退出什么都不会写;按yes之后就是一路装到底中途失败清理起来很痛苦。安装过程大概需要 5 到 20 分钟取决于机器性能。期间它会做这些事初始化 LDAP 实例、签发 CA 证书、启动 Dogtag、配置 BIND 区域、启动 KDC、注册 HTTP 服务、生成 Web 界面资源。日志在/var/log/ipaserver-install.log如果卡住了盯着这个文件看比盯着屏幕瞎猜强。3.3 装完之后的验证清单看到The ipa-server-install command was successful千万别急着收工按这个清单逐项验一遍# 1. 拿到管理员票据这一步是能不能用的分水岭 kinit admin # 输入密码后无报错即为成功 # 2. 查看票据 klist # 3. 查看当前身份 ipa whoami # 4. 确认服务全部在跑 ipactl statusipactl status会列出所有组件状态理想情况是全部RUNNING。如果有STOPPED的先用ipactl restart试一次还不行就看对应组件的日志LDAP 看/var/log/dirsrv/slapd-CORP-EXAMPLE-COM/errorsKerberos 看/var/log/krb5kdc.log。然后跑一次健康检查这是 RHEL 8.1 以后提供的好东西能提前发现很多隐患ipa-healthcheck它会检查副本状态、证书有效期、CA 配置、DNS 记录、服务运行状态等输出分SUCCESS、WARNING、ERROR三级。刚装好一般是全绿如果报证书相关的警告八成是时间没同步好。最后验证 Web 界面。浏览器打开https://ipa.corp.example.com/ipa/ui用admin登录。第一次访问会有自签名证书警告这是正常的——因为你用的是 FreeIPA 自己的 CA。生产环境如果要消掉告警可以从 Web 界面或者用命令导出 CA 证书下发到各个客户端的信任库# 在服务端导出 CA 证书 ipa-getcert list # 证书位置通常在 /etc/ipa/ca.crt确认这三块——命令行kinitipa命令、服务状态ipactl、Web 界面——都通了服务端才算真正搭好。4. 客户端接入与身份策略落地4.1 Linux 客户端加域全过程服务端只是大脑真正当手脚的是每一台客户端。加域这一步有一半的失败来自客户端本身的 DNS 配置——它得先能解析到 IPA 服务器才知道去哪儿认证。前置条件三条客户端的 DNS 指向 IPA 服务器或者你的 DNS 能正确转发。客户端时间和服务端偏差在 5 分钟内。客户端主机名同样是 FQDN。操作如下# 1. 指向 IPA 的 DNS vi /etc/resolv.conf # nameserver 192.168.10.10 # 2. 安装客户端包 dnf install -y ipa-client # 3. 加域 ipa-client-install \ --domaincorp.example.com \ --serveripa.corp.example.com \ --principaladmin \ --password管理员密码 \ --mkhomedir \ --unattended加域过程中它会做几件事写/etc/sssd/sssd.conf、写/etc/krb5.conf、申请一张主机证书、在服务端注册这台主机的记录。跑完之后用这两条命令验证# 用域用户登录测试 id someuser # 查看 SSSD 是否正常工作 systemctl status sssd sssctl domain-status corp.example.comsssctl domain-status输出里的Online status: Online是关键如果显示Offline说明客户端连不上服务端回去查 DNS 和 88/389 端口。这里有个很实用的技巧加域时加--mkhomedir只是给这台机器开了开关如果你想让整个域的新机器默认都自动建家目录可以在服务端统一配置ipa config-mod --addattripaConfigStringenabledService \ --addattripaConfigStringmkhomedir甚至可以让它去读一个骨架目录把公司统一的.bashrc、.vimrc之类分发给所有新用户这个后面单独写一篇展开。4.2 用户、组、HBAC 和 sudo 规则的设计思路加完域只是能认证真正管住权限靠的是策略。FreeIPA 的策略体系有几个层次容易搞混我按从粗到细的顺序理一遍。第一层是用户和组。ipa user-add建用户ipa group-add建组。组有两种POSIX 组有 GID用于文件权限和非 POSIX 组纯逻辑分组用于策略绑定。做访问控制时我强烈建议全用非 POSIX 组把业务分组和文件权限分组彻底分开否则改文件权限的时候会把访问策略一起改乱。# 建非 POSIX 组不加 --posix 参数即是 ipa group-add ops-team --desc运维组 # 加人 ipa group-add-member ops-team --userszhangsan第二层是 HBACHost-Based Access Control。这是很多人不知道但极其有用的东西它控制谁能在哪台机器上用哪个服务。默认有一条allow_all规则很多教程让你留着我不建议。# 关掉默认的万能规则 ipa hbacrule-disable allow_all # 建一条精准规则 ipa hbacrule-add ops-ssh --desc运维组 SSH 到生产机 ipa hbacrule-add-user ops-ssh --groupsops-team ipa hbacrule-add-host ops-ssh --hostgroupsprod-servers ipa hbacrule-add-service ops-ssh --hbacsvcssshd这条规则的意思是ops-team组的人只能 SSH 到prod-servers主机组里的机器。设置好之后再测试效果立竿见影——不在规则里的人密码再对也进不去而且报错信息是标准的认证失败不会泄露任何内部结构。这就是默认拒绝的威力。第三层是 sudo 规则。这是 FreeIPA 相比纯 LDAP 最舒服的地方sudo 规则集中管理客户端自动下发不用再往每台机器的/etc/sudoers.d里塞文件。# 建规则 ipa sudorule-add ops-reboot --desc允许重启服务 # 允许谁 ipa sudorule-add-user ops-reboot --groupsops-team # 允许在哪 ipa sudorule-add-host ops-reboot --hostgroupsprod-servers # 允许执行什么这里用命令组更利于维护 ipa sudorule-add-allow-command ops-reboot --sudocmds/usr/bin/systemctl我个人的经验是优先用--sudocmds绑定具体命令而不是给ALL同时用命令组ipa sudocmdgroup-add来批量管理。真的需要临时提权的时候在 Web 界面点两下把命令加进组里比每台机器改配置安全得多而且有审计记录。第四层是密码策略。默认策略对现代环境来说偏松建议调紧# 全局策略最小长度 12历史 5 次90 天过期 ipa pwpolicy-mod --minlength12 --history5 --maxlife90 \ --minlife1 --priority0如果某个特殊账号比如服务账号需要不同的策略可以用--priority做优先级覆盖数值大的优先。4.3 证书、备份与日常巡检证书这块FreeIPA 用自己的 Dogtag CA 给每台主机签证书用于 HTTPS、LDAP over TLS、以及跨服务的相互认证。这些证书不是永久的默认有效期两年到期不续就全面报错。好在有 certmonger 自动盯着# 查看所有受管理的证书 getcert list # 重点看这两行expires 和 status如果某张证书status显示MONITORING就是正常的它会在快到期时自动续签并在服务端重新签发。但有一个必须注意的点CA 证书本身到期是个麻烦事它不会自动续因为签名链的问题需要提前规划。建议在巡检脚本里加上# 查看 CA 证书有效期 openssl x509 -in /etc/ipa/ca.crt -noout -enddate备份是这套系统的命门。ipa-backup支持全量和增量# 全量备份默认输出到 /var/lib/ipa/backup/ ipa-backup # 指定输出目录建议放到独立存储 ipa-backup --data --gpg --gpg-keyring/root/backup-key--gpg会把备份加密适合明文存储的环境。备份内容包含 LDAP 数据、CA 私钥、配置文件CA 私钥尤其重要——丢了它所有已签发的证书全部作废等于要重建整个域。所以备份文件一定要异地存放并且定期做恢复演练。恢复用ipa-restore注意它需要在单用户模式下或者停掉 IPA 服务后执行。日常巡检我一般做成一个 cron 脚本跑这几项# 1. 健康检查 ipa-healthcheck --failures-only # 2. 服务状态 ipactl status # 3. 复制状态多副本环境 ipa-replica-manage list ipa-replica-manage status # 4. 磁盘余量 df -h /var # 5. 最近失败的登录 ipa hbacrule-find5. 与 AD 建立信任关系的关键环节5.1 信任模型和不可动摇的前置条件很多公司是混合环境Windows 侧用 ADLinux 侧用 FreeIPA。早期常见的做法是在两边各建一套账号一个人两个身份权限还得手工对齐运维苦不堪言。正确的做法是让 FreeIPA 和 AD 建立跨域信任实现 AD 用户直接登录 Linux 机器。信任的本质是两边 KDC 互相认对方的票据路径是跨领域认证Cross-Realm。要实现它硬性前置条件有几个缺一个都做不成条件具体要求检查方式域名不同FreeIPA 域 ≠ AD 域规划阶段就定好双向 DNS 解析双方都要能解析对方的域和 SRV 记录dig _kerberos._tcp.ad.example.com SRV时间同步两边偏差在 5 分钟内chronyc trackingAD 侧允许需要在 AD 上有管理员账号提前协调FreeIPA 已装信任包ipa-server-trust-adrpm -q ipa-server-trust-adSSSD 版本客户端 SSSD 要支持 trust一般 RHEL 7.5 都支持DNS 这一条是最容易卡住的。双向解析意味着FreeIPA 这边要能解析 AD 域靠转发器指向 AD 的 DNS或者在 AD 上建条件转发指向 FreeIPA;AD 那边也要能解析 FreeIPA 域在 AD 的 DNS 里建条件转发。这两步任何一边没配好ipa trust-add就会报Unable to resolve AD domain之类的错误而且提示很不明确。我的建议是在规划阶段就画一张 DNS 转发关系图两边都留好配置记录后面出问题排查起来会快很多。5.2 建立信任的实操步骤前置条件满足后先跑信任准备# 1. 让 FreeIPA 具备作为信任方的能力 ipa-adtrust-install --netbios-nameCORP这个命令会问你几个问题其中 NetBIOS 名建议和 AD 域短名区分开避免混淆。执行完后它会提示你重启相关服务记下它输出的那几条systemctl restart命令一条条执行到位。然后建立信任# 2. 建立到 AD 的单向信任FreeIPA 信任 AD ipa trust-add --typead ad.example.com \ --adminAdministrator \ --password # 3. 验证信任状态 ipa trust-show ad.example.com ipa trust-findipa trust-find里如果看到Trust status: established and verified说明信任已经通了。接下来是验证的临门一脚找一台已经加了 FreeIPA 域的 Linux 客户端用 AD 用户登录。# 在客户端上直接查 AD 用户 id aduserad.example.com # SSSD 里要能看到这个用户 getent passwd aduserad.example.com如果id命令能返回 UID/GID说明整个链路——Linux 客户端 → FreeIPA SSSD → 跨域票据 → AD KDC——全部打通了。这一步有几个常见的坑我先替你踩过第一AD 用户默认的 UID/GID 是 SSSD 用算法动态映射出来的一致性哈希不是 AD 里存的真实值。这导致同一个 AD 用户在不同客户端上 UID 可能不同如果做 NFS 共享或者跨机文件授权就会出问题。解法是配置 ID 映射或者用sssd.conf里的ldap_id_mapping相关选项这块内容比较多值得单独写一篇。第二加了信任之后HBAC 规则对 AD 用户同样生效。也就是说 AD 用户不会自动获得访问权限你还得把他们对应的 AD 组加到 HBAC 规则里或者用外部组External Group的方式桥接。这是很多人以为信任建好就能用、结果发现登录不上时的最大盲点。第三AD 那边禁用或删除了用户FreeIPA 侧因为 SSSD 有缓存可能还会残留一段时间过期后自然消失。如果要求即时生效需要在 SSSD 配置里调短缓存时间。6. 常见问题排查实录6.1 DNS 和 Kerberos 问题速查表把这两年遇到过的高频问题整理成表出问题先来这里对号症状最可能的原因排查命令处理办法ipa-server-install报主机名不合格hostname -f不是 FQDN 或解析到回环hostname -f/dig修/etc/hosts和hostnamectlkinit admin报Cannot find KDC88 端口不通或 DNS 解析不到dig _kerberos._tcp.corp.example.com SRV检查防火墙和内置 DNS 区域报Clock skew too great时间偏差超过 5 分钟chronyc tracking修时间同步ipa-client-install卡在 discovering客户端 DNS 没指向 IPAcat /etc/resolv.conf改 DNS 后重试加域成功但id user查不到SSSD 未启动或缓存问题systemctl status sssdsystemctl restart sssdWeb 界面登录报 500Dogtag 或 HTTPD 异常/var/log/httpd/error_log看具体堆栈通常是证书副本同步失败389 DS 复制协议问题ipa-replica-manage list检查 749 端口和主机证书用户能登录但不能 sudosudo 规则未下发或未刷新sudo -l/sssctl检查 HBAC 和 sudo 规则清 SSSD 缓存补一个万能排查起手式遇到任何认证问题都可以按顺序走一遍# 1. 时间对不对 chronyc tracking | grep System time # 2. DNS 通不通 dig ipa.corp.example.com dig _kerberos._tcp.corp.example.com SRV # 3. 拿票行不行 kinit admin # 4. 端口通不通从客户端发起 nc -zv ipa.corp.example.com 88 nc -zv ipa.corp.example.com 389 # 5. SSSD 状态 sssctl domain-status corp.example.com这五步走下来八成的问题都能定位到具体环节比漫无目的地翻日志高效得多。6.2 安装中断后的清理和重装安装失败是必然要经历的事。两种情况一种是安装器自己回滚了相对好办;一种是装到一半磁盘满、网络断进程被杀死这时候系统里残留了一堆半成品配置。先别急着重装正确顺序是这样# 1. 先看日志弄清到底卡在哪一步 tail -100 /var/log/ipaserver-install.log # 2. 如果安装器提示可以清理用它自带的卸载命令 ipa-server-install --uninstall # 3. 如果上面的命令也跑不起来强清理 ipa-server-install --uninstall -U--uninstall会尽力把 LDAP 实例、Kerberos 数据库、DNS 区域、证书、服务配置全部移除。但它不总是干净的尤其是中断发生在后期阶段时。我遇到过清理完还有残留的情况这时候要手工检查这几处# 检查残留的服务 systemctl list-unit-files | grep -E ipa|dirsrv|pki|krb5|httpd # 检查残留目录 ls -la /etc/dirsrv/ /var/lib/dirsrv/ /etc/pki/pki-tomcat/ /var/lib/ipa/ # 检查残留 LDAP 数据 ls /etc/dirsrv/slapd-*/我个人的强烈建议是能用虚拟机快照就用快照。新装一个干净系统重新跑一遍安装通常比在残留系统上折腾清理要快而且结果可预期。这也是我前面反复强调安装前打快照的原因。如果实在不能用快照还有个折中办法在安装前把/etc、/var/lib里的关键目录做个 tar 备份出问题直接覆盖回去比--uninstall更彻底。6.3 性能、容量和一些踩出来的心得最后聊点运维层面的实际体会这些是文档里不会写、但用久了必然会碰上的。关于副本数量。很多人觉得副本越多越安全其实不是。每多一个副本就多一条复制协议写入操作要在副本之间同步冲突解决也更复杂。三副本在大多数场景下已经是上限再多就是给自己加负担。真正需要的是每个机房的容灾副本 一份离线备份。关于监控。FreeIPA 有几个关键指标必须监控起来否则出事的时候你只是被动救火# LDAP 连接数、操作响应时间可以通过 389 DS 的监控条目看 ldapsearch -D cnDirectory Manager -W -b cnmonitor -s base # 副本延迟这是最关键的指标 ipa-replica-manage status # 磁盘余量LDAP 日志涨得比想象中快 df -h /var副本延迟如果超过几分钟就要警惕网络或者同步队列积压。我见过一次因为磁盘写满导致复制协议断开两边数据分叉了两天才发现最后靠手工导出比对才补齐。关于审计日志。FreeIPA 默认会记录 LDAP 的写操作审计日志这在合规场景下是必需的但会显著增加磁盘 I/O 和空间占用。如果环境规模不大、又对审计没有硬性要求可以适度调整日志级别# 查看当前日志级别 ldapsearch -D cnDirectory Manager -W -b cnconfig \ (nsslapd-pluginIdnsslapd-audit-log) nsslapd-errorlog-level调整前一定先确认清楚合规要求别自己图快把审计关了。关于密码策略的落地节奏。策略不要一次调得太狠。我经历过一次直接把最小长度从 8 改成 16、历史改成 10结果第二天一堆人的服务账号认证失败因为那些账号密码是多年前手工设的、存在配置文件里。正确的做法是先调影响面小的参数比如历史次数观察一周再逐步收紧长度和复杂度要求同时提前把所有服务账号梳理出来单独加策略。关于文档。这个听起来像废话但真的重要。FreeIPA 这种集中式系统最怕的就是只有一个人懂。我现在的习惯是在内部 Wiki 里固定维护几样东西域名和 Realm 的规划、所有主机的 FQDN 和 IP 对照表、副本拓扑图、备份恢复的操作步骤、以及每次变更的记录。真到了出故障的时候这些文档能帮你省下大量回忆的时间。ipa-backup配上ipa-restore的演练我建议每季度做一次在测试环境完整走一遍备份 → 模拟故障 → 恢复 → 验证用户能登录。没演练过的备份等于没有备份这句话在身份系统上尤其成立——等真出事的时候才发现备份文件损坏或者恢复步骤漏了一环代价就不是加班能解决的了。这套东西现在我在三四个环境里跑着最久的一个跑了三年多中间经历过副本迁移、域信任调整、证书轮换整体稳定性是让人放心的前提是前期规划别偷懒、日常巡检别省。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门