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

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

Компании: VK

Стек: Go

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

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

Как бороться с MITM в Go:

  1. Использование TLS/HTTPS - обязательное шифрование трафика. В Go это реализуется через net/http с настройкой http.Server на TLS:

    GO
    server := &http.Server{
    Addr: ":443",
    TLSConfig: &tls.Config{
    MinVersion: tls.VersionTLS12,
    },
    }
    err := server.ListenAndServeTLS("cert.pem", "key.pem")
  2. Проверка сертификатов - клиент должен верифицировать сертификат сервера. В Go используйте tls.Config с InsecureSkipVerify: false (по умолчанию) и настройте корневые CA:

    GO
    client := &http.Client{
    Transport: &http.Transport{
    TLSClientConfig: &tls.Config{
    RootCAs: certPool, // пул доверенных корневых сертификатов
    },
    },
    }
  3. Certificate Pinning - привязка к конкретному сертификату или его отпечатку. В Go можно реализовать через кастомный VerifyPeerCertificate:

    GO
    tlsConfig := &tls.Config{
    InsecureSkipVerify: true, // отключаем стандартную проверку
    VerifyPeerCertificate: func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error {
    // проверяем отпечаток сертификата
    cert, _ := x509.ParseCertificate(rawCerts[0])
    expectedFingerprint := "sha256:..."
    // сравниваем fingerprint
    return nil
    },
    }
  4. HSTS (HTTP Strict Transport Security) - на сервере отправляйте заголовок Strict-Transport-Security, чтобы браузеры и клиенты всегда использовали HTTPS:

    GO
    w.Header().Set("Strict-Transport-Security", "max-age=63072000; includeSubDomains")
  5. Аутентификация и подпись запросов - используйте HMAC или JWT для проверки целостности данных. В Go:

    GO
    import "crypto/hmac"
    // подпись запроса
    mac := hmac.New(sha256.New, secretKey)
    mac.Write([]byte(message))
    signature := mac.Sum(nil)
  6. Избегайте HTTP-редиректов - принудительно используйте HTTPS на уровне кода, не доверяя редиректам.

Дополнительно: для gRPC используйте TLS аналогично, а для WebSocket - wss:// вместо ws://.

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

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