Содержание
- Введение
- Установка и настройка Authelia
- Настройка 1С
- Настройка Nginx Proxy Manager
- Настройка 2FA
- Возможные проблемы и решения
- Полезные ссылки
Введение
OpenID Connect (OIDC) - протокол аутентификации, построенный поверх OAuth 2.0, который позволяет клиентским приложениям проверять личность пользователя на основе аутентификации, выполненной сервером авторизации.
Authelia - открытое решение для аутентификации и авторизации, которое обеспечивает:
- Двухфакторную аутентификацию (2FA)
- Single Sign-On (SSO)
- Интеграцию с различными backend'ами пользователей (LDAP, файлы)
- Гибкие правила авторизации
В примере используются следующие параметры, которые следует заменить на свои:
- Домен: example.ru
- Адрес Authelia: auth.example.ru
- Адрес веб-сервера: 1c.example.ru
- Информационная база: 1c_smb_demo1
Потребуется docker, т.к. Authelia разворачивается в docker-контейнере.
В качестве proxy сервера используется Nginx Proxy Manager. Можно и без него, используется только для удобства настройки SSL.
Установка и настройка Authelia
Подготовка
1. Клонируйте репозиторий
git clone https://github.com/komarovps/onec-authelia.git cd onec-authelia
2. Сгенерируйте секреты, которые будут проброшены в Authelia
openssl rand -hex 64 > authelia/secrets/JWT_SECRET openssl rand -hex 64 > authelia/secrets/STORAGE_ENCRYPTION_KEY openssl rand -hex 64 > authelia/secrets/SESSION_SECRET openssl rand -hex 64 > authelia/secrets/OIDC_HMAC_SECRET openssl genrsa -out authelia/secrets/rsa.2048.key 2048
3. На секреты выдайте права только владельцу
chmod 600 authelia/secrets/*
Конфигурация
Конфигурационный файл Authelia: authelia/config/configuration.yml
Если при первом запуске конфигурационного файла не будет, то он сформируется автоматически с параметрами по-умолчанию и описанием. Можно его забэкапить и приступить к дальнейшей настройке.
1. Создайте конфигурационный файл из шаблона
Для 1С нужно выбрать тип конфигурации в зависимости от версии платформы:
До версии 8.3.20: configuration_token.yml
- используется Implicit Flow
mv authelia/config/configuration_token.yml authelia/config/configuration.yml rm authelia/config/configuration_code.yml # лишний конфиг удаляем
После 8.3.20 (рекомендуется): configuration_code.yml
- используется Authorization Code Flow
mv authelia/config/configuration_code.yml authelia/config/configuration.yml rm authelia/config/configuration_token.yml # лишний конфиг удаляем
Authorization Code Flow более безопасен, т.к. токены не попадают в браузер.
Блоки параметров
authentication_backend - блок, где определеяем откуда брать пользователей. В примере испоьзуетсяфайл файл users_database.yml, но можно подключить LDAP/Active Directory.
totp - настройки двухфакторной аутентификации
access_control - определяет правила доступа (по умолчанию все запрещено), через rules указываем конкретные разрешения.
session - параметры пользовательских сессий (срок жизни и т.д.)
regulation - защита от подобра пароля
storage - параметры базы данных Authelia. Она может быть не только SQLite, но из PostgreSQL, MySQL.
notifier - механизм отправки уведомлений (например SMTP)
identity_providers - параметры провайдеров идентификации. В нашем случае мы используем протокол oidc
Разберем параметры для OIDC:
jwks - параметры закрытого ключа для подписи токенов
enable_client_debug_messages - расширенные сообщения об ошибках для отладки
cors - параметры CORS
claims_policies - определяет, какие поля попадут в id_token
clients - список клиентов и их параметры, которым доступен данный протокол аутентификации.
Пользователи
Самый простой вариант ведения пользователей это перечисление их в yaml файле. Но Authelia так же поддерживает и интеграцию с Active Directory.
Файл с пользователями: authelia/config/user_database.yml
1. Создайте пользователей
Пример:
users:
abdulovyv:
disabled: false
displayname: 'Yurii Abdulov'
password: '$argon2id$v=19$m=16,t=2,p=1$b215c2VjdXJpdHk$7RzcnAvUX6M5p9p28KKX5Q'
email: 'abdulovyv@example.ru'
groups:
- 'admins'
- 'dev'
В поле password нужно указывать хэш, который можно получить выполнив:
docker run --rm authelia/authelia:latest authelia crypto hash generate argon2 --password 'password'
где в ключе --password
указать пароль.
Есть вариант получения хэша пароля без docker - воспользоваться сервисом.
Запуск
1. Запустите docker-контейнер c Authelia
docker compose up -d
Сервис будет доступен по адресу: http://Адрес:9091/
Но заходить туда смысла нет, т.к. у Authelia нет админского UI, как у Keycloak или Authentik. Только yaml конфигурация, только IaC! :) Есть форма авторизации и UI для пользователя (настройка устройств OTP и т.п.)
2. Проверьте конфигурацию OIDC
Перейдите в браузере по адресу http://Адрес:9091/.well-known/openid-configuration
. В ответе должен появится json с конфигурацией.
3. Проверьте лог контейнера
docker logs -f authelia
При успешном запуске, в логе будет что-то вроде:
time="" level=info msg="Authelia v4.39.10 is starting" time="" level=info msg="Log severity set to info" time="" level=info msg="Storage schema is being checked for updates" time="" level=info msg="Storage schema is already up to date" time="" level=info msg="Startup complete" time="" level=info msg="Listening for non-TLS connections on '[::]:9091' path '/'" server=main service=server
Следующим шагом, хоть он и не обязательный, рекомендую навести порядок с внешним доступом к сервисам, например через обратный прокси (NPM, Traefik).
Что можно сделать:
- Для http://Адрес:9091 сделать удобный CNAME, например auth.example.ru
- Для веб-сервера с публикациями баз http://Адрес:80 сделать CNAME 1c.example.ru
- Выпустить и настроить SSL-сертификаты
На выходе получить красивые адреса с доступом по https: https://auth.example.ru, https://1c.example.ru
И после того как обратный прокси будет настроен, можно перейти к настройке веб-публикации базы 1С.
Настройка Nginx Proxy Manager
Nginx Proxy Manager используется для проксирования запросов и управления SSL-сертификатами.
Упускаю момент с созданием CNAME для Authelia и веб-сервера в DNS, но допустим у нас уже есть адреса auth.example.ru и 1c.example.ru, которые указывают на адрес NPM: proxy.example.ru.
Документация по настройке NPM для Authelia
Настройка прокси-хоста для Authelia
1. Создайте snippet proxy.conf
на сервере NPM:
sudo mkdir -p /data/nginx/custom/snippets sudo nano /data/nginx/custom/snippets/proxy.conf
Вставьте в proxy.conf
:
2. Создайте новый Host в Nginx Proxy Manager:
- Domain Names:
auth.example.ru
- Scheme:
http
- Forward Hostname/IP:
IP_адрес_сервера_Authelia
- Forward Port:
9091
- Включите Cache Assets, Block Common Exploits, Websockets Support
3. Включите SSL:
- Перейдите на вкладку SSL
- Выберите SSL сертификат (его нужно заранее сделать)
- Включите Force SSL
4. Настройте Advanced конфигурацию:
- Перейдите на вкладку Advanced
- Добавьте следующую конфигурацию:
location / { include /data/nginx/custom/snippets/proxy.conf; proxy_pass $forward_scheme://$server:$port; }
Настройка прокси-хоста для 1С
1. Создайте новый Proxy Host для 1С:
- Domain Names:
1c.example.ru
- Scheme:
http
- Forward Hostname/IP:
IP_адрес_сервера_1С
- Forward Port:
80
или порт веб-сервера 1С
2. Настройте SSL аналогично Authelia
Настройка 1С
Настройка веб-публикации
1. Опубликовать базу на веб-сервере и в default.vrd
веб-публикации добавить:
Для Authorization Code Flow:
Для Implicit Flow:
Описание элемента openidconnect
на ИТС.
Настройка пользователей в информационной базе
В конфигураторе базы 1С, в настройках пользователя:
- Установите флаг Аутентификация OpenID Connect
- В поле Имя укажите адрес электронной почты
Сопоставление пользователя будет выполняться по свойству токена указанному в authenticationClaimName и свойству объекта ПользовательИнформационнойБазы указанному в authenticationUserPropertyName.
В данном случае будет взят email из токена (свойсто email из users_database.yml) и name (свойство Имя) из объекта ПользовательИнформационнойБазы.
Вход в базу
Переходим в браузере по адресу информационной базы. Нас перебрасывает на форму авторизации. Вводим логин/пароль.
Разрешаем доступ к запрашиваемым данным и попадаем в базу.
Настройка 2FA
Предварительная настройка
Внимание! Перед настройкой 2FA обязательно настройте механизм оповещений через smtp
, т.к. на почту пользователя будут отправляться данные для начальной настройки.
Пример с почтовым сервером yandex
:
Допустим у нас есть техническая УЗ: auth.robot@yandex.ru
1. Создайте файл для хранения её пароля (это может быть специальный пароль предоставляющий доступ только к функциям почты)
touch authelia/secrets/yandex_smtp_password chmod 600 authelia/secrets/yandex_smtp_password nano authelia/secrets/yandex_smtp_password # указываем пароль
2. Добавьте в configuration.yml
:
notifier: disable_startup_check: false smtp: address: 'submissions://smtp.yandex.ru:465' timeout: '10s' username: 'auth.robot@yandex.ru' password: {{ secret "/secrets/yandex_smtp_password" }} sender: 'Authelia <auth.robot@yandex.ru>' identifier: '1c.example.ru' subject: '[Authelia] {title}' startup_check_address: 'auth.robot@yandex.ru' disable_require_tls: false disable_html_emails: false tls: server_name: 'smtp.yandex.ru' skip_verify: false minimum_version: 'TLS1.2'
Time-based One-time Password
Для включения TOTP добавьте в configuration.yml
:
totp: issuer: auth.example.ru period: 30
И включите второй фактор для клиента:
identity_providers: oidc: clients: - client_id: 1c_smb_demo1 authorization_policy: 'two_factor'
Пользователь при входе зарегистрирует свое устройство для получения одноразового пароля и в дальнейшем, будет выводиться форма для его ввода.
Возможные проблемы и решения
Ошибка, что в токене нет ключа сопоставления
Внимание! Только для Implicit Flow, т.е. если клиент настроен на response_types: ['id_token token', 'token']
.
Для response_types: code
этот способ не работает.
При успешной аутентификации в Authelia, 1С получает токен с данными о пользователе. Чаще всего далее идентификация пользователя 1С выполняется по email. Этой информации может не быть в токене.
Чтобы понять, что есть в токене, надо его получить и расшифровать. Тут на помощь приходит декодер токена: https://jwt.ms/
1. В configuration.yml
раскомментируем redirect_uris
для отладки:
clients: - client_id: 1c_smb_demo1 redirect_uris: - 'https://1c.example.ru/smb_demo1/authform.html' - 'https://jwt.ms' # Для отладки содержимого jwt
2. Перезагружаем контейнер, чтобы перезагрузился конфиг.
3. Открываем bash и готовим url для отладки:
STATE=$(openssl rand -hex 16); NONCE=$(openssl rand -hex 16) # В параметре запроса `client_id` установить свой `id` из `configuration.yml` AUTH_URL="https://auth.example.ru/api/oidc/authorization?client_id=1c_smb_demo1&redirect_uri=https%3A%2F%2Fjwt.ms&response_type=id_token%20token&scope=openid%20email%20profile&state=${STATE}&nonce=${NONCE}" echo "$AUTH_URL"
4. Открываем полученную ссылку в браузере
Видно, что в свойствах нет информации о пользователе.
Управлять содержимым токена можно через свойство claims_policies
. Добавляем его в configuration.yml
:
identity_providers: oidc: claims_policies: id_token_with_email: id_token: - email - email_verified - preferred_username - name clients: - client_id: 1c_smb_demo1 claims_policy: id_token_with_email
Повторяем п.3 и получаем токен с дополненной информацией:
С таким токеном уже можно в 1С.
В тонком клиенте не загружается форма авторизации
Если в браузере проблем нет, то при входе через тонкий клиент форма авторизации не загружается. В ранних версиях платформы был костыль - помогало переключение между формами ввода логина/пароля и OIDC, но в 8.3.27.1719 и этот способ уже не работает. Разобраться в причине не удалось.
Полезные ссылки
- Документация OpenId Connect
- ИТС. Описание элемента openidconnect
- ИТС. Настройка keycloak
- ИТС. Документация по настройке OpenId Connect в 1С:Фреш
- Authelia. OpenId Connect
- Authelia. Настройка NPM
- Настройка аутентификации OpenID connect используя KeyCloak при подключении к 1С
- Мой опыт настройки SSO OpenID Connect в 1С с помощью Authentik
Вступайте в нашу телеграмм-группу Инфостарт