Configurer les droits d'accès appropriés pour une extension

Pour qu'une extension effectue les actions spécifiées, Firebase accorde à chaque instance d'une extension installée a limité l'accès 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 particulier de compte utilisateur Google. Il représente un utilisateur non humain pouvant effectuer des appels d'API autorisés aux 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 sa propre de service géré. 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 suivant:

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 (groupes d'autorisations) spécifiques ; au compte de service de l'extension. Lorsque vous créez une extension, déterminez les rôles requis pour que votre extension fonctionne, puis répertoriez-les rôles et la raison pour laquelle votre extension a besoin de ces rôles dans votre extension.yaml (voir l'exemple en bas de cette page).

Déterminer les rôles requis par votre extension

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

Lors de l'installation, la CLI Firebase invite l'utilisateur à accepter les 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 enclins à l'installer.

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

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

      Par exemple, si votre extension écrit des données dans une instance Realtime Database, votre extension a besoin d'un rôle Realtime Database (plus précisément, firebasedatabase.admin).

    • Si votre extension écoute simplement l'événement déclencheur d'une produit, votre extension ne nécessite pas qu'un rôle soit associé avec ce produit.

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

  2. Une fois que vous avez déterminé avec quels produits votre extension interagit, déterminer quel rôle est requis pour cette interaction spécifique. Un peu Les produits ont des rôles différents selon l'action ou l'ensemble d'actions d'exécution.

    Par exemple, imaginons 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 pas de l'afficher, de le supprimer ni de l'écraser. Pour permettre à l'extension d'effectuer ces actions supplémentaires, vous devez attribuer le rôle storage.objectAdmin à la place.

Consultez la section située en bas de cette page pour afficher tous les rôles compatibles 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 page la documentation Firebase ou Documentation Google Cloud Vous pouvez également rechercher des rôles dans la console Google Cloud IAM et Panneau d'administration.

Attribuer des rôles à une extension

Indiquez 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 Chemin d'accès Firebase Realtime Database. Lorsqu'elle est déclenchée, l'extension met à jour un compte utilisateur e-mail (interaction avec Firebase Authentication) et envoie une notification (interaction avec Firebase Cloud Messaging). Notez les points suivants:

  • Même si l'extension se déclenche à partir d'un événement Realtime Database, le rôle firebasedatabase.admin n'est pas listé (l'écoute n'est pas considérée comme une interaction).
  • Étant donné que l'extension interagit avec Authentication et Cloud Messaging, elle 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 à un compte de service de l'extension:

Champ Type Description
role
(obligatoire)
chaîne Nom du rôle IAM requis par le pour fonctionner
reason
(obligatoire)
chaîne

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

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

resource
(facultatif)
chaîne

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 acceptées sont projects/* et projects/*/buckets/*.

Réduire le champ d'application des rôles

Les extensions doivent respecter le principe du moindre privilège et ne demander aux ressources dont ils ont besoin. Vous pouvez limiter le champ d'application d'accès d'une extension à l'aide du 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 bucket dont elle a besoin, et pas d’autres sur le même projet.

Ce champ accepte les projets (projects/{project_id}) et Buckets de stockage (projects/{project_id}/buckets/{bucket_id}).

Rôles compatibles pour les extensions

Le tableau suivant répertorie les rôles IAM compatibles pour interagir avec Firebase. produits. La plupart des rôles de ce tableau sont Rôles au niveau du produit Firebase mais certaines sont gérées directement par Google Cloud Cloud Firestore et Cloud Storage).

Produits Firebase

Si votre extension interagit avec... Attribuez l'un de ces rôles...
Cloud Firestore datastore.importExportAdmin
datastore.indexAdmin
datastore.owner
utilisateur.utilisateur
datastore datastore.viewer
Cloud Storage for Firebase stockage.admin
storage.objectAdmin
storage.objectCreator
stockage.objectViewer
Firebase App Distribution firebaseappdistro.admin
firebaseappdistro.viewer
Firebase Authentication firebaseauth.admin
firebaseauth.viewer
Firebase A/B Testing firebaseabt.admin
firebaseabt.viewer
Firebase Cloud Messaging firebasenotifications.admin.
firebasenotifications.viewer
Firebase Crashlytics firebasecrashlytics.admin
firebasecrashlytics.viewer
Firebase Hosting firebasehosting.admin
firebasehosting.viewer
Firebase In-App Messaging firebaseinappmessaging.admin
firebaseinappmessaging.viewer
Firebase ML firebaseml.admin
firebaseml.viewer
Firebase Performance Monitoring firebaseperformance.viewer
firebaseperformance.reader
firebaseperformance.writer.
Firebase Realtime Database firebasedatabase.admin
firebasedatabase.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.Administration
Lecteur actions.
Apigee apigee.analyticsAgent
apigee.analyticsEditor
apigee.analyticsViewer
apigee.apiCreator
apigee.deployer
apigee.developerAdmin
apigee.readOnlyAdmin
apigee.synchronizerManager
App Engine appengine.appAdmin
appengine.appViewer
appengine.codeViewer
appengine.deployer
appengine.serviceAdmin
AutoML automl.editor
automl.predictor
automl.viewer
BigQuery bigquery.connectionAdmin
bigquery.connectionUser
bigquery.dataEditor
bigquery.dataOwner
bigquery.dataViewer
bigquery.jobUser
bigquery.metadataViewer
bigquery.readSessionUser
bigquery.user
Cloud Bigtable bigtable.reader
bigtable.user
bigtable.viewer
Facturation billing.viewer
Hangouts Chats chat.propriétaire
chat.reader
Cloud Asset cloudasset.owner
cloudasset.viewer
Cloud Data Fusion datafusion.admin
lecteur datafusion.viewer
Cloud Debugger cloudDebugger.agent
cloudDebugger.user
Cloud Functions cloudfunctions.invoker
cloudfunctions.viewer
Cloud IAP iap.admin
iap.httpsResourceAccessor
iap.settingsAdmin
iap.tunnelResourceAccessor
Cloud IoT cloudiot.deviceController
cloudiot.éditeur
cloudiot.provisioner
cloudiot.viewer
Stackdriver Profiler cloudprofiler.agent
cloudprofiler.utilisateur
Cloud Scheduler cloudscheduler.admin
cloudscheduler.jobRunner
cloudscheduler.viewer
Cloud Security Scanner cloudsecurityscanner.editor
cloudsecurityscanner.runner
cloudsecurityscanner.viewer
Cloud SQL cloudsql.client
cloudsql.editor
cloudsql.viewer
Cloud Trace cloudtrace.admin
cloudtrace.agent
cloudtrace.utilisateur
Dataflow dataflow.developer
dataflow.viewer
dataflow.worker
Dialogflow dialogflow.admin
dialogflow.client
dialogflow.reader
Cloud Data Loss Prevention dlp.reader
dlp.utilisateur
Error Reporting errorreporting.utilisateur
lecteur_erreur.lecteur
errorreporting.writer
Eventarc eventarc.éditeur
eventarc.eventReceiver
Cloud Filestore fichier.éditeur
fichier.viewer
Journalisation logging.configWriter
logging.logWriter
logging.privateLogViewer
logging.viewer
Machine Learning Engine ml.developer
ml.jobOwner
ml.modelOwner
ml.modelUser
ml.operationOwner
ml.viewer
Surveillance monitoring.editor
monitoring.metricWriter
lecteur de surveillance
Notebooks AI notebooks.admin
notebooks.viewer
Pub/Sub pubsub.editor
pubsub.publisher
pubsub.subscriber
pubsub.viewer
Memorystore Redis redis.editor
lecteur redis.viewer
Cloud Run run.invoker
Source source.reader
source.writer
Cloud Spanner spanner.databaseAdmin
spanner.databaseReader
spanner.utilisateur_base_de_données
spanner.viewer
Service Usage serviceusage.apiKeysMetadataViewer
Service de transfert de stockage Cloud Storage utilisateur
storagetransfer. lecteur storagetransfer.viewer
Cloud Transcoder transcodager.admin
transcodager.viewer
Vertex AI utilisateur.aiplatform
Autre identitytoolkit.admin
identitytoolkit.viewer