Безопасность 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
ресурс у меня работал.