Нотатки

Налаштування Authelia

Authelia — це відкритий self-hosted сервер автентифікації та авторизації, який ставлять перед власними веб-застосунками, щоб не робити окремий вхід у кожному з них. Сам він не є реверс-проксі й не вміє сам приймати трафік із зовнішнього світу: зазвичай перед ним стоїть Caddy, Nginx чи Traefik, які через механізм forward auth питають в Authelia, чи можна пропустити конкретний запит.

Authelia віддає користувачеві єдину сторінку входу, де той один раз вводить логін і пароль та, за потреби, другий фактор — TOTP-код, апаратний ключ WebAuthn або push-підтвердження. Після успішного входу вона виставляє підписаний cookie-сесію, і далі всі сайти в межах того самого домену вважають користувача вже автентифікованим. Кого саме пускати й з яким рівнем перевірки визначають правила access_control: можна дозволити one_factor для однієї піддомен-зони, вимагати two_factor для іншої або повністю закрити решту політикою deny.

Список користувачів Authelia бере з LDAP-каталогу або з простого YAML-файлу, у якому зберігаються лише хеші паролів, а для скидання пароля й повідомлень потрібен налаштований notifier. У результаті всі пароли, друга лічба факторів і правила доступу живуть в одному місці, а застосунки за проксі просто довіряють заголовкам, які прокидає Authelia.

Docker (compose.yaml)

Цей compose-файл запускає Authelia в контейнері й підключає його до зовнішньої мережі trkm-network, де контейнери бачать один одного за іменами сервісів. Каталог ./config монтується в /config, тож налаштування й база лишаються на хості, а expose відкриває порт 9091 тільки всередині мережі — назовні Authelia доступна лише через Caddy.

cat compose.yaml 
services:
  authelia:
    image: authelia/authelia:latest
    container_name: authelia
    restart: unless-stopped
    volumes:
      - ./config:/config
    networks:
      - trkm-network
    expose:
      - 9091
    environment:
      - TZ=Europe/Kyiv

networks:
  trkm-network:
    external: true

Конфігурація Authelia (configuration.yml)

Це головний конфіг Authelia: session описує cookie й час життя «запам'ятай мене», authentication_backend вказує файл із хешами паролів, а access_control за замовчуванням забороняє все й дозволяє one_factor для articles.trkm.top. Секції storage та identity_validation тримають ключі для шифрування SQLite-бази і JWT скидання пароля, а notifier у режимі filesystem просто пише листи у файл — зручно для тестів, для продакшену краще SMTP.

cat config/configuration.yml
server:
  address: "tcp://0.0.0.0:9091"

session:
  name: authelia_session
  secret: "8d5c4b1e9f2a7b3c6d5e8f1a2b3c4erre7a8b9c0d1e2f3a4b5c6d7e8f9a0b1c"
  remember_me: 1M
  cookies:
    - domain: trkm.top
      authelia_url: https://auth.trkm.top
      # Цей рядок переїхав сюди
      default_redirection_url: https://articles.trkm.top

identity_validation:
  reset_password:
    jwt_secret: "a7b8c9d0e1f2g3h7687981p2q3r4s5t6u7v8w9x0y1z2a3b4c5d6e7f8"

authentication_backend:
  file:
    path: /config/users_database.yml

access_control:
  default_policy: deny
  rules:
    - domain: articles.trkm.top
      policy: one_factor
   
storage:
  encryption_key: "k1l2m3n4or8s9t0u1v2w3x4y5z6a7b8c9d0e1256679i5j6k7l8m9n0o1p2"
  local:
    path: /config/db.sqlite3

notifier:
  filesystem:
    filename: /config/emails.txt

log:
  level: info
  format: text

Налаштування Caddy

Caddy тут — єдина публічна точка входу: auth.trkm.top проксіює запити до Authelia, доступної на хості як host.docker.internal:9091. У блоці articles.trkm.top директива forward_auth перед кожним запитом викликає /api/verify і за потреби перенаправляє на вхід, а copy_headers прокидає дані користувача в бекенд.

auth.trkm.top {
    reverse_proxy host.docker.internal:9091
}

articles.trkm.top {
    # Блок перевірки автентифікації через Authelia
    forward_auth auth.trkm.top {
        uri /api/verify?rd=https://auth.trkm.top
        copy_headers Remote-User Remote-Groups Remote-Name Remote-Email
    }
		
    reverse_proxy articles:8080
}

Генерація хешу пароля

Команда виконується всередині контейнера і перетворює пароль у хеш argon2id — саме такий рядок треба вставити в поле password файлу users_database.yml. Відкритий пароль ніде не зберігаємо; замість --password можна передати --random, і Authelia сама згенерує пароль.

docker exec -it authelia authelia crypto hash generate --password "pa$$word"