Для создания единой точки входа во внутренние сервисы с недавних пор я начал использовать проект 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 должна принять следующий вид:

netbox-login

Нажимаем Keycloak, нас перебросит на страницу входа, пробуем ввести свой логин и пароль.

Если все успешно, то после входа, по умолчанию, у пользователя не будет прав. Не забудьте поправить их в конфиге (если нужно) или назначить через администратора5.


  1. Имя созданного клиента Keycloak - netbox в нашем случае; ↩︎

  2. Secret берем в настройках нашего клиента Keycloak, вкладка Credentials; ↩︎

  3. Чтобы скопировать публичный ключ алгоритма, переходим в Realm Settings на вкладку Keys и нажимаем кнопку Public Key напротив RS256; ↩︎

  4. Реалмы можно посмотреть в Realm Settings, щелкнув в строке Endpoints на OpenID Endpoint Configuration ↩︎ ↩︎

  5. Как создать суперпользователя в Netbox - create-a-super-user ↩︎