[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-mikroservisy-kak-obespechit-bezopasnost-mezhservisnogo-vzaimodeystviya":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":16,"progress":17,"seo":18},912,"kak-obespechit-bezopasnost-mezhservisnogo-vzaimodeystviya",23,"mikroservisy","Микросервисы","🔗","Как обеспечить безопасность межсервисного взаимодействия?","Безопасность в микросервисной архитектуре — комплексная задача, включающая аутентификацию (OAuth2\u002FJWT), шифрование (mTLS), управление секретами (Vault) и сетевые политики (Network Policies).\n\n```\nКлиент → API Gateway → Проверка JWT → Микросервис\n                            │\n                    ┌───────▼───────┐\n                    │ Keycloak \u002F    │\n                    │ Spring Auth   │\n                    │ Server        │\n                    └───────────────┘\n```\n\n\u003Cdetails>\u003Csummary>1. OAuth2\u002FJWT: конфигурация Resource Server\u003C\u002Fsummary>\n\n```java\n@Configuration\n@EnableWebSecurity\npublic class SecurityConfig {\n\n    @Bean\n    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {\n        return http\n            .authorizeHttpRequests(auth -> auth\n                .requestMatchers(\"\u002Factuator\u002Fhealth\u002F**\").permitAll()\n                .requestMatchers(\"\u002Fapi\u002Fpayments\u002F**\").hasAuthority(\"SCOPE_payments\")\n                .anyRequest().authenticated()\n            )\n            .oauth2ResourceServer(oauth2 -> oauth2\n                .jwt(jwt -> jwt.jwtAuthenticationConverter(jwtAuthConverter()))\n            )\n            .build();\n    }\n\n    private JwtAuthenticationConverter jwtAuthConverter() {\n        JwtAuthenticationConverter converter = new JwtAuthenticationConverter();\n        converter.setJwtGrantedAuthoritiesConverter(jwt -> {\n            Map\u003CString, Object> realmAccess = jwt.getClaim(\"realm_access\");\n            List\u003CString> roles = (List\u003CString>) realmAccess.get(\"roles\");\n            return roles.stream()\n                .map(role -> new SimpleGrantedAuthority(\"ROLE_\" + role))\n                .collect(Collectors.toList());\n        });\n        return converter;\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### 2. mTLS (Mutual TLS) -- взаимная аутентификация сервисов\n\nПри mTLS оба участника соединения предъявляют сертификаты. Обычно реализуется через Service Mesh (Istio):\n\n```yaml\n# Istio PeerAuthentication — требовать mTLS\napiVersion: security.istio.io\u002Fv1beta1\nkind: PeerAuthentication\nmetadata:\n  name: default\n  namespace: banking\nspec:\n  mtls:\n    mode: STRICT\n```\n\n### 3. Передача контекста пользователя между сервисами\n\n```java\n@Component\npublic class AuthTokenInterceptor implements ClientHttpRequestInterceptor {\n\n    @Override\n    public ClientHttpResponse intercept(HttpRequest request, byte[] body,\n            ClientHttpRequestExecution execution) throws IOException {\n        String token = SecurityContextHolder.getContext().getAuthentication()\n            .getCredentials().toString();\n        request.getHeaders().setBearerAuth(token);\n        return execution.execute(request, body);\n    }\n}\n```\n\n### 4. Защита секретов\n\n- Хранение в HashiCorp Vault (не в переменных окружения и не в конфигурационных файлах).\n- Ротация секретов (Vault поддерживает автоматическую ротацию паролей БД).\n- Шифрование чувствительных данных в Kafka-сообщениях.\n\n### 5. Сетевые политики (Network Policies в Kubernetes)\n\n```yaml\n# Разрешить трафик к payment-service только от api-gateway и order-service\napiVersion: networking.k8s.io\u002Fv1\nkind: NetworkPolicy\nmetadata:\n  name: payment-service-policy\nspec:\n  podSelector:\n    matchLabels:\n      app: payment-service\n  ingress:\n    - from:\n        - podSelector:\n            matchLabels:\n              app: api-gateway\n        - podSelector:\n            matchLabels:\n              app: order-service\n      ports:\n        - port: 8080\n```\n\n### 6. Валидация входных данных\n\nКаждый сервис должен сам валидировать входные данные, не полагаясь на то, что вызывающий сервис уже провёл валидацию.\n\n> **На собеседовании:** покажите многослойную защиту: JWT на Gateway, mTLS между сервисами, Vault для секретов, Network Policies для сетевой изоляции. Частая ошибка — думать, что JWT-валидации на Gateway достаточно и внутренние сервисы не нужно защищать.","","senior",[15],"microservices",[],null,{"title":19,"description":20,"ogTitle":19,"ogDescription":21,"keywords":22,"schemaAnswer":23,"featuredSnippetReady":24},"Как обеспечить безопасность межсервисного взаимодействия? — Gymterview","Безопасность в микросервисной архитектуре — комплексная задача, включающая аутентификацию (OAuth2\u002FJWT), шифрование (mTLS), управление секретами (Vault) и сетевы","Безопасность в микросервисной архитектуре — комплексная задача, включающая аутентификацию (OAuth2\u002FJWT), шифрование (mTLS",[15,13],"Безопасность в микросервисной архитектуре — комплексная задача, включающая аутентификацию (OAuth2\u002FJWT), шифрование (mTLS), управление секретами (Vault) и сетевые политики (Network Policies).",true]