导读:本期聚焦于花满楼创作的《如何在Ubuntu上部署Heimdal Kerberos实现集中式身份认证?》,敬请观看详情。Kerberos协议以票据机制实现安全的网络身份认证,而Heimdal是其中一款开源实现。部署Heimdal Kerberos时,很多人会在密钥分发中心(KDC)的初始化与数据库配置环节卡住,尤其是krb5.conf中realm与domain_realm的映射关系容易弄混。这篇文章从Ubuntu Server 22.04环境出发,一条一条梳理安装heimdal-kdc、创建Kerberos数据库、配置访问控制列表,以及客户端如何通过kinit获取票据。文中还会对比MIT Kerberos与Heimdal在配置文件路径和工具命令上的差异,并指出常见的加密类型、时间同步和DNS反向解析等坑。照着操作完成后,你可以用klist验证票据,为后续接入SSH或NFS服务打下基础。

Kerberos是一种基于对称密钥体制的第三方认证协议,客户端、服务端和认证中心三者通过票据(Ticket)建立信任关系。Heimdal作为Kerberos 5协议的开源实现,在Ubuntu的软件仓库中提供了完整的服务端和客户端工具包。与MIT Kerberos相比,Heimdal的默认配置文件路径和部分命令参数略有不同,部署时如果沿用MIT的习惯容易走弯路。

本文以Ubuntu Server 22.04为例,目标是在一台主机上完成密钥分发中心(KDC)的安装和配置,并让同一网络内的其他Ubuntu主机作为客户端通过kinit获取票据。整个过程涉及主机名规划、时间同步、软件包安装、数据库初始化、访问控制列表编辑以及客户端配置验证。

安装前的环境准备与主机名规划

Kerberos对时间同步有严格要求,客户端与服务端的时间偏差通常不能超过5分钟,否则票据校验会直接失败。因此在开始安装之前,建议先用chrony或systemd-timesyncd将系统时钟与NTP服务器同步。Ubuntu Server默认启用了systemd-timesyncd,可以用timedatectl status查看同步状态。如果时间偏差过大,执行sudo timedatectl set-ntp true并等待几秒即可。

其次,Kerberos的realm名称习惯上使用大写字母的域名形式,例如EXAMPLE.COM。主机名需要使用完全限定域名(FQDN),不能是短主机名。假设KDC主机IP为192.168.10.10,主机名为kdc.ippipp.com,那么需要确保/etc/hosts文件中存在类似下面的映射,同时反向解析不要指向localhost。因为在票据请求过程中,客户端会根据服务主体名称(SPN)中的主机名去解析地址,错误的主机名解析会导致“Server not found in Kerberos database”错误。

# 编辑 /etc/hosts
127.0.0.1 localhost
192.168.10.10 kdc.ippipp.com kdc

注意,以上代码块中反斜杠不是特殊字符,本文所有命令里的路径分隔符都会原样保留,例如/etc/krb5.conf中的斜杠不受影响。对于Windows路径风格的场景,反斜杠也会保留,但这里Linux环境使用正斜杠。

安装Heimdal KDC并初始化数据库

Ubuntu软件仓库中Heimdal相关的软件包主要有三个:heimdal-kdc提供密钥分发中心服务,heimdal-clients提供kinit、klist等客户端工具,heimdal-servers提供kadmin等管理工具。在KDC主机上执行下面命令安装全部软件包:

sudo apt update
sudo apt install heimdal-kdc heimdal-clients heimdal-servers

安装过程中可能会提示输入默认realm名称,这里设置为EXAMPLE.COM。如果安装时没有设置,之后可以手动编辑/etc/krb5.conf并修改default_realm。Heimdal的krb5.conf结构与MIT版本基本一致,但某些默认库路径不同。一个最小化的KDC配置如下:

[libdefaults]
    default_realm = EXAMPLE.COM
    forwardable = true
    proxiable = true

[realms]
    EXAMPLE.COM = {
        kdc = kdc.ippipp.com
        admin_server = kdc.ippipp.com
    }

[domain_realm]
    .ippipp.com = EXAMPLE.COM
    ippipp.com = EXAMPLE.COM

保存配置文件后,接下来需要创建Kerberos数据库并设置主密钥(master key)。Heimdal使用/var/lib/heimdal-kdc/目录存放数据库文件,初始化数据库的命令是kadmin -l,其中-l表示本地管理,不需要经过网络认证。执行下面的命令会提示输入主密钥,该密钥用于加密数据库,务必妥善保存。

sudo kadmin -l init EXAMPLE.COM

初始化完成后,数据库文件会生成在/var/lib/heimdal-kdc/heimdal.db。然后需要添加管理员主体,通常使用/admin后缀,例如admin/admin。执行下面命令进入本地管理模式并添加主体:

sudo kadmin -l add admin/admin

系统会提示输入该主体的密码,这个密码之后用于远程管理KDC。添加完成后,需要为管理员主体设置访问控制权限。编辑/etc/heimdal-kdc/kadmind.acl文件,添加下面一行,表示admin/admin主体拥有所有权限:

admin/admin@EXAMPLE.COM *

Heimdal的KDC服务由heimdal-kdc和heimdal-kadmind两个进程组成,前者处理票据签发,后者处理管理请求。启动服务并设置开机自启:

sudo systemctl restart heimdal-kdc
sudo systemctl restart heimdal-kadmind
sudo systemctl enable heimdal-kdc heimdal-kadmind

到这里KDC端就绪,可以用kadmin -p admin/admin远程测试管理连接。如果提示无法连接,检查kadmind是否监听749端口,以及防火墙是否放行88和749端口的TCP/UDP流量。

配置客户端主机实现票据获取

在另一台Ubuntu主机上,只需要安装heimdal-clients包,然后编辑/etc/krb5.conf,内容与KDC端基本一致,但不需要realms段中的kdc地址指向本机,而是指向KDC主机IP或域名。客户端同样需要保证时间同步和主机名解析正确。例如客户端主机名设为client.ippipp.com,在/etc/hosts中添加对应条目。

sudo apt install heimdal-clients
sudo nano /etc/krb5.conf

客户端配置文件可以简化,只需要libdefaults中的default_realm和domain_realm映射,以及realms段中的kdc地址。如果内网没有DNS服务器,还可以在krb5.conf中使用[libdefaults]下的dns_lookup_kdc = false,避免DNS查询带来的延迟。完成配置后,首先用kinit获取管理员票据,验证整个链路是否正常:

kinit admin/admin
Password for admin/admin@EXAMPLE.COM:

输入密码后,使用klist查看票据缓存。如果出现类似“Ticket cache: FILE:/tmp/krb5cc_1000”以及有效期的信息,说明客户端已经成功从KDC获取了票据授予票据(TGT)。此时可以进一步使用kvno命令测试特定服务的票据,比如kvno host/kdc.ippipp.com,这也是后续配置SSO或NFS时常用的调试手段。

Heimdal与MIT Kerberos的一个显著差异在于默认的凭据缓存类型。Heimdal默认使用文件缓存,路径为/tmp/krb5cc_uid,而MIT Kerberos在较新版本中默认使用DIR:缓存。如果在同一台主机上混用两个实现,可能会出现kinit成功但klist读不到票据的情况。因此建议在Ubuntu环境中统一使用Heimdal工具集,避免不必要的冲突。

常见错误排查与性能调优

部署过程中最常见的错误就是时间不同步和DNS反向解析失败。前者可以用date命令对比KDC与客户端时间,后者可以用getent hosts kdc.ippipp.com检查解析结果。如果反向解析返回了127.0.1.1之类的地址,需要修改/etc/hosts或DNS记录。另一个高频问题是加密类型不匹配。Heimdal默认支持的加密类型包括aes256-cts-hmac-sha1-96和aes128-cts-hmac-sha1-96,而旧版MIT或Windows域可能仍然使用rc4-hmac。如果遇到“KDC has no support for encryption type”错误,可以在krb5.conf的libdefaults段中通过default_tgs_enctypes和default_tkt_enctypes显式指定双方都支持的加密类型。

在较大规模环境下,KDC的数据库访问性能会逐渐成为瓶颈。Heimdal默认使用基于Berkeley DB的本地文件存储,适合数十到数百个主体的场景。如果需要更高并发或高可用,可以考虑将数据库迁移到LDAP后端,Heimdal支持通过hdb-ldap模块使用OpenLDAP存储主体信息。不过该方案配置较为复杂,需要额外安装heimdal-dev和libldap2-dev,并重新编译相关模块。对于中小型内部系统,本地文件数据库完全够用。

安全性方面,主密钥文件的权限必须严格控制。数据库文件/var/lib/heimdal-kdc/heimdal.db以及密钥存储文件应当仅允许root用户读取。定期备份数据库可以使用kadmin -l dump命令导出文本格式的主体列表,配合cron任务实现自动化。另外,不建议在生产环境中使用DES或3DES等弱加密类型,可以通过在krb5.conf中设置allow_weak_crypto = false来禁止弱加密。

完成KDC部署后,可以进一步将SSH服务集成到Kerberos认证中。在服务端启用GSSAPIAuthentication并配置对应的服务主体,客户端使用kinit获取TGT后即可免密登录,同时保持票据的可追踪性。这种集中式身份认证方式大大简化了多主机环境下的账户管理,也为后续接入NFS、HTTP等支持GSS-API的服务铺平了道路。

UbuntuHeimdal Kerberos身份认证修改时间:2026-08-30 17:13:06

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。