LDAP провайдер аутентификации
Описание
Этот провайдер аутентификации проверяет учетные данные пользователя в LDAP, а затем выдает токен доступа.
Все запросы к бэкенду должны выполняться с передачей этого токена доступа. Если срок действия токена истек, необходимо запросить новый токен аутентификации.
После успешной аутентификации имя пользователя сохраняется в базе данных бэкенда. Затем оно используется для создания записей аудита при любом изменении объекта, см. поле changed_by.
Внимание!
Пока токен действителен, запросы к LDAP для проверки существования пользователя и его блокировки не выполняются. Поэтому не устанавливайте слишком длительное время истечения срока действия токена доступа (например, больше дня).
Стратегии
Примечание
Базовая терминология LDAP объясняется здесь: Обзор LDAP
Существуют 2 стратегии проверки пользователя в LDAP:
- Попытка вызвать запрос
bindв LDAP сDN(DistinguishedName) и паролем пользователя.DNгенерируется с использованиемbind_dn_template - Сначала попытка поиска пользователя (запрос
search) в LDAP для полученияDNпользователя с помощью некоторого запроса, а затем попытка вызватьbindс использованием этогоDN. См.настройки поиска
По умолчанию используется стратегия поиска, так как она может найти пользователя в сложной среде LDAP/ActiveDirectory. Например:
- вы можете искать пользователя по
uid, например,(uid={login})или(sAMAccountName={login}) - вы можете искать пользователя по нескольким атрибутам, например,
(|(uid={login})(mail={login}@domain.com)) - вы можете фильтровать записи, например,
(&(uid={login})(objectClass=person) - вы можете фильтровать пользователей, соответствующих определенной группе или другому условию, например,
(&(uid={login})(memberOf=cn=MyPrettyGroup,ou=Groups,dc=mycompany,dc=com))
После того как пользователь найден в LDAP, его uid_attribute используется для записей аудита.
Схема взаимодействия
sequenceDiagram
participant "Клиент"
participant "Бэкенд"
participant "LDAP"
activate "Клиент"
alt Успешный кейс
"Клиент" ->> "Бэкенд" : логин + пароль
"Бэкенд" ->> "Бэкенд" : DN = bind_dn_template(login)
"Бэкенд" ->> "LDAP" : Вызов bind(DN, password)
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда,\nusername = login
"Бэкенд" ->> "Бэкенд" : Создание пользователя, если не существует
else Неверные учетные данныве | Пользователь заблокирован в LDAP
"Клиент" ->> "Бэкенд" : логин + пароль
"Бэкенд" ->> "Бэкенд" : DN = bind_dn_template(login)
"Бэкенд" ->> "LDAP" : Вызов bind(DN, password)
"LDAP" --x "Бэкенд" : Ошибка связываения
"Бэкенд" --x "Клиент" : 401 Unauthorized
else Пользователь заблокирован во внутренней базе данных бэкенда
"Клиент" ->> "Бэкенд" : логин + пароль
"Бэкенд" ->> "Бэкенд" : DN = bind_dn_template(login)
"Бэкенд" ->> "LDAP" : Вызов bind(DN, password)
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда,\nusername = login
"Бэкенд" --x "Клиент" : 404 Не найден
else Пользователь удален из внутренней базы данных Бэкенда
"Клиент" ->> "Бэкенд" : логин + пароль
"Бэкенд" ->> "Бэкенд" : DN = bind_dn_template(login)
"Бэкенд" ->> "LDAP" : Вызов bind(DN, password)
"LDAP" ->> "Бэкенд" : Возвращение информации по пользователю
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда,\nusername = login
"Бэкенд" --x "Клиент" : 404 Не найден
else LDAP недоступен
"Клиент" ->> "Бэкенд" : логин + пароль
"Бэкенд" ->> "Бэкенд" : DN = bind_dn_template(login)
"Бэкенд" --x "LDAP" : вызов bind(DN, password)
"Бэкенд" --x "Клиент" : 503 сервис недоступен
end
alt Успешный кейс
"Клиент" ->> "Бэкенд" : токен доступа
"Бэкенд" ->> "Бэкенд" : Проверка токена
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда
"Бэкенд" ->> "Бэкенд" : Получение данных
"Бэкенд" ->> "Клиент" : Возвращение данных
else Токен истек
"Клиент" ->> "Бэкенд" : токен доступа
"Бэкенд" ->> "Бэкенд" : Проверка токена
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда
"Бэкенд" --x "Клиент" : 401 Неавторизован
else Пользователь заблокирован
"Клиент" ->> "Бэкенд" : токен доступа
"Бэкенд" ->> "Бэкенд" : Проверка токена
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда
"Бэкенд" --x "Клиент" : 401 неавторизован
else
"Клиент" ->> "Бэкенд" : токен доступа
"Бэкенд" ->> "Бэкенд" : Проверка токена
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда
"Бэкенд" --x "Клиент" : 401 неавторизован
end
deactivate "Клиент"
sequenceDiagram
participant "Клиент"
participant "Бэкенд"
participant "LDAP"
"Бэкенд" -> "LDAP" : bind(lookup.username, lookup.password)
activate "LDAP"
Note right of "LDAP" : Открытие пула\nсоединений для\nпоисковых запросов\n(опционально, рекомендуется)
activate "Клиент"
alt Успешный кейс
"Клиент" ->> "Бэкенд" : логин + пароль
"Бэкенд" ->> "Бэкенд" : query = query_template(login)
"Бэкенд" ->> "LDAP" : Вызов search(query, base_dn, attributes=*)
activate "LDAP"
"LDAP" ->> "Бэкенд" : Возвращение пользовательского DN and uid атрибутов
deactivate "LDAP"
"Бэкенд" ->> "LDAP" : Вызов bind(DN, password)
"LDAP" ->> "Бэкенд" : Успешно
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда,\nusername = uid_attribute из ответа LDAP
"Бэкенд" ->> "Бэкенд" : Создание пользователя, если не существует
"Бэкенд" ->> "Клиент" : Генерация и возвращение токена доступа
else Неверные учетные данныве | Пользователь заблокирован в LDAP
"Клиент" ->> "Бэкенд" : логин + пароль
"Бэкенд" ->> "Бэкенд" : query = query_template(login)
"Бэкенд" ->> "LDAP" : Вызов search(query, base_dn, attributes=*)
activate "LDAP"
"LDAP" ->> "Бэкенд" : Возвращение пользовательского DN and uid атрибутов
deactivate "LDAP"
"Бэкенд" ->> "LDAP" : Вызов bind(DN, password)
"LDAP" --x "Бэкенд" : Ошибка связывания
"Бэкенд" --x "Клиент" : 401 неавторизован
else Пользователь заблокирован во внутренней базе данных бэкенда
"Клиент" ->> "Бэкенд" : логин + пароль
"Бэкенд" ->> "Бэкенд" : query = query_template(login)
"Бэкенд" ->> "LDAP" : Вызов search(query, base_dn, attributes=*)
activate "LDAP"
"LDAP" ->> "Бэкенд" : Возвращение пользовательского DN and uid атрибутов
deactivate "LDAP"
"Бэкенд" ->> "LDAP" : Вызов bind(DN, password)
"LDAP" ->> "Бэкенд" : Успешно
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда,\nusername = uid_attribute из ответа LDAP
"Бэкенд" --x "Клиент" : 404 не найден
else Пользователь удален из внутренней базы данных Бэкенда
"Клиент" ->> "Бэкенд" : логин + пароль
"Бэкенд" ->> "Бэкенд" : query = query_template(login)
"Бэкенд" ->> "LDAP" : Вызов search(query, base_dn, attributes=*)
activate "LDAP"
"LDAP" ->> "Бэкенд" : Return user DN and uid_attribute
deactivate "LDAP"
"Бэкенд" ->> "LDAP" : Вызов bind(DN, password)
"LDAP" ->> "Бэкенд" : Успешно
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда,\nusername = uid_attribute из ответа LDAP
"Бэкенд" --x "Клиент" : 404 не найден
else LDAP недоступен
"Клиент" ->> "Бэкенд" : логин + пароль
"Бэкенд" ->> "Бэкенд" : query = query_template(login)
"Бэкенд" --x "LDAP" : Вызов search(query, base_dn, attributes=*)
"Бэкенд" --x "Клиент" : 503 Сервис недоступен
end
alt Успешный кейс
"Клиент" ->> "Бэкенд" : токен доступа
"Бэкенд" ->> "Бэкенд" : Проверка токена
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда
"Бэкенд" ->> "Бэкенд" : Получение данных
"Бэкенд" ->> "Клиент" : Возвращение данных
else Токен просрочен
"Клиент" ->> "Бэкенд" : токен доступа
"Бэкенд" ->> "Бэкенд" : Проверка токена
"Бэкенд" --x "Клиент" : 401 неавторизован
else Пользователь заблокирован
"Клиент" ->> "Бэкенд" : токен доступа
"Бэкенд" ->> "Бэкенд" : Проверка токена
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда
"Бэкенд" --x "Клиент" : 401 неавторизован
else Пользователь удален
"Клиент" ->> "Бэкенд" : токен доступа
"Бэкенд" ->> "Бэкенд" : Проверка токена
"Бэкенд" ->> "Бэкенд" : Проверка пользователя во внутренней базе данных бэкенда
"Бэкенд" --x "Клиент" : 404 не найден
end
deactivate "LDAP"
deactivate "Клиент"
Базовая конфигурация
Bases: BaseModel
Settings for LDAPAuthProvider.
Examples
.. code-block:: bash
HORIZON__AUTH__PROVIDER=horizon.backend.providers.auth.ldap.LDAPAuthProvider
HORIZON__AUTH__ACCESS_KEY__SECRET_KEY=secret
HORIZON__AUTH__LDAP__URL=ldap://ldap.domain.com:389
HORIZON__AUTH__LDAP__LOOKUP__ENABLED=True
HORIZON__AUTH__LDAP__LOOKUP__POOL__ENABLED=True
HORIZON__AUTH__LDAP__LOOKUP__CREDENTIALS__USER=uid=techuser,ou=users,dc=example,dc=com
HORIZON__AUTH__LDAP__LOOKUP__CREDENTIALS__PASSWORD=somepassword
Source code in horizon/backend/settings/auth/ldap.py
209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 | |
Bases: BaseModel
Settings related to LDAP interaction.
Examples
.. code-block:: bash
HORIZON__AUTH__LDAP__URL=ldap://ldap.domain.com:389
HORIZON__AUTH__LDAP__UID_ATTRIBUTE=sAMAccountName
Source code in horizon/backend/settings/auth/ldap.py
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 | |
Bases: BaseModel
Settings related to JWT tokens.
Examples
.. code-block:: bash
HORIZON__AUTH__ACCESS_KEY__SECRET_KEY=somesecret
HORIZON__AUTH__ACCESS_KEY__EXPIRE_SECONDS=3600 # 1 hour
Source code in horizon/backend/settings/auth/jwt.py
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | |
Bases: BaseModel
Settings related to LDAP connection pool.
Examples
.. code-block:: bash
HORIZON__AUTH__LDAP__LOOKUP__POOL__ENABLED=True
HORIZON__AUTH__LDAP__LOOKUP__POOL__MAX=10
HORIZON__AUTH__LDAP__LOOKUP__POOL__CHECK_ON_STARTUP=True
Source code in horizon/backend/settings/auth/ldap.py
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | |
Конфигурация, связанная с поиском
Bases: BaseModel
Settings related to LDAP lookup.
Examples
.. code-block:: bash
HORIZON__AUTH__LDAP__LOOKUP__ENABLED=True
HORIZON__AUTH__LDAP__LOOKUP__POOL__ENABLED=True
HORIZON__AUTH__LDAP__LOOKUP__CREDENTIALS__USER=uid=techuser,ou=users,dc=example,dc=com
HORIZON__AUTH__LDAP__LOOKUP__CREDENTIALS__PASSWORD=somepassword
HORIZON__AUTH__LDAP__LOOKUP__QUERY=(uid={login})
Source code in horizon/backend/settings/auth/ldap.py
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | |
Bases: BaseModel
LDAP lookup query is executed using this credentials (instead of login and password provided by user).
Examples
.. code-block:: bash
HORIZON__AUTH__LDAP__LOOKUP__CREDENTIALS__USER=uid=techuser,ou=users,dc=example,dc=com
HORIZON__AUTH__LDAP__LOOKUP__CREDENTIALS__PASSWORD=somepassword
Source code in horizon/backend/settings/auth/ldap.py
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | |