Firebase udostępnia kilka narzędzi do zarządzania Security Rules. Każde z nich jest przydatne w określonych przypadkach i korzysta z tego samego interfejsu API do zarządzania regułami zabezpieczeń Firebase.
Niezależnie od narzędzia użytego do wywołania interfejsu Management API:
- Pobiera źródło reguł: zestaw reguł, zwykle plik kodu zawierający instrukcje Firebase Security Rules.
- Usługa przechowuje źródło jako niezmienny zbiór reguł.
- Śledzi wdrażanie każdego zestawu reguł w wersji. Usługi z włączonymi regułami zabezpieczeń Firebase wyszukują wersję projektu, aby ocenić każdą prośbę o dostęp do zabezpieczonego zasobu.
- Umożliwia przeprowadzanie testów składniowych i semantycznych zestawu reguł.
Korzystanie z interfejsu wiersza poleceń Firebase
Za pomocą Firebase CLI możesz przesyłać lokalne źródła i wdrażać wersje. Interfejs CLIFirebase Local Emulator Suite umożliwia przeprowadzenie pełnego testowania lokalnego źródeł.
Korzystanie z interfejsu wiersza poleceń umożliwia przechowywanie reguł pod kontrolą wersji wraz z kodem aplikacji i wdrażanie reguł w ramach istniejącego procesu wdrażania.
Generowanie pliku konfiguracji
Gdy skonfigurujesz projekt w Firebase za pomocą interfejsu wiersza poleceń Firebase, w katalogu projektu utworzysz plik konfiguracji .rules. Aby rozpocząć konfigurowanie projektu w 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ł
Edytuj źródło reguł bezpośrednio w pliku konfiguracyjnym .rules.
Upewnij się, że zmiany wprowadzone w Firebaseinterfejsie wiersza poleceńFirebase są odzwierciedlone w konsoli. Możesz też wprowadzać zmiany tylko w Firebasekonsoli lub w interfejsie wiersza poleceń Firebase. W przeciwnym razie możesz zastąpić wszystkie zmiany wprowadzone w Firebasekonsoli.
Testowanie aktualizacji
Local Emulator Suite udostępnia emulatory wszystkich usług, w których włączone są reguły zabezpieczeń. Silnik reguł bezpieczeństwa każdego emulatora przeprowadza zarówno syntaktyczną, jak i semantyczną ocenę reguł, co wykracza poza testowanie syntaktyczne oferowane przez interfejs API do zarządzania regułami bezpieczeństwa.
Jeśli pracujesz z interfejsem CLI, pakiet jest doskonałym narzędziem do Firebase Security Rulestestowania. Użyj Local Emulator Suite, aby przetestować aktualizacje lokalnie i sprawdzić, czy Security Rules w aplikacji działają zgodnie z Twoimi oczekiwaniami.
Wdrażanie aktualizacji
Po zaktualizowaniu i przetestowaniu Security Rules wdróż źródła w środowisku produkcyjnym.
W przypadku Cloud Firestore Security Rules powiąż pliki .rules z domyślną i dodatkowymi bazami danych, sprawdzając i aktualizując firebase.json.
Użyj tych poleceń, aby wdrożyć tylko Security Rules lub wdrożyć je 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
Używanie konsoli Firebase
Możesz też edytować Security Rules źródła i wdrażać je jako wersje w konsoli Firebase. Testowanie składniowe jest przeprowadzane podczas edytowania w interfejsie konsoliFirebase, a testowanie semantyczne jest dostępne w Security Rulespiaskownicy.
Edytowanie i aktualizowanie reguł
- Otwórz Firebasekonsolę i wybierz projekt.
- Następnie w menu nawigacyjnym produktu wybierz Realtime Database, Cloud Firestore lub Przechowywanie, a potem kliknij Reguły, aby otworzyć edytor Security Rules.
- Edytuj reguły bezpośrednio w edytorze.
Testowanie aktualizacji
Oprócz testowania składni w interfejsie edytora możesz testować zachowanie semantyczneSecurity Rules, korzystając z zasobów bazy danych i pamięci projektuFirebase bezpośrednio w Security Rulesśrodowisku testowym. Otwórz ekran Plac zabaw dla reguł w edytorze Security Rules, zmień ustawienia i kliknij Uruchom. U góry edytora powinien pojawić się komunikat z potwierdzeniem.
Wdrażanie aktualizacji
Gdy upewnisz się, że wprowadzone zmiany są zgodne z Twoimi oczekiwaniami, kliknij Opublikuj.
Korzystanie z pakietu Admin SDK
Możesz używać Admin SDK zbiorów reguł w przypadku Node.js. Dzięki temu programowemu dostępowi możesz:
- Wdrażaj niestandardowe narzędzia, skrypty, panele i potoki CI/CD do zarządzania regułami.
- Łatwiejsze zarządzanie regułami w wielu projektach Firebase.
Podczas programistycznego aktualizowania reguł bardzo ważne jest, aby unikać niezamierzonych zmian w kontroli dostępu do aplikacji. Twórz Admin SDKkod z myślą przede wszystkim o bezpieczeństwie, zwłaszcza podczas aktualizowania lub wdrażania reguł.
Kolejną ważną rzeczą, o której należy pamiętać, jest to, że Firebase Security Rules wdrażanie zmian trwa kilka minut. Podczas wdrażania reguł za pomocą interfejsu Admin SDK unikaj sytuacji wyścigu, w których aplikacja natychmiast korzysta z reguł, których wdrażanie nie zostało jeszcze zakoń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 zostały zaprojektowane tak, aby ograniczać warunki wyścigu pomimo częstych aktualizacji.
Pamiętaj też o tych limitach:
- Reguły po serializacji muszą mieć mniej niż 256 KiB tekstu zakodowanego w UTF-8.
- Projekt może mieć maksymalnie 2500 wdrożonych zestawów reguł. Po osiągnięciu tego limitu musisz usunąć niektóre starsze zestawy reguł, zanim utworzysz nowe.
Tworzenie i wdrażanie zestawów reguł Cloud Storage lub Cloud Firestore
Typowy przepływ pracy związany z zarządzaniem regułami zabezpieczeń za pomocą Admin SDK może obejmować 3 osobne etapy:
- Utwórz źródło pliku reguł (opcjonalnie)
- Tworzenie zestawu reguł
- Wprowadź nowy zestaw reguł.
Pakiet SDK udostępnia metodę łączenia tych kroków w jedno wywołanie interfejsu API w przypadku reguł zabezpieczeń 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 wzorzec działa w przypadku reguł Cloud Storage z parametrem releaseFirestoreRulesetFromSource().
Możesz też utworzyć plik reguł jako obiekt w pamięci, utworzyć zestaw 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);
Aktualizowanie zestawów reguł Realtime Database
Aby zaktualizować zbiory reguł Realtime Database za pomocą Admin SDK, użyj metod getRules() i setRules() w admin.database. Możesz pobrać zestawy reguł 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 zbiorami reguł, Admin SDK umożliwia wyświetlanie wszystkich istniejących reguł za pomocą 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 reguł, możesz utworzyć logikę usuwania najstarszych reguł w określonych odstępach czasu. Aby na przykład usunąć wszystkie zestawy reguł wdrożone na okres dłuższy 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, w tym w Firebase Security Ruleszarządzaniu wieloma bazami danychCloud Firestore w projekcie. Możesz jednak zarządzać Firebase Security Rules i wdrażać je za pomocą samego interfejsu API do zarządzania. Interfejs Management API zapewnia największą elastyczność.
.Pamiętaj też o tych limitach:
- Reguły po serializacji muszą mieć mniej niż 256 KiB tekstu zakodowanego w UTF-8.
- Projekt może mieć maksymalnie 2500 wdrożonych zestawów reguł. Po osiągnięciu tego limitu musisz usunąć niektóre starsze zestawy reguł, zanim utworzysz nowe.
Tworzenie i wdrażanie zestawów reguł Cloud Firestore lub Cloud Storage za pomocą interfejsu REST
Przykłady w tej sekcji korzystają z Firestore Security Rules, ale dotyczą też Cloud Storage Security Rules.
W przykładach do wywoływania interfejsu API używane jest też narzędzie cURL. Pominięto 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 zarządzania:
- Tworzenie źródeł plików reguł
- Tworzenie zestawu reguł
- Wprowadź (wdroż) nowy zbiór reguł.
Utwórz źródło
Załóżmy, że pracujesz nad secure_commerce projektem w Firebase i chcesz wdrożyć zablokowane Cloud Firestore Security Rules w bazie danych w projekcie o nazwie east_store.
Możesz wdrożyć te reguły w firestore.rulespliku.
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
Tworzenie zestawu reguł
Teraz wygeneruj odcisk tego pliku zakodowany w standardzie Base64. Możesz następnie użyć źródła w tym pliku, aby wypełnić ładunek potrzebny do utworzenia zestawu reguł za pomocą projects.rulesets.createwywołania REST Użyj tutaj polecenia cat, aby wstawić zawartość firestore.rules do ładunku REST.
Aby śledzić i powiązać to z bazą danych east_store, ustaw wartość attachment_point na 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.
Wdrażanie zbioru reguł
Jeśli zestaw reguł jest prawidłowy, ostatnim krokiem jest wdrożenie nowego zestawu reguł w nazwanej wersji.
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 Firebase Security Rules wersji zajmuje kilka minut. Podczas wdrażania za pomocą interfejsu REST API do zarządzania unikaj sytuacji wyścigu, w których aplikacja natychmiast korzysta z reguł, których wdrażanie nie zostało jeszcze zakończone.
Aktualizowanie Realtime Database zestawów reguł za pomocą interfejsu REST
Realtime Database udostępnia własny interfejs REST do zarządzania Security Rules. Zobacz Zarządzanie Firebase Realtime Database Security Rules za pomocą REST.
Zarządzanie zestawami reguł za pomocą interfejsu REST
Aby ułatwić zarządzanie wdrożeniami dużych reguł, interfejs Management API udostępnia oprócz metody REST do tworzenia zestawów reguł i wersji także te metody:
- wyświetlać, pobierać i usuwać zbiory reguł;
- wyświetlać, pobierać i usuwać reguły wersji;
W przypadku bardzo dużych wdrożeń, które z czasem osiągną limit 2500 reguł, możesz utworzyć logikę usuwania najstarszych reguł w określonych odstępach czasu. Aby na przykład usunąć wszystkie zestawy reguł wdrożone na dłużej niż 30 dni, możesz wywołać metodę projects.rulesets.list, przeanalizować listę JSON obiektów Ruleset na podstawie ich kluczy createTime, a następnie wywołać metodę project.rulesets.delete w odpowiednich zestawach reguł za pomocą metody ruleset_id.
Testowanie aktualizacji za pomocą interfejsu REST
Interfejs Management API umożliwia przeprowadzanie testów składniowych i semantycznych zasobów Cloud Firestore i Cloud Storage w projektach produkcyjnych.
.Testowanie tego komponentu interfejsu API obejmuje:
- Definiowanie obiektu JSON
TestSuitereprezentują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 Security Rules źródło języka w treści ładunku REST wraz z zestawem testów, które mają być uruchomione w odniesieniu do tych reguł. Określamy oczekiwania dotyczące oceny reguł oraz żądanie klienta, pod kątem którego ma być testowany zestaw reguł. Możesz też określić, jak kompletny ma być raport z testu. Użyj wartości „FULL”, aby wskazać, że w raporcie powinny się znaleźć wyniki wszystkich Security Ruleswyrażeń językowych, 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"}}} } ] } ] } }
Możemy wtedy 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'Zwrócony obiekt TestReport (zawierający stan testu SUKCES/NIEPOWODZENIE, listy komunikatów debugowania, listy odwiedzonych wyrażeń reguł i raporty z ich oceną) potwierdzi stan SUKCES, że dostęp jest prawidłowo dozwolony.
Zarządzanie uprawnieniami do usług Cloud Storage Security Rules
Jeśli utworzysz Cloud Storage Security Rules, które używają Cloud Firestore zawartości dokumentu do oceny warunków bezpieczeństwa, w Firebase konsoli lub Firebase interfejsie wiersza poleceń pojawi się prośba o włączenie uprawnień do połączenia tych dwóch usług.
Jeśli zdecydujesz się wyłączyć takie zabezpieczenia między usługami:
Najpierw przed wyłączeniem tej funkcji zmień reguły, usuwając wszystkie instrukcje, które używają funkcji Security Rules do uzyskiwania dostępu do Cloud Firestore. W przeciwnym razie po wyłączeniu tej funkcji oceny Security Rules spowodują niepowodzenie żądań dotyczących usługi Storage.
Na stronie IAM w konsoli Google Cloud usuń rolę „Firebase Rules Firestore Service Agent”, postępując zgodnie z przewodnikiem Cloud dotyczącym odwoływania ról.
Przy następnym zapisywaniu reguł obejmujących wiele usług za pomocą Firebase CLI lub Firebase konsoli pojawi się prośba o ponowne włączenie tej funkcji.