> Что такое MITM (man-in-the-middle) атака и как с ней бороться (Go)
Уровень: junior · Роль: backend · Категория: Технические вопросы
Компании: VK
Стек: Go
> Пример ответа
MITM-атака (человек посередине) - это тип сетевой атаки, при которой злоумышленник тайно перехватывает и, возможно, изменяет передаваемые данные между двумя сторонами (например, клиентом и сервером), которые считают, что общаются напрямую. Атакующий встраивается в канал связи, получая доступ к конфиденциальной информации (логины, пароли, токены) или подменяя ответы.
Как бороться с MITM в Go:
-
Использование TLS/HTTPS - обязательное шифрование трафика. В Go это реализуется через
net/httpс настройкойhttp.Serverна TLS:GOserver := &http.Server{Addr: ":443",TLSConfig: &tls.Config{MinVersion: tls.VersionTLS12,},}err := server.ListenAndServeTLS("cert.pem", "key.pem") -
Проверка сертификатов - клиент должен верифицировать сертификат сервера. В Go используйте
tls.ConfigсInsecureSkipVerify: false(по умолчанию) и настройте корневые CA:GOclient := &http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{RootCAs: certPool, // пул доверенных корневых сертификатов},},} -
Certificate Pinning - привязка к конкретному сертификату или его отпечатку. В Go можно реализовать через кастомный
VerifyPeerCertificate:GOtlsConfig := &tls.Config{InsecureSkipVerify: true, // отключаем стандартную проверкуVerifyPeerCertificate: func(rawCerts [][]byte, verifiedChains [][]*x509.Certificate) error {// проверяем отпечаток сертификатаcert, _ := x509.ParseCertificate(rawCerts[0])expectedFingerprint := "sha256:..."// сравниваем fingerprintreturn nil},} -
HSTS (HTTP Strict Transport Security) - на сервере отправляйте заголовок
Strict-Transport-Security, чтобы браузеры и клиенты всегда использовали HTTPS:GOw.Header().Set("Strict-Transport-Security", "max-age=63072000; includeSubDomains") -
Аутентификация и подпись запросов - используйте HMAC или JWT для проверки целостности данных. В Go:
GOimport "crypto/hmac"// подпись запросаmac := hmac.New(sha256.New, secretKey)mac.Write([]byte(message))signature := mac.Sum(nil) -
Избегайте HTTP-редиректов - принудительно используйте HTTPS на уровне кода, не доверяя редиректам.
Дополнительно: для gRPC используйте TLS аналогично, а для WebSocket - wss:// вместо ws://.
> Похожие задачи по backend
Что такое негативный кэш и почему он вреден
Стоит ли кэшировать пустые результаты запросов к базе данных
Для чего нужны центры сертификации и чем самоподписанные сертификаты отличаются от выданных центрами
Что такое CSRF и как определить поддельный запрос
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью