附录:原生安装 MIT KDC 实验环境
# 原生安装 MIT KDC 实验环境
如果手边没有现成的企业 KDC,可以先在集群外准备一台独立主机,搭建一套 MIT KDC,再按“外部 MIT KDC”模式接入 Ambari Plus。这样可以同时验证外部认证中心的网络、管理权限和平台接入边界。
本文沿用一次真实验收环境的参数:KDC 主机为 dev1.test.com,Realm 为 EXTDEV.TEST,KDC 数据放在 /data/extdev/kdc。示例没有包含公网 IP、密码或密钥,实际部署时请替换成自己的 FQDN 和 Realm。
注意
这是一套单节点外部 KDC,适合功能验证、测试和接入联调。生产环境还需要单独规划 KDC 副本、数据库备份、故障切换和运维权限,不能把本附录直接当成生产高可用方案。
# 先看清平台边界

外部模式下,Ambari Plus 负责给集群节点写客户端配置、创建服务 Principal、分发 Keytab 并切换集群认证模式。KDC 进程、Realm 数据、备份和恢复仍由外部管理员负责。
本次实测还确认了一条重要边界:平台解除外部 KDC 接入后,外部 KDC 的进程、启动时间和 Principal 集合都没有变化。也就是说,“停用 Kerberos”只解除当前集群关系,不等于卸载外部认证中心。
# 准备主机与软件包
我会先确认 KDC 主机满足下面这些条件:
- 使用稳定的 FQDN,例如
dev1.test.com,所有 Hadoop 节点都能解析这个名称。 - 与集群节点使用同一时间源,避免因为时钟偏差导致票据失效。
88/TCP、88/UDP和749/TCP没有被其他 KDC 占用。- 防火墙允许所有集群节点访问这些端口。
- KDC 主机不属于 Ambari Plus 当前托管的 KDC 拓扑。
不同系统的软件包名称不完全一样。dev1 实测环境是 Kylin V10 aarch64,使用 krb5-server、krb5-client 和 krb5-libs。
sudo dnf install -y krb5-server krb5-client
sudo dnf install -y krb5-server krb5-workstation
sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt install -y \
krb5-kdc krb5-admin-server krb5-user krb5-config
2
3
// Make sure to add code blocks to your code group
安装完成后确认命令已经可用:
command -v krb5kdc kadmind kdb5_util kadmin kinit

这里不仅要看到服务端命令,也要确认客户端工具已经安装。后面验证票据时会直接用到 kinit 和 klist。
# 建立独立目录
为了不覆盖主机上可能存在的 /etc/krb5.conf、默认 KDC 数据库或其他测试 Realm,我建议把配置、数据库、日志和密钥全部放进独立目录。
sudo install -d -m 700 \
/data/extdev/kdc/db \
/data/extdev/kdc/etc \
/data/extdev/kdc/log \
/data/extdev/kdc/run \
/data/extdev/kdc/secrets \
/data/extdev/kdc/systemd
2
3
4
5
6
7
这里的 EXTDEV.TEST、dev1.test.com 和 /data/extdev/kdc 是一组完整参数。修改时要同步替换后面所有配置和命令,不能只改 Realm 名称。
# 写入 Realm 配置
先创建 /data/extdev/kdc/etc/kdc.conf:
[kdcdefaults]
kdc_ports = 88
kdc_tcp_ports = 88
[realms]
EXTDEV.TEST = {
database_name = /data/extdev/kdc/db/principal
admin_keytab = /data/extdev/kdc/secrets/kadm5.keytab
acl_file = /data/extdev/kdc/etc/kadm5.acl
key_stash_file = /data/extdev/kdc/secrets/.k5.EXTDEV.TEST
kadmind_port = 749
kpasswd_port = 464
max_life = 24h
max_renewable_life = 7d
default_principal_flags = +preauth
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
再创建 /data/extdev/kdc/etc/krb5.conf:
[libdefaults]
default_realm = EXTDEV.TEST
dns_lookup_realm = false
dns_lookup_kdc = false
rdns = false
dns_canonicalize_hostname = false
ticket_lifetime = 24h
forwardable = true
udp_preference_limit = 1
[realms]
EXTDEV.TEST = {
kdc = dev1.test.com
admin_server = dev1.test.com
kpasswd_server = dev1.test.com
}
[domain_realm]
.test.com = EXTDEV.TEST
test.com = EXTDEV.TEST
[logging]
kdc = FILE:/data/extdev/kdc/log/krb5kdc.log
admin_server = FILE:/data/extdev/kdc/log/kadmind.log
default = FILE:/data/extdev/kdc/log/krb5lib.log
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
最后创建 /data/extdev/kdc/etc/kadm5.acl,先允许指定管理 Principal 维护这个 Realm:
admin/[email protected] *
收紧配置文件权限:
sudo chown -R root:root /data/extdev/kdc
sudo chmod 700 /data/extdev/kdc/{db,etc,log,run,secrets,systemd}
sudo chmod 600 /data/extdev/kdc/etc/{kdc.conf,krb5.conf,kadm5.acl}
2
3

截图中可以同时核对目录权限、Realm、主机名和端口。stash、密码与 Keytab 不应该出现在操作记录里。
笔记
示例中的 admin/admin 便于理解接入流程。生产环境建议使用专门的 KDC 管理 Principal,按企业规范限制权限,并在接入完成后轮换临时凭据。
# 初始化 KDC 数据库
下面两条环境变量很关键。它们让 MIT Kerberos 使用独立目录中的配置,不会误读系统默认配置。
export KRB5_CONFIG=/data/extdev/kdc/etc/krb5.conf
export KRB5_KDC_PROFILE=/data/extdev/kdc/etc/kdc.conf
umask 077
2
3
初始化 Realm 数据库:
sudo --preserve-env=KRB5_CONFIG,KRB5_KDC_PROFILE \
kdb5_util create -s -r EXTDEV.TEST
2
命令会交互式要求输入 KDC 数据库主密钥。不要把主密钥写在命令行、脚本、截图或文章里。
随后创建用于远程管理的 Principal:
sudo --preserve-env=KRB5_CONFIG,KRB5_KDC_PROFILE \
kadmin.local -r EXTDEV.TEST \
-q "addprinc admin/[email protected]"
2
3
这里输入的是 KDC 管理 Principal 密码,它与数据库主密钥、Ambari Plus 登录密码和 LDAP 管理密码都不是一回事。
# 使用独立 systemd 服务
创建 /data/extdev/kdc/systemd/extdev-krb5kdc.service:
[Unit]
Description=EXTDEV.TEST isolated external KDC
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
Environment=KRB5_CONFIG=/data/extdev/kdc/etc/krb5.conf
Environment=KRB5_KDC_PROFILE=/data/extdev/kdc/etc/kdc.conf
ExecStart=/usr/sbin/krb5kdc -n -r EXTDEV.TEST -p 88 -P /data/extdev/kdc/run/krb5kdc.pid
Restart=on-failure
RestartSec=3
UMask=0077
NoNewPrivileges=yes
PrivateTmp=yes
ProtectHome=yes
ProtectSystem=strict
ReadWritePaths=/data/extdev/kdc
[Install]
WantedBy=multi-user.target
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
创建 /data/extdev/kdc/systemd/extdev-kadmind.service:
[Unit]
Description=EXTDEV.TEST external KDC administration daemon
After=network-online.target extdev-krb5kdc.service
Requires=extdev-krb5kdc.service
[Service]
Type=simple
Environment=KRB5_CONFIG=/data/extdev/kdc/etc/krb5.conf
Environment=KRB5_KDC_PROFILE=/data/extdev/kdc/etc/kdc.conf
ExecStart=/usr/sbin/kadmind -nofork -r EXTDEV.TEST -port 749 -P /data/extdev/kdc/run/kadmind.pid
Restart=on-failure
RestartSec=3
UMask=0077
NoNewPrivileges=yes
PrivateTmp=yes
ProtectHome=yes
ProtectSystem=strict
ReadWritePaths=/data/extdev/kdc
[Install]
WantedBy=multi-user.target
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
安装并启动两个服务:
sudo install -m 0644 \
/data/extdev/kdc/systemd/extdev-krb5kdc.service \
/etc/systemd/system/extdev-krb5kdc.service
sudo install -m 0644 \
/data/extdev/kdc/systemd/extdev-kadmind.service \
/etc/systemd/system/extdev-kadmind.service
sudo systemctl daemon-reload
sudo systemctl enable --now extdev-krb5kdc.service extdev-kadmind.service
2
3
4
5
6
7
8
9
10
查看进程和监听端口:
sudo systemctl --no-pager --full status \
extdev-krb5kdc.service extdev-kadmind.service
sudo ss -lntup | grep -E ':(88|464|749)\b'
2
3
4

正常情况下至少可以看到 KDC 的 88/TCP、88/UDP 和管理服务的 749/TCP。如果准备使用 Kerberos 改密协议,还要放通并检查 464/TCP、464/UDP。
使用 firewalld 放通端口
sudo firewall-cmd --permanent --add-port=88/tcp
sudo firewall-cmd --permanent --add-port=88/udp
sudo firewall-cmd --permanent --add-port=749/tcp
sudo firewall-cmd --permanent --add-port=464/tcp
sudo firewall-cmd --permanent --add-port=464/udp
sudo firewall-cmd --reload
2
3
4
5
6
如果现场使用云安全组、硬件防火墙或其他主机防火墙,还要在对应位置设置同样的访问范围。不要为了省事直接向公网开放这些端口。
# 从集群节点验证取票
不要一启动服务就直接进入 Ambari Plus 向导。先在 hadoop1.test.com、hadoop2.test.com 和 hadoop3.test.com 分别验证 DNS、端口与取票。
在每台节点准备一份临时客户端配置 /tmp/extdev-krb5.conf:
[libdefaults]
default_realm = EXTDEV.TEST
dns_lookup_realm = false
dns_lookup_kdc = false
rdns = false
dns_canonicalize_hostname = false
[realms]
EXTDEV.TEST = {
kdc = dev1.test.com:88
admin_server = dev1.test.com:749
}
[domain_realm]
.test.com = EXTDEV.TEST
test.com = EXTDEV.TEST
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
逐台执行:
getent hosts dev1.test.com
timeout 5 bash -c '</dev/tcp/dev1.test.com/88'
timeout 5 bash -c '</dev/tcp/dev1.test.com/749'
export KRB5_CONFIG=/tmp/extdev-krb5.conf
kdestroy -A 2>/dev/null || true
kinit admin/[email protected]
klist
kvno krbtgt/[email protected]
2
3
4
5
6
7
8
9

端口连通要从三台 Agent 节点分别确认。只在 dev1.test.com 本机看到监听,并不能证明集群节点真的能访问外部 KDC。
klist 中应看到默认 Principal 为 admin/[email protected],票据签发方为 krbtgt/[email protected]。

为了避免管理密码进入截图,这里使用临时 Principal 和临时 Keytab 验证 TGT 签发。验证完成后应立即删除临时 Principal、Keytab 和票据缓存。
然后在一台节点上验证远程管理写入。进入交互式 kadmin 后创建、查询并删除临时 Principal:
export KRB5_CONFIG=/tmp/extdev-krb5.conf
kadmin -p admin/[email protected]
2
kadmin: addprinc -randkey [email protected]
kadmin: getprinc [email protected]
kadmin: delprinc -force [email protected]
kadmin: quit
2
3
4
只有 kinit 和远程 kadmin 都通过,才能说明外部 KDC 同时具备取票能力和平台创建服务 Principal 所需的管理能力。
# 接入 Ambari Plus
KDC 验证完成后,回到 Ambari Plus 的外部接入向导,填写:
| 页面字段 | 本次示例 |
|---|---|
| 认证服务主机 | dev1.test.com |
| Realm | EXTDEV.TEST |
| 域名映射 | .test.com,test.com |
| 管理服务主机 | dev1.test.com |
| KDC 端口 | 88 |
| KDC 管理账号 | admin/[email protected] |
| KDC 管理密码 | 创建管理 Principal 时设置的密码。 |
接下来的页面操作、预检、执行计划和结果验证见 外部 MIT KDC 接入。
# 验收时我会检查什么
| 检查项 | 预期结果 |
|---|---|
| 三节点取票 | hadoop1、hadoop2、hadoop3 都能获得 EXTDEV.TEST 票据。 |
| 管理写入 | 可以创建、查询并删除临时 Principal。 |
| 平台所有权 | 页面显示外部 MIT KDC,而不是平台托管 KDC。 |
| 服务身份 | 外部 Realm 中出现平台创建的服务 Principal。 |
| Keytab | 目标主机收到对应 Keytab,服务能够使用它启动。 |
| 服务恢复 | 接入完成后,原先运行的服务恢复并通过最终 Service Check。 |
| 解除接入 | 平台只切回非 Kerberos 模式,不停止 KDC、不删除 Realm 数据。 |
如果其中任何一项失败,不要只看页面上的“已启用”。外部 KDC 接入真正闭环,需要同时证明网络、取票、管理写入、Keytab、服务恢复和外部所有权边界都成立。
# 留一份可恢复的备份
即使是测试 KDC,也建议在接入前保存一次数据库转储,并把配置、ACL、stash 和转储文件放到受控的安全目录。
sudo install -d -m 700 /data/extdev/kdc-backup
sudo env \
KRB5_CONFIG=/data/extdev/kdc/etc/krb5.conf \
KRB5_KDC_PROFILE=/data/extdev/kdc/etc/kdc.conf \
kdb5_util dump /data/extdev/kdc-backup/extdev-$(date +%Y%m%d).dump
sudo chmod 600 /data/extdev/kdc-backup/*
2
3
4
5
6
7
8
不要把 stash、数据库转储、管理密码或 Keytab 上传到文档站、代码仓库和普通工单附件。需要截图时,也要先把这些内容、IP、账号和密钥信息打码。