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 – Password

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

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

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

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

  • Логин: login@gmail.com
  • Пароль приложения для 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
    password: Password
    database_index: 0

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

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: login@gmail.com
    password: 16-значный пароль приложения
    host: smtp.gmail.com
    port: 587
    sender: login@gmail.com
    subject: "[Authelia] {title}"
    startup_check_address: login@gmail.com
    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: admin@mydomain.ru
  • Группы: admins, dev
users:
  admin:
    displayname: "Admin"
    password: "$argon2id$v=19$m=1024,t=1,p=8$MTFsdWJpZTE2em5ha292MQ$DxDhXKHJE0TLvQOr6yO6ACGx1ABDbWf8Jkwi0ONBAW4"
    email: admin@mydomain.ru
    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://192.168.31.100: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://192.168.31.100: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_jacket http://192.168.31.100:9117;
        proxy_pass $upstream_jacket;
		
		auth_request /authelia;
		auth_request_set $target_url $scheme://$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://authelia.myunraid.ru/?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 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;

    }

Где set $upstream_authelia http://192.168.31.100:9091/api/verify;

Локальный IP адрес и порт контейнера Authelia. Вторая часть

    location / {
        set $upstream_jacket http://192.168.31.100:9117;
        proxy_pass $upstream_jacket;

Относится к названию контейнера, который подключаем $upstream_jacket и $upstream_jacket; , а также настройки его локального IP и порт http://192.168.31.100:9117;

Ну и в завершении, самая главная строка:

error_page 401 =302 https://authelia.mydomain.ru/?rd=$target_url;

Где указываем субдомен вида authelia.mydomain.ru для переадресации.

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

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

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

Итог

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

  • Redis
  • MariaDB
  • Nginx Proxy Manager
  • Authelia

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