> Как обезопасить взаимодействие микросервисов при использовании REST или gRPC (Go)

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

Компании: Black Wall Group (BWG)

Стек: Go

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

Основные меры безопасности взаимодействия микросервисов в Go:

  1. TLS/mTLS - обязательное шифрование трафика. Для gRPC встроенная поддержка TLS, для REST - настройка HTTPS. mTLS обеспечивает двустороннюю аутентификацию сертификатами (например, через cert-manager или SPIRE).

  2. Аутентификация и авторизация - использование JWT или OAuth2. В Go популярна библиотека go-jose для JWT. Каждый запрос проверяет токен через middleware (например, в gRPC перехватчики, в REST - HTTP middleware).

  3. API Gateway - единая точка входа, где выполняется валидация токенов, rate limiting, логирование. Пример: Envoy или Kong.

  4. Service Mesh (Istio, Linkerd) - прозрачное шифрование mTLS, политики доступа, observability без изменения кода.

  5. Валидация входных данных - использование protobuf валидаторов для gRPC (например, protoc-gen-validate) или библиотек типа go-playground/validator для REST.

  6. Rate Limiting и Circuit Breaker - защита от DDoS и каскадных отказов. В Go: golang.org/x/time/rate для лимитов, sony/gobreaker для circuit breaker.

  7. Логирование и мониторинг - структурированные логи с корреляционными ID (через OpenTelemetry), метрики (Prometheus) для обнаружения аномалий.

Пример middleware для проверки JWT в Go:

GO
func AuthMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
token := r.Header.Get("Authorization")
if !validateJWT(token) {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
next.ServeHTTP(w, r)
})
}

Для gRPC аналогичный перехватчик:

GO
func UnaryAuthInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
md, ok := metadata.FromIncomingContext(ctx)
if !ok || !validateToken(md["authorization"]) {
return nil, status.Error(codes.Unauthenticated, "invalid token")
}
return handler(ctx, req)
}

Ключевой принцип - Zero Trust: не доверять ни одному запросу, даже внутри сети, и всегда проверять подлинность и права доступа.

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

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