Настройка аутентификации через FAM Avanpost

Инструкция подготовлена на примере FAM Avanpost v1.10.10.379

Терминология

  • Authentication (Аутентификация) — идентификация и проверка пользователя.
  • Authorization (Авторизация) — предоставление доступа пользователю.
  • Приложение — сущности, которые могут обращаться к Avanpost для аутентификации пользователя. Чаще всего ими являются приложения и службы, которые используют Avanpost для обеспечения единого входа в систему.
  • Пользователи — субъекты которые могут войти в вашу систему. Им можно назначить членство в группе и/или определенные роли.
  • Роли — определяют тип/категорию пользователя. Читатель, писатель — типичные роли. Обычно, приложения назначают доступ и разрешения конкретным ролям, а не отдельным пользователям.

Приложения Визиона требующие клиентов:

  • Vision Core
  • Grafana

1 Создание клиента#

Для каждого приложения необходимо создать клиента.

  1. Перейдите на страницу Приложения и нажмите кнопку Добавить приложение, после чего укажите следующие параметры.
  • Наименование - название для отображения в интерфейсе Avanpost
  • Тип - Open ID

После ввода параметров нажмите Далее и продолжите ввод:

  • Secret - “Пароль” для приложения
  • Redirect URIs - через пробел допустимые адреса для перенаправления
  • Vision Core: <app_url>/vision/api/v1/auth/login
  • Grafana: <app_url>/login/generic_oauth
  • Base URL - <app_url>. Адрес приложения
  • Logout URL - url для выхода из приложения

Где <app_url>, это:

  • для Vision Core: https://<ip_vision_vm>:8092
  • для Grafana: https://<ip_vision_vm>/vision/grafana

При доступности приложений с нескольких <app_url> (по IP, по домену) укажите все допустимые варианты для Redirect IRIs.

  1. После ввода параметров нажмите Далее.

  2. Выберите процесс аутентификации, по умолчанию Password.

  3. После ввода параметров нажмите Далее.

  4. Оставьте флажок Сделать приложение активным, нажмите Сохранить.

2 Настройка приложений и ролей#

  1. В странице приложения перейдите в Настройки
  2. Нажмите на кнопку изменения настроек
  3. Измените следующие параметры:
  • ID synonym - синоним, который можно использовать вместо Client ID (опционально)
  • Allowed grant types - необходимо включить:
  • Authorization code
  • Resresh token
  • Access token type - JSON web token

2.1 Logout Grafana#

Необходимо указать Post logout redirect URIs - https://<app_url>/login, для активации Single logout

После нажмите Сохранить.

2.2 Модель доступа для Vision Core#

  1. В разделе Модель доступа добавьте объект доступа.
  • Код - Client ID или ID synonym, если был указан. Необходимо использовать только тот вариант, который потом будет использован в конфиге vision core (параметр auth: client_id)
  • Описание - Права доступа
  • Права (Scopes) - записи по количеству ролей, где:
    • Код - название роли
    • Описание - описание роли, отображаемое в интерфейсе Аванпост

В данный момент в Vision Core следующие роли: writer - полный доступ reader - только чтение

  1. После нажмите Сохранить.

Примечание: Необходимо создать количество ролей и групп равное реальному количеству ролей. Например, роли reader и writer должны иметь соответствующие группы и роли.

  1. В разделе Сервис в Настройка ролей и прав нажмите кнопку “Добавить” и заполните следующие значения:
  • Наименование - имя роли для интерфейса аванпоста
  • Описание - опционально
  • Выберите необходимые объекты доступа - они будут справа иметь название приложения и заданное ранее описание.
  1. Далее перейдите в раздел Группы и добавьте группу (или используйте существующую).
  • Наименование - удобное обозначение группы
  • Описание - опционально
  1. Нажмите Сохранить.

  2. На странице группы во вкладках:

  • Пользователи - добавите пользователей в соответствии с его ролью.
  • Приложения - назначьте нужное приложение(vision core).
  • Роли - найдите и назначьте соответствующую роль созданную в предыдущем пункте.

2.3 Модель доступа для Grafana#

В соответствии с https://docs.avanpost.ru/fam/1.12/67732720.html

Необходимо на странице Группы создать группу под каждую роль Grafana:

|Имя группы | Описание| |Grafana Admins | Admin | |Grafana Editor | Editor | |GrafanaAdmin |Server administrator | |Grafana Viewer |Viewer |

Группы создаем, описанным выше образом. Также добавляем пользователей в соответствующие группы и назначаем приложение (Grafana). Роли создавать и назначать не нужно.

3 Настройка конфигурации#

3.1 Vision Core#

В конфигурационный файл необходимо внести следующие изменения - /opt/skala-r/etc/vision/server/vision_core/config.yml

  1. В ключе “auth” необходимо указать:
  • enabled - установить значение true
  • auth_type: ‘avanpost’
  • auth_server - URL Anapost, например “http://fam.skala-r.tech
  • client_id - ID приложения.
  • client_secret - значение является ключом из хранилища секретов. Не изменять.
  • tls_insecure_skip_verify - пропуск проверки tls сертификатов.

Пример секции авторизации:

auth:
  enabled: true
  auth_type: 'avanpost'
  auth_server: 'http://fam.skala-r.tech'
  client_id: 'vision'
  client_secret: vault.auth.client_secret
  tls_insecure_skip_verify: true

Необходимо указать реальное значение Client secret клиента.

  1. Сделайте копию файла хранилища секретов: “cp /opt/skala-r/vision/.vault_store /opt/skala-r/vision/.vault_store_bak”.

  2. Запустите команду

/opt/skala-r/vision/server/vision_venv/bin/python3 -c "import storage; print(storage.get_initial_data())" > ~/.vault_pass && ansible-vault edit /opt/skala-r/vision/.secrets_vault --vault-password-file=~/.vault_pass && rm -rf ~/.vault_pass && systemctl restart vision_core.service
  1. Для ключа “vault.auth.client_secret” установите значение Client secret из раздела Credentials клиента.

  2. Сохраните файл и перезапустите сервис “vision_core.service” командой: systemctl restart vision_core.service.

  3. Проверьте успешный запуск vision_core командой: systemctl status vision_core.service и убедитесь, что в логе нет ошибок после перезапуска: journalctl -fu vision_core -n 20.

3.2 Grafana#

  1. В конфигурационный файл необходимо внести следующие изменения - /opt/skala-r/etc/vision/server/grafana/grafana.ini
[server]
domain = <домен-визиона>  # Домен Визиона
   
...
   
[auth]
oauth_allow_insecure_email_lookup = true
   
...
   
[auth.anonymous]
enabled = false
  
[auth.generic_oauth]
  
enabled = true
name = FAM
allow_sign_up = true
client_id = <ID приложения>
client_secret = <секрет приложения>
scopes = openid profile email permissions groups
email_attribute_path = preferred_username
login_attribute_path = preferred_username
role_attribute_path = contains(groups[*].name, 'GrafanaAdmin') && 'GrafanaAdmin' || contains(groups[*].name, 'Grafana Editor') && 'Editor' || contains(groups[*].name, 'Grafana Admins') && 'Admin' || contains(groups[*].name, 'Grafana Viewer') && 'Viewer'
auth_url = https://<хост-Avanpost>/oauth2/authorize
token_url = https://<хост-Avanpost>/oauth2/token
api_url = https://<хост-Avanpost>/oauth2/userinfo
tls_skip_verify_insecure = true
allow_assign_grafana_admin = true  # Разрешение на роль GrafanaAdmin
role_attribute_strict = true  # Запрет на вход пользователя без роли
signout_redirect_url = https://<хост-Avanpost>/oauth2/end_session?post_logout_redirect_uri=https://<ip_vision_vm>/vision/grafana/login 
  1. Сохраните файл и перезапустите сервис “grafana.service” командой: systemctl restart grafana.service.

  2. Проверьте успешный запуск Grafana командой: systemctl status grafana.service.

4 Отключение функции регистрации и восстановления пароля#

В версии Avanpost FAM v1.10.10.379 отключение Регистрации на странице аутентификации пользователя осуществляется через конфигурационный файл Avanpost, пример пути конфигурационного файла: /opt/idp/config.toml

[selfregistration]
redirectUrl = 'https://<your_redirect_URL_after_registration>'
disabled = false

Функция “Восстановления пароля” в данной версии отключается через редактирование шаблона страницы аутентификации.

Описание кастомизации пользовательских интерфейсов. В шаблоне login.password.html можно удалить/закомментировать следующий блок:

[{if ne .Username ""}]
<div class="field">
<a href="[{$path}]/user/restore_password?request_id=[{.RequestID}]">
  [{.ForgotPassword}]
</a>
</div>
[{else}]
<div class="field">
<a href="[{$path}]/user/restore_password?request_id=[{.RequestID}]">
  [{.ForgotPassword}]
</a>
</div>
[{end}]

5 Рекомендации по настройке FAM#

5.1 Пароли должны передаваться по сети исключительно в зашифрованном виде. Пароли должны храниться в АС только с использованием защищенных протоколов взаимодействия или в зашифрованном виде.#

Взаимодействие между компонентами проходит через https. В настройках парольной политики в Avanpost доступны шифрование и хеширование пароля.

Сервис→Настройки политики паролей→Добавить или редактировать политику.

Пароли в vision_core хранятся в зашифрованном виде в ansible vault (.secrets_vault)

5.2 Должна отсутствовать возможность изменить пароль методом замены объекта, хранящего преобразованный (зашифрованный/хешированный) пароль.#

В vision_core при подмене vault’а изменные секреты не будут прочитаны из-за несовпадения ключей шифрования.

В Аванпост FAM все манипуляции с паролями фиксируются в журнале безопасности, спецификация журнала безопасности https://docs.avanpost.ru/fam/1.12/87885025.html

Отчеты→Журнал событий безопасности

5.3 Установлен запрет на повторное использование одного и того же пароля.#

В разделе Сервис→Настройки политики паролей→(Добавить или редактировать политику) задается парольная политика в том числе:

  • Минимальная длина
  • Максимальная длина
  • Содержание цифр
  • Содержание букв в верхнем регистре
  • Содержание букв в нижнем регистре
  • Содержание специальных символов
  • Настройка запрета повторного использования одного и того же пароля - активируется включением “Вести журнал паролей” .

5.3 Смена пароля пользователем#

Пользователь может сменить пароль перейдя в личный кабинет (пример: http://fam.skala-r.tech/lk) , авторизовавшись и перейдя в раздел Профиль.

Для этого группе пользователей необходимо назначить приложение lk-client в списке приложений группы

Пароли технических учетных записей меняются согласно http://confluence.skala-r.tech/pages/viewpage.action?pageId=67965821 - раздел Технические учетные записи

5.4 Осуществление контролЯ и подсчет попыток входа в АС (успешный или неуспешный – несанкционированный).#

В Avanpost в Отчеты→Журнал аутентификаций хранится информация о количестве попыток входа

5.5 Настройка блокировки входа пользователя до разблокирования администратором системы или АБ при достижении заданного числа неуспешных попыток входа.#

В Avanpost в Сервис→Настройки политики паролей→Добавить или редактировать политику в разделе Блокировка пользователь производятся необходимые настройки.

После достижения числа неудачных попыток пользователь был заблокирован, администратор может его разблокировать

5.6 Превышении количества неудачных попыток входа.#

Avanpost по умолчанию уведомляет пользователя о превышении количества неудачных попыток входа. После превышения заданного количества неудачных попыток входа Avanpost не предоставляет доступ при предъявлении правильного пароля.

5.7 Механизм блокировки пользователя с его оперативным отключением от ресурсов#

В Avanpost на вкладке Сервис→Менеджер сессий можно отключить пользователя от ресурса, завершив его сессию

Также это можно сделать в карточке пользователя в разделе Безопасность→Текущие сессии.

В карточке пользователя у администратора есть возможность блокировки пользователя. После блокировки пользователя его сессии автоматически завершаются.