Перейти к содержимому
Integration

Проверяйте безопасность электронной почты вашего домена при каждом нажатии с помощью GitHub Actions

| 7 min read

Действие GitHub, которое проверяет записи SPF, DMARC и DKIM с помощью API botoi и завершает сборку неудачно, если какая-либо запись отсутствует или неправильно настроена.

GitHub Actions workflow running in a terminal
Photo by Roman Synkevych on Unsplash

Кто-то из вашей команды обновляет запись DNS. Запись TXT удаляется во время миграции поставщика. Ваша запись SPF незаметно превышает лимит в 10 запросов. Письма начинают попадать в спам. Никто уведомления в течение двух недель, пока клиент не сообщит, что он так и не получил ваш счет.

Записи безопасности электронной почты на основе DNS (SPF, DMARC, DKIM) — это тип инфраструктуры, которая работает отлично, пока не работает. При его поломке режим отказа молчит: ошибок нет, никаких оповещений, электронные письма исчезают в папках со спамом.

В этом руководстве настраивается действие GitHub, которое проверяет все три записи при каждом нажатии. Если любая запись отсутствует или неправильно настроена, рабочий процесс завершается сбоем и сообщает, что сломалось.

Что делает рабочий процесс

При каждом нажатии на main, действие:

  1. Вызывает ботоя /v1/dns-security/spf-check конечная точка для проверки вашей записи SPF
  2. Звонки /v1/dns-security/dmarc-check для подтверждения вашей политики DMARC
  3. Звонки /v1/dns-security/dkim-check чтобы убедиться, что ваш ключ DKIM опубликован
  4. Выход с ненулевым кодом, если какая-либо проверка не удалась, блокируя слияние.

Рабочий процесс действий GitHub

Создавать .github/workflows/dns-security.yml в вашем репозитории:

Заменять yourdomain.com с вашим доменом и google с селектор DKIM вашего провайдера электронной почты. Рабочий процесс выполняется при каждом нажатии на main, по ежедневному расписанию и может быть запущен вручную на вкладке «Действия».

Что подтверждает каждая проверка

SPF (структура политики отправителей)

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

Ключевые поля для просмотра:

  • has_spf: Есть ли запись TXT, начинающаяся с v=spf1? Если значение false, любой сервер может утверждать, что отправляет электронную почту из вашего домена.
  • valid: Правильно ли парсится запись? Записи SPF разрушаются, когда они превышают лимит поиска DNS в 10 или содержат синтаксические ошибки.
  • all_policy: Прицепной механизм. -all (жесткий провал) это самая сильная установка. ~all (мягкий сбой) помечает несанкционированную почту как подозрительно. +all полностью противоречит цели SPF.

Пример ответа API для исправной записи SPF:

DMARC (Аутентификация сообщений, отчетность и соответствие на основе домена)

DMARC сообщает принимающим серверам, что делать, если проверки SPF или DKIM не удались. Без этого, даже действительные записи SPF и DKIM не предотвращают подделку.

Ключевые поля для просмотра:

  • policy: Что происходит с ошибочными сообщениями. reject капли они, quarantine отправляет их в спам, none не предпринимает никаких действий (только мониторинг).
  • pct: процент сообщений, к которым применяется политика. Начните с низкого уровня номер во время развертывания, затем перейдите к 100.
  • reporting.rua: куда отправляются сводные отчеты. Без этого вы не иметь возможности видеть ошибки аутентификации.

Пример ответа API для записи DMARC:

DKIM (почта, идентифицированная DomainKeys)

DKIM добавляет криптографическую подпись к исходящим сообщениям. Принимающие серверы проверяют подпись на основе открытого ключа, опубликованного в вашем DNS. Если ключ отсутствует или повернут без обновления DNS проверка подписи не удалась.

Ключевые поля для просмотра:

  • has_dkim: опубликован ли ключ DKIM для данного селектора? Каждое письмо провайдер использует другое имя селектора.
  • public_key_length: NIST рекомендует минимум 2048 бит. Ключи короче более 1024 бит считаются слабыми.
  • key_type: Большинство ключей используют RSA. Ed25519 keys are smaller and faster but have limited support across mail providers.

Пример ответа API на проверку DKIM:

Common DKIM selectors by provider

Поставщик электронной почты Селектор(ы) DKIM
Google Рабочая область google
Майкрософт 365 selector1, selector2
Амазон СЭС UUID-based (check your SES dashboard)
Mailchimp / Мандрил k1
ОтправитьГрид s1, s2
Почтовый штемпель Генерируется для каждого домена (проверьте настройки DNS)

Расширение рабочего процесса

Несколько доменов

Если вы управляете несколькими доменами, используйте матричную стратегию для проверки каждого из них. Добавить ботой Ключ API в качестве секрета GitHub, чтобы избежать превышения лимита скорости бесплатного уровня.

Slack уведомления о сбоях

Добавьте шаг уведомления, который срабатывает, если какая-либо проверка не удалась. При этом используется официальное действие Slack GitHub:

Настройка монорепо

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

Запланированный триггер по-прежнему запускается ежедневно независимо от фильтров путей, поэтому вы можете улавливать DNS. изменения, сделанные вне репозитория.

Использование ключа API для более высоких лимитов скорости

Если вы проверяете несколько доменов или часто запускаете рабочий процесс, добавьте свой ключ API botoi. в качестве секрета действий GitHub:

  1. Перейдите в настройки вашего репозитория > Секреты и переменные > Действия
  2. Добавьте секрет с именем BOTOI_API_KEY
  3. Добавьте заголовок аутентификации к каждой команде Curl:

Что делать, если проверки не прошли

  • Отсутствует запись SPF: Добавьте запись TXT в DNS вашего домена. Начните с v=spf1 include:_spf.google.com ~all (замените include на свой домен SPF поставщика электронной почты).
  • Неверная запись SPF: Вероятно, вы достигли предела поиска в 10 DNS. Используйте Инструмент для выравнивания SPF для замены include: механизмы с IP-адресами, или объединить поставщиков.
  • Отсутствует запись DMARC: Добавьте запись TXT в _dmarc.yourdomain.com. Начните с v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com контролировать прежде чем приводить в исполнение.
  • Политика DMARC — «нет»: Это нормально во время развертывания. Как только вы подтвердите законная электронная почта проходит SPF и DKIM, перейдите на p=quarantine а потом p=reject.
  • Отсутствует запись DKIM: Убедитесь, что у вас есть правильный селектор для вашего провайдер электронной почты (см. таблицу выше). Ключ должен быть опубликован в виде записи TXT по адресу [selector]._domainkey.yourdomain.com.
  • Ключ DKIM слишком короткий: Измените ключ DKIM на 2048 бит через панель администратора почтового провайдера, а затем обновите запись DNS TXT.

FAQ

Нужен ли мне ключ API botoi для этого рабочего процесса?
Нет. Уровень бесплатного пользования допускает 5 запросов в минуту без ключа API. Рабочий процесс делает 3 запроса за один запуск (SPF, DMARC, DKIM), что укладывается в лимит. Если вы выполняете проверки на нескольких доменах или селекторах, добавьте свой ключ API в качестве секрета GitHub и передайте его в заголовке авторизации.
Могу ли я проверить несколько доменов за один рабочий процесс?
Да. Переберите массив доменов в сценарии проверки. Для каждого домена требуется 3 вызова API, поэтому запуск на бесплатном уровне обрабатывает один домен за один вызов. Для нескольких доменов добавьте ключ API botoi, чтобы избежать ограничения скорости.
Какой селектор DKIM мне следует использовать?
Селектор зависит от вашего провайдера электронной почты. Google Workspace использует «google», Microsoft 365 использует «selector1» и «selector2», Amazon SES использует селектор на основе UUID. Проверьте записи TXT DNS на наличие записей, соответствующих шаблону [селектор]._domainkey.вашдомен.com.
Будет ли этот рабочий процесс блокировать мои развертывания?
Только в том случае, если проверка не удалась, что означает, что записи безопасности вашей электронной почты отсутствуют или неправильно настроены. В этом вся суть: вы хотите выявить эти проблемы до того, как они вызовут проблемы с доставляемостью. Вы можете изменить рабочий процесс, чтобы публиковать предупреждение вместо сбоя, заменив «выход 1» шагом, который создает проблему GitHub или отправляет сообщение Slack.
Как часто мне следует запускать эту проверку?
При каждом нажатии на вашу основную ветку используется базовая линия. Добавьте запланированный триггер cron (например, ежедневно в 9 утра), чтобы отслеживать изменения DNS, внесенные за пределами вашего репозитория, например, когда товарищ по команде редактирует записи на панели управления регистратора.

Начните разработку с botoi

150+ API-эндпоинтов для поиска, обработки текста, генерации изображений и утилит для разработчиков. Бесплатный тариф, без банковской карты.