openldap + kerberos - не может достичь ни одного KDC в мире

У меня есть настройка ldap server + kerberos в centos vm (работает с использованием boot2docker vm), и я пытаюсь использовать их для аутентификации моего веб-приложения (с хоста - моего macbook).

Для аутентификации мне нужно использовать механизм "GSSAPI", а не простую привязку. "Простое связывание" работает отлично, но подход, основанный на "GSSAPI", не работает.

Я получаю следующую ошибку всякий раз, когда я пытаюсь выполнить команду "ldapwhoami" (я запустил "kinit" перед запуском ldapwhoami, чтобы убедиться, что у меня есть действующий 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 работают отлично, это означает, что я протестировал их с такими вещами, как "ldapsearch", "ldapwhoami" в виртуальной машине centos, где у меня есть настройка ldap server + kerberos, все работает нормально. Я могу видеть правильный выход для них.

Я получаю ошибки (выше ошибки) только тогда, когда я пробую ту же команду с моего ноутбука (клиента).

Примечание: даже я создал принципал хоста (host/mymacbook.dev@DEV.EXAMPLE.COM) со своего ноутбука и добавил его в мой локальный файл krb5.keytab, используя 'kadmin'.

Ниже приведены мои конфигурации на стороне клиента:

Файл /etc/krb5.conf в клиенте (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

Файл /etc/hosts в клиенте (macbook):

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 ( 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 ответа

Решение

Вам нужно несколько вещей, чтобы получить контейнерный 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. При необходимости получите IP-адрес вашего док-контейнера.

    • При использовании обычного докера (в Linux), вы можете просто использовать loopback 127.0.0.1,

    • При использовании boot2docker (в OSX) вы получите это, используя: boot2docker ip

  2. Подготовьте минимальный krb5.conf, который использует KDC. Ради этого примера я использую область 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

В MacOS клиент по умолчанию не использует TCP. в вашем префиксе krb.conf ваш kdc с tcp/ заставить клиента использовать TCP, если ваша сеть блокирует трафик UPD (как могут это делать некоторые сетевые администраторы).

kdc = tcp/ds01.int.domain.com:88

Убедитесь, что файл krb5.conf находится в каталоге /etc. У меня была та же проблема, и у меня не было проблем с брандмауэром. Наконец, я смог решить проблему, переместив файл krb5.conf в каталог /etc.

Другие вопросы по тегам