openldap + kerberos - 无法到达任何KDC领域

时间:2014-11-21 03:17:31

标签: ldap docker kerberos openldap kdc

我在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)中的 /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,我正在从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或其他相关?有什么建议吗?

3 个答案:

答案 0 :(得分:3)

您需要多种方法才能从外部获得容器化的KDC。

让我们假设您正在使用端口88,因为这是默认设置,并且还假设您的图像被称为 docker-kdc

  1. 确保您的端口88已暴露。
  2. EXPOSE 88

    1. 确保您的KDC守护程序侦听该端口。为了这个例子,我只是简单地使用KDC作为入口点,如果不适用于你的具体例子,你应该能够推断出来。
    2. ENTRYPOINT ["/usr/lib/heimdal-servers/kdc", "--config-file=/etc/heimdal-kdc/kdc.conf", "-P 88"]

      1. 运行容器时,我正在使用端口转发48088.请注意,KDC同时使用 TCP和UDP
      2. docker run -d -h kdc --name kdc -p 48088:88/udp -p 48088:88 docker-kdc

        从此时起,您的KDC应该可以从主机系统中访问。


        === 仅限OSX ===

        1. 现在假设您使用的是OSX(boot2docker - > VirtualBox),您还需要为您的OSX环境设置端口转发。
        2. 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"


          1. 如果需要,获取docker容器的IP地址。

            • 使用普通泊坞窗(在Linux上)时,您只需使用环回127.0.0.1

            • 使用boot2docker(在OSX上)时,您可以使用:boot2docker ip

          2. 准备一个使用KDC的最小krb5.conf。为了这个例子,我在域example.com上使用一个名为EXAMPLE.COM的域。 请注意,您必须将 IP 替换为步骤5的结果。

          3.   

            [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
            
            1. 现在继续测试该配置。
            2. 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 目录来解决问题。