Configura l'accesso appropriato per un'estensione

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.

  1. 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.

  2. 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 ruolo storage.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 e firebasenotifications.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 è projects/${project_id} .

I valori supportati sono projects/* e projects/*/buckets/* .

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