Использование собственных сервисов зачастую удобно и дает больший контроль над своими данными. Однако по мере роста количества сервисов возникает проблема их защиты от нежелательного трафика – к примеру, часть сервисов не поддерживает ограничение доступа как таковое, а некоторые могут не поддерживать двухфакторную авторизацию. К тому же, зачастую может быть удобно настроить единую авторизацию для нескольких приложений, не полагаясь при этом на сторонних провайдеров. Тут на сцену и выходит Authelia – этот сервис позволяет как защищать эндпоинты дополнительным механизмом авторизации, так и использовать его в качестве Open ID Connect провайдера. Сервис поддерживает интеграцию с большинством популярных реверс-прокси, таких как Caddy, Nginx, Traefix и HAProxy.
В данной статье мы расскажем, как установить Authelia в комбинации с реверс-прокси Caddy, а также рассмотрим процесс интеграции с приложением в качестве OIDC-провайдера на примере Nextcloud.
Установка Authelia
Для установки Authelia и Caddy мы будем использовать Docker – для удобства будет использоваться соответствующее готовое решение, однако установка возможна на любой Linux-машине с установленными Docker и docker-compose.
Для упрощения статьи мы рассмотрим одну из возможных конфигураций 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"Сохраните полученные сертификат и ключ в безопасном месте. Также сгенерируйте случайную секретную строку следующей командой:
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, после чего нажмите на иконку пользователя в правом верхнем углу и нажмите “Приложения”:

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

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

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

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

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

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

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

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

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