#kubernetes #istio #istio-sidecar #istio-gateway #istio-operator
#kubernetes #istio #istio-sidecar #istio-шлюз #istio-оператор
Вопрос:
Недавно мы настроили istio в нашем кластере kubernetes и пытаемся выяснить, можем ли мы использовать RequestAuthentication и AuthenticationPolicy, чтобы разрешить pod в пространстве имен x взаимодействовать с pod в пространстве имен y только тогда, когда у него есть действительный токен jwt.
Все примеры, которые я видел в Интернете, похоже, применяются только для аутентификации конечного пользователя через шлюз, а не для внутренней связи pod-pod.
Мы попробовали несколько разных вариантов, но пока не добились успеха.
Мы можем заставить AuthenticationPolicy работать для трафика pod-pod, используя «from», а источником является IP-адрес pod в пространстве имен x:
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
name: "request-jwt"
namespace: y
spec:
jwtRules:
- issuer: "https://keycloak.example.com/auth/realms/istio"
jwksUri: "https://keycloak.example.com/auth/realms/istio/protocol/openid-connect/certs"
---
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: "jwt-auth"
namespace: y
spec:
action: ALLOW
rules:
- from:
- source:
ipBlocks: ["10.43.5.175"]
Когда мы добавляем блок when для jwt, это не работает:
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
name: "request-jwt"
namespace: y
spec:
jwtRules:
- issuer: "https://keycloak.example.com/auth/realms/istio"
jwksUri: "https://keycloak.example.com/auth/realms/istio/protocol/openid-connect/certs"
---
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: "jwt-auth"
namespace: y
spec:
action: ALLOW
rules:
- from:
- source:
ipBlocks: ["10.43.5.175"]
when:
- key: request.auth.claims[iss]
values: ["https://keycloak.example.com/auth/realms/istio"]
Также пробовал это, но, похоже, тоже не работает:
apiVersion: security.istio.io/v1beta1
kind: RequestAuthentication
metadata:
name: "request-jwt"
namespace: y
spec:
jwtRules:
- issuer: "https://keycloak.example.com/auth/realms/istio"
jwksUri: "https://keycloak.example.com/auth/realms/istio/protocol/openid-connect/certs"
---
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
name: "deny-invalid-jwt"
namespace: y
spec:
action: DENY
rules:
- from:
- source:
notRequestPrincipals: ["*"]
Заранее спасибо!
Комментарии:
1. Да, это возможно. Это очень важно для вашей среды, используемого JWT и т. Д. Я бы посоветовал вам включить журналы с областью действия rbac для отладки в прокси-сервере envoy и просмотреть метаданные фильтра, которые вы получаете из своего JWT. Возможно, он вообще не соответствует отправителю в ресурсе RequestAuthentication. Если это так, то вы должны увидеть метаданные фильтра, которые показывают информацию о том, что вы можете применять политики аутентификации.
2. Какую версию Istio и Kubernetes вы используете?
3. Какую версию Istio и Kubernetes вы используете? Какой профиль конфигурации установки вы использовали? Как вы настроили свой кластер — какое-то простое решение или решение облачного провайдера? Эта информация важна для воспроизведения вашей проблемы. Как ваш модуль отправляет запрос к модулю в другом пространстве имен?
4. Предложения @rinor по увеличению протоколирования для rbac помогли выявить проблему с нашей настройкой keycloak. Когда мы исправили эту проблему, все работает так, как ожидалось.
5. @gdix0n Я добавил комментарий в качестве ответа, поскольку люди могут не читать комментарии, думая, что на них нет ответа.
Ответ №1:
Да, можно использовать как политики авторизации, так и запрашивать аутентификации.
Но отладка довольно сложна, потому что многое зависит от вашей среды и используемого JWT, и так далее.
Для устранения подобных проблем я бы начал с настройки журналов с областью действия rbac для отладки для прокси-сервера services envoy. В журналах отладки rbac вы увидите данные, извлеченные из JWT и сохраненные в метаданных фильтра. Часто вы обнаружите, что:
- Эмитент в метаданных фильтра может не совпадать с тем, который указан в ресурсе RequestAuthentication и т. Д.
Подробнее об областях ведения журнала здесь https://istio.io/v1.12/docs/ops/diagnostic-tools/component-logging/#logging-scopes