Настройка ntfy

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

1
2
3
4
ntfy user add authentik
# вводим пароль и подтверждение

ntfy token add authentik

ntfy выведет токен в виде tk_*****, который понадобится в дальнейшем.

Для уведомлений будем использовать тему ntfy с названием auth. Добавляем нашему пользователю права на запись в эту тему:

1
ntfy access authentik auth write

Настройка Authentik

Переходим в интерфейс администратора и в разделе Events -> Notification Transports, создаем новый транспорт:

  • Name: ntfy
  • Send once: включено
  • Mode: Webhook (generic)
  • Webhook URL: см. ниже
  • Webhook Body Mapping: пока оставляем пустым, заполним позже
  • Webhook Header Mapping: пусто

Webhook URL

Для примера будем использовать https://ntfy.example.com как адрес ntfy. Тогда в Webhook URL пишем: https://ntfy.example.com?auth=. После auth= нужно дописать токен ntfy, закодированный в base64, но без символов =. Готовим токен командой:

1
echo -n "Bearer tk_*****" | base64 -w0 | tr -d '='

и добавляем в URL.

Обратите внимание: в URL тема ntfy не указывается.

Webhook Body Mapping

Здесь придётся использовать немного магии: с помощью кода на Python, сформируем JSON, который будет отправляться в ntfy.

Создаем новый Property Mapping в разделе Customization -> Property Mappings:

  • Type: Webhook Mapping
  • Name: ntfy
  • Expression: пишем следующий код:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
topic = "auth"  # Сюда подставьте название темы в ntfy
title = ""
message = ""
priority = 3
tags = []

try:
    if notification.event.action == "login_failed":
        # Если тип события - неудачный логин,
        # собираем данные о входе и формируем уведомление
        user = notification.event.user["username"]
        ip = notification.event.client_ip
        country = notification.event.context["geo"]["country"]
        city = notification.event.context["geo"]["city"]
        user_agent = notification.event.context["http_request"]["user_agent"]

        title = "Неудачная попытка входа"
        message = (
            f"Кто-то попытался войти под именем {user}\n"
            f"С IP адреса {ip} ({city}, {country})\n"
            f"User agent: {user_agent}"
        )
        priority = 4
        tags = ["ninja"]
    else:
        # Для остальных событий:
        # в заголовке уведомления пишем тип события
        # в теле - выводим все доступные данные в "сыром" виде
        title = notification.event.action
        message = str(notification.event)
except Exception as e:
    # Эта часть выполнится в случае ошибок в коде выше
    # и запишет ошибку в тело уведомления
    title = "Произошла ошибка"
    message = repr(e)
    priority = 5
    tags = ["no_entry"]

# Отдаем данные для отправки в ntfy
return {
    "topic": topic,
    "title": title,
    "message": message,
    "priority": priority,
    "tags": tags
}

Не забудьте поменять название темы ntfy в переменной topic. В примере указана тема auth.

Если планируете добавить обработку других типов событий, поля структуры notification.event можно подсмотреть в логах Authentik, раздел Events -> Logs. Выберете нужное событие и в столбце Actions нажмите кнопку Show details.

Возвращаемся в Events -> Notification Transports, редактируем транспорт ntfy и выбираем только что созданный Property Mapping (ntfy) в поле Webhook Body Mapping.

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

Notification Rules

Переходим в раздел Events -> Notification Rules и создаем новое правило:

  • Name: ntfy notifications
  • Group: authentik Admins
  • Transports: добавляем ntfy в столбец Selected Transports
  • Severity: любая (для ntfy приоритет уведомления определяется в Python коде)

Нажимаем Create.

Теперь укажем политики, при которых будет срабатывать наше правило. Раскрываем ntfy notifications и нажимаем Create and bind Policy:

  • Type: Event Matcher Policy
  • Name: любое имя
  • Action: выбираем тип события (например, Login Failed срабатывает при неудачных попытках входа)
  • Остальные поля не трогаем

Созданные политики можно посмотреть и отредактировать в разделе Customization -> Policies.

На этом - всё. Подпишитесь на выбранную тему в ntfy, если ещё этого не сделали, и попробуйте ввести неправильный пароль при входе в Authentik. Подписчикам темы придет уведомление о неудачной попытке входа.

Полезные ссылки