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.
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.
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ôlestorage.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
etfirebasenotifications.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 Les valeurs prises en charge sont |
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 |