Как работает шифрование и цифровая подпись при отправке электронного письма?

«Как работает шифрование и цифровая подпись при отправке электронного письма?» — вопрос из категории Безопасность, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В инфраструктурной безопасности мы используем шифрование и цифровые подписи для защиты коммуникаций между системами (например, оповещения от мониторинга, хуки от Git). Стандарты PGP/GPG и S/MIME реализуют это для email.

Цифровая подпись (обеспечивает целостность и аутентификацию): Цель — доказать, что письмо отправлено конкретным отправителем и не было изменено.

  1. Создание подписи отправителем:
    • Письмо пропускается через хэш-функцию (например, SHA-256), создавая уникальную "свертку" (digest).
    • Этот digest шифруется приватным ключом отправителя. Результат — цифровая подпись, которая прикрепляется к письму.
  2. Проверка подписи получателем:
    • Получатель вычисляет хэш полученного письма тем же алгоритмом.
    • Получатель расшифровывает прикрепленную подпись с помощью публичного ключа отправителя, получая оригинальный digest.
    • Если вычисленный хэш совпадает с расшифрованным — письмо подлинное и не тронутое.

Шифрование (обеспечивает конфиденциальность): Цель — чтобы прочитать письмо мог только предполагаемый получатель.

  1. Шифрование отправителем:
    • Отправитель генерирует случайный симметричный сессионный ключ (например, AES-256).
    • Письмо шифруется этим быстрым симметричным ключом.
    • Сам сессионный ключ шифруется публичным ключом получателя и прикрепляется к письму.
  2. Расшифровка получателем:
    • Получатель расшифровывает сессионный ключ своим приватным ключом.
    • С помощью полученного сессионного ключа расшифровывается тело письма.

Практический пример с GPG в командной строке (для автоматизированных скриптов):

# 1. Генерация ключевой пары (делается один раз)
# gpg --full-generate-key

# 2. Экспорт публичного ключа для коллег
# gpg --export --armor user@example.com > public-key.asc

# 3. Подписание и шифрование файла для конкретного получателя
gpg --encrypt --sign --armor -r recipient@example.com secret_document.txt
# Создается файл secret_document.txt.asc, который можно безопасно отправить по email.

# 4. Расшифровка и проверка подписи на стороне получателя
gpg --decrypt secret_document.txt.asc > decrypted_document.txt
# GPG автоматически проверит подпись и покажет, кто его подписал.

Для DevOps это означает:

  • Настройка агентов мониторинга (Prometheus Alertmanager) или CI/CD систем (Jenkins) для отправки зашифрованных оповещений.
  • Использование HashiCorp Vault или AWS KMS для безопасного хранения и управления ключами шифрования, а не жесткое кодирование их в скриптах.
  • Внедрение mutual TLS (mTLS) для сервис-сервисного взаимодействия в микросервисной архитектуре — это аналог на транспортном уровне.