Sécuriser votre application avec des en-têtes signés

Cette page explique comment sécuriser votre application avec des en-têtes IAP signés. Une fois configuré, Identity-Aware Proxy (IAP) utilise des jetons Web JSON (JWT, JSON Web Token) pour s'assurer qu'une requête envoyée à votre application est autorisée. Cela protège votre application contre les risques suivants :

  • Désactivation accidentelle du service IAP
  • Pare-feu mal configurés
  • Accès non autorisé depuis le projet

Pour sécuriser votre application, vous devez utiliser des en-têtes signés pour tous les types d'applications.

Si vous disposez d'une application d'environnement standard App Engine, vous pouvez également utiliser l'API Users.

Les vérifications d'état de Compute Engine et de GKE n'incluent pas les en-têtes JWT, et IAP ne traite pas les vérifications d'état. Si votre vérification de l'état renvoie des erreurs d'accès, assurez-vous que vous l'vérification de l'étatavez correctement configurée dans la Google Cloud console et que votre validation d'en-tête JWT autorise le chemin de la vérification de l'état. Pour en savoir plus, consultez la section Créer une exception de vérification de l'étatétat.

Avant de commencer

Pour sécuriser votre application avec des en-têtes signés, vous avez besoin des éléments suivants :

Sécuriser votre application avec des en-têtes IAP

Pour sécuriser votre application avec le JWT IAP, validez l'en-tête, la charge utile et la signature de celui-ci. Le JWT se trouve dans l'en-tête de requête HTTP x-goog-iap-jwt-assertion. En contournant IAP, un pirate informatique peut falsifier les en-têtes d'identité IAP non signés : x-goog-authenticated-user-{email,id}. Le JWT IAP constitue une alternative plus sécurisée.

Les en-têtes signés offrent une sécurité secondaire dans le cas d'un éventuel contournement d'IAP. Lorsque IAP est activé, il retire les en-têtes x-goog-* fournis par le client quand la requête passe par l'infrastructure de diffusion du service.

Valider l'en-tête JWT

Assurez-vous que l'en-tête JWT respecte les contraintes suivantes :

Revendications d'en-tête JWT
alg Algorithme ES256
kid ID de clé Doit correspondre à l'une des clés publiques répertoriées dans le fichier de clé IAP, disponible dans deux formats différents : https://www.gstatic.com/iap/verify/public_key et https://www.gstatic.com/iap/verify/public_key-jwk

Assurez-vous que le JWT a été signé par la clé privée correspondant à la revendication kid du jeton. Commencez par récupérer la clé publique à l'un des deux emplacements suivants :

  • https://www.gstatic.com/iap/verify/public_key. Cette URL contient un dictionnaire JSON qui mappe les revendications kid avec les valeurs de la clé publique.
  • https://www.gstatic.com/iap/verify/public_key-jwk. Cette URL contient les clés publiques IAP au format JWK.

Une fois la clé publique récupérée, validez la signature à l'aide d'une bibliothèque JWT.

IAP alterne régulièrement ses clés publiques. Pour vous assurer de toujours pouvoir valider les JWT, consultez la section Automatiser la mise en cache des clés publiques.

Valider la charge utile JWT

Assurez-vous que la charge utile JWT respecte les contraintes suivantes :

Revendications de charge utile JWT
exp Date/Heure d'expiration Il doit s'agir d'une date future. Le temps est mesuré en secondes depuis l'époque UNIX. Prévoyez 30 secondes de décalage. La durée de vie maximale d'un jeton est de 10 minutes + 2 * le décalage.
iat Date/Heure d'émission Il doit s'agir d'une date antérieure. Le temps est mesuré en secondes depuis l'époque UNIX. Prévoyez 30 secondes de décalage.
aud Cible Doit être une chaîne avec les valeurs suivantes :
  • App Engine: /projects/PROJECT_NUMBER/apps/PROJECT_ID
  • Compute Engine et GKE: /projects/PROJECT_NUMBER/global/backendServices/SERVICE_ID
  • Cloud Run: /projects/PROJECT_NUMBER/locations/REGION/services/SERVICE_NAME
iss Émetteur Doit être https://cloud.google.com/iap.