4.6. Configurer l'accès aux services Knative
4.6.1. Configuration de l'authentification par jeton Web JSON pour les services Knative
OpenShift Serverless ne dispose pas actuellement de fonctionnalités d'autorisation définies par l'utilisateur. Pour ajouter une autorisation définie par l'utilisateur à votre déploiement, vous devez intégrer OpenShift Serverless à Red Hat OpenShift Service Mesh, puis configurer l'authentification JSON Web Token (JWT) et l'injection sidecar pour les services Knative.
4.6.2. Utilisation de l'authentification par jeton Web JSON avec Service Mesh 2.x
Vous pouvez utiliser l'authentification par jeton Web JSON (JWT) avec les services Knative en utilisant Service Mesh 2.x et OpenShift Serverless. Pour ce faire, vous devez créer des demandes et des politiques d'authentification dans l'espace de noms de l'application qui est membre de l'objet ServiceMeshMemberRoll
. Vous devez également activer l'injection de sidecar pour le service.
4.6.2.1. Configuration de l'authentification par jeton Web JSON pour Service Mesh 2.x et OpenShift Serverless
L'ajout d'une injection de sidecar aux pods dans les espaces de noms du système, tels que knative-serving
et knative-serving-ingress
, n'est pas pris en charge lorsque Kourier est activé.
Si vous avez besoin de l'injection de sidecar pour les pods dans ces espaces de noms, consultez la documentation OpenShift Serverless sur Integrating Service Mesh with OpenShift Serverless natively.
Conditions préalables
- Vous avez installé OpenShift Serverless Operator, Knative Serving et Red Hat OpenShift Service Mesh sur votre cluster.
-
Installez le CLI OpenShift (
oc
). - Vous avez créé un projet ou avez accès à un projet avec les rôles et autorisations appropriés pour créer des applications et d'autres charges de travail dans OpenShift Container Platform.
Procédure
Ajoutez l'annotation
sidecar.istio.io/inject="true"
à votre service :Exemple de service
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: <service_name> spec: template: metadata: annotations: sidecar.istio.io/inject: "true" 1 sidecar.istio.io/rewriteAppHTTPProbers: "true" 2 ...
- 1
- Ajouter l'annotation
sidecar.istio.io/inject="true"
. - 2
- Vous devez définir l'annotation
sidecar.istio.io/rewriteAppHTTPProbers: "true"
dans votre service Knative, car les versions 1.14.0 et supérieures d'OpenShift Serverless utilisent par défaut une sonde HTTP comme sonde de préparation pour les services Knative.
Appliquer la ressource
Service
:$ oc apply -f <filename>
Créer une ressource
RequestAuthentication
dans chaque espace de noms d'application sans serveur qui est un membre de l'objetServiceMeshMemberRoll
:apiVersion: security.istio.io/v1beta1 kind: RequestAuthentication metadata: name: jwt-example namespace: <namespace> spec: jwtRules: - issuer: testing@secure.istio.io jwksUri: https://raw.githubusercontent.com/istio/istio/release-1.8/security/tools/jwt/samples/jwks.json
Appliquer la ressource
RequestAuthentication
:$ oc apply -f <filename>
Autoriser l'accès à la ressource
RequestAuthenticaton
à partir des pods système pour chaque espace de noms d'application sans serveur qui est un membre de l'objetServiceMeshMemberRoll
, en créant la ressourceAuthorizationPolicy
suivante :apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: allowlist-by-paths namespace: <namespace> spec: action: ALLOW rules: - to: - operation: paths: - /metrics 1 - /healthz 2
Appliquer la ressource
AuthorizationPolicy
:$ oc apply -f <filename>
Pour chaque espace de noms d'application sans serveur qui est un membre de l'objet
ServiceMeshMemberRoll
, créez la ressourceAuthorizationPolicy
suivante :apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: require-jwt namespace: <namespace> spec: action: ALLOW rules: - from: - source: requestPrincipals: ["testing@secure.istio.io/testing@secure.istio.io"]
Appliquer la ressource
AuthorizationPolicy
:$ oc apply -f <filename>
Vérification
Si vous essayez d'utiliser une requête
curl
pour obtenir l'URL du service Knative, elle est refusée :Example command
$ curl http://hello-example-1-default.apps.mycluster.example.com/
Exemple de sortie
RBAC: access denied
Vérifier la demande avec un JWT valide.
Obtenir le jeton JWT valide :
$ TOKEN=$(curl https://raw.githubusercontent.com/istio/istio/release-1.8/security/tools/jwt/samples/demo.jwt -s) && echo "$TOKEN" | cut -d '.' -f2 - | base64 --decode -
Accédez au service en utilisant le jeton valide dans l'en-tête de la requête
curl
:$ curl -H "Authorization: Bearer $TOKEN" http://hello-example-1-default.apps.example.com
La demande est désormais autorisée :
Exemple de sortie
Hello OpenShift!
4.6.3. Utilisation de l'authentification par jeton Web JSON avec Service Mesh 1.x
Vous pouvez utiliser l'authentification par jeton Web JSON (JWT) avec les services Knative en utilisant Service Mesh 1.x et OpenShift Serverless. Pour ce faire, vous devez créer une politique dans l'espace de noms de l'application qui est un membre de l'objet ServiceMeshMemberRoll
. Vous devez également activer l'injection de sidecar pour le service.
4.6.3.1. Configuration de l'authentification par jeton Web JSON pour Service Mesh 1.x et OpenShift Serverless
L'ajout d'une injection de sidecar aux pods dans les espaces de noms du système, tels que knative-serving
et knative-serving-ingress
, n'est pas pris en charge lorsque Kourier est activé.
Si vous avez besoin de l'injection de sidecar pour les pods dans ces espaces de noms, consultez la documentation OpenShift Serverless sur Integrating Service Mesh with OpenShift Serverless natively.
Conditions préalables
- Vous avez installé OpenShift Serverless Operator, Knative Serving et Red Hat OpenShift Service Mesh sur votre cluster.
-
Installez le CLI OpenShift (
oc
). - Vous avez créé un projet ou avez accès à un projet avec les rôles et autorisations appropriés pour créer des applications et d'autres charges de travail dans OpenShift Container Platform.
Procédure
Ajoutez l'annotation
sidecar.istio.io/inject="true"
à votre service :Exemple de service
apiVersion: serving.knative.dev/v1 kind: Service metadata: name: <service_name> spec: template: metadata: annotations: sidecar.istio.io/inject: "true" 1 sidecar.istio.io/rewriteAppHTTPProbers: "true" 2 ...
- 1
- Ajouter l'annotation
sidecar.istio.io/inject="true"
. - 2
- Vous devez définir l'annotation
sidecar.istio.io/rewriteAppHTTPProbers: "true"
dans votre service Knative, car les versions 1.14.0 et supérieures d'OpenShift Serverless utilisent par défaut une sonde HTTP comme sonde de préparation pour les services Knative.
Appliquer la ressource
Service
:$ oc apply -f <filename>
Créer une politique dans l'espace de noms d'une application sans serveur, qui est un membre de l'objet
ServiceMeshMemberRoll
, qui n'autorise que les demandes avec des jetons Web JSON valides (JWT) :ImportantLes chemins
/metrics
et/healthz
doivent être inclus dansexcludedPaths
car ils sont accessibles à partir des pods du système dans l'espace de nomsknative-serving
.apiVersion: authentication.istio.io/v1alpha1 kind: Policy metadata: name: default namespace: <namespace> spec: origins: - jwt: issuer: testing@secure.istio.io jwksUri: "https://raw.githubusercontent.com/istio/istio/release-1.6/security/tools/jwt/samples/jwks.json" triggerRules: - excludedPaths: - prefix: /metrics 1 - prefix: /healthz 2 principalBinding: USE_ORIGIN
Appliquer la ressource
Policy
:$ oc apply -f <filename>
Vérification
Si vous essayez d'utiliser une requête
curl
pour obtenir l'URL du service Knative, elle est refusée :$ curl http://hello-example-default.apps.mycluster.example.com/
Exemple de sortie
Origin authentication failed.
Vérifier la demande avec un JWT valide.
Obtenir le jeton JWT valide :
$ TOKEN=$(curl https://raw.githubusercontent.com/istio/istio/release-1.6/security/tools/jwt/samples/demo.jwt -s) && echo "$TOKEN" | cut -d '.' -f2 - | base64 --decode -
Accédez au service en utilisant le jeton valide dans l'en-tête de la requête
curl
:$ curl http://hello-example-default.apps.mycluster.example.com/ -H "Authorization: Bearer $TOKEN"
La demande est désormais autorisée :
Exemple de sortie
Hello OpenShift!