Authelia — это сервер аутентификации и авторизации с открытым исходным кодом, защищающий современные веб-приложения путем взаимодействия с обратными прокси-серверами, такими как NGINX, Traefik и HAProxy.

Введение

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

Сценариев использования инструмента всего два:

  1. Авторизация по связке логин/пароль – обычное средство защиты.
  2. Двухэтапная аутентификация – добавляет еще один уровень безопасности, к связке логин/пароль добавляется еще код с мобильного телефона.

Если с первым вариантом все понятно – ставим логин отличный от admin , пароль не 1111 и жизнь прекрасна, то со вторым вариантом все не так однозначно, а именно существует много противников двухфакторки, аргументируя свою позицию, тем, что чем больше в процесс включается софта, тем больше потенциальная уязвимость.

Итак, двухэтапная аутентификация подразумевает под собой дополнительную защиту ваших электронных данных через привязку мобильного телефона и подтверждения входов через временные коды.

В Authelia она реализована двумя вариантами на выбор:

  1. Получение тайм кодов через Google Authenticator
  2. Взаимодействие с сервисом DUO Security

Мы будем настраивать первый вариант. Перейдем к подготовительному этапу.

Подготовка

Для работы Authelia, необходимо наличие:

  1. Контейнера MariaDB или другой СУБД.
  2. Контейнера REDIS – тоже СУБД, только данные хранит в памяти, доступ к которым осуществляется по ключу доступа.
  3. Почтовый ящик.

Шаг 1 – СУБД MariaDB

Установим MariaDB и создадим базу данных, юзера и дадим права пользователю для использования созданной БД как описано в статье. Соберем установленные данные для подключения:

Адрес MariaDB – ИПСЕРВЕРА:3307

Пароль от MariaDB – Password

Имя созданной базы данных – userbase

Имя пользователя базы данных – user

Пароль от базы данных – userpass

MariaDB – система управления базами данных

Шаг 2 – СУБД REDIS

Установим Redis.

Соберем установленные данные для подключения:

Адрес REDIS – ИПСЕРВЕРА:6379

Redis – резидентная система управления базами данных

Шаг 3 – Почтовый ящик gmail.com

Я использую почтовый ящик от gmail.com с включенной двухфакторной аутентификацией. С регистрацией почты проблем возникнуть не должно, а вот с включением двухфакторки + созданием 16-значного пароля, могут могут быть вопросы, для их решения читаем инструкции от гугла.

От почтового ящика нам нужно собрать данные:

  • Логин: [email protected]
  • Пароль приложения для Authelia: 16-значный код
  • Сервер исходящей почты (SMTP): smtp.gmail.com
  • Порт для TLS/STARTTLS: 587

Установка Authelia

Для упрощения процедуры, разобьем на основные части:

  1. Установка шаблона Authelia из репозитория Community Application, а также привел пример ручной установки, приоритетом является именно он.
  2. Правки файла конфигурации Authelia.
  3. Первый запуск контейнера.
  4. Правки конфигурации пользователей для Authelia.

Шаг 1 – Установка контейнера из CA

В окне анрейд переходим на вкладку APPS, в графе поиска вводим Authelia, в поисковой выдаче видим искомый результат:

Authelia - поднимаем свой сервер авторизации на Unraid 6.8.3 4

Настроим контейнер, проверив поля. В основном стоит обратить внимание на те, которые с пометкой *

Authelia - поднимаем свой сервер авторизации на Unraid 6.8.3 5
  • Authelia Web UI: порт на котором будет работать будущий сервер авторизации, не должен быть занят другими контейнера.
  • AppData Config Path: путь, где будут хранится файлы конфигурации.
Остальные данные в полях контейнера остаются по умолчанию, любые изменения производить на свой страх и риск

После заполнения данных нажимаем APPLY. В следующем окне будет информация о выполненных операциях по установке.

Authelia - поднимаем свой сервер авторизации на Unraid 6.8.3 6

Нажимаем DONE, переходим на вкладку DOCKER, видим установленный контейнер Authelia, но он окажется выключен.

Если по каким-то причинам возникают сложности с установкой из CA, переходим к ручной установке

Шаг 1 – Ручная установка

Если по каким-то причинам не подошел контейнер из CA(способ установки описан выше), и возникают трудности с установкой из шаблона, то те же действия можно проделать полностью в ручном режиме, для этого переходим на вкладку DOCKER, затем спускаемся в самый низ и нажимаем кнопку Authelia - поднимаем свой сервер авторизации на Unraid 6.8.3 7

В открывшемся окне включаем расширенный вид активацией ползунка в верхнем правом углу Authelia - поднимаем свой сервер авторизации на Unraid 6.8.3 8 и начинаем методично заполнять поля:

  • Name: произвольное имя контейнера, должно отображать суть, у меня Authelia
  • Repository: репозиторий, откуда будет установлен контейнер, официальный authelia/authelia
  • Docker Hub URL: ссылка на репозиторий, пишем https://hub.docker.com/r/authelia/authelia/
  • Icon URL: ссылка на иконку, пишем https://i.imgur.com/DCn2yiv.png
  • WebUI: доступ из локальной сети, связка в IP+Port, заполняем http://[IP]:[PORT:9091]/
  • Network Type: как контейнер будет выходить в сеть, ставим HOST
  • Authelia Web UI: порт, по которому будет доступ в WebUI, по умолчанию 9091
  • Key 1: переменная для работы контейнера, устанавливаем 000
  • PUID: переменная для работы контейнера, устанавливаем 99
  • PGID: переменная для работы контейнера, устанавливаем 100
  • AppData Config Path: путь, для файлов конфигурации, по умолчанию /mnt/user/appdata/Authelia

Сверяемся со скринами, обращаем внимание на каждое значение:

Authelia - поднимаем свой сервер авторизации на Unraid 6.8.3 9
Общий вид

Детально разберем каждый пункт:

После заполнения данных нажимаем APPLY. В следующем окне будет информация о выполненных операциях по установке, нажимаем DONE, переходим на вкладку DOCKER, видим установленный контейнер Authelia, но он выключен, т.к. не настроены файлы конфигурации.

Шаг 2 – Файлы конфигурации

При установке контейнера в AppData Config Path указывали директорию хранения файла конфигурации configuration.yml, который следует заполнить в соответствии с собранными данными из подготовительного пункта.

Я указывал путь /mnt/user/appdata/Authelia заходим туда любым файловым менеджером на выбор: WinSCP, MC или Cloud Commander, я буду использовать последний вариант.

Вне зависимости от того, создал ли контейнер автоматически файлы конфигурации или нет, мы их будем заменять

Основной файл конфигурации configuration.yml скачиваем из репозитория ibracorp и заполняем своими данными исходя и собранных на этапе Подготовки:

Указываем IP и порт для контейнера Authelia:

host: 192.168.31.100
port: 9091

Очень важный секрет, генерируем онлайн, предварительно выбрав 128-bit:

jwt_secret: H+MbQeShVmYq3t6w

Параметры переадресации(не обязательно) в случае успешной авторизации, вписываем свой домен:

default_redirection_url: https://mydomain.ru

Параметры TOTP:

totp:
  issuer: mydomain.ru
  period: 30
  skew: 1

Параметры DUO(не пользуюсь, настройки оставляю по дефолту), секрет можно использовать из настроек выше:

duo_api:
  hostname: api-123456789.mydomain.ru
  integration_key: ABCDEF
  secret_key: H+MbQeShVmYq3t6w

Настройка разрешает(по умолчанию, false) или запрещает(true) возможность восстановления пароля:

authentication_backend:
  disable_reset_password: false
  refresh_interval: 5m

Настройки файла конфигурации пользовательских данных:

  file:
    path: /config/users_database.yml
    password:
      algorithm: argon2id
      iterations: 1
      key_length: 32
      salt_length: 16
      memory: 1024
      parallelism: 8

Настройки доступа для пользователей и групп, более подробно описано в официальной документации.

Для себя выставил настройки:

access_control:
  default_policy: two_factor
  rules:
    - domain: "*.mydomain.ru"
      subject:
        - "group:admins"
        - "group:devs"
      policy: one_factor
      networks:
        - 192.168.1.0/24

В пользовании это будет выглядеть примерно следующим образом:

default_policy: two_factor – от всех будет требовать двухфакторную аутентификацию.

Если вход осуществляется из сети 192.168.1.0/24, то вместо двухфакторки, требуется только ввод связки лог/пас.

Остальные данные являются настройками зон и групп пользователей, которые будут подвергнуты обязательной процедуре авторизации.

Идем далее, очень важные настройки, я оставил как есть, секрет используем тот, который генерировали ранее:

session:
  name: authelia_session
  secret: H+MbQeShVmYq3t6w
  expiration: 1h
  inactivity: 5m
  remember_me_duration: 1M

Все субдомены, которые попадают под защиту Authelia, должны быть под одним доменом, только так это работает:

  domain: mydomain.ru

Настройки подключения к СУБД REDIS:

    host: 192.168.31.100
    port: 6379
    database_index: 0
database_index – выбирается свободный порядковый номер из простых чисел. Делается это для того, чтобы не возникало смешения данных из разных контейнеров, которые подключены к redis. Для примера authelia подключена к redis c индексом 0, затем я подключил nextcloud c индексом 1, далее контейнер WP с индексом 2 и так далее.

Настройки защиты от подбора пароля. Если три раза введены неправильные данные, то получаем бан на пять минут:

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

Настройка подключения к СУБД MariaDB:

storage:
  mysql:
    host: 192.168.31.100
    port: 3307
    database: userbase
    username: user
    password: userpass

Настройки уведомлений о смене пароля, отключил:

notifier:
  disable_startup_check: true

Настройки почтового сервера, использую ящик gmail.com с подготовленным 16-значным паролем приложения:

  smtp:
    username: [email protected]
    password: 16-значный пароль приложения
    host: smtp.gmail.com
    port: 587
    sender: [email protected]
    subject: "[Authelia] {title}"
    startup_check_address: [email protected]
    trusted_cert: ""
    disable_require_tls: false
    disable_verify_cert: false
При редактировании, также следует обратить внимание на комментарии внутри конфига

После всех манипуляций подготовленный конфиг закидываем по пути /mnt/user/appdata/Authelia с помощью файлового менеджера.

Шаг 3 – Запуск контейнера

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

Authelia - поднимаем свой сервер авторизации на Unraid 6.8.3 15

Шаг 4 – Настройка пользователей

После успешного старта контейнера, рядом с основным файлом конфигурации должен появиться users_database.yml в котором сосредоточены настройки пользователей.

Если этого не произошло берем заветный файл из репозитория ibracorp, и проводим его настройку. Создадим пользователя с данными:

  • Логин: admin
  • Отображаемое имя: Admin
  • Пароль: Password
  • Email: [email protected]
  • Группы: admins, dev
users:
  admin:
    displayname: "Admin"
    password: "$argon2id$v=19$m=1024,t=1,p=8$MTFsdWJpZTE2em5ha292MQ$DxDhXKHJE0TLvQOr6yO6ACGx1ABDbWf8Jkwi0ONBAW4"
    email: [email protected]
    groups:
      - admins
      - dev

Пароль Password представлен в зашифрованном виде, для получения переходим на argon2.online и вводим желаемый пароль с настройками:

  • Salt: Произвольные 16 символов
  • Parallelism: 8
  • Memory Cost: 1024
  • Iterations: 1
  • Hash length: 32
  • Algorithm: Argon2id

Результат должен быть как на скрине:

Authelia - поднимаем свой сервер авторизации на Unraid 6.8.3 16

Сохраняем сформированный users_database.yml по пути /mnt/user/appdata/Authelia

Настройка Nginx Proxy Manager(NPM)

Как установить NPM описал в отдельной статье, он нам понадобится для подключения субдомена к Authelia, получения SSL и настройке авторизации к уже проброшенным контейнерам.

Добавляем ProxyHost для Authelia

Заходим в WebUI контейнера Nginx Proxy Manager, авторизуемся, переходим по вкладкам Dashboard -> Proxy Hosts -> Add Proxy Host

В открывшемся окне – заполняем параметры вкладок Details и SSL:

  • Domain Names: имя будущего субдомена для Authelia, вместо mydomain.ru надо вписать Ваш
  • Scheme: http
  • Forward Hostname / IP: вписываем IP сервера
  • Forward Port: вписываем порт Authelia
  • SSL Certificate: запрашиваем новый сертификат
  • Email Address for Let’s Encrypt: почта указанная при регистрации NPM

Вкладка Advanced требует отдельного внимания, туда копируем конфиг:

location / {
set $upstream_authelia http://SERVERIP:9091; # This example assumes a Docker deployment 
proxy_pass $upstream_authelia;
client_body_buffer_size 128k;

#Timeout if the real server is dead
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;

# Advanced Proxy Config
send_timeout 5m;
proxy_read_timeout 360;
proxy_send_timeout 360;
proxy_connect_timeout 360;

# Basic Proxy Config
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Uri $request_uri;
proxy_set_header X-Forwarded-Ssl on;
proxy_redirect  http://  $scheme://;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_cache_bypass $cookie_session;
proxy_no_cache $cookie_session;
proxy_buffers 64 256k;

# If behind reverse proxy, forwards the correct IP
set_real_ip_from 10.0.0.0/8;
set_real_ip_from 172.0.0.0/8;
set_real_ip_from 192.168.0.0/16;
set_real_ip_from fc00::/7;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
}

Где http://192.168.31.100:9091 – IP и Port для контейнера Authelia, остальное оставляем без изменений. После заполнения трех вкладок нажимаем SAVE, Обращаем внимание на Status, должен быть Online с зеленым значком.

Пробуем зайти по доменному имени, если все сделано верно, то будет результат:

Authelia - поднимаем свой сервер авторизации на Unraid 6.8.3 19

Авторизация

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

Authelia - поднимаем свой сервер авторизации на Unraid 6.8.3 20

Далее в METHODS выбираем способ авторизации для данного пользователя, выбираем One-time-password

Authelia - поднимаем свой сервер авторизации на Unraid 6.8.3 21

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

Authelia - поднимаем свой сервер авторизации на Unraid 6.8.3 22

Переходим по ссылке, в новом окне сканируем QRCode приложением Google Authenticator

Authelia - поднимаем свой сервер авторизации на Unraid 6.8.3 23

После сканирования в мобильном устройстве будут доступны 6-значные коды для входа.

Authelia - поднимаем свой сервер авторизации на Unraid 6.8.3 24

Подключаем Authelia к контейнерам

Добавлять авторизацию к контейнерам, которые не имеют собственную, будем через Nginx Proxy Manager. Для примера я возьму Jackett

Для начала пробрасываем Jackett в веб, мы уже делали подобное выше, заполняя вкладку Details и SSL, отличия будут в коде вкладке Advanced:

location /authelia {
internal;
set $upstream_authelia http://SERVERIP:9091/api/verify;
proxy_pass_request_body off;
proxy_pass $upstream_authelia;    
proxy_set_header Content-Length "";

# Timeout if the real server is dead
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
client_body_buffer_size 128k;
proxy_set_header Host $host;
proxy_set_header X-Original-URL $scheme://$http_host$request_uri;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr; 
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Uri $request_uri;
proxy_set_header X-Forwarded-Ssl on;
proxy_redirect  http://  $scheme://;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_cache_bypass $cookie_session;
proxy_no_cache $cookie_session;
proxy_buffers 4 32k;

send_timeout 5m;
proxy_read_timeout 240;
proxy_send_timeout 240;
proxy_connect_timeout 240;
}

location / {
set $upstream_CONTAINERNAME $forward_scheme://$server:$port;
proxy_pass $upstream_CONTAINERNAME;

auth_request /authelia;
auth_request_set $target_url https://$http_host$request_uri;
auth_request_set $user $upstream_http_remote_user;
auth_request_set $groups $upstream_http_remote_groups;
proxy_set_header Remote-User $user;
proxy_set_header Remote-Groups $groups;
error_page 401 =302 https://auth.YOURDOMAIN.com/?rd=$target_url;

client_body_buffer_size 128k;

proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;

send_timeout 5m;
proxy_read_timeout 360;
proxy_send_timeout 360;
proxy_connect_timeout 360;

proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
proxy_set_header Accept-Encoding gzip;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header X-Forwarded-Uri $request_uri;
proxy_set_header X-Forwarded-Ssl on;
proxy_redirect  http://  $scheme://;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_cache_bypass $cookie_session;
proxy_no_cache $cookie_session;
proxy_buffers 64 256k;

set_real_ip_from 192.168.1.0/16;
real_ip_header X-Forwarded-For;
real_ip_recursive on;

}

Где SERVERIP:9091 – IP + порт контейнера authelia.

Задаем CONTAINERNAME в двух местах (в моем случае это будет jackett)

А также YOURDOMAIN.com меняем на ваш домен(в моем случае myunraid.ru)

Если у контейнера есть API

К таким контейнерам относятся Sonarr, Radarr и Lidarr. Они используют встроенный API с помощью которого подключаются другие контейнеры и приложения.

Для Authelia его необходимо исключить из процесса авторизации, и сделать это можно при помощи все того же NPM, в котором настраивается вкладка Custom Locations. Выглядит настройка следующим образом:

Порядок запуска

При использовании баз данных MariaDB и Redis (рекомендуется) важно отметить, что порядок запуска контейнеров должен быть настроен правильно. В unRAID:

  1. На вкладке DOCKER переключаем ползунок с basic на advanced view.
  2. Переместите строки так, чтобы все контейнеры баз данных были выше в списке, чем Authelia.
  3. Рядом с переключателем Autostart, необходимо установить задержку (в секундах) для контейнера, чтобы он ждал перед запуском следующего контейнера под ним. Устанавливаем 20 для контейнера над authelia.
Это важно, так как позволяет некоторым контейнерам, запуск которых требует времени и может иметь зависимости, полноценно завершить процедуру запуска.

Итог

Описанная выше связка контейнеров:

  • Redis
  • MariaDB
  • Nginx Proxy Manager
  • Authelia

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