kerberos 配置具有多个域的单个 kdc

kerberos config single kdc with multiple domains

我们正在尝试配置具有多个域的单个 kerberos 服务器(这是必需的),所以我最终创建了 2 个这样的数据库,并在每个数据库中创建了一些主体(一切都很好,我可以同时登录数据库和见不同的校长):

kdc.conf

[realms]
EXAMPLE1.COM =
{database_module=EXAMPLE1.COM
...}
EXAMPLE2.COM =
{database_module=EXAMPLE2.COM
...}

[dbmodules]
EXAMPLE1.COM=
{database_name=/var/kerberos/krb5kdc/principal
...}
EXAMPLE2.COM =
{database_name=/var/kerberos/krb5kdc/principal2
...}

krb5.conf 看起来像这样:

[realms]
EXAMPLE1.COM=
{ kdc= server.example1.com
admin_server = server.example1.com
default_domain = example1.com
...}
EXAMPLE2.COM =
{kdc= server.example2.com:61321
admin_server = server.example2.com:61321
default_domain = example2.com
...}

[domain_realm]
.example1.com = EXAMPLE1.COM
example1.com = EXAMPLE1.COM
.example2.com = EXAMPLE2.COM
example2.com = EXAMPLE2.COM

现在的问题是 kerberos 似乎不接受 example2 的不同领域的 kdc(但它适用于 example1):

kinit -V -t /tmp/krb5.example2.keytab user/example2@EXAMPLE2.com
keytab specified, forcing -k
Using default cache: /tmp/krb5cc_0
Using principal: user/example2@EXAMPLE2.com
Using keytab: /tmp/krb5.example2.keytab
kinit: Cannot contact any KDC for realm 'EXAMPLE2.com' while getting initial credentials

修改建议 graity 后,我用 systemctl edit --full krb5kdc.service 编辑服务文件并放在最后 -r EXAMPLE1 -r EXAMPLE2 现在它似乎工作得更好但我仍然得到一个错误我无法理解(不确定我是否应该添加不同的端口或发生了什么):

kinit -V -t /tmp/krb5.example2.keytab user/example2@EXAMPLE2.COM
keytab specified, forcing -k
Using default cache: /tmp/krb5cc_0
Using principal: user/example2@EXAMPLE2.COM
Using keytab: /tmp/krb5.example2.keytab
[355090] 1573732431.376189: Getting initial credentials for user/example2@EXAMPLE2.COM
[355090] 1573732431.376190: Looked up etypes in keytab: aes256-cts, aes128-cts, des3-cbc-sha1, rc4-hmac, des-hmac-sha1, des, des-cbc-crc
[355090] 1573732431.376192: Sending unauthenticated request
[355090] 1573732431.376193: Sending request (201 bytes) to CPD4PRE.NEO4J.GENCAT.CAT
[355090] 1573732431.376194: Resolving hostname host.example2.com
[355090] 1573732431.376195: Initiating TCP connection to stream 10.53.48.79:88
[355090] 1573732431.376196: Sending TCP request to stream 10.53.48.79:88
[355090] 1573732431.376197: Received answer (218 bytes) from stream 10.53.48.79:88
[355090] 1573732431.376198: Terminating TCP connection to stream 10.53.48.79:88
[355090] 1573732431.376199: Response was not from master KDC
[355090] 1573732431.376200: Received error from KDC: -1765328370/KDC has no support for encryption type
[355090] 1573732431.376201: Getting initial credentials for user/example2@EXAMPLE2.COM
[355090] 1573732431.376202: Looked up etypes in keytab: aes256-cts, aes128-cts, des3-cbc-sha1, rc4-hmac, des-hmac-sha1, des, des-cbc-crc
[355090] 1573732431.376204: Sending unauthenticated request
[355090] 1573732431.376205: Sending request (201 bytes) to EXAMPLE2.COM (master)
kinit: KDC has no support for encryption type while getting initial credentials

实际上我没有读到它需要不同的端口,所以我修改了它以便使用 61321 但它没有推高该端口上的任何套接字,它只是推默认端口 88,我假设是对于第一个(也是默认的)领域: {kdc= 服务器。example2.com:61321 admin_server = 服务器。example2.com:61321

root@example1.com:/root# netstat -netapl | grep 听 | grep krb tcp 0 0 0.0.0.0:88 0.0.0.0:* 听 0 9326395 362136/krb5kdc tcp6 0 0 :::88 :::* 听 0 9326396 362136/krb5kdc root@example1.com:/root#ps-ef | grep -i krb 根 362136 1 0 13:04 ? 00:00:00 /usr/sbin/krb5kdc -P /var/run/krb5kdc.pid -r EXAMPLE1.COM -r EXAMPLE2.COM root 363981 331025 0 13:08 pts/0 00:00:00 grep --color=auto -i krb

首先,您的 [realms] database_module 配置与 [dbmodules] 配置不匹配。您有 database_module=EXAMPLE1 但实际模块部分称为 EXAMPLE1.com.

(配置 layout/syntax 看起来也很奇怪。我希望这只是复制粘贴的产物,而不是实际的样子?)


其次,在 MIT Kerberos 中,KDC 进程 (krb5-kdc) 必须使用每个领域的 -r 参数启动。如果未指定,它将仅使用系统范围的 default_realm – 它不会枚举所有已配置的数据库。

将 systemd krb5-kdc.service 或 init.d 脚本编辑为 运行:

krb5kdc -r EXAMPLE1.COM -r EXAMPLE2.COM

不幸的是,在当前版本中,MIT Kerberos 的 kadmind 无法 实现相同的效果——它仅支持每个实例一个数据库。您可以 运行 多个 kadmind 实例(在不同的 TCP 端口上),或使用 kadmin.local 进行管理。


最后,您的 kinit 实际上并没有首先显示它是否联系了正确的 KDC。 (而且您也没有包含任何表明这一点的 KDC 日志。)

您可以通过导出 KRB5_TRACE=/dev/stderr 使 Kerberos 客户端更加详细。


另请注意,传统领域名称是 完全 大写,包括 TLD。因此,尽管 EXAMPLE1.com 完全有效,但它并不是软件默认所期望的。例如,如果您没有 [domain_realm] 部分,客户端将尝试自动将域映射到完全大写的领域,而不是您当前拥有的混合版本。