Firebase udostępnia kilka narzędzi do zarządzania Rules, które są przydatne w określonych przypadkach i przy użyciu tego samego backendu interfejsu Firebase Security Rules Management API.
Niezależnie od tego, jakie narzędzie zostanie użyte do jego wywołania, interfejs API zarządzania:
- Przetwarza źródło reguł: zestaw reguł, zwykle plik kodu zawierający instrukcje Firebase Security Rules.
- Przechowuje przetworzone źródło jako niezmienny zbiór reguł.
- Śledzenie wdrożenia każdej reguły w wersji. Usługi z włączonymi regułami zabezpieczeń Firebase sprawdzają wersję projektu, aby ocenić każdą prośbę dotyczącą chronionego zasobu.
- Umożliwia uruchamianie testów składu reguł pod kątem składni i semantyki.
Użyj interfejsu wiersza poleceń Firebase.
Za pomocą interfejsu wiersza poleceń Firebase możesz przesyłać lokalne źródła i wdrażać wersje. Interfejs wiersza poleceń Firebase Local Emulator Suite umożliwia przeprowadzanie pełnych lokalnych testów źródeł.
Użycie interfejsu wiersza poleceń pozwala kontrolować wersję reguł za pomocą kodu aplikacji i wdrażania reguł w ramach istniejącego procesu wdrażania.
Generowanie pliku konfiguracji
Gdy konfigurujesz projekt Firebase za pomocą interfejsu wiersza poleceń Firebase, w katalogu projektu tworzysz plik konfiguracji .rules
. Aby rozpocząć konfigurowanie projektu Firebase, użyj tego polecenia:
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
Edytowanie i aktualizowanie reguł
Źródło reguł możesz edytować bezpośrednio w pliku konfiguracji .rules
.
Upewnij się, że wszelkie zmiany wprowadzone w interfejsie wiersza poleceń Firebase są odzwierciedlone w konsoli Firebase lub że zmiany są konsekwentnie wprowadzane za pomocą konsoli Firebase lub interfejsu wiersza poleceń Firebase. W przeciwnym razie możesz nadpisać wszelkie zmiany wprowadzone w konsoli Firebase.
Testowanie aktualizacji
Local Emulator Suite udostępnia emulatory dla wszystkich usług z włączonymi regułami bezpieczeństwa. Silnik reguł zabezpieczeń w przypadku każdego emulatora przeprowadza zarówno analizę składniową, jak i semantyczną reguł, co wykracza poza testowanie składniowe oferowane przez interfejs API do zarządzania regułami zabezpieczeń.
Jeśli korzystasz z interfejsu wiersza poleceń, G Suite to doskonałe narzędzie do Firebase Security Rulestestowania. Użyj Local Emulator Suite, aby przetestować aktualizacje lokalnie i sprawdzić, czy funkcja Rules w aplikacji działa zgodnie z oczekiwaniami.
Wdrażanie aktualizacji
Po zaktualizowaniu i przetestowaniu Rules wdróż źródła w środowisku produkcyjnym.
W przypadku Cloud Firestore Security Rules powiązaj pliki .rules
z domyślnymi i dodatkowymi skatalogowanymi bazami danych, sprawdzając i aktualizując plik firebase.json
.
Użyj tych poleceń, aby wybrać Rules do wdrożenia lub wdrożyć je jako część normalnego procesu wdrażania.
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
Korzystanie z konsoli Firebase
Możesz też edytować źródła Rules i wdrażać je jako wersje z poziomu konsoli Firebase. Testowanie poprawności składni odbywa się podczas wprowadzania zmian w interfejsie Firebase konsoli, a testowanie semantyczne jest dostępne w Rules Playground.
Edytowanie i aktualizowanie reguł
- Otwórz konsolę Firebase i wybierz projekt.
- Następnie w menu usługi wybierz Realtime Database, Cloud Firestore lub Przechowywanie, a potem kliknij Reguły, aby otworzyć edytor Rules.
- Możesz edytować reguły bezpośrednio w edytorze.
Testowanie aktualizacji
Oprócz testowania składni w interfejsie edytora możesz testować semantyczneRules zachowanie za pomocą zasobów bazy danych i magazynu projektu bezpośrednio w konsoli Firebase, korzystając z Rules Playground. Otwórz ekran Gry w reguły w edytorze Rules, zmień ustawienia i kliknij Uruchom. U góry edytora poszukaj komunikatu z potwierdzeniem.
Wdrażanie aktualizacji
Gdy wszystko będzie gotowe, kliknij Opublikuj.
Korzystanie z pakietu Admin SDK
Do Node.js możesz używać Admin SDKrulesets. Dzięki temu dostępowi możesz:
- Wdrożyć niestandardowe narzędzia, skrypty, panele i pozycje CI/CD do zarządzania regułami.
- Łatwiej zarządzaj regułami w różnych projektach Firebase.
Podczas aktualizowania reguł programowo bardzo ważne jest, aby unikać niezamierzonych zmian w kontroli dostępu do aplikacji. Pisz kodAdmin SDK z myślą o bezpieczeństwie, zwłaszcza podczas aktualizowania lub wdrażania reguł.
Inną ważną rzeczą, o której należy pamiętać, jest to, że Firebase Security Rules wdrażanie może potrwać kilka minut. Podczas stosowania funkcji Admin SDK do wdrażania reguł należy unikać warunków wyścigu, w których aplikacja natychmiast korzysta z reguł, których wdrożenie nie zostało jeszcze ukończone. Jeśli Twój przypadek użycia wymaga częstych aktualizacji reguł kontroli dostępu, rozważ rozwiązania korzystające z Cloud Firestore, które mają na celu zmniejszenie liczby warunków wyścigu pomimo częstych aktualizacji.
Pamiętaj też o tych ograniczeniach:
- Po zaimplementowaniu reguły muszą mieć rozmiar mniejszy niż 256 KiB tekstu zakodowanego w UTF-8.
- Projekt może zawierać maksymalnie 2500 wdrożonych zestawów reguł. Gdy osiągniesz ten limit, przed utworzeniem nowych reguł musisz usunąć niektóre stare reguły.
Tworzenie i wdrażanie reguł Cloud Storage lub Cloud Firestore
Typowy przepływ pracy dotyczący zarządzania regułami zabezpieczeń za pomocą Admin SDK może obejmować 3 oddzielne kroki:
- Tworzenie źródła pliku z regułami (opcjonalnie)
- Tworzenie zestawu reguł
- Opublikuj lub wdrocz nowy zestaw reguł.
Pakiet SDK udostępnia metodę łączenia tych czynności w jednym wywołaniu interfejsu API w przypadku reguł bezpieczeństwa Cloud Storage i Cloud Firestore. Przykład:
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);
Ten sam schemat działa w przypadku reguł Cloud Storage z wartością releaseFirestoreRulesetFromSource()
.
Możesz też utworzyć plik reguł jako obiekt w pamięci, utworzyć zbiór reguł i wdrożyć go osobno, aby mieć większą kontrolę nad tymi zdarzeniami. Przykład:
const rf = admin.securityRules().createRulesFileFromSource('firestore.rules', source);
const rs = await admin.securityRules().createRuleset(rf);
await admin.securityRules().releaseFirestoreRuleset(rs);
Zaktualizuj zestawy zasad Realtime Database
Aby zaktualizować reguły Realtime Database za pomocą Admin SDK, użyj metod getRules()
i setRules()
w admin.database
. Zasady możesz pobrać w formacie JSON lub jako ciąg znaków z komentarzami.
Aby zaktualizować zestaw reguł:
const source = `{
"rules": {
"scores": {
".indexOn": "score",
"$uid": {
".read": "$uid == auth.uid",
".write": "$uid == auth.uid"
}
}
}
}`;
await admin.database().setRules(source);
Zarządzanie zestawami reguł
Aby ułatwić zarządzanie dużymi zestawami reguł, funkcja Admin SDK umożliwia wyświetlanie wszystkich istniejących reguł za pomocą funkcji admin.securityRules().listRulesetMetadata
. Przykład:
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;
}
}
W przypadku bardzo dużych wdrożeń, które z czasem osiągną limit 2500 zestawów reguł, możesz utworzyć logikę usuwania najstarszych reguł w ustalonym cyklu czasowym. Aby na przykład usunąć wszystkie reguły wdrożone dłużej niż 30 dni:
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.`);
Korzystanie z interfejsu API REST
Opisane powyżej narzędzia dobrze sprawdzają się w różnych przepływach pracy, m.in. do zarządzania Firebase Security Rules w przypadku wielu baz danych Cloud Firestore w projekcie, ale warto też zarządzać usługą Firebase Security Rules i wdrożyć ją za pomocą interfejsu API do zarządzania. Interfejs Management API zapewnia największą elastyczność.
.Pamiętaj też o tych ograniczeniach:
- Po zaimplementowaniu reguły muszą mieć rozmiar mniejszy niż 256 KiB tekstu zakodowanego w UTF-8.
- Projekt może mieć łącznie maksymalnie 2500 wdrożonych zestawów reguł. Po osiągnięciu tego limitu musisz usunąć niektóre stare zestawy reguł, zanim utworzysz nowe.
Utwórz i wdróż zbiory reguł Cloud Firestore lub Cloud Storage za pomocą REST
Przykłady w tej sekcji korzystają z Firestore Rules, ale dotyczą też Cloud Storage Rules.
Przykłady wykorzystują też cURL do wywoływania interfejsów API. Pomijamy kroki konfiguracji i przekazywania tokenów uwierzytelniania. Możesz eksperymentować z tym interfejsem API za pomocą narzędzia API Explorer zintegrowanego z dokumentacją referencyjną.
Typowe kroki tworzenia i wdrażania zestawu reguł za pomocą interfejsu API do zarządzania:
- Tworzenie źródeł plików reguł
- Tworzenie zestawu reguł
- Opublikuj (wdróż) nowy zestaw reguł.
Utwórz źródło
Załóżmy, że pracujesz nad projektem secure_commerce
w Firebase i chcesz wdrożyć zablokowaną wersję funkcji Cloud Firestore Rules do bazy danych w projekcie o nazwie east_store
.
Możesz zastosować te reguły w pliku firestore.rules
.
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
Tworzenie zestawu reguł
Teraz wygeneruj odcisk cyfrowy zakodowany w standardzie base64. Następnie możesz użyć źródła w tym pliku, aby wypełnić ładunek potrzebny do utworzenia reguł za pomocą wywołania interfejsu API REST projects.rulesets.create
. Aby wstawić zawartość pliku firestore.rules
do ładunku REST, użyj polecenia cat
.
Aby powiązać tę usługę z bazą danych east_store
, użyj wartości attachment_point
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'
Interfejs API zwraca odpowiedź weryfikacyjną i nazwę zestawu reguł, np. projects/secure_commerce/rulesets/uuid123
.
Publikowanie (wdrażanie) zestawu reguł
Jeśli zestaw reguł jest prawidłowy, ostatnim krokiem jest wdrożenie nowego zestawu reguł w oznaczonym wydaniu.
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'
Pamiętaj, że pełne rozpowszechnienie wersji Firebase Security Rules może potrwać kilka minut. Podczas wdrażania za pomocą interfejsu REST API do zarządzania unikaj sytuacji, w której aplikacja natychmiast korzysta z reguł, których wdrożenie nie zostało jeszcze ukończone.
Aktualizowanie reguł Realtime Database za pomocą interfejsu REST
Usługa Realtime Database udostępnia własny interfejs REST do zarządzania Rules. Zapoznaj się z artykułem Zarządzanie Firebase Realtime Database Rules za pomocą interfejsu REST.
Zarządzanie zestawami reguł za pomocą interfejsu REST
Aby ułatwić zarządzanie wdrożeniami dużych reguł, oprócz metody REST do tworzenia zestawów reguł i wersji interfejs API do zarządzania udostępnia metody do:
- tworzyć, pobierać i usuwać reguły;
- wyświetlanie, pobieranie i usuwanie reguł releases
W przypadku bardzo dużych wdrożeń, które z czasem osiągają limit 2500 reguł, możesz utworzyć logikę, która będzie usuwać najstarsze reguły w ustalonym cyklu czasowym. Aby na przykład usunąć wszystkie zestawy reguł, które są wdrażane od ponad 30 dni, możesz wywołać metodę projects.rulesets.list
, przeanalizować listę JSON obiektów Ruleset
według ich kluczy createTime
, a następnie wywołać metodę project.rulesets.delete
w odpowiednich zestawach reguł według klucza ruleset_id
.
Testowanie aktualizacji za pomocą interfejsu REST
Ponadto interfejs API do zarządzania umożliwia przeprowadzanie testów składni i semantyki zasobów Cloud Firestore i Cloud Storage w projektach produkcyjnych.
Testowanie za pomocą tego komponentu interfejsu API obejmuje:
- Definiowanie obiektu JSON
TestSuite
reprezentującego zbiór obiektówTestCase
- Przesyłanie
TestSuite
- Analizowanie zwróconych obiektów
TestResult
Zdefiniujmy obiekt TestSuite
z jednym elementem TestCase
w pliku testcase.json
. W tym przykładzie przekazujemy źródło języka Rules w ładunku REST wraz z pakietem testów do wykonania na podstawie tych reguł. Określamy oczekiwania dotyczące oceny reguł oraz żądanie klienta, na podstawie którego ma być testowany zbiór reguł. Możesz też określić, jak szczegółowy ma być raport z testu. Użycie wartości „FULL” wskazuje, że w raporcie mają się znaleźć wyniki dla wszystkich wyrażeń językowych Rules, w tym tych, które nie pasowały do żądania.
{ "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"}}} } ] } ] } }
Następnie możemy przesłać ten TestSuite
do oceny za pomocą metody projects.test
.
curl -X POST -d '{
' $(cat testcase.json) '
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets/uuid123:test'
Zwracany obiekt TestReport
(zawierający stan testu SUCCESS/FAILURE, listy komunikatów debugowania, listy odwiedzonych wyrażeń reguł i ich raporty oceny) potwierdzi stan SUCCESS, że dostęp jest prawidłowo dozwolony.
Zarządzanie uprawnieniami do korzystania z różnych usług w Cloud Storage Security Rules
Jeśli utworzysz Cloud Storage Security Rules, które używają zawartości dokumentu Cloud Firestore do oceny warunków zabezpieczeń, w konsoli Firebase lub interfejsie wiersza poleceń Firebase pojawi się prośba o zezwolenie na połączenie tych 2 usług.
Jeśli zdecydujesz się wyłączyć taką ochronę w wielu usługach:
Najpierw przed wyłączeniem funkcji zmodyfikuj reguły, usuwając wszystkie instrukcje, które używają funkcji Rules do uzyskiwania dostępu do Cloud Firestore. W przeciwnym razie po wyłączeniu tej funkcji oceny Rules spowodują niepowodzenie żądań Storage.
Aby usunąć rolę „Firebase Rules Firestore Service Agent”, otwórz stronę Uprawnienia w konsoli Google Cloud i postępuj zgodnie z instrukcjami anulowania przypisania ról.
.
Gdy następnym razem zapiszesz reguły międzyusługowe za pomocą wiersza poleceń Firebase lub konsoli Firebase, pojawi się prośba o ponowne włączenie tej funkcji.