Affinché un'estensione possa eseguire le azioni specificate, Firebase concede a ciascuna istanza di un'estensione installata un accesso limitato al progetto e ai relativi dati tramite un account di servizio .
Cos'è un account di servizio?
Un account di servizio è un tipo speciale di account utente Google. Rappresenta un utente non umano che può effettuare chiamate API autorizzate ai servizi Google.
Durante l'installazione di un'estensione, Firebase crea un account di servizio per l'estensione nel progetto. Ogni istanza installata di un'estensione ha il proprio account di servizio. Se un'istanza di estensione viene disinstallata, Firebase elimina l'account di servizio dell'estensione.
Gli account di servizio creati per le estensioni sono nel formato:
ext- extension-instance-id @ project-id .iam.gserviceaccount.com
Firebase limita l'accesso di un'estensione a un progetto e ai relativi dati assegnando ruoli specifici (gruppi di autorizzazioni) all'account di servizio dell'estensione. Quando crei un'estensione, determini quali ruoli richiede la tua estensione per funzionare, quindi elenchi questi ruoli e il motivo per cui la tua estensione ha bisogno di questi ruoli nel file extension.yaml
(vedi l'esempio in fondo a questa pagina).
Determina quali ruoli richiede la tua estensione
Quando crei la tua estensione, determini il livello di accesso richiesto dall'estensione per funzionare.
Durante l'installazione, la CLI di Firebase richiede all'utente di accettare il livello di accesso concesso da ciascun ruolo. Se la tua estensione richiede più ruoli di quelli effettivamente necessari, gli utenti potrebbero avere meno probabilità di installarla.
Determina se la tua estensione interagisce con un prodotto:
Se la tua estensione interagisce con un prodotto , devi concedere alla tua estensione l'accesso a quel prodotto.
Ad esempio, se la tua estensione scrive dati su un'istanza di Realtime Database, allora la tua estensione necessita di un ruolo di Realtime Database (in particolare,
firebasedatabase.admin
).Se la tua estensione è in ascolto solo per un evento di attivazione da un prodotto , non necessita di un ruolo associato a quel prodotto.
Ad esempio, se la tua estensione si attiva in seguito a una scrittura su un'istanza di Realtime Database (ma non scrive nulla sul database), la tua estensione non necessita di un ruolo di Realtime Database.
Dopo aver determinato con quali prodotti interagisce la tua estensione , devi decidere quale ruolo è richiesto per quella specifica interazione. Alcuni prodotti offrono ruoli diversi a seconda dell'azione o dell'insieme di azioni eseguite.
Ad esempio, supponiamo che la tua estensione interagisca con un bucket Cloud Storage. Il ruolo
storage.objectCreator
consentirebbe all'estensione di creare un oggetto in un bucket Cloud Storage, ma tale ruolo non consentirebbe all'estensione di visualizzare, eliminare o sovrascrivere oggetti. Per consentire all'estensione di eseguire tali azioni aggiuntive, è necessario invece assegnare il ruolostorage.objectAdmin
.
Fai riferimento alla sezione in fondo a questa pagina per visualizzare tutti i ruoli supportati che puoi assegnare all'account di servizio della tua estensione. Per conoscere la descrizione di ciascun ruolo e le autorizzazioni concesse, visita la documentazione di Firebase o la documentazione di Google Cloud . Puoi anche cercare i ruoli nel pannello IAM e di amministrazione della console Google Cloud.
Come assegnare ruoli a un interno
Elenca i ruoli IAM richiesti affinché la tua estensione funzioni nella sezione dei roles
del file extension.yaml
.
Ecco un esempio di un'estensione che ascolta un percorso del database Firebase Realtime specificato. Quando viene attivata, l'estensione aggiorna l'e-mail di un account utente (interazione con Firebase Authentication) e invia una notifica (interazione con Firebase Cloud Messaging). Notare quanto segue:
- Anche se l'estensione si attiva da un evento di Realtime Database, il ruolo
firebasedatabase.admin
non è elencato (l'ascolto non è considerato un'interazione ). - Poiché l'estensione interagisce con Authentication e Cloud Messaging, l'estensione richiede ruoli per accedere a tali prodotti (
firebaseauth.admin
efirebasenotifications.admin
, rispettivamente).
# 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
...
Nel file extension.yaml
, utilizza i seguenti campi per assegnare un ruolo all'account di servizio di un'estensione:
Campo | Tipo | Descrizione |
---|---|---|
role (necessario) | corda | Nome del ruolo IAM necessario all'estensione per funzionare |
reason (necessario) | corda | Breve descrizione del motivo per cui l'interno necessita dell'accesso concesso dal ruolo Assicurati di fornire dettagli sufficienti in modo che l'utente possa capire come l'estensione utilizza il ruolo. |
resource (opzionale) | corda | Policy IAM della risorsa a cui aggiungere questo ruolo. Se omesso, il valore predefinito è I valori supportati sono |
Ridurre l'ambito dei ruoli
Le estensioni dovrebbero seguire il principio del privilegio minimo e richiedere l'accesso solo alle risorse di cui hanno bisogno. Puoi limitare l'ambito di accesso di un'estensione utilizzando il campo role.resource
. Ad esempio, se la tua estensione deve scrivere oggetti in un bucket Cloud Storage, potresti utilizzare il seguente ruolo:
roles:
- role: storage.objectCreator
reason: Needed in order to write
resource: projects/${PROJECT_ID}/buckets/${STORAGE_BUCKET}
Ciò consente all'estensione di accedere solo al bucket di cui ha bisogno e non ad altri sullo stesso progetto.
Questo campo supporta progetti ( projects/{project_id}
) e bucket di archiviazione ( projects/{project_id}/buckets/{bucket_id}
).
Ruoli supportati per le estensioni
La tabella seguente elenca i ruoli IAM supportati per l'interazione con i prodotti Firebase. La maggior parte dei ruoli in questa tabella sono ruoli a livello di prodotto Firebase , ma alcuni sono gestiti direttamente da Google Cloud (in particolare, Cloud Firestore e Cloud Storage ).
Prodotti Firebase
Se la tua estensione interagisce con... | Assegna uno di questi ruoli... |
---|---|
Cloud Fire Store | datastore.importExportAdmin datastore.indexAdmin proprietario.datastore datastore.utente datastore.viewer |
Archiviazione nel cloud per Firebase | storage.admin storage.oggettoAdmin storage.objectCreator storage.objectViewer |
Distribuzione dell'app Firebase | firebaseappdistro.admin firebaseappdistro.viewer |
Autenticazione Firebase | firebaseauth.admin firebaseauth.viewer |
Test A/B di Firebase | firebaseabt.admin firebaseabt.viewer |
Messaggistica cloud Firebase | firebasenotifications.admin firebasenotifications.viewer |
Crashlytics di Firebase | firebasecrashlytics.admin firebasecrashlytics.viewer |
Hosting Firebase | firebasehosting.admin firebasehosting.viewer |
Messaggistica in-app Firebase | firebaseinappmessaging.admin firebaseinappmessaging.viewer |
FirebaseML | firebaseml.admin firebaseml.viewer |
Monitoraggio delle prestazioni di Firebase | firebaseperformance.viewer firebaseperformance.reader firebaseperformance.writer |
Database in tempo reale Firebase | firebasedatabase.admin firebasedatabase.viewer |
Regole di sicurezza | firebaserules.viewer firebaserules.developer firebaserules.deployer |
statistiche di Google | firebaseanalytics.admin firebaseanalytics.viewer |
Prodotti Google Cloud
Ulteriori informazioni su questi ruoli nella documentazione di Google Cloud .
Se la tua estensione interagisce con... | Assegna uno di questi ruoli... |
---|---|
Azioni | azioni.Admin azioni.Visualizzatore |
Apigee | apigee.analyticsAgent apigee.analyticsEditor apigee.analyticsViewer apigee.apiCreator apigee.deployer apigee.developerAdmin apigee.readOnlyAdmin apigee.synchronizerManager |
Motore dell'applicazione | 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.utente |
Big Table sul cloud | bigtable.reader bigtable.utente bigtable.viewer |
Fatturazione | billing.viewer |
Chat di Hangouts | chat.proprietario chat.reader |
Risorsa cloud | cloudasset.proprietario cloudasset.viewer |
Fusione dei dati nel cloud | datafusion.admin datafusion.viewer |
Debug cloud | clouddebugger.agent clouddebugger.utente |
Funzioni del cloud | cloudfunctions.invoker cloudfunctions.viewer |
IAP sul cloud | iap.admin iap.httpsResourceAccessor iap.settingsAdmin iap.tunnelResourceAccessor |
IoT nel cloud | cloudiot.deviceController cloudiot.editor cloudiot.provisioner cloudiot.viewer |
Profilo Stackdriver | cloudprofiler.agent cloudprofiler.utente |
Pianificatore cloud | cloudscheduler.admin cloudscheduler.jobRunner cloudscheduler.viewer |
Scanner di sicurezza nel cloud | cloudsecurityscanner.editor cloudsecurityscanner.runner cloudsecurityscanner.viewer |
CloudSQL | cloudql.client cloudsql.editor cloudsql.viewer |
Traccia delle nuvole | cloudtrace.admin cloudtrace.agent cloudtrace.utente |
Flusso di dati | dataflow.developer dataflow.viewer flusso di dati.worker |
Flusso di dialogo | dialogflow.admin dialogflow.client dialogflow.reader |
Prevenzione della perdita di dati nel cloud | dlp.reader dlp.utente |
Segnalazione errori | errorreporting.utente errorreporting.viewer errorreporting.writer |
Eventarc | eventarc.publisher eventarc.eventReceiver |
Archivio file cloud | file.editor file.viewer |
Registrazione | logging.configWriter logging.logWriter logging.privateLogViewer logging.viewer |
Motore di apprendimento automatico | ml.developer ml.jobOwner ml.modelloProprietario ml.modelUser ml.operazioneOwner ml.viewer |
Monitoraggio | monitoraggio.editor monitoraggio.metricWriter monitoraggio.viewer |
Notebook IA | notebook.admin notebooks.viewer |
Pub/Sub | pubsub.editor pubsub.editore pubsub.subscriber pubsub.viewer |
Memory Store Redis | redis.editor redis.viewer |
Corsa sulle nuvole | esegui.invoker |
Fonte | source.reader source.writer |
Chiave per le nuvole | chiave.databaseAdmin chiave.databaseReader chiave.databaseUtente chiave inglese.viewer |
Utilizzo del servizio | serviceusage.apiKeysMetadataViewer |
Servizio di trasferimento di archiviazione cloud | storagetransfer.utente storagetransfer.viewer |
Transcodificatore cloud | transcoder.admin transcoder.viewer |
IA del vertice | aiplatform.utente |
Altro | identitàtoolkit.admin identitàtoolkit.viewer |