Для создания единой точки входа во внутренние сервисы с недавних пор я начал использовать проект Keycloak. Сегодня рассмотрим организацию SSO в Netbox с помощью него.
В документации Netbox описана настройка только для двух провайдеров :
- Microsoft Azure AD
- Okta
Netbox использует библиотеку python-soc-auth для взаимодействия с провайдерами.
Список доступных провайдеров можно посмотреть тут
Настройка клиента в Keycloak
Заходим в веб интерфейс Keycloak, переходим на вкладку Clients и создаем нового клиента:
Заполняем поля:
Client ID - netbox;
Enabled - On;
Standard Flow Enabled - On;
Valid Redirect URIs - URL нашего netbox сервера в виде https://netbox.0xbbeer.local/* ;
Backchannel Logout Session Required - On;
В секции Fine Grain OpenID Connect Configuration
заполняем:
User Info Signed Response Algorithm - RS256;
Request Object Signature Algorithm - RS256;
Сохраняем и переходим на вкладку Mappers:
Создаем mapper типа audience со следующими параметрами:
Protocol - openid-connect;
Name - netbox;
Mapper Type - Audience;
Included Client Audience - выбираем созданного ранее клиента (netbox);
Add to access token - ON;
Настройка Netbox
В файл конфигурации configuration.py, который у меня находится по пути /opt/netbox/netbox/netbox, добавим следующие параметры:
1
2REMOTE_AUTH_ENABLED = True
3
4REMOTE_AUTH_BACKEND = 'social_core.backends.keycloak.KeycloakOAuth2'
5
6REMOTE_AUTH_HEADER = 'HTTP_REMOTE_USER'
7
8REMOTE_AUTH_AUTO_CREATE_USER = True
9
10REMOTE_AUTH_DEFAULT_GROUPS = []
11
12REMOTE_AUTH_DEFAULT_PERMISSIONS = {}
13
14SOCIAL_AUTH_KEYCLOAK_KEY = 'netbox'
15
16SOCIAL_AUTH_KEYCLOAK_SECRET = 'DnSGgsdfg#sdgsdfs4fggsdfv$#gfasq'
17
18SOCIAL_AUTH_KEYCLOAK_PUBLIC_KEY = '/ZfnXP0cmg8Vh4AE6>'
19
20SOCIAL_AUTH_KEYCLOAK_AUTHORIZATION_URL = 'https://sso.0xbbeer.local:8443/realms/master/protocol/openid-connect/auth'
21
22SOCIAL_AUTH_KEYCLOAK_ACCESS_TOKEN_URL = 'https://sso.0xbbeer.local:8443/realms/master/protocol/openid-connect/token'
где:
- REMOTE_AUTH_ENABLED - Включает функционал удаленной аутентификации;
- REMOTE_AUTH_BACKEND - Устанавливает Keycloak в качестве провайдера для аутентификации\авторизации;
- REMOTE_AUTH_HEADER - Добавляет информацию о пользователе в HTTP-хедер;
- REMOTE_AUTH_AUTO_CREATE_USER - Создает внутреннего пользователя при авторизации;
- REMOTE_AUTH_DEFAULT_GROUPS - Группа Netbox назначаемая по умолчанию;
- REMOTE_AUTH_DEFAULT_PERMISSIONS - Права в Netbox по умолчанию;
- SOCIAL_AUTH_KEYCLOAK_KEY - Client ID1 из Keycloak;
- SOCIAL_AUTH_KEYCLOAK_SECRET - Client Secret2 из Keycloak;
- SOCIAL_AUTH_KEYCLOAK_PUBLIC_KEY - RS256 Public Key3 из Keycloak;
- SOCIAL_AUTH_KEYCLOAK_AUTHORIZATION_URL - Keycloak Auth4 Realm;
- SOCIAL_AUTH_KEYCLOAK_ACCESS_TOKEN_URL - Keycloak4 Token Realm;
Если Keycloak настроен по HTTPS соединению и сертификат был выпущен локальным CA, то необходимо добавить корневой сертификат CA в виртуальное окружение (путь: /opt/netbox/venv/), из которого запускается Netbox, иначе можно получить ошибку:
1SSL: CERTIFICATE_VERIFY_FAILED
Как добавить корневой сертификат в виртуальное окружение, можно почитать в статье Python: SSL CERTIFICATE_VERIFY_FAILED
Сохранив настройки, перезапускаем Netbox и Apache. Страница авторизации в Netbox-e должна принять следующий вид:
Нажимаем Keycloak, нас перебросит на страницу входа, пробуем ввести свой логин и пароль.
Если все успешно, то после входа, по умолчанию, у пользователя не будет прав. Не забудьте поправить их в конфиге (если нужно) или назначить через администратора5.
Имя созданного клиента Keycloak - netbox в нашем случае; ↩︎
Secret берем в настройках нашего клиента Keycloak, вкладка Credentials; ↩︎
Чтобы скопировать публичный ключ алгоритма, переходим в Realm Settings на вкладку Keys и нажимаем кнопку Public Key напротив RS256; ↩︎
Реалмы можно посмотреть в Realm Settings, щелкнув в строке Endpoints на OpenID Endpoint Configuration ↩︎ ↩︎
Как создать суперпользователя в Netbox - create-a-super-user ↩︎