Безопасность Istio Service Mesh с AuthorizationPolicy и RequestAuthentication

Виртуальная служба istio использует RequestAuthentication и AuthorizationPolicy в том же пространстве имен службы безопасности oauth2, безопасность игнорируется, запросы всегда разрешены.

Настроенные компоненты Istio: Gateway, Virtualservice, AuthorizationPolicy, RequestAuthentication

проект безопасности: Istio-Security

другой проект: Istio-Policy

оба находятся в одном кластере и пространстве имен!!!

apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
 name: authentication-req 
 namespace: default
spec:
  selector:
    matchLabels:
      app: admin-service
  jwtRules:
  - issuer: "testing@secure.istio.io"
    jwksUri: "http://127.0.0.1:31400/security/oauth/token"
---  
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: authorization-pol
spec:
  selector:
    matchLabels:
      app: admin-service
  action: ALLOW
  rules:
  - from:
    - source:
       requestPrincipals: ["*"]

шлюз:

apiVersion: networking.istio.io/v1alpha3  
kind: Gateway                             
metadata:                                 
  name: oauth-gateway                     
spec:                                     
  selector:                               
    istio: ingressgateway           
  servers:
  - port:
      number: 443
      name: https
      protocol: HTTPS
    tls:
      mode: SIMPLE
      serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
      privateKey: /etc/istio/ingressgateway-certs/tls.key
    hosts:
    - '*'
  - port:
      number: 31400
      name: http
      protocol: HTTP
    hosts:
    - '*'
  tls:
      httpsRedirect: true

чего не хватает в настройках для обеспечения безопасности?

2 ответа

Я столкнулся с подобной проблемой.

Токен JWT имел следующее значение для эмитента: "iss": "http://localhost:8080/auth/realms/dev"

Я сопоставил одно и то же значение в своих JwtRules, т.е. localhost. Однако я изменил jwksUri на кластерный IP-адрес Keycloak. Кажется, это сработало.

jwtПравила:

      - issuer: 'http://localhost:8080/auth/realms/dev'

  jwksUri: 'http://10.105.250.41:8080/auth/realms/dev/protocol/openid-connect/certs'

Вы можете проверить, действительно ли ingressgateway может получить доступ к вашему файлу jwks_uri. Я предполагаю, что вы получите 404, потому что он находится в другом кластере или развернут на локальном докере и т. д. др.

      kubectl exec -i -t -n istio-system YOUR_ISTIOINGRESS_GATEWAY_POD -c istio-proxy -- sh -c "clear; (bash || ash || sh)"

> curl -i http://YOUR_DOMAIN:YOUR_PORT/auth/realms/master/protocol/openid-connect/certs

HTTP/1.1 404 Not Found
date: Thu, 23 Dec 2021 16:11:17 GMT
server: istio-envoy
content-length: 0

Мой обходной путь для локального тестирования состоял в том, чтобы запустить ngrok, чтобы показать keycloak, работающий на порту 8080.

      npm install -g ngrok
ngrok http 8080

Замените локальный хост в jwksUriсо сгенерированным доменом ngrok в вашем RequestAuthenticationресурс у меня работал.

Другие вопросы по тегам