Identité des fonctions

De la même manière que les autres entités ont besoin d'accéder à Cloud Functions pour interagir avec cet environnement, les fonctions elles-mêmes doivent souvent accéder à d'autres ressources dans Google Cloud pour effectuer leur travail. Chaque fonction est associée à un compte de service qui sert d'identité lorsque la fonction accède à d'autres ressources. Le compte de service utilisé par une fonction en tant qu'identité est également appelé compte de service d'exécution.

Pour une utilisation en production, Google recommande d'attribuer une identité dédiée à chaque fonction en lui attribuant un compte de service géré par l'utilisateur. Les comptes de service gérés par l'utilisateur vous permettent de contrôler les accès en accordant un ensemble minimal d'autorisations à l'aide d'Identity and Access Management.

Compte de service d'exécution

À moins que vous ne spécifiiez un autre compte de service d'exécution lors du déploiement d'une fonction, Cloud Functions utilise le compte de service App Engine par défaut (PROJECT_ID@appspot.gserviceaccount.com) comme identité pour l'exécution de la fonction.

Le compte de service App Engine dispose du rôle d'éditeur, ce qui lui permet d'accéder à de nombreux services Google Cloud. Bien qu'il s'agisse du moyen le plus rapide de développer des fonctions, Google recommande d'utiliser ce compte de service par défaut à des fins de test et de développement uniquement. Pour la production, vous ne devez attribuer au compte de service que l'ensemble minimal d'autorisations requis pour atteindre son objectif.

Pour sécuriser vos fonctions en production, procédez comme suit :

Modifier les autorisations sur le compte de service App Engine par défaut

Console

  1. Accédez à Google Cloud Console :

    Accéder à Google Cloud Console

  2. Sélectionnez le compte de service App Engine par défaut (PROJECT_ID@appspot.gserviceaccount.com) dans la table.

  3. Cliquez sur le crayon à droite de la ligne pour afficher l'onglet Modifier les autorisations.

  4. Ajoutez ou supprimez des rôles dans la liste déroulante disponible pour définir l'accès selon le principe du moindre privilège.

  5. Cliquez sur Enregistrer.

gcloud

Supprimez le rôle d'éditeur, puis exécutez la commande gcloud projects add-iam-policy-binding pour ajouter un rôle :

# Remove the Editor role
gcloud projects remove-iam-policy-binding PROJECT_ID \
  --member="PROJECT_ID@appspot.gserviceaccount.com"
  --role="roles/editor"

# Add the desired role
gcloud projects add-iam-policy-binding PROJECT_ID \
  --member="PROJECT_ID@appspot.gserviceaccount.com"
  --role="ROLE"

PROJECT_ID est l'ID du projet que vous utilisez et ROLE est le nouveau rôle à attribuer au compte de service d'exécution.

Utiliser des comptes de service individuels pour vos fonctions

Pour plus de flexibilité dans le contrôle des accès à vos fonctions, vous pouvez octroyer à chacune d'elles son propre compte de service géré par l'utilisateur.

  • Créez le compte de service. Notez son nom.
  • Accordez-lui les rôles appropriés, en fonction des ressources auxquelles la fonction doit accéder pour effectuer son travail.
  • Si le compte de service et la fonction se trouvent dans des projets différents, configurez le compte de service pour qu'il fonctionne sur tous les projets. Vous devez attribuer le rôle de créateur de jetons du compte de service à ces comptes de service gérés par Google sur le compte de service que vous avez créé :

    • Compte de service App Engine par défaut (PROJECT_ID@appspot.gserviceaccount.com)
    • Agent de service Cloud Functions (service-PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com)
  • Ajoutez le compte de service à la ressource en tant que membre. La façon de procéder va dépendre de la ressource à laquelle vous devez accéder.

  • Associez le compte de service à la fonction. Vous pouvez définir cette association au moment du déploiement, ou en mettant à jour une fonction précédemment déployée.

Ajouter un compte de service géré par l'utilisateur lors du déploiement

Console

  1. Accédez à Google Cloud Console :

    Accéder à Google Cloud Console

  2. Spécifiez et configurez la fonction selon vos besoins.

  3. Cliquez sur Paramètres d'exécution, de compilation et de connexion pour afficher des paramètres supplémentaires.

  4. Sélectionnez l'onglet Environnement d'exécution.

  5. Cliquez sur le menu déroulant Compte de service, puis sélectionnez le compte de service souhaité.

  6. Cliquez sur Suivant puis sur Créer.

gcloud

Lorsque vous déployez une fonction à l'aide de gcloud functions deploy, ajoutez l'option --service-account. Exemple :

gcloud functions deploy FUNCTION_NAME --service-account SERVICE_ACCOUNT_EMAIL

FUNCTION_NAME est le nom de votre fonction et SERVICE_ACCOUNT_EMAIL est l'adresse e-mail du compte de service.

Mettre à jour le compte de service d'une fonction existante

Vous pouvez mettre à jour le compte de service d'exécution d'une fonction existante.

Console

  1. Accédez à Google Cloud Console :

    Accéder à Google Cloud Console

  2. Cliquez sur le nom de la fonction souhaitée pour accéder à sa page d'informations.

  3. Cliquez sur le crayon MODIFIER situé en haut de la page d'informations pour modifier la fonction.

  4. Cliquez sur Paramètres d'exécution, de compilation et de connexion pour afficher des paramètres supplémentaires.

  5. Sélectionnez l'onglet Environnement d'exécution.

  6. Cliquez sur le menu déroulant Compte de service, puis sélectionnez le compte de service souhaité.

  7. Cliquez sur Suivant puis sur Déployer.

gcloud

Lorsque vous déployez une fonction à l'aide de gcloud functions deploy, ajoutez l'option --service-account :

gcloud functions deploy FUNCTION_NAME --service-account SERVICE_ACCOUNT_EMAIL

FUNCTION_NAME est le nom de votre fonction et SERVICE_ACCOUNT_EMAIL est le compte de service.

La fonction redéployée utilise désormais le nouveau compte de service d'exécution.

Utiliser le serveur de métadonnées pour acquérir des jetons

Bien que les comptes de service définis par IAM soient la méthode privilégiée pour l'identification et l'autorisation dans Google Cloud, certains services peuvent nécessiter d'autres modes, tels qu'une clé API, un client OAuth 2.0 ou une clé de compte de service.. L'accès à une ressource externe peut également nécessiter d'autres méthodes.

Si votre service cible nécessite la génération d'un jeton d'identité OpenID Connect ou d'un jeton d'accès Oauth 2.0, vous pouvez peut-être utiliser le serveur de métadonnées Compute pour récupérer ces jetons, plutôt que de configurer un client OAuth complet.

Jetons d'identité

Le serveur Compute Metadata permet de récupérer des jetons d’identité pour une audience spécifique de la façon suivante :

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=AUDIENCE" \
  -H "Metadata-Flavor: Google"

AUDIENCE correspond à l'audience demandée, par exemple, l'URL d'un service que vous appelez, telle que https://service.domain.com, ou à l'ID client OAuth d'une ressource IAP protégée, comme 1234567890.apps.googleusercontent.com.

Jetons d'accès

Les jetons d'accès OAuth 2.0 utilisent des champs d'application pour définir les autorisations d'accès. Par défaut, les jetons d'accès Google Cloud ont le champ d'application cloud-platform. Pour accéder à d'autres API Google ou Google Cloud, vous devez récupérer un jeton d'accès avec un champ d'application approprié.

Vous pouvez utiliser le serveur Compute Metadata pour récupérer des jetons d'accès.

Si vous avez besoin d'un jeton d'accès avec un champ d'application spécifique, vous pouvez le générer de la façon suivante :

curl "http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token?scopes=SCOPES" \
  -H "Metadata-Flavor: Google"

SCOPES correspond à une liste de champs d'application OAuth séparés par une virgule, par exemple, https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/spreadsheets.

Consultez la liste complète des champs d'application Google OAuth pour trouver ceux dont vous avez besoin.

Étapes suivantes

Apprenez à autoriser l'accès à vos fonctions ou à authentifier les développeurs et autres fonctions pour qu'ils puissent appeler vos fonctions.