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