我在centos vm中设置了ldap服务器+ kerberos(使用boot2docker vm运行)我正在尝试将它们用于我的Web应用程序身份验证(来自主机 - 我的macbook)。
对于身份验证,我需要使用“GSSAPI”机制,而不是简单绑定。 'simple bind'工作正常,但基于“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设置,它的工作正常。我能够看到他们的正确输出。
只有当我从笔记本电脑(客户端)尝试相同的命令时,我才会收到错误(错误之上)。
注意:即使我从笔记本电脑创建了主机主体(host/mymacbook.dev@DEV.EXAMPLE.COM),也使用'kadmin'将其添加到我的本地krb5.keytab文件中。
以下是我的客户端配置:
客户端(macbook)中的[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,我正在从boot2docker vm端口转发到与LDAP和kerberos相关的所有默认端口上的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或其他相关?有什么建议吗?
答案 0 :(得分:3)
您需要多种方法才能从外部获得容器化的KDC。
让我们假设您正在使用端口88,因为这是默认设置,并且还假设您的图像被称为 docker-kdc 。
EXPOSE 88
ENTRYPOINT ["/usr/lib/heimdal-servers/kdc", "--config-file=/etc/heimdal-kdc/kdc.conf", "-P 88"]
docker run -d -h kdc --name kdc -p 48088:88/udp -p 48088:88 docker-kdc
从此时起,您的KDC应该可以从主机系统中访问。
=== 仅限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地址。
使用普通泊坞窗(在Linux上)时,您只需使用环回127.0.0.1
。
使用boot2docker(在OSX上)时,您可以使用:boot2docker ip
准备一个使用KDC的最小krb5.conf。为了这个例子,我在域example.com上使用一个名为EXAMPLE.COM的域。 请注意,您必须将 IP 替换为步骤5的结果。
[libdefaults]
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
答案 1 :(得分:3)
在MacOS上,默认客户端不会回退到TCP。
在你的krb.conf前缀中你的kdc与tcp/
强制客户端使用TCP,如果你的网络阻止UPD流量(正如一些网络管理员可能做的那样)。
kdc = tcp/ds01.int.domain.com:88
答案 2 :(得分:1)
确保 krb5.conf 文件位于 / etc 目录中。我有同样的问题,没有防火墙问题,仍然得到相同的错误。最后,我能够通过将krb5.conf文件移动到 / etc 目录来解决问题。