Firebase udostępnia kilka narzędzi do zarządzania Rules. Każde z nich jest przydatne w określonych przypadkach i każde korzysta z tego samego interfejsu API do zarządzania regułami zabezpieczeń Firebase.
Niezależnie od tego, którego narzędzia używasz do wywołania interfejsu 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 pełne testowanie lokalnych źródeł.
Korzystanie z interfejsu wiersza poleceń pozwala kontrolować wersje reguł wraz z kodem aplikacji i wdrażać reguły jako część dotychczasowego 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 wprowadź źródła do środowiska produkcyjnego.
W przypadku Cloud Firestore Security Rules powiązaj pliki .rules
z domyślnymi i dodatkowymi skonfigurowanymi bazami danych, sprawdzając i aktualizując plik firebase.json
.
Użyj tych poleceń, aby wybrać Rules do wdrożenia samodzielnie lub w ramach 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ć Rules źródła i wdrażać je jako wersje w konsoli Firebase. Testowanie poprawności składni odbywa się podczas wprowadzania zmian w interfejsie Firebase konsoli, a testowanie semantyczne jest dostępne w sekcji 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 za pomocą RulesPlac zabaw. 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 w formacie UTF-8 muszą zajmować mniej niż 256 KiB.
- Projekt może zawierać maksymalnie 2500 wdrożonych zestawów reguł. Po osiągnięciu tego limitu musisz usunąć niektóre stare zestawy reguł, zanim utworzysz nowe.
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ą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 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 są odpowiednie do różnych przepływów pracy, w tym do zarządzania Firebase Security Rules w przypadku wielu baz danych Cloud Firestore w Twoim projekcie. Możesz jednak zarządzać Firebase Security Rules i wdrażać je za pomocą interfejsu API do zarządzania. Interfejs Management API zapewnia największą elastyczność.
.Pamiętaj też o tych ograniczeniach:
- Po zaimplementowaniu reguły w formacie UTF-8 muszą zajmować mniej niż 256 KiB.
- Projekt może zawierać maksymalnie 2500 wdrożonych zestawów reguł. Po osiągnięciu tego limitu musisz usunąć niektóre stare zestawy reguł, zanim utworzysz nowe.
Tworzenie i wdrażanie zbiorów reguł Cloud Firestore lub Cloud Storage za pomocą interfejsu 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 czynności związane z tworzeniem i wdrażaniem zestawu reguł za pomocą interfejsu API 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 je zaimplementować w pliku firestore.rules
.
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
Tworzenie zestawu reguł
Teraz wygeneruj odcisk palca zakodowany w standardzie base64 dla tego pliku. Następnie możesz użyć źródła w tym pliku, aby wypełnić ładunek potrzebny do utworzenia reguł za pomocą wywołania 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órych aplikacja natychmiast korzysta z reguł, których wdrożenie nie zostało jeszcze ukończone.
Aktualizowanie zestawów reguł Realtime Database za pomocą interfejsu REST
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:
- wyświetlanie, pobieranie i usuwanie reguł
- 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 były wdrażane przez ponad 30 dni, możesz wywołać metodę projects.rulesets.list
, przeanalizować listę obiektów JSON Ruleset
według 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
Interfejs API do zarządzania umożliwia też 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 ramach ł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 kompletny 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 w usłudze Cloud Storage Security Rules w wielu usługach
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:
Zanim wyłączysz tę funkcję, 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.