4

我在 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 服务器端运行良好,这意味着我在我有 ldap 服务器 + kerberos 设置的 centos VM 中使用“ldapsearch”、“ldapwhoami”等内容对它们进行了测试,它工作正常。我能够看到他们的正确输出。

只有当我从我的笔记本电脑(客户端)尝试相同的命令时,我才会收到错误(以上错误)。

注意:即使我从笔记本电脑创建了主机主体 (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,我在与 LDAP 和 kerberos 相关的所有默认端口(88、389、464 和 749)上进行从 boot2docker vm 到 docker 映像的端口转发

知道为什么我会收到此错误吗?

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或其他有关吗?有什么建议么?

4

3 回答 3

6

在 MacOS 上,默认客户端不会回退到 TCP。如果您的网络阻止了 UPD 流量(正如某些网络管理员可能会做的那样) ,请在您的 krb.conf 中为您的 kdc 添加前缀tcp/以强制客户端使用 TCP。

kdc = tcp/ds01.int.domain.com:88
于 2017-02-14T17:18:23.960 回答
4

您需要做很多事情才能让容器化的 KDC 可以从外部访问。

假设您使用的是默认端口 88,并且还假设您的图像被称为docker-kdc

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

EXPOSE 88

  1. 确保您的 KDC 守护程序侦听该端口。为了这个例子,我只是使用 KDC 作为入口点,如果这不适用于您的特定示例,您应该能够推断。

ENTRYPOINT ["/usr/lib/heimdal-servers/kdc", "--config-file=/etc/heimdal-kdc/kdc.conf", "-P 88"]

  1. 运行容器时,我使用向 48088 的端口转发。请注意,KDC 同时使用TCP 和 UDP

docker run -d -h kdc --name kdc -p 48088:88/udp -p 48088:88 docker-kdc

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


===仅限 OSX ===

  1. 现在鉴于您使用的是 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"


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

    • 使用普通 docker(在 linux 上)时,您可以简单地使用 loopback 127.0.0.1

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

  2. 准备一个使用 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
  1. 现在继续测试该配置。

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

于 2014-11-25T00:00:47.213 回答
1

确保krb5.conf文件位于/etc目录中。我有同样的问题并且没有防火墙问题,仍然遇到同样的错误。最后,我能够通过将 krb5.conf 文件移动到/etc目录来解决这个问题。

于 2017-01-12T21:12:06.493 回答