Wdrażanie reguł zabezpieczeń Firebase i zarządzanie nimi

Firebase udostępnia kilka narzędzi do zarządzania Rules, każde przydatne w konkretnych przypadkach, a każdy korzysta z tego samego backendu Firebase. Interfejs API do zarządzania regułami zabezpieczeń.

Niezależnie od tego, jakie narzędzie zostanie użyte do jego wywołania, interfejs API zarządzania:

  • Przetwarza źródło reguł: zbiór reguł, zwykle plik kodu zawierający Wyciągi: Firebase Security Rules.
  • Zapisuje źródło pozyskane jako stałą regułę.
  • Śledzi wdrożenie każdego zestawu reguł w wersji. Bezpieczeństwo Firebase Usługi z włączoną regułą sprawdzają wersję dla projektu w celu oceny każdego żądania dla zabezpieczonego zasobu.
  • Umożliwia przeprowadzanie składniowych i semantycznych testów zestawu reguł.

Użyj interfejsu wiersza poleceń Firebase

Za pomocą interfejsu wiersza poleceń Firebase możesz: przesyłać lokalne źródła i wdrażać wersje. Metoda wiersza poleceń Firebase Local Emulator Suite umożliwia przeprowadzenie pełnego lokalnego testowania źródeł.

Użycie interfejsu wiersza poleceń pozwala kontrolować wersję reguł za pomocą kodu aplikacji i reguł wdrażania.

Generowanie pliku konfiguracji

Podczas konfigurowania projektu Firebase za pomocą interfejsu wiersza poleceń Firebase plik konfiguracji .rules w katalogu projektu. Użyj następujących aby rozpocząć konfigurowanie projektu 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

Edytowanie i aktualizowanie reguł

Edytuj źródło reguł bezpośrednio w pliku konfiguracji .rules.

Upewnij się, że wszystkie zmiany wprowadzone w interfejsie wiersza poleceń Firebase zostały odzwierciedlone w Firebase lub regularnie wprowadzasz aktualizacje za pomocą Firebase lub interfejsu wiersza poleceń Firebase. W przeciwnym razie możesz zastąpić dowolną Aktualizacje wprowadzone w konsoli Firebase.

Testowanie aktualizacji

Local Emulator Suite udostępnia emulatory wszystkich reguł zabezpieczeń z włączonymi regułami zabezpieczeń usług. Mechanizm reguł zabezpieczeń każdego emulatora obsługuje zarówno składnię, i semantycznej oceny reguł, przez co sprawdzanie składniowe jest większe Oferty interfejsu Security Rules Management API.

Jeśli używasz interfejsu wiersza poleceń, ten pakiet jest doskonałym narzędziem do Firebase Security Rules i testowania. Aby przetestować aktualizacje, użyj narzędzia Local Emulator Suite lokalnie i upewnij się, że Rules działa w pobliżu.

Wdrażanie aktualizacji

Po zaktualizowaniu i przetestowaniu Rules wdróż źródła w produkcji.

W przypadku Cloud Firestore Security Rules powiąż pliki (.rules) z plikami domyślnymi i dodatkowych nazwanych baz danych, sprawdzając i aktualizując firebase.json plik.

Za pomocą tych poleceń możesz selektywnie wdrożyć model Rules samodzielnie lub wdrożyć je w ramach standardowego 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 w konsoli Firebase. Testowanie składniowe jest wykonywane podczas edytowania Interfejs użytkownika konsoli Firebase oraz testy semantyczne są dostępne przy użyciu Rules Playground.

Edytowanie i aktualizowanie reguł

  1. Otwórz konsolę Firebase i wybierz projekt.
  2. Następnie wybierz Realtime Database, Cloud Firestore lub Miejsce na dane z nawigacji po usługach, a następnie kliknij Reguły, aby przejść do Edytujący: Rules.
  3. Edytuj reguły bezpośrednio w edytorze.
.

Testowanie aktualizacji

Oprócz testowania składni w interfejsie edytora możesz testować semantykę Działanie Rules z wykorzystaniem bazy danych i zasobów pamięci masowej projektu bezpośrednio w konsoli Firebase przy użyciu Rules Playground. Otwórz stronę zasad. w edytorze Rules, zmień ustawienia i kliknij Uruchom. Poszukaj komunikatu z potwierdzeniem u góry edytora.

Wdrażanie aktualizacji

Jeśli zmiany są zgodne z Twoimi oczekiwaniami, kliknij Opublikuj.

Korzystanie z pakietu Admin SDK

Możesz użyć interfejsu Admin SDK w Node.js reguł. Program ten umożliwia:

  • Wdrażanie niestandardowych narzędzi, skryptów, paneli i potoków CI/CD do zarządzania regułami.
  • Łatwiejsze zarządzanie regułami w wielu projektach Firebase.

Przy automatycznym aktualizowaniu reguł należy unikać niezamierzone zmiany w kontroli dostępu aplikacji. Wpisz Admin SDK kod mając na uwadze bezpieczeństwo, zwłaszcza podczas aktualizowania i wdrażania reguł.

Inną ważną rzeczą, o której warto pamiętać, jest to, że wersje Firebase Security Rules przyjmują może potrwać kilka minut. Podczas wdrażania przy użyciu: Admin SDK reguł, unikaj sytuacji podczas wyścigu, w których aplikacja w przypadku reguł, których wdrożenie nie zostało jeszcze ukończone. Jeśli Twój przypadek użycia wymaga częste aktualizacje reguł kontroli dostępu, rozważ rozwiązania za pomocą Cloud Firestore, który ma ograniczać warunki w wyścigach pomimo częstych aktualizacji.

Pamiętaj też o tych ograniczeniach:

  • W przypadku serializacji reguły nie mogą mieć więcej niż 256 KB tekstu zakodowanego w formacie UTF-8.
  • Projekt może mieć łącznie maksymalnie 2500 wdrożonych zestawów reguł. Gdy ten limit wynosi musisz usunąć stare zestawy reguł, zanim utworzysz nowe.

Utwórz i wdróż zbiory reguł Cloud Storage lub Cloud Firestore

Typowy przepływ pracy zarządzania regułami zabezpieczeń za pomocą Admin SDK może obejmować: 3 konkretne kroki:

  1. Utwórz źródło pliku reguł (opcjonalnie)
  2. Tworzenie zestawu reguł
  3. Opublikuj lub wdróż nowy zestaw reguł

Pakiet SDK udostępnia metodę łączenia tych kroków w jedno wywołanie interfejsu API dla Cloud Storage i Cloud Firestore reguł zabezpieczeń. 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żna też utworzyć plik reguł jako obiekt w pamięci, i wdrożyć go oddzielnie, aby mieć ściślejszą 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 Realtime Database zbioru reguł

Aby zaktualizować zestawy reguł Realtime Database za pomocą zasad Admin SDK, użyj reguł getRules() i setRules() metod (admin.database). Zestawy reguł możesz pobrać w formacie JSON lub w postaci ciągu 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ądzaj zestawami reguł

Aby ułatwić zarządzanie dużymi zbiorami reguł, Admin SDK umożliwia wyświetlenie listy wszystkich istniejących reguł dzięki 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 po pewnym czasie osiągną limit 2500 zestawów reguł, możesz: utworzyć logikę usuwania najstarszych reguł w ustalonym cyklu czasowym. Aby na przykład: usuń wszystkie zbiory reguł 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.`);

Używanie interfejsu API REST

Opisane powyżej narzędzia dobrze sprawdzają się w różnych przepływach pracy, takich jak: zarządzanie Firebase Security Rules dla wielu baz danych Cloud Firestore w projekcie, Być może warto jednak wdrożyć usługę Firebase Security Rules i nią zarządzać za pomocą interfejsu API do zarządzania. Interfejs API do zarządzania zapewnia największą elastyczność.

Pamiętaj też o tych ograniczeniach:

  • W przypadku serializacji reguły nie mogą mieć więcej niż 256 KB tekstu zakodowanego w formacie UTF-8.
  • Projekt może mieć łącznie maksymalnie 2500 wdrożonych zestawów reguł. Gdy ten limit wynosi musisz usunąć stare zestawy reguł, zanim utworzysz nowe.

Utwórz i wdróż zbiory reguł Cloud Firestore lub Cloud Storage za pomocą REST

W przykładach w tej sekcji używana jest usługa Firestore Rules, ale mają one zastosowanie Cloud Storage Rules.

W przykładach cURL jest również używany do wywołań interfejsu API. Etapy konfiguracji i zaliczania są pomijane. Możesz eksperymentować z tym interfejsem API za pomocą Interfejs API Explorer zintegrowany z dokumentacji referencyjnej.

Typowe kroki tworzenia i wdrażania zestawu reguł za pomocą interfejsu API do zarządzania:

  1. Tworzenie źródeł plików reguł
  2. Tworzenie zestawu reguł
  3. Opublikuj (wdróż) nowy zestaw reguł.

Utwórz źródło

Załóżmy, że pracujesz nad projektem Firebase w secure_commerce i chcesz aby wdrożyć zablokowane działanie Cloud Firestore Rules w bazie danych w projekt o nazwie east_store.

Możesz zastosować te reguły w 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ć funkcji source w tym pliku, aby wypełnić ładunek potrzebny do utworzenia zestawu reguł z projects.rulesets.create wywołanie REST. W tym miejscu użyj polecenia cat, aby wstawić zawartość firestore.rules do ładunku REST.

Aby na potrzeby śledzenia powiązać go z bazą danych east_store, ustaw 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ź weryfikacji i nazwę zestawu reguł, na przykład projects/secure_commerce/rulesets/uuid123

Tworzenie (wdrażanie) zestawu reguł

Jeśli zestaw reguł jest prawidłowy, ostatnim krokiem jest wdrożenie nowego zestawu w 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 udostępnienie wersji Firebase Security Rules może potrwać kilka minut propagować. Podczas wdrażania interfejsu API typu REST do zarządzania pamiętaj, aby unikać wyścigu w których aplikacja podlega regułom, których wdrożenie nie jest jeszcze zakończone.

Zaktualizuj zbiory reguł (Realtime Database) za pomocą REST

Realtime Database udostępnia własny interfejs REST do zarządzania Rules. Zobacz Zarządzanie Firebase Realtime Database Rules za pomocą REST.

Zarządzanie zestawami reguł za pomocą REST

Do zarządzania wdrożeniami dużych reguł oprócz metody REST dla tworzenia zestawów reguł i wersji, interfejs API zarządzania zapewnia metody:

  • tworzyć, pobierać i usuwać reguły;
  • wyświetlanie, pobieranie i usuwanie wersji reguł

W przypadku bardzo dużych wdrożeń, które po pewnym czasie osiągną limit 2500 zestawów reguł, możesz: utworzyć logikę usuwania najstarszych reguł w ustalonym cyklu czasowym. Aby na przykład: usuń wszystkie zbiory reguł wdrożone przez ponad 30 dni, możesz wywołać metodę projects.rulesets.list, przeanalizuj listę JSON obiektów Ruleset jego kluczy createTime, a następnie zadzwoń pod numer project.rulesets.delete odpowiednie zestawy reguł według zbioru ruleset_id.

Testowanie aktualizacji za pomocą REST

Dodatkowo interfejs API zarządzania umożliwia przeprowadzanie testów składniowych i semantycznych Cloud Firestore i Cloud Storage zasobu w środowisku produkcyjnym w projektach AI.

Testowanie za pomocą tego komponentu interfejsu API obejmuje:

  1. Definiowanie obiektu JSON TestSuite tak, aby reprezentował zbiór obiektów TestCase
  2. Przesyłam: TestSuite
  3. Analizowanie zwróciło TestResult obiektów

Zdefiniujmy obiekt TestSuite z pojedynczym elementem TestCase w testcase.json. W tym przykładzie przekazujemy Rules źródła języka wbudowanego w ładunek REST, wraz z pakietem testowym do uruchomienia tych zasad. Określamy oczekiwania związane z oceną reguł, a klient żądanie, pod kątem którego ma zostać przetestowany zestaw reguł. Możesz też określić, Wypełnij raport testowy, używając wartości „FULL” aby wskazać wyniki dla wszystkich Raport powinien zawierać wyrażenia określające język Rules, w tym: wyrażenia, które nie zostały dopasowane 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 następnie przesłać ten element (TestSuite) do oceny w projects.test .

curl -X POST -d '{
    ' $(cat testcase.json) '
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets/uuid123:test'

Zwrócona wartość TestReport (zawierająca stan testu UDAŁO SIĘ/NIEPOWODZENIE, listy komunikaty o debugowaniu, listy odwiedzonych wyrażeń reguł i ich raporty oceny). potwierdzi stan SUKCES, że dostęp jest dozwolony.

Zarządzanie uprawnieniami do korzystania z różnych usług w Cloud Storage Security Rules

Jeśli utworzysz instancję Cloud Storage Security Rules, która będzie korzystać z Cloud Firestore zawartości dokumentu do oceny warunków bezpieczeństwa, w konsoli Firebase lub w interfejsie wiersza poleceń Firebase pojawi się prośba o włączenie do połączenia tych dwóch usług.

Jeśli zdecydujesz się wyłączyć takie zabezpieczenia obejmujące wiele usług:

  1. Przed wyłączeniem funkcji edytuj reguły, usuwając wszystkie które uzyskują dostęp do Cloud Firestore za pomocą funkcji Rules. W przeciwnym razie po wyłączeniu funkcji oceny Rules będą mogą powodować niepowodzenie żądań dotyczących miejsca na dane.

  2. Na stronie Uprawnienia w konsoli Google Cloud możesz usunąć „Firebase”. Agent usługi reguł Firestore zgodnie z przewodnikiem Cloud dla dotyczące ich utraty.

Przy następnym zapisywaniu pojawi się prośba o ponowne włączenie tej funkcji reguł dotyczących różnych usług z interfejsu wiersza poleceń Firebase lub konsoli Firebase.