Authelia — это сервер аутентификации и авторизации с открытым исходным кодом, защищающий современные веб-приложения путем взаимодействия с обратными прокси-серверами, такими как NGINX, Traefik и HAProxy.
Введение
В современном мире главным ресурсом является информация, защиту которой мы обсудим в данной статье. Authelia послужит нам тем самым инструментом, который оградит, от посторонних глаз и рук, установленные докер контейнеры, которые не имеют собственных средств авторизации, или имеют, но их не достаточно.
Сценариев использования инструмента всего два:
- Авторизация по связке логин/пароль – обычное средство защиты.
- Двухэтапная аутентификация – добавляет еще один уровень безопасности, к связке логин/пароль добавляется еще код с мобильного телефона.
Если с первым вариантом все понятно – ставим логин отличный от admin , пароль не 1111 и жизнь прекрасна, то со вторым вариантом все не так однозначно, а именно существует много противников двухфакторки, аргументируя свою позицию, тем, что чем больше в процесс включается софта, тем больше потенциальная уязвимость.
Итак, двухэтапная аутентификация подразумевает под собой дополнительную защиту ваших электронных данных через привязку мобильного телефона и подтверждения входов через временные коды.
В Authelia она реализована двумя вариантами на выбор:
- Получение тайм кодов через Google Authenticator
- Взаимодействие с сервисом DUO Security
Мы будем настраивать первый вариант. Перейдем к подготовительному этапу.
Подготовка
Для работы Authelia, необходимо наличие:
- Контейнера MariaDB или другой СУБД.
- Контейнера REDIS – тоже СУБД, только данные хранит в памяти, доступ к которым осуществляется по ключу доступа.
- Почтовый ящик.
Шаг 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
Для упрощения процедуры, разобьем на основные части:
- Установка шаблона Authelia из репозитория Community Application, а также привел пример ручной установки, приоритетом является именно он.
- Правки файла конфигурации Authelia.
- Первый запуск контейнера.
- Правки конфигурации пользователей для Authelia.
Шаг 1 – Установка контейнера из CA
В окне анрейд переходим на вкладку APPS, в графе поиска вводим Authelia, в поисковой выдаче видим искомый результат:
Настроим контейнер, проверив поля. В основном стоит обратить внимание на те, которые с пометкой *
- Authelia Web UI: порт на котором будет работать будущий сервер авторизации, не должен быть занят другими контейнера.
- AppData Config Path: путь, где будут хранится файлы конфигурации.
После заполнения данных нажимаем APPLY. В следующем окне будет информация о выполненных операциях по установке.
Нажимаем DONE, переходим на вкладку DOCKER, видим установленный контейнер Authelia, но он окажется выключен.
Шаг 1 – Ручная установка
Если по каким-то причинам не подошел контейнер из CA(способ установки описан выше), и возникают трудности с установкой из шаблона, то те же действия можно проделать полностью в ручном режиме, для этого переходим на вкладку DOCKER, затем спускаемся в самый низ и нажимаем кнопку
В открывшемся окне включаем расширенный вид активацией ползунка в верхнем правом углу и начинаем методично заполнять поля:
- 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
Сверяемся со скринами, обращаем внимание на каждое значение:
Детально разберем каждый пункт:
После заполнения данных нажимаем 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
Настройки защиты от подбора пароля. Если три раза введены неправильные данные, то получаем бан на пять минут:
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 – Запуск контейнера
Пробуем запустить контейнер, обращая внимание на лог. Если все верно, то рядом с иконкой контейнера будет зеленая стрелка и лог будет без красных записей. Посмотреть лог можно нажав на значок справа. В случае некорректных данных в логе будет запись.
Шаг 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
Результат должен быть как на скрине:
Сохраняем сформированный 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 с зеленым значком.
Пробуем зайти по доменному имени, если все сделано верно, то будет результат:
Авторизация
Пробуем авторизоваться используя логин и пароль созданного пользователя.
Далее в METHODS выбираем способ авторизации для данного пользователя, выбираем One-time-password
На указанную в шаге создания пользователя почту придет письмо с ссылкой на регистрацию мобильного устройства:
Переходим по ссылке, в новом окне сканируем QRCode приложением Google Authenticator
После сканирования в мобильном устройстве будут доступны 6-значные коды для входа.
Подключаем 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. Выглядит настройка следующим образом:
Radarr Sonarr Lidarr
Порядок запуска
При использовании баз данных MariaDB и Redis (рекомендуется) важно отметить, что порядок запуска контейнеров должен быть настроен правильно. В unRAID:
- На вкладке DOCKER переключаем ползунок с basic на advanced view.
- Переместите строки так, чтобы все контейнеры баз данных были выше в списке, чем Authelia.
- Рядом с переключателем Autostart, необходимо установить задержку (в секундах) для контейнера, чтобы он ждал перед запуском следующего контейнера под ним. Устанавливаем 20 для контейнера над authelia.
Итог
Описанная выше связка контейнеров:
- Redis
- MariaDB
- Nginx Proxy Manager
- Authelia
Позволит организовать бесшовный, приватный, гибкий, шустрый, “красивый” и самое главное безопасный сервер авторизации, который позволит без опасений, пробросить все контейнеры, будь то совместная работа над одним проектом, или в качестве облегчения личного доступа к конкретным докерам.
круть, отличное приложение.
Угу
просто читаю, не знаю какой по счёту, пост и выписываю себе планы на выходные…
И это прекрасно =)
а что за гуи управления docker на скринах?
Это unRAID гуй)