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

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 zarządzania regułami zabezpieczeń Firebase w backendzie.

Niezależnie od tego, które narzędzie jest używane do wywołania, interfejs API zarządzania Google Analytics:

  • 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ł.
  • Śledzi wdrażanie każdego zbioru reguł w wersji. Usługi z włączonymi regułami zabezpieczeń Firebase wyszukują wersję projektu, aby ocenić każde żądanie dotyczące zabezpieczonego zasobu.
  • Umożliwia przeprowadzanie testów składniowych i semantycznych zbioru reguł.

Korzystanie z interfejsu wiersza poleceń Firebase

Za pomocą interfejsu wiersza poleceń Firebase możesz przesyłać lokalne źródła i wdrażać wersje. Polecenie Firebase Local Emulator Suite interfejsu wiersza poleceń umożliwia pełne lokalne testowanie źródeł.

Korzystanie z interfejsu wiersza poleceń pozwala zachować reguły w kontroli wersji z kodem aplikacji i wdrażać je w ramach istniejącego procesu wdrażania.

Wygeneruj plik konfiguracji

Gdy konfigurujesz projekt w Firebase za pomocą interfejsu wiersza poleceń Firebase, w katalogu projektu tworzysz plik konfiguracji .rules. Użyj tego polecenia, aby rozpocząć konfigurowanie projektu w 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 są odzwierciedlone w konsoli Firebase lub że konsekwentnie wprowadzasz aktualizacje za pomocą konsoli Firebase lub interfejsu wiersza poleceń Firebase. W przeciwnym razie możesz zastąpić zmiany wprowadzone w konsoli Firebase.

Testowanie aktualizacji

Local Emulator Suite udostępnia emulatory dla wszystkich usług, w których można korzystać z reguł zabezpieczeń. Mechanizm reguł zabezpieczeń każdego emulatora przeprowadza zarówno składniową, jak i semantyczną ocenę reguł, co wykracza poza testowanie składniowe oferowane przez interfejs API zarządzania regułami zabezpieczeń.

Jeśli pracujesz z interfejsem wiersza poleceń, pakiet jest doskonałym narzędziem do testowania Firebase Security Rules. Użyj Local Emulator Suite, aby przetestować aktualizacje lokalnie i upewnić się, że Security Rules aplikacji działają zgodnie z 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ślnymi i dodatkowymi nazwanymi bazami danych, sprawdzając i aktualizując plik firebase.json.

Użyj tych poleceń, aby selektywnie 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

Korzystanie z konsoli Firebase

Możesz też edytować Security Rules źródła i wdrażać je jako wersje z konsoli Firebase. Testowanie składniowe jest wykonywane podczas edytowania w interfejsie konsoli Firebase, a testowanie semantyczne jest dostępne w Security Rules Playground.

Edytowanie i aktualizowanie reguł

  1. Otwórz konsolę Firebase i wybierz projekt.
  2. Następnie w menu nawigacyjnym usługi wybierz Realtime Database, Cloud Firestore lub Storage i kliknij Reguły, aby przejść do edytora Security Rules.
  3. Edytuj reguły bezpośrednio w edytorze.

Testowanie aktualizacji

Oprócz testowania składni w interfejsie edytora możesz też testować zachowanie semantyczne Security Rules, korzystając z bazy danych i zasobów pamięci masowej projektu, bezpośrednio w konsoli Firebase za pomocą Security Rules Playground. Otwórz ekran Rules Playground w edytorze Security Rules, zmień ustawienia i kliknij Run. U góry edytora pojawi się komunikat z potwierdzeniem.

Wdrażanie aktualizacji

Gdy uznasz, że zmiany są zgodne z Twoimi oczekiwaniami, kliknij Opublikuj.

Korzystanie z pakietu Admin SDK

Możesz używać zbiorów reguł Admin SDK dla Node.js. Dzięki temu dostępowi automatycznemu możesz:

  • 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 w Firebase.

Podczas programowego aktualizowania reguł bardzo ważne jest, aby unikać wprowadzania niezamierzonych zmian w kontroli dostępu do aplikacji. Podczas pisania kodu Admin SDK pamiętaj przede wszystkim o bezpieczeństwie, zwłaszcza podczas aktualizowania lub wdrażania reguł.

Inną ważną kwestią, o której należy pamiętać, jest to, że pełne rozpowszechnienie wersji Firebase Security Rules zajmuje kilka minut. Podczas wdrażania reguł za pomocą 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 ograniczyć sytuacje 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 formacie UTF-8.
  • Projekt może mieć 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 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 odrębne kroki:

  1. Tworzenie źródła pliku reguł (opcjonalnie)
  2. Tworzenie zbioru reguł
  3. Opublikuj lub wdróż nowy zestaw reguł.

Pakiet SDK udostępnia metodę, która pozwala połączyć te kroki w jedno wywołanie interfejsu API w przypadku reguł zabezpieczeń Cloud Storage i Cloud Firestore. Na 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 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. Na przykład:

    const rf = admin.securityRules().createRulesFileFromSource('firestore.rules', source);
    const rs = await admin.securityRules().createRuleset(rf);
    await admin.securityRules().releaseFirestoreRuleset(rs);

Zaktualizuj zestawy reguł Realtime Database

Aby zaktualizować zbiory reguł Realtime Database za pomocą Admin SDK, użyj metod getRules() i setRules() interfejsu admin.database. Zbiory reguł możesz pobierać 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świetlenie listy wszystkich istniejących reguł za pomocą admin.securityRules().listRulesetMetadata. Na 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 zestawów reguł, możesz utworzyć logikę usuwania najstarszych reguł w stałym cyklu czasowym. Aby na przykład usunąć wszystkie zbiory reguł wdrożone ponad 30 dni temu:

    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 typu REST

Opisane powyżej narzędzia dobrze sprawdzają się w różnych przepływach pracy, w tym w zarządzaniu Firebase Security Rules w przypadku wielu baz danych Cloud Firestore w projekcie, ale możesz też zarządzać Firebase Security Rules i wdrażać je za pomocą interfejsu API zarządzania Google Analytics. Interfejs API zarządzania Google Analytics zapewnia największą elastyczność.

Pamiętaj też o tych limitach:

  • Reguły po serializacji muszą mieć mniej niż 256 KiB tekstu zakodowanego w formacie UTF-8.
  • Projekt może mieć 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 zestawów reguł Cloud Firestore lub Cloud Storage za pomocą REST

Przykłady w tej sekcji dotyczą Firestore Security Rules, ale mają też zastosowanie do Cloud Storage Security Rules.

Przykłady używają też cURL do wywoływania interfejsu API. Pominięto kroki konfiguracji i przekazywania tokenów uwierzytelniania. Możesz eksperymentować z tym interfejsem API, korzystając z narzędzia APIs Explorer zintegrowanego z dokumentacją referencyjną.

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

  1. Tworzenie źródeł plików reguł
  2. Tworzenie zbioru reguł
  3. Opublikuj (wdroż) nowy zbiór reguł.

Utwórz źródło

Załóżmy, że pracujesz nad projektem w Firebase secure_commerce 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 pliku firestore.rules.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Tworzenie zbioru reguł

Teraz wygeneruj odcisk cyfrowy 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 zbioru reguł za pomocą wywołania REST projects.rulesets.create. Użyj polecenia cat, aby wstawić zawartość firestore.rules do ładunku REST.

Aby śledzić i powiązać to 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ź dotyczącą weryfikacji i nazwę zbioru reguł, na przykład projects/secure_commerce/rulesets/uuid123.

Opublikuj (wdroż) zbiór 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 wersji Firebase Security Rules może potrwać 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 jeszcze się nie zakończyło.

Aktualizowanie zbiorów reguł Realtime Database za pomocą REST

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

Zarządzanie zestawami reguł za pomocą REST

Aby ułatwić zarządzanie dużymi wdrożeniami reguł, interfejs API zarządzania Google Analytics oprócz metody REST do tworzenia zestawów reguł i wydań udostępnia metody do:

  • wyświetlanie, pobieranie i usuwanie zbiorów reguł;
  • wyświetlanie, pobieranie i usuwanie wersji reguł;

W przypadku bardzo dużych wdrożeń, które z czasem osiągają limit 2500 zestawów reguł, możesz utworzyć logikę usuwania najstarszych reguł w stałym cyklu czasowym. Na przykład, aby usunąć wszystkie zestawy reguł wdrożone dłużej niż 30 dni, możesz wywołać metodę projects.rulesets.list, przeanalizować listę JSON obiektów Ruleset pod kątem ich kluczy createTime, a następnie wywołać metodę project.rulesets.delete na odpowiednich zestawach reguł według ruleset_id.

Testowanie aktualizacji za pomocą interfejsu REST

Interfejs API zarządzania Google Analytics umożliwia też przeprowadzanie testów składniowych i semantycznych zasobów Cloud Firestore i Cloud Storage w projektach produkcyjnych.

Testowanie za pomocą tego komponentu interfejsu API obejmuje:

  1. Definiowanie obiektu JSON TestSuite reprezentującego zbiór obiektów TestCase
  2. Przesyłanie: TestSuite
  3. Analiza zwróciła TestResult obiektów

Zdefiniujmy obiekt TestSuite z jednym polem TestCase w pliku testcase.json. W tym przykładzie przekazujemy źródło języka Security Rules w tekście z ładunkiem REST wraz z zestawem testów do uruchomienia na tych regułach. Określamy oczekiwania dotyczące oceny reguł i żądanie klienta, pod kątem którego ma zostać przetestowany zestaw reguł. Możesz też określić, jak kompletny ma być raport z testu, używając wartości „FULL”, aby wskazać, że raport powinien zawierać wyniki dla wszystkich wyrażeń języka Security Rules, w tym wyrażeń, 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"}}}
            }
          ]
      }
    ]
  }
}

Następnie możemy przesłać ten obiekt 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 SUCCESS/FAILURE, listy komunikatów debugowania, listy odwiedzonych wyrażeń reguł i raporty z ich oceny) potwierdzi stanem SUCCESS, że dostęp jest prawidłowo dozwolony.

Zarządzanie uprawnieniami do Cloud Storage Security Rules między usługami

Jeśli utworzysz Cloud Storage Security Rules, które używają treści dokumentów Cloud Firestore do oceny warunków bezpieczeństwa, w konsoli Firebase lub interfejsie wiersza poleceń Firebase pojawi się prośba o włączenie uprawnień do połączenia tych 2 usług.

Jeśli zdecydujesz się wyłączyć zabezpieczenia między usługami:

  1. Najpierw, przed wyłączeniem tej funkcji, zmodyfikuj 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ą, że żądania dotyczące miejsca na dane będą kończyć się niepowodzeniem.

  2. Użyj strony Uprawnienia w konsoli Google Cloud, aby usunąć rolę „Agent usługi Firestore reguł Firebase”, postępując zgodnie z przewodnikiem Cloud dotyczącym unieważniania ról.

Gdy następnym razem zapiszesz reguły obejmujące wiele usług za pomocą interfejsu wiersza poleceń Firebase lub konsoli Firebase, pojawi się prośba o ponowne włączenie tej funkcji.