Невозможно использовать аутентификацию LDAP с помощью JupyterHub: ошибка неработающего канала

#ldap #jupyterhub

#ldap #jupyterhub

Вопрос:

Я настроил и сервер LDAP с помощью Docker (https://github.com/osixia/docker-openldap ), а также установил Jupyterhub на той же машине. К сожалению, соединение между LDAP-сервером и JupyterHub не работает. Это строки, соответствующие аутентификации LDAP в jupyterhub_config.py :

 c.JupyterHub.authenticator_class = 'ldapauthenticator.LDAPAuthenticator'
c.LDAPAuthenticator.server_address = '192.168.48.2' # Docker Container IP of openldap
c.LDAPAuthenticator.lookup_dn = True
c.LDAPAuthenticator.use_ssl = False
# c.LDAPAuthenticator.bind_dn_template = ["cn={username},dc=example,dc=com"]
  

(Переключение между двумя последними строками не имеет значения.)

Когда я пытаюсь войти на страницу входа в JupyterHub, появляется следующая ошибка:

 ldap3.core.exceptions.LDAPSocketSendError: socket sending error[Errno 32] Broken pipe
  

Я могу «получить доступ» к базе данных LDAP из командной строки с помощью ldapsearch:

 ldapsearch -x -H ldap://192.168.48.2 -b dc=example,dc=com -D "cn=admin,dc=example,dc=com" -w password
  

Отключение брандмауэра также не имеет значения (думал о некоторых сетевых проблемах между Docker (openldap) и jupyterhub).

 jupyterhub==1.1.0
jupyterhub-ldapauthenticator==1.3.2
  

Я смог воспроизвести эту проблему за ldap3 пределами JupyterHub:

 # Get IP of dockerized OpenLDAP
import docker
client = docker.DockerClient()
container = client.containers.get("openldap")
ip_add = container.attrs['NetworkSettings']['Networks']['ldap_default']['IPAddress']

# Check Connection
from ldap3 import Server, Connection, ALL
server = Server(ip_add,use_ssl=False,port=389)
conn = Connection(server)
print(conn.bind(read_server_info=True))

> True
  

Когда я теперь заменяю ssl=False на ssl=True него, возвращается та же ошибка, что и с JupyterHub:

 # Check Connection
from ldap3 import Server, Connection, ALL
server = Server(ip_add,use_ssl=True,port=636
conn = Connection(server)
print(conn.bind(read_server_info=True))

Traceback (most recent call last):
  File "test_connection.py", line 11, in <module>
    print(conn.bind(read_server_info=True))
  File "/opt/anaconda3/lib/python3.8/site-packages/ldap3/core/connection.py", line 590, in bind
    response = self.post_send_single_response(self.send('bindRequest', request, controls))
  File "/opt/anaconda3/lib/python3.8/site-packages/ldap3/strategy/base.py", line 330, in send
    self.sending(ldap_message)
  File "/opt/anaconda3/lib/python3.8/site-packages/ldap3/strategy/base.py", line 882, in sending
    raise communication_exception_factory(LDAPSocketSendError, type(e)(str(e)))(self.connection.last_error)
ldap3.core.exceptions.LDAPSocketSendError: socket sending error[Errno 32] Broken pipe
  

Похоже, это как-то связано с SSL / TLS / StartTLS. Если я отключу ssl jupyterhub_config.py аутентификатор, он (попытается) обновиться с помощью StartTLS.

LDAPAuthenticator.use_ssl

Логическое значение, указывающее, следует ли использовать SSL-шифрование при обращении к серверу LDAP. Если оставить значение False (по умолчанию), LDAPAuthenticator попытается обновить соединение с помощью StartTLS. Установите для этого значение True, чтобы начать SSL-соединение. (URL: https://github.com/jupyterhub/ldapauthenticator 🙂

Ответ №1:

Попробуйте заменить :

   c.LDAPAuthenticator.server_address= 'ldaps://192.168.48.2:636' or 'ladp://192.168.48.2:389'
  

636 и 389 являются портами по умолчанию для ldap и ldap

Комментарии:

1. Спасибо за ваш ответ. К сожалению, это тоже не сработало. Я переместил LDAP на локальную установку вместо docker, и теперь все работает нормально.