> Что такое MITM (man-in-the-middle) атака и как с ней бороться (Go)

Уровень: junior · Роль: backend · Категория: Технические вопросы

Компании: Юрент

Стек: Go

> Пример ответа

Короткий ответ

MITM (man-in-the-middle) - атака, при которой злоумышленник незаметно встраивается между двумя сторонами, перехватывая и модифицируя их трафик. Основные методы защиты: шифрование (TLS), аутентификация сторон, проверка сертификатов и использование защищённых протоколов. Для backend-разработчика на Go это означает обязательный HTTPS, валидацию сертификатов и отказ от доверия к незашифрованным соединениям.

Подробное объяснение

MITM-атака работает так: клиент думает, что общается с сервером, а сервер - с клиентом, но на самом деле весь трафик проходит через атакующего. Атакующий может:

  • перехватывать данные (логины, пароли, токены);
  • модифицировать запросы и ответы;
  • подменять содержимое (например, инжектить вредоносный код).

Классические сценарии: поддельные Wi-Fi точки, ARP-spoofing в локальной сети, DNS-spoofing, подмена сертификатов.

Основная защита - TLS (HTTPS). Но важно понимать: просто наличие TLS не гарантирует безопасность, если клиент не проверяет сертификат или доверяет поддельному CA. Поэтому ключевые меры:

  • обязательный HTTPS на всех эндпоинтах;
  • строгая валидация сертификатов на клиенте;
  • certificate pinning для критичных мобильных приложений;
  • HSTS (HTTP Strict Transport Security) на сервере;
  • отказ от HTTP-редиректов без шифрования;
  • использование mTLS для server-to-server коммуникаций.

Для backend-разработчика важно также защищать внутренние сервисы: если микросервисы общаются по HTTP внутри сети, это тоже зона риска. Рекомендуется mTLS или хотя бы шифрование на транспортном уровне.

На практике

В Go стандартная библиотека net/http уже поддерживает TLS. Основные практические шаги:

  1. Настроить TLS-терминацию на сервере (или за reverse proxy).
  2. На клиенте (если ваш сервис ходит во внешние API) - использовать http.Client с корректной конфигурацией TLS.
  3. Не отключать проверку сертификатов (даже в dev-окружении).
  4. Для внутренних сервисов - использовать mTLS с собственным CA.
  5. Добавить HSTS-заголовок на всех HTTPS-ответах.

Пример настройки HTTP-клиента с проверкой сертификатов:

GO
client := &http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
MinVersion: tls.VersionTLS12,
// InsecureSkipVerify должен быть false (по умолчанию)
},
},
}

Для mTLS на сервере:

GO
tlsConfig := &tls.Config{
ClientAuth: tls.RequireAndVerifyClientCert,
ClientCAs: clientCAs, // пул сертификатов доверенных клиентов
MinVersion: tls.VersionTLS12,
}
server := &http.Server{
Addr: ":8443",
TLSConfig: tlsConfig,
}

Как отвечать на собеседовании

Начни с короткого определения, затем опиши механизм атаки. Обязательно упомяни, что основная защита - TLS, но подчеркни, что валидация сертификатов критична. Если спросят про Go - расскажи про crypto/tls, http.Server, mTLS. Хорошо показать понимание, что MITM возможен даже при HTTPS, если клиент доверяет поддельному сертификату. Можно упомянуть HSTS и certificate pinning как дополнительные меры.

Что проверяет интервьюер

  • понимание базовых принципов сетевой безопасности;
  • знание, как работает TLS и почему он защищает от MITM;
  • осознание, что шифрование без аутентификации не решает проблему;
  • практические навыки настройки TLS в Go;
  • понимание угроз для backend-сервисов (внутренние коммуникации).

Типичные ошибки

  • утверждение, что HTTPS полностью исключает MITM (неверно - если сертификат не проверяется);
  • предложение использовать только шифрование без аутентификации;
  • игнорирование внутреннего трафика между сервисами;
  • совет отключить проверку сертификатов для удобства разработки;
  • незнание разницы между TLS и SSL;
  • отсутствие упоминания HSTS или certificate pinning как дополнительных мер.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью