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.
- Убедитесь, что ваш порт 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"
При необходимости получите IP-адрес вашего док-контейнера.
При использовании обычного докера (в Linux), вы можете просто использовать loopback
127.0.0.1
,При использовании boot2docker (в OSX) вы получите это, используя:
boot2docker ip
Подготовьте минимальный 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
- Теперь попробуйте и протестируйте эту конфигурацию.
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.