我在 centos vm 中有一个 ldap 服务器 + kerberos 设置(使用 boot2docker vm 运行)我正在尝试将它们用于我的 Web 应用程序身份验证(从主机 - 我的 macbook)。
对于身份验证,我需要使用"GSSAPI"机制,而不是简单的绑定。"简单绑定"运行良好,但基于"GSSAPI"的方法不起作用。
每当我尝试"ldapwhoami"命令时,我都会收到以下错误(我在运行 ldapwhoami 之前运行了"kinit"以确保我有有效的 kerberos TGT)
ldap_sasl_interactive_bind_s: Local error (-2)
additional info: SASL(-1): generic failure: GSSAPI Error: Miscellaneous failure (see text (unable to reach any KDC in realm DEV.EXAMPLE.COM, tried 1 KDC)
请注意,LDAP 服务器和 kerberos 服务器端运行良好,这意味着我在 centos VM 中使用"ldapsearch"、"ldapwhoami"之类的东西测试了它们,我有我的 ldap 服务器 + kerberos 设置,它工作正常。我能够看到他们的正确输出。
只有当我从笔记本电脑(客户端)尝试相同的命令时,我才收到错误(上述错误)。
注意:即使我创建了主机主体(主机/mymacbook.dev@DEV。EXAMPLE.COM)从我的笔记本电脑,并使用"kadmin"将其添加到我的本地krb5.keytab文件中。
以下是我的客户端配置:
客户端(macbook)中的/etc/krb5.conf 文件:
[libdefaults]
default_realm = DEV.EXAMPLE.COM
ticket_lifetime = 24000
dns_lookup_realm = false
dns_lookup_kdc = false
[realms]
DEV.EXAMPLE.COM = {
kdc = d4dc7089282c
admin_server = krb.example.com
}
[domain_realm]
.dev.example.com = DEV.EXAMPLE.COM
dev.example.com = DEV.EXAMPLE.COM
.example.com = DEV.EXAMPLE.COM
example.com = DEV.EXAMPLE.COM
[appdefaults]
pam = {
debug = false
ticket_lifetime = 36000
renew_lifetime = 36000
forwardable = true
krb4_convert = false
}
[logging]
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmin.log
客户端(macbook)中的/etc/hosts文件:
127.0.0.1 localhost
192.168.59.3 mymacbook.dev
255.255.255.255 broadcasthost
::1 localhost
192.168.59.103 ldapserver.example.com
192.168.59.103 d4dc7089282c
192.168.59.103 krb.example.com
192.168.59.103 是我的 boot2docker VM IP,我正在与 LDAP 和 Kerberos 相关的所有默认端口上从 boot2docker vm 到 docker 映像进行端口转发( 88、389、464 和 749)
知道为什么我会收到此错误吗?
ldap_sasl_interactive_bind_s: Local error (-2)
additional info: SASL(-1): generic failure: GSSAPI Error: Miscellaneous failure (see text (unable to reach any KDC in realm DEV.EXAMPLE.COM, tried 1 KDC)
它是否与 DNS 或其他内容有关?有什么建议吗?
在 MacOS 上,默认客户端不会回退到 TCP。在您的 krb.conf 中,在 kdc 前面加上 tcp/
,以强制客户端在网络阻止 UPD 流量时使用 TCP(就像某些网络管理员可能会做的那样)。
kdc = tcp/ds01.int.domain.com:88
您需要多种东西才能从外部访问容器化 KDC。
假设您使用的是端口 88,因为这是默认端口,并且还假设您的映像称为 docker-kdc。
- 确保您的端口 88 已公开。
EXPOSE 88
- 确保您的 KDC 守护程序侦听该端口。为了这个例子,我只是使用 KDC 作为入口点,如果这不适用于您的特定示例,您应该能够推断。
ENTRYPOINT ["/usr/lib/heimdal-servers/kdc", "--config-file=/etc/heimdal-kdc/kdc.conf", "-P 88"]
- 运行容器时,我使用端口转发朝向 48088。请注意,KDC 同时使用 TCP 和 UDP。
docker run -d -h kdc --name kdc -p 48088:88/udp -p 48088:88 docker-kdc
从这一点开始,您的 KDC 应该可以从主机系统内部访问。
=== 仅限 OSX ===
- 现在假设您使用的是OSX(boot2docker -> VirtualBox),您还需要设置到OSX环境的端口转发。
VBoxManage controlvm boot2docker-vm natpf1 "48088/tcp,tcp,127.0.0.1,48088,,48088"
VBoxManage controlvm boot2docker-vm natpf1 "48088/udp,udp,127.0.0.1,48088,,48088"
-
如果需要,获取 docker 容器的 IP 地址。
-
当使用普通 docker (在 linux 上)时,您可以简单地使用环回
127.0.0.1
。 -
当使用boot2docker(在OSX上)时,你将使用以下方法获得:
boot2docker ip
-
-
准备一个使用 KDC 的最小 krb5.conf。在本例中,我在域 example.com 上使用名为 EXAMPLE.COM 的领域。请注意,您必须将 IP 替换为步骤 5 的结果。
[库默认]
default_realm = EXAMPLE.COM noaddresses = true
[领域]
EXAMPLE.COM = { kdc = IP:48088 admin_server = IP:48088 }
[domain_realm]
example.com = EXAMPLE.COM .example.com = EXAMPLE.COM
- 现在继续测试该配置。
export KRB5_CONF=PATH_TO_THE_KRB5.CONF_FILE_FROM_STEP_6
kinit test/foo.example.com@EXAMPLE.COM
由于我必须为我的一个项目执行此操作,因此我将其全部打包到一些可能对您的进一步研究有所帮助的小脚本中;https://github.com/tillt/docker-kdc
确保 krb5.conf 文件位于 /etc 目录中。我遇到了同样的问题,没有防火墙问题,仍然遇到同样的错误。最后,我能够通过将 krb5.conf 文件移动到 /etc 目录来解决此问题。