Configurer un accès approprié pour une extension

Pour qu'une extension effectue les actions spécifiées, Firebase accorde à chaque instance d'une extension installée un accès limité au projet et à ses données via un compte de service .

Qu'est-ce qu'un compte de service ?

Un compte de service est un type spécial de compte utilisateur Google. Il représente un utilisateur non humain pouvant effectuer des appels API autorisés vers les services Google.

Lors de l'installation d'une extension, Firebase crée un compte de service pour l'extension dans le projet. Chaque instance installée d'une extension possède son propre compte de service. Si une instance d'extension est désinstallée, Firebase supprime le compte de service de l'extension.

Les comptes de service créés pour les extensions sont au format :

ext- extension-instance-id @ project-id .iam.gserviceaccount.com

Firebase limite l'accès d'une extension à un projet et à ses données en attribuant des rôles spécifiques (ensembles d'autorisations) au compte de service de l'extension. Lorsque vous créez une extension, vous déterminez les rôles dont votre extension a besoin pour fonctionner, puis vous répertoriez ces rôles et la raison pour laquelle votre extension a besoin de ces rôles dans votre fichier extension.yaml (voir l'exemple au bas de cette page).

Déterminez les rôles requis par votre extension

Lorsque vous créez votre extension, vous déterminez le niveau d'accès dont votre extension a besoin pour fonctionner.

Lors de l'installation, la CLI Firebase invite l'utilisateur à accepter le niveau d'accès accordé par chaque rôle. Si votre extension demande plus de rôles qu’elle n’en a réellement besoin, les utilisateurs seront peut-être moins susceptibles de l’installer.

  1. Déterminez si votre extension interagit avec un produit :

    • Si votre extension interagit avec un produit , vous devez alors donner à votre extension l'accès à ce produit.

      Par exemple, si votre extension écrit des données dans une instance de base de données en temps réel, elle a besoin d'un rôle de base de données en temps réel (en particulier, firebasedatabase.admin ).

    • Si votre extension écoute simplement un événement déclencheur provenant d'un produit , alors votre extension n'a pas besoin d'un rôle associé à ce produit.

      Par exemple, si votre extension se déclenche lors d'une écriture dans une instance de base de données en temps réel (mais n'écrit rien dans la base de données), votre extension n'a pas besoin d'un rôle de base de données en temps réel.

  2. Après avoir déterminé avec quels produits votre extension interagit , vous devez décider quel rôle est requis pour cette interaction spécifique. Certains produits proposent différents rôles en fonction de l'action ou de l'ensemble d'actions effectuées.

    Par exemple, supposons que votre extension interagisse avec un bucket Cloud Storage. Le rôle storage.objectCreator permettrait à l'extension de créer un objet dans un bucket Cloud Storage, mais ce rôle ne permettrait pas à l'extension d'afficher, de supprimer ou d'écraser des objets. Pour permettre à l'extension d'effectuer ces actions supplémentaires, vous devez plutôt attribuer le rôle storage.objectAdmin .

Reportez-vous à la section au bas de cette page pour afficher tous les rôles pris en charge que vous pouvez attribuer au compte de service de votre extension. Pour en savoir plus sur la description de chaque rôle et les autorisations accordées, consultez la documentation Firebase ou la documentation Google Cloud . Vous pouvez également rechercher des rôles dans le panneau IAM et d'administration de la console Google Cloud.

Comment attribuer des rôles à une extension

Répertoriez les rôles IAM requis pour que votre extension fonctionne dans la section roles de votre fichier extension.yaml .

Voici un exemple d'extension qui écoute un chemin de base de données en temps réel Firebase spécifié. Lorsqu'elle est déclenchée, l'extension met à jour l'e-mail d'un compte utilisateur (interaction avec l'authentification Firebase) et envoie une notification (interaction avec Firebase Cloud Messaging). Notez ce qui suit :

  • Même si l'extension se déclenche à partir d'un événement Realtime Database, le rôle firebasedatabase.admin n'est pas répertorié (l'écoute n'est pas considérée comme une interaction ).
  • Étant donné que l'extension interagit avec l'authentification et Cloud Messaging, l'extension nécessite des rôles pour accéder à ces produits ( firebaseauth.admin et firebasenotifications.admin , respectivement).
# extension.yaml
...

# Roles assigned to the extension's service account by Firebase during installation
roles:
  - role: firebaseauth.admin
    reason: Required to update the email address of the user account

  - role: firebasenotifications.admin
    reason: Required to send a notification that the email address has been updated

...

Dans votre fichier extension.yaml , utilisez les champs suivants pour attribuer un rôle au compte de service d'une extension :

Champ Taper Description
role
(requis)
chaîne Nom du rôle IAM nécessaire à l'extension pour fonctionner
reason
(requis)
chaîne

Brève description de la raison pour laquelle l'extension a besoin de l'accès accordé par le rôle

Assurez-vous de fournir suffisamment de détails pour qu'un utilisateur puisse comprendre comment l'extension utilise le rôle.

resource
(facultatif)
chaîne

La stratégie IAM de la ressource à laquelle ce rôle doit être ajouté. En cas d'omission, la valeur par défaut est projects/${project_id} .

Les valeurs prises en charge sont projects/* et projects/*/buckets/* .

Réduire la portée des rôles

Les extensions doivent suivre le principe du moindre privilège et demander uniquement l’accès aux ressources dont elles ont besoin. Vous pouvez limiter la portée d'accès d'une extension en utilisant le champ role.resource . Par exemple, si votre extension doit écrire des objets dans un bucket Cloud Storage, vous pouvez utiliser le rôle suivant :

roles:
  - role: storage.objectCreator
    reason: Needed in order to write
    resource: projects/${PROJECT_ID}/buckets/${STORAGE_BUCKET}

Cela permet à l'extension d'accéder uniquement au compartiment dont elle a besoin, et pas aux autres compartiments du même projet.

Ce champ prend en charge les projets ( projects/{project_id} ) et les buckets de stockage ( projects/{project_id}/buckets/{bucket_id} ).

Rôles pris en charge pour les extensions

Le tableau suivant répertorie les rôles IAM pris en charge pour interagir avec les produits Firebase. La plupart des rôles de ce tableau sont des rôles Firebase au niveau du produit , mais certains sont gérés directement par Google Cloud (en particulier, Cloud Firestore et Cloud Storage ).

Produits Firebase

Si votre extension interagit avec... Attribuez l'un de ces rôles...
Cloud Firestore banque de données.importExportAdmin
banque de données.indexAdmin
banque de données.propriétaire
banque de données.user
datastore.viewer
Stockage cloud pour Firebase stockage.admin
stockage.objectAdmin
stockage.objectCreator
stockage.objectViewer
Distribution d'applications Firebase firebaseappdistro.admin
firebaseappdistro.viewer
Authentification Firebase firebaseauth.admin
firebaseauth.viewer
Tests A/B Firebase firebaseabt.admin
firebaseabt.viewer
Messagerie cloud Firebase firebasenotifications.admin
firebasenotifications.viewer
Firebase Crashlytics firebasecrashlytics.admin
firebasecrashlytics.viewer
Hébergement Firebase firebasehosting.admin
firebasehosting.viewer
Messagerie intégrée à l'application Firebase firebaseinappmessaging.admin
firebaseinappmessaging.viewer
Firebase ML firebaseml.admin
firebaseml.viewer
Surveillance des performances de Firebase firebaseperformance.viewer
firebaseperformance.reader
firebaseperformance.writer
Base de données en temps réel Firebase firebaseddatabase.admin
firebaseddatabase.viewer
Règles de sécurité firebaserules.viewer
firebaserules.developer
firebaserules.deployer
Google Analytics firebaseanalytics.admin
firebaseanalytics.viewer

Produits Google Cloud

Découvrez ces rôles dans la documentation Google Cloud .

Si votre extension interagit avec... Attribuez l'un de ces rôles...
Actions actions.Admin
actions.Viewer
Apigee apigee.analyticsAgent
apigee.analyticsÉditeur
apigee.analyticsViewer
apigee.apiCreator
apigee.deployer
apigee.developerAdmin
apigee.readOnlyAdmin
apigee.synchronizerManager
Moteur d'application appengine.appAdmin
appengine.appViewer
appengine.codeViewer
appengine.deployer
appengine.serviceAdmin
ML automatique éditeur automatique
automl.predictor
automl.viewer
BigQuery bigquery.connectionAdmin
bigquery.connectionUser
bigquery.dataEditor
bigquery.dataOwner
bigquery.dataViewer
bigquery.jobUser
bigquery.metadataViewer
bigquery.readSessionUser
bigquery.utilisateur
Bigtable en nuage bigtable.lecteur
bigtable.utilisateur
bigtable.viewer
Facturation facturation.viewer
Chats Hangouts chat.propriétaire
chat.lecteur
Actif cloud cloudasset.propriétaire
cloudasset.viewer
Fusion de données cloud datafusion.admin
datafusion.viewer
Débogueur cloud clouddebugger.agent
clouddebugger.user
Fonctions cloud cloudfunctions.invoker
cloudfunctions.viewer
IAP cloud iap.admin
iap.httpsResourceAccessor
iap.settingsAdmin
iap.tunnelResourceAccessor
Cloud IoT cloudiot.deviceController
cloudiot.éditeur
cloudiot.provisioner
cloudiot.viewer
Profileur Stackdriver cloudprofiler.agent
cloudprofiler.user
Planificateur de cloud cloudcheduler.admin
cloudcheduler.jobRunner
cloudcheduler.viewer
Scanner de sécurité cloud cloudsecurityscanner.éditeur
cloudsecurityscanner.runner
cloudsecurityscanner.viewer
Nuage SQL cloudsql.client
cloudsql.éditeur
cloudsql.viewer
Trace de nuage cloudtrace.admin
cloudtrace.agent
cloudtrace.utilisateur
Flux de données flux de données.développeur
dataflow.viewer
flux de données.worker
Flux de dialogue dialogueflow.admin
dialogflow.client
dialogflow.reader
Prévention des pertes de données dans le cloud dlp.reader
dlp.user
Rapport d'erreur rapport d'erreurs.user
errorreporting.viewer
rapport d'erreurs.writer
Arc Événementiel eventarc.publisher
eventarc.eventReceiver
Magasin de fichiers cloud fichier.éditeur
fichier.viewer
Enregistrement journalisation.configWriter
journalisation.logWriter
journalisation.privateLogViewer
journalisation.viewer
Moteur d'apprentissage automatique ml.développeur
ml.jobOwner
ml.modelPropriétaire
ml.modelUser
ml.opérationPropriétaire
ml.viewer
Surveillance surveillance.éditeur
surveillance.metricWriter
surveillance.viewer
Carnets IA notebooks.admin
notebooks.viewer
Pub/Sous pubsub.éditeur
pubsub.éditeur
pubsub.abonné
pubsub.viewer
Mémoire Redis redis.éditeur
redis.viewer
Exécution en nuage exécuter.invoker
Source source.lecteur
source.écrivain
Clé de nuage clé.databaseAdmin
clé.databaseReader
clé.databaseUser
clé.viewer
Utilisation des services serviceusage.apiKeysMetadataViewer
Service de transfert de stockage cloud transfert de stockage.utilisateur
transfert de stockage.viewer
Transcodeur cloud transcodeur.admin
transcodeur.viewer
Sommet AI aiplatform.user
Autre identitétoolkit.admin
IdentityToolkit.Viewer