Firebase ti offre diversi strumenti per gestire Security Rules, ognuno utile in casi particolari e ognuno che utilizza la stessa API di gestione delle regole di sicurezza di Firebase di backend.
Indipendentemente dallo strumento utilizzato per richiamarla, l'API di gestione:
- Importa un'origine di regole: un insieme di regole, in genere un file di codice contenente istruzioni Firebase Security Rules.
- Archivia l'origine importata come ruleset immutabile.
- Monitora il deployment di ogni set di regole in una release. I servizi abilitati per le regole di sicurezza di Firebase cercano la release di un progetto per valutare ogni richiesta di una risorsa protetta.
- Fornisce la funzionalità per eseguire test sintattici e semantici di un set di regole.
Utilizza l'interfaccia a riga di comando Firebase
Con l'interfaccia a riga di comando Firebase, puoi caricare origini locali ed eseguire il deployment delle release. Il comando Firebase Local Emulator Suite dell'interfaccia a riga di comando consente di eseguire test locali completi delle origini.
L'utilizzo dell'interfaccia a riga di comando ti consente di mantenere le regole sotto il controllo della versione con il codice dell'applicazione ed eseguire il deployment delle regole nell'ambito del processo di deployment esistente.
Genera un file di configurazione
Quando configuri il tuo progetto Firebase utilizzando l'interfaccia a riga di comando Firebase, crei un file di configurazione .rules nella directory del progetto. Utilizza il seguente comando per iniziare a configurare il tuo progetto Firebase:
Cloud Firestore
// Set up Firestore in your project directory, creates a .rules file firebase init firestore
Realtime Database
// Set up Realtime Database in your project directory, creates a .rules file firebase init database
Cloud Storage
// Set up Storage in your project directory, creates a .rules file firebase init storage
Modifica e aggiorna le regole
Modifica l'origine delle regole direttamente nel file di configurazione .rules.
Assicurati che le modifiche apportate nell'interfaccia a riga di comando Firebase vengano applicate nella console Firebase o che gli aggiornamenti vengano eseguiti in modo coerente utilizzando la console Firebase o l'interfaccia a riga di comando di Firebase. In caso contrario, potresti sovrascrivere gli aggiornamenti apportati nella console Firebase.
Testa gli aggiornamenti
Local Emulator Suite fornisce emulatori per tutti i prodotti abilitati per le regole di sicurezza. Il motore delle regole di sicurezza per ogni emulatore esegue la valutazione sintattica e semantica delle regole, superando così i test sintattici offerti dall'API di gestione delle regole di sicurezza.
Se utilizzi l'interfaccia a riga di comando, la suite è uno strumento eccellente per i test di Firebase Security Rules. Utilizza Local Emulator Suite per testare gli aggiornamenti localmente e verificare che i Security Rules della tua app mostrino il comportamento che vuoi.
Esegui il deployment degli aggiornamenti
Dopo aver aggiornato e testato Security Rules, esegui il deployment delle origini in produzione.
Per Cloud Firestore Security Rules, associa i file .rules ai tuoi database predefiniti e aggiuntivi denominati esaminando e aggiornando il file firebase.json.
Utilizza i seguenti comandi per eseguire il deployment selettivo dei tuoi Security Rules singolarmente o come parte del normale processo di deployment.
Cloud Firestore
// Deploy rules for all databases configured in your firebase.json firebase deploy --only firestore:rules
// Deploy rules for the specified database configured in your firebase.json firebase deploy --only firestore:<databaseId>
Realtime Database
// Deploy your .rules file firebase deploy --only database
Cloud Storage
// Deploy your .rules file firebase deploy --only storage
Utilizza la console Firebase
Puoi anche modificare le origini Security Rules ed eseguirne il deployment come release dalla console Firebase. I test sintattici vengono eseguiti durante la modifica nell'interfaccia utente della console Firebase, mentre i test semantici sono disponibili utilizzando il Playground Security Rules.
Modifica e aggiorna le regole
- Apri la console Firebase e seleziona il tuo progetto.
- Poi, seleziona Realtime Database, Cloud Firestore o Storage dalla navigazione del prodotto, quindi fai clic su Regole per andare all'editor Security Rules.
- Modifica le regole direttamente nell'editor.
Testa gli aggiornamenti
Oltre a testare la sintassi nell'interfaccia utente dell'editor, puoi testare il comportamento semantico di Security Rules utilizzando le risorse di database e archiviazione del tuo progetto direttamente nella console Firebase, utilizzando il Playground Security Rules. Apri la schermata Playground delle regole nell'editor Security Rules, modifica le impostazioni e fai clic su Esegui. Cerca il messaggio di conferma nella parte superiore dell'editor.
Esegui il deployment degli aggiornamenti
Quando hai la certezza che gli aggiornamenti corrispondono alle tue aspettative, fai clic su Pubblica.
Utilizza l'SDK Admin
Puoi utilizzare Admin SDK per i set di regole di Node.js. Con questo accesso programmatico, puoi:
- Implementare strumenti, script, dashboard e pipeline CI/CD personalizzati per la gestione delle regole.
- Gestisci le regole più facilmente in più progetti Firebase.
Quando aggiorni le regole in modo programmatico, è molto importante evitare di apportare modifiche involontarie al controllo degli accessi per la tua app. Scrivi il codice Admin SDK tenendo presente innanzitutto la sicurezza, soprattutto quando aggiorni o esegui il deployment delle regole.
Un altro aspetto importante da tenere presente è che le release di Firebase Security Rules richiedono alcuni minuti per essere propagate completamente. Quando utilizzi l'Admin SDK per eseguire il deployment delle regole, assicurati di evitare race condition in cui la tua app si basa immediatamente su regole il cui deployment non è ancora stato completato. Se il tuo caso d'uso richiede aggiornamenti frequenti delle regole di controllo degli accessi, prendi in considerazione soluzioni che utilizzano Cloud Firestore, progettato per ridurre le race condition nonostante gli aggiornamenti frequenti.
Tieni presente anche questi limiti:
- Le regole devono avere dimensioni inferiori a 256 KiB di testo con codifica UTF-8 quando vengono serializzate.
- Un progetto può avere un massimo di 2500 set di regole di cui è stato eseguito il deployment. Una volta raggiunto questo limite, devi eliminare alcuni set di regole precedenti prima di crearne di nuovi.
Crea ed esegui il deployment di set di regole Cloud Storage o Cloud Firestore
Un workflow tipico per la gestione delle regole di sicurezza con Admin SDK potrebbe includere tre passaggi distinti:
- Crea un'origine file di regole (facoltativo)
- Crea un set di regole
- Rilascia o esegui il deployment del nuovo set di regole
L'SDK fornisce un metodo per combinare questi passaggi in un'unica chiamata API per le regole di sicurezza Cloud Storage e Cloud Firestore. Ad esempio:
const source = `service cloud.firestore {
match /databases/{database}/documents {
match /carts/{cartID} {
allow create: if request.auth != null && request.auth.uid == request.resource.data.ownerUID;
allow read, update, delete: if request.auth != null && request.auth.uid == resource.data.ownerUID;
}
}
}`;
// Alternatively, load rules from a file
// const fs = require('fs');
// const source = fs.readFileSync('path/to/firestore.rules', 'utf8');
await admin.securityRules().releaseFirestoreRulesetFromSource(source);
Questo stesso pattern funziona per le regole Cloud Storage con releaseFirestoreRulesetFromSource().
In alternativa, puoi creare il file delle regole come oggetto in memoria, creare il set di regole ed eseguirne il deployment separatamente per un controllo più preciso di questi eventi. Ad esempio:
const rf = admin.securityRules().createRulesFileFromSource('firestore.rules', source);
const rs = await admin.securityRules().createRuleset(rf);
await admin.securityRules().releaseFirestoreRuleset(rs);
Aggiorna Realtime Database set di regole
Per aggiornare i set di regole Realtime Database con Admin SDK, utilizza i metodi getRules() e setRules() di admin.database. Puoi recuperare i set di regole in formato JSON o come stringa con commenti inclusi.
Per aggiornare un set di regole:
const source = `{
"rules": {
"scores": {
".indexOn": "score",
"$uid": {
".read": "$uid == auth.uid",
".write": "$uid == auth.uid"
}
}
}
}`;
await admin.database().setRules(source);
Gestisci i set di regole
Per semplificare la gestione di set di regole di grandi dimensioni, Admin SDK ti consente di elencare tutte le regole esistenti con admin.securityRules().listRulesetMetadata. Ad esempio:
const allRulesets = [];
let pageToken = null;
while (true) {
const result = await admin.securityRules().listRulesetMetadata(pageToken: pageToken);
allRulesets.push(...result.rulesets);
pageToken = result.nextPageToken;
if (!pageToken) {
break;
}
}
Per deployment molto grandi che raggiungono il limite di 2500 set di regole nel tempo, puoi creare una logica per eliminare le regole meno recenti in un ciclo di tempo fisso. Ad esempio, per eliminare tutti i set di regole di cui è stato eseguito il deployment per più di 30 giorni:
const thirtyDays = new Date(Date.now() - THIRTY_DAYS_IN_MILLIS);
const promises = [];
allRulesets.forEach((rs) => {
if (new Date(rs.createTime) < thirtyDays) {
promises.push(admin.securityRules().deleteRuleset(rs.name));
}
});
await Promise.all(promises);
console.log(`Deleted ${promises.length} rulesets.`);
Utilizzo dell'API REST
Gli strumenti descritti sopra sono adatti a vari workflow, tra cui la gestione di Firebase Security Rules per più database Cloud Firestore nel tuo progetto, ma potresti voler gestire ed eseguire il deployment di Firebase Security Rules utilizzando l'API di gestione stessa. L'API di gestione offre la massima flessibilità.
Tieni presente anche questi limiti:
- Le regole devono avere dimensioni inferiori a 256 KiB di testo con codifica UTF-8 quando vengono serializzate.
- Un progetto può avere un massimo di 2500 set di regole di cui è stato eseguito il deployment. Una volta raggiunto questo limite, devi eliminare alcuni set di regole precedenti prima di crearne di nuovi.
Crea ed esegui il deployment di set di regole Cloud Firestore o Cloud Storage con REST
Gli esempi in questa sezione utilizzano Firestore Security Rules, anche se si applicano anche a Cloud Storage Security Rules.
Gli esempi utilizzano anche cURL per effettuare chiamate API. I passaggi per configurare e passare i token di autenticazione sono stati omessi. Puoi sperimentare con questa API utilizzando Explorer API integrato con la documentazione di riferimento.
I passaggi tipici per la creazione e il deployment di un set di regole utilizzando l'API di gestione sono:
- Crea origini file di regole
- Crea un set di regole
- Rilascia (esegui il deployment) il nuovo set di regole.
Crea un'origine
Supponiamo che tu stia lavorando al tuo progetto Firebase secure_commerce e voglia eseguire il deployment di Cloud Firestore Security Rules bloccate in un database del tuo progetto denominato east_store.
Puoi implementare queste regole in un file firestore.rules.
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
Crea un set di regole
Ora genera un'impronta con codifica in base64 per questo file. Puoi quindi utilizzare l'origine in questo file per compilare il payload necessario per creare un set di regole con la chiamata REST projects.rulesets.create. In questo caso, utilizza il comando cat per inserire i contenuti di firestore.rules nel payload REST.
Per il monitoraggio, per associare questo elemento al tuo database east_store, imposta attachment_point su east_store.
curl -X POST -d '{
"source": {
"files": [
{
"content": "' $(cat storage.rules) '",
"name": "firestore.rules",
"fingerprint": <sha fingerprint>
},
"attachment_point": "firestore.googleapis.com/databases/east_store"
]
}
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets'L'API restituisce una risposta di convalida e un nome del set di regole, ad esempio projects/secure_commerce/rulesets/uuid123.
Rilascia (esegui il deployment) un set di regole
Se il set di regole è valido, il passaggio finale consiste nel distribuire il nuovo set di regole in una release denominata.
curl -X POST -d '{
"name": "projects/secure_commerce/releases/cloud.firestore/east_store" ,
"rulesetName": "projects/secure_commerce/rulesets/uuid123"
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/releases'Tieni presente che le release di Firebase Security Rules richiedono alcuni minuti per essere propagate completamente. Quando utilizzi l'API REST di gestione per il deployment, assicurati di evitare race condition in cui l'app si basa immediatamente su regole il cui deployment non è ancora completo.
Aggiorna i set di regole Realtime Database con REST
Realtime Database fornisce la propria interfaccia REST per la gestione di Security Rules. Consulta Gestione di Firebase Realtime Database Security Rules tramite REST.
Gestisci i set di regole con REST
Per semplificare la gestione di deployment di regole di grandi dimensioni, oltre a un metodo REST per la creazione di set di regole e release, l'API di gestione fornisce metodi per:
- elencare, recuperare ed eliminare ruleset
- Elencare, recuperare ed eliminare le release delle regole
Per deployment molto grandi che raggiungono il limite di 2500 set di regole nel tempo, puoi creare una logica per eliminare le regole meno recenti in un ciclo di tempo fisso. Ad esempio, per eliminare tutti i set di regole di cui è stato eseguito il deployment per più di 30 giorni, puoi chiamare il metodo projects.rulesets.list, analizzare l'elenco JSON degli oggetti Ruleset sulle relative chiavi createTime, quindi chiamare project.rulesets.delete sui set di regole corrispondenti per ruleset_id.
Testa gli aggiornamenti con REST
Infine, l'API di gestione consente di eseguire test sintattici e semantici sulle risorse Cloud Firestore e Cloud Storage nei progetti di produzione.
I test con questo componente dell'API consistono in:
- Definizione di un oggetto JSON
TestSuiteper rappresentare un insieme di oggettiTestCase - Invio del
TestSuite - L'analisi ha restituito
TestResultoggetti
Definiamo un oggetto TestSuite con un singolo TestCase in un file testcase.json. In questo esempio, passiamo l'origine del linguaggio Security Rules in linea con il payload REST, insieme alla suite di test da eseguire su queste regole. Specifichiamo un'aspettativa di valutazione delle regole e la richiesta del client rispetto alla quale deve essere testato il set di regole. Puoi anche specificare il livello di completezza del report di test utilizzando il valore "FULL" per indicare che nel report devono essere inclusi i risultati per tutte le espressioni del linguaggio Security Rules, incluse quelle che non corrispondono alla richiesta.
{ "source": { "files": [ { "name": "firestore.rules", "content": "service cloud.firestore { match /databases/{database}/documents { match /users/{userId}{ allow read: if (request.auth.uid == userId); } function doc(subpath) { return get(/databases/$(database)/documents/$(subpath)).data; } function isAccountOwner(accountId) { return request.auth.uid == accountId || doc(/users/$(request.auth.uid)).accountId == accountId; } match /licenses/{accountId} { allow read: if isAccountOwner(accountId); } } }" } ] }, "testSuite": { "testCases": [ { "expectation": "ALLOW", "request": { "auth": {"uid": "123"}, "path": "/databases/(default)/documents/licenses/abcd", "method": "get"}, "functionMocks": [ { "function": "get", "args": [{"exact_value": "/databases/(default)/documents/users/123"}], "result": {"value": {"data": {"accountId": "abcd"}}} } ] } ] } }
Possiamo quindi inviare questo TestSuite per la valutazione con il metodo projects.test.
curl -X POST -d '{
' $(cat testcase.json) '
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets/uuid123:test'L'oggetto TestReport restituito (contenente lo stato SUCCESS/FAILURE del test, gli elenchi dei messaggi di debug, gli elenchi delle espressioni delle regole visitate e i relativi report di valutazione) confermerà con lo stato SUCCESS che l'accesso è consentito correttamente.
Gestisci le autorizzazioni per Cloud Storage Security Rules tra servizi
Se crei Cloud Storage Security Rules che utilizzano i contenuti dei documenti Cloud Firestore per valutare le condizioni di sicurezza, ti verrà chiesto nella console Firebase o nell'interfaccia a riga di comando Firebase di abilitare le autorizzazioni per connettere i due prodotti.
Se decidi di disattivare questa sicurezza tra servizi:
Innanzitutto, prima di disattivare la funzionalità, modifica le regole rimuovendo tutte le istruzioni che utilizzano le funzioni Security Rules per accedere a Cloud Firestore. In caso contrario, dopo la disattivazione della funzionalità, le valutazioni di Security Rules causeranno l'esito negativo delle richieste di Storage.
Utilizza la pagina IAM nella console Google Cloud per eliminare il ruolo "Firebase Rules Firestore Service Agent" seguendo la guida di Cloud per la revoca dei ruoli.
Ti verrà chiesto di riattivare la funzionalità la prossima volta che salverai le regole tra servizi dall'interfaccia a riga di comando Firebase o dalla console Firebase.