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

Использование собственных сервисов зачастую удобно и дает больший контроль над своими данными. Однако по мере роста количества сервисов возникает проблема их защиты от нежелательного трафика – к примеру, часть сервисов не поддерживает ограничение доступа как таковое, а некоторые могут не поддерживать двухфакторную авторизацию. К тому же, зачастую может быть удобно настроить единую авторизацию для нескольких приложений, не полагаясь при этом на сторонних провайдеров. Тут на сцену и выходит 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:

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, после чего нажмите на иконку пользователя в правом верхнем углу и нажмите “Приложения”:

Nextcloud приложения

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

openid connect установка

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

Параметры сервера

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

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

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

список провайдеров

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

Nextcloud авторизация

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

Authelia страница авторизации

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

nextcloud разрешения

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

nextcloud успешная авторизация

Заключение

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

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

0
1666