Найти в Дзене
Beget

Authelia – установка и настройка сервера OAuth-аутентификации и авторизации

Использование собственных сервисов зачастую удобно и дает больший контроль над своими данными. Однако по мере роста количества сервисов возникает проблема их защиты от нежелательного трафика – к примеру, часть сервисов не поддерживает ограничение доступа как таковое, а некоторые могут не поддерживать двухфакторную авторизацию. К тому же, зачастую может быть удобно настроить единую авторизацию для нескольких приложений, не полагаясь при этом на сторонних провайдеров. Тут на сцену и выходит Authelia – этот сервис позволяет как защищать эндпоинты дополнительным механизмом авторизации, так и использовать его в качестве Open ID Connect провайдера. Сервис поддерживает интеграцию с большинством популярных реверс-прокси, таких как Caddy, Nginx, Traefix и HAProxy. В данной статье мы расскажем, как установить Authelia в комбинации с реверс-прокси Caddy, а также рассмотрим процесс интеграции с приложением в качестве OIDC-провайдера на примере Nextcloud. Для установки Authelia и Caddy мы будем исп
Оглавление

Использование собственных сервисов зачастую удобно и дает больший контроль над своими данными. Однако по мере роста количества сервисов возникает проблема их защиты от нежелательного трафика – к примеру, часть сервисов не поддерживает ограничение доступа как таковое, а некоторые могут не поддерживать двухфакторную авторизацию. К тому же, зачастую может быть удобно настроить единую авторизацию для нескольких приложений, не полагаясь при этом на сторонних провайдеров. Тут на сцену и выходит Authelia – этот сервис позволяет как защищать эндпоинты дополнительным механизмом авторизации, так и использовать его в качестве Open ID Connect провайдера. Сервис поддерживает интеграцию с большинством популярных реверс-прокси, таких как Caddy, Nginx, Traefix и HAProxy.

В данной статье мы расскажем, как установить Authelia в комбинации с реверс-прокси Caddy, а также рассмотрим процесс интеграции с приложением в качестве OIDC-провайдера на примере Nextcloud.

Установка Authelia

Для установки Authelia и Caddy мы будем использовать Docker – для удобства будет использоваться соответствующее готовое решение, однако установка возможна на любой Linux-машине с установленными Docker и docker-compose.

Обратите внимание!

Поскольку для OAuth обязательно использование https, для настройки Authelia потребуется собственный домен, направленный на созданный VPS-сервер.

Для упрощения статьи мы рассмотрим одну из возможных конфигураций Authelia в комбинации с PostgreSQL, Valkey (redis) и Caddy.

Подключитесь к серверу, после чего создайте директорию под конфигурационные файлы Authelia и перейдите в нее:

mkdir /opt/authelia

Подготовьте нужные директории:

mkdir -p authelia/{config,secrets} redis postgres caddy/{conf,site}

В результате должна получиться следующая структура:

/opt/authelia
├── authelia
│ ├── config
│ ├── data
│ └── secrets
├── caddy
│ ├── conf
│ └── site
├── postgres
└── redis

Сгенерируйте файлы секретов:

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/STORAGE_PASSWORD

Создайте файл .env с переменной пароля PostgreSQL:

echo "POSTGRES_PASSWORD=$(cat authelia/secrets/STORAGE_PASSWORD)" > .env

Скорректируйте права для файлов:

chmod 600 .env authelia/secrets/*

Также потребуется задать конфигурационный файл Authelia. В рамках данной статьи мы укажем минимально необходимую конфигурацию, однако если вы используете сервис для авторизации в критически важных приложениях, рекомендуем ознакомиться с документацией сервиса для полноценной настройки. Создайте файл authelia/config/configuration.yml со следующим содержимым:

theme: "auto"
server:
address: "tcp://:9091"
endpoints:
authz:
forward-auth:
implementation: ForwardAuth

authentication_backend:
file:
path: /config/users.yml

totp:
issuer: auth.betutorial.ru
period: 30

access_control:
default_policy: deny
rules:
- domain: ["blog.betutorial.ru"]
policy: bypass

session:
redis:
host: "redis"
port: 6379

cookies:
- name: authelia_session
domain: "betutorial.ru"
authelia_url: "https://auth.betutorial.ru"
expiration: 1h
inactivity: 10m
remember_me: 1M
default_redirection_url: "https://betutorial.ru"

regulation:
max_retries: 3
find_time: 2m
ban_time: 5m

storage:
postgres:
address: "tcp://postgres:5432"
database: "authelia"
username: "authelia"
schema: "public"
timeout: "5 seconds"

notifier:
filesystem:
filename: "/config/notification.txt"

Домен измените на выбранный вами, в блоке access_control укажите защищаемые URL и нужную политику.

В качестве первого фактора авторизации можно использовать файл либо LDAP. Для простоты в рамках данной статьи будет использоваться авторизация с помощью конфигурационного файла, с настройкой LDAP вы можете ознакомиться в официальной документации. Создайте файл authelia/config/users.yml, в нем укажите список пользователей с хэшами паролей и нужными группами:

users:
betutorial:
displayname: "Beget Tutorial"
password: "$argon2id$v=19$m=65536,t=3,p=4$g9rr2Pc6nEYRt446UlnQhg$zDjDZMrlAhfBfSEkUSniJfF+Zbyi4cMksYEvEs26F+g"
email: "example@betutorial.ru"
groups:
- "admin"
- "dev"

Для генерации хэша пароля можно использовать следующую команду, заменив <password> на нужный пароль:

docker run --rm ghcr.io/authelia/authelia:latest authelia crypto hash generate argon2 --password <password> | sed 's/Digest: //g'

В /opt/authelia создайте файл compose.yml со следующим содержимым:

services:
authelia:
container_name: authelia
image: authelia/authelia:latest
ports:
- 127.0.0.1:9091:9091
depends_on:
redis:
condition: service_healthy
postgres:
condition: service_healthy
restart: "unless-stopped"
environment:
AUTHELIA_IDENTITY_VALIDATION_RESET_PASSWORD_JWT_SECRET_FILE: "/secrets/JWT_SECRET"
AUTHELIA_SESSION_SECRET_FILE: "/secrets/SESSION_SECRET"
AUTHELIA_STORAGE_POSTGRES_PASSWORD_FILE: "/secrets/STORAGE_PASSWORD"
AUTHELIA_STORAGE_ENCRYPTION_KEY_FILE: "/secrets/STORAGE_ENCRYPTION_KEY"
volumes:
- "${PWD}/authelia/config:/config"
- "${PWD}/authelia/secrets:/secrets"


redis:
container_name: authelia-redis
image: valkey/valkey:8-alpine
command: valkey-server --save 30 1 --loglevel warning
restart: unless-stopped
volumes:
- ${PWD}/redis:/data
healthcheck:
test: redis-cli ping || exit 1

postgres:
container_name: authelia-postgres
image: postgres:17
environment:
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_USER: authelia
POSTGRES_DB: authelia
volumes:
- ${PWD}/postgres:/var/lib/postgresql/data
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -h localhost -U $$POSTGRES_USER"]
interval: 2s

caddy:
container_name: authelia-caddy
image: caddy:latest
restart: unless-stopped
cap_add:
- NET_ADMIN
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ${PWD}/caddy/conf:/etc/caddy
- ${PWD}/caddy/site:/srv
- caddy_data:/data
- caddy_config:/config

volumes:
caddy_data:
caddy_config:

И наконец, в /opt/authelia/caddy/conf создайте Caddyfile, в нем укажите конфигурацию для проксирования следующего вида с выбранным вами доменом:

auth.betutorial.ru {
reverse_proxy authelia:9091
}

После чего запустите Authelia командой:

docker compose up -d

В случае успешной настройки по выбранному вами домену откроется страница авторизации Authelia:

Если при открытии страницы возникает ошибка, проверьте логи контейнеров командой:

docker compose logs

Подключение Authelia в качестве сервиса авторизации в Nextcloud

Процесс настройки Authelia в качестве OIDC провайдера состоит из двух этапов: настройка Authelia и конфигурация интегрируемого сервиса. В данной статье мы рассмотрим настройку на примере Nextcloud, инструкции для других сервисов вы можете найти в официальной документации.

Подготовка Authelia

Если вы еще не настраивали функционал OIDC в Authelia, потребуется сгенерировать сертификат и ключ следующей командой:

docker run --rm authelia/authelia sh -c "authelia crypto certificate rsa generate --common-name auth.betutorial.ru && cat public.crt && cat private.pem"

Обратите внимание!

Домен в команде необходимо изменить на домен, используемый вашим инстансом Authelia.

Сохраните полученные сертификат и ключ в безопасном месте. Также сгенерируйте случайную секретную строку следующей командой:

openssl rand -hex 64

Сохраните ее в безопасном месте. И наконец, сгенерируйте комбинацию пароля и его хэша командой:

docker run authelia/authelia:latest authelia crypto hash generate pbkdf2 --variant sha512 --random --random.length 72 --random.charset rfc3986

Далее потребуется отредактировать конфигурационный файл Authelia. Добавьте в него следующую секцию:

identity_providers:
oidc:
hmac_secret: 'my-secure-hmac-secret-key-to-change'
jwks:
- key_id: 'authelia'
algorithm: 'RS256'
use: 'sig'
certificate_chain: |
-----BEGIN CERTIFICATE-----
<PASTE-HERE-YOUR-PUBLIC-KEY-DATA>
-----END CERTIFICATE-----
key: |
-----BEGIN PRIVATE KEY-----
<PASTE-HERE-YOUR-PRIVATE-KEY-DATA>
-----END PRIVATE KEY-----

В значения сертификата и ключа подставьте сгенерированные ранее сертификат и ключ, в поле hmac_secret – сгенерированную ранее случайную строку.

Далее потребуется добавить клиент oidc – в данном случае Nextcloud. Для этого внутри секции oidc добавьте раздел clients следующего вида:

identity_providers:
oidc:
...
clients:
- client_id: 'nextcloud'
client_name: 'Nextcloud OIDC'
client_secret: '$pbkdf2-sha512$310000$abYBFyIOd3NzbSceHkLzWA$G4AAJt.ZAOqBLJ.5jhmLei/hfwrUDfFT84y3dsXeoUuPBTtWCXolXHvdcIEkKtXYbDK1ZmYcsCnsTKcTzHslaQ'
public: false
authorization_policy: 'one_factor'
require_pkce: true
pkce_challenge_method: 'S256'
redirect_uris:
- 'https://quedutaddad.beget.app/apps/user_oidc/code'
scopes:
- 'openid'
- 'profile'
- 'email'
- 'groups'
userinfo_signed_response_alg: 'none'
token_endpoint_auth_method: 'client_secret_post'

В поле client_secret укажите сгенерированный ранее хэш пароля, а в поле redirect_uris скорректируйте домен в ссылке редиректа на домен вашего сервера Nextcloud. Пример итоговой конфигурации:

theme: "auto"
server:
address: "tcp://:9091"
endpoints:
authz:
forward-auth:
implementation: ForwardAuth

authentication_backend:
file:
path: /config/users.yml

totp:
issuer: auth.betutorial.ru
period: 30

access_control:
default_policy: deny
rules:
- domain: ["blog.betutorial.ru"]
policy: bypass

identity_providers:
oidc:
hmac_secret: "ad54b80c3cfc0978b1ce54463d14aa624f012623daa8caa5c3589d558741ceeebc55bd722fb81230fd46d080b2550db23b62b15523ffc1b7b7ac5bdc1d12ad48"
jwks:
- key_id: "authelia"
algorithm: "RS256"
use: "sig"
certificate_chain: |
-----BEGIN CERTIFICATE-----
<СЕРТИФИКАТ>
-----END CERTIFICATE-----
key: |
-----BEGIN PRIVATE KEY-----
<КЛЮЧ>
-----END PRIVATE KEY-----
clients:
- client_id: "nextcloud"
client_name: "Nextcloud OIDC"
client_secret: "$pbkdf2-sha512$310000$abYBFyIOd3NzbSceHkLzWA$G4AAJt.ZAOqBLJ.5jhmLei/hfwrUDfFT84y3dsXeoUuPBTtWCXolXHvdcIEkKtXYbDK1ZmYcsCnsTKcTzHslaQ"
public: false
authorization_policy: "one_factor"
require_pkce: true
pkce_challenge_method: "S256"
redirect_uris:
- "https://quedutaddad.beget.app/index.php/apps/user_oidc/code"
scopes:
- "openid"
- "profile"
- "email"
- "groups"
userinfo_signed_response_alg: "none"
token_endpoint_auth_method: "client_secret_post"

session:
redis:
host: "redis"
port: 6379

cookies:
- name: authelia_session
domain: "betutorial.ru"
authelia_url: "https://auth.betutorial.ru"
expiration: 1h
inactivity: 10m
remember_me: 1M
default_redirection_url: "https://betutorial.ru"

regulation:
max_retries: 3
find_time: 2m
ban_time: 5m

storage:
postgres:
address: "tcp://postgres:5432"
database: "authelia"
username: "authelia"
schema: "public"
timeout: "5 seconds"

notifier:
filesystem:
filename: "/config/notification.txt"

После чего перезагрузите контейнер authelia:

docker restart authelia

Настройка Nextcloud

Для завершения настройки потребуется установить приложение user_oidc в Nextcloud. Для этого авторизуйтесь в панели управления Nextcloud, после чего нажмите на иконку пользователя в правом верхнем углу и нажмите “Приложения”:

-2

В поиске введите "OpenID Connect user backend", после чего нажмите “Скачать и включить”:

-3

Затем перейдите в раздел “Параметры сервера” и откройте раздел OpenID Connect:

-4

Далее, чтобы настроить сервер авторизации и аутентификации, напротив Registered Providers нажмите на иконку плюса и в открывшейся форме укажите следующие данные:

  • Identifier – название провайдера для удобства
  • ID клиента – указанный в конфигурации Authelia client_id
  • Клиентский ключ – сгенерированный ранее пароль
  • Discovery endpoint – адрес Authelia в формате https://<домен>/.well-known/openid-configuration
  • Объем – openid email profile
-5

После этого сохраните, нажав “Добавить ответ”. Если сервер аутентификации настроен корректно, провайдер отобразится в списке:

-6

Добавленный провайдер будет доступен на странице авторизации:

-7

При нажатии откроется страница входа Authelia:

-8

Для входа используйте заданные в authelia/config/users.yml данные. Далее потребуется выдать разрешения Nextcloud:

-9

После чего произойдет авторизация в Nextcloud. Пользователь будет создан автоматически.

-10

Заключение

В данной статье мы кратко рассказали про установку и первичную настройку Authelia, а также как интегрировать сервис в качестве OIDC-провайдера на примере Nextcloud, однако сам сервис предоставляет значительно больше опций для настройки сервера аутентификации – рекомендуем ознакомиться с официальной документацией, если вам необходима более тонкая настройка сервиса.

Если возникнут вопросы, напишите нам, пожалуйста, тикет из панели управления аккаунта (раздел “Помощь и поддержка”), а если вы захотите обсудить эту статью или наши продукты с коллегами по цеху и сотрудниками облачной платформы Beget – ждем вас в нашем сообществе в Telegram.