Zarządzaj i wdrażaj reguły bezpieczeństwa Firebase

Firebase udostępnia kilka narzędzi do zarządzania regułami, każde przydatne w określonych przypadkach i każde korzystające z tego samego interfejsu API zarządzania regułami bezpieczeństwa Firebase.

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

  • Pozyskuje źródło reguł: zestaw reguł, zazwyczaj plik kodu zawierający instrukcje reguł zabezpieczeń Firebase.
  • Przechowuje pozyskane źródło jako niezmienny zestaw reguł .
  • Śledzi wdrożenie każdego zestawu reguł w wydaniu . Usługi obsługujące reguły zabezpieczeń Firebase wyszukują wersję projektu w celu oceny każdego żądania dotyczącego zabezpieczonego zasobu.
  • Zapewnia możliwość uruchamiania testów syntaktycznych i semantycznych zestawu reguł.

Użyj interfejsu wiersza polecenia Firebase

Dzięki interfejsowi CLI Firebase możesz przesyłać lokalne źródła i wdrażać wersje . Pakiet lokalnego emulatora Firebase CLI umożliwia przeprowadzanie pełnych lokalnych testów źródeł .

Korzystanie z interfejsu wiersza polecenia umożliwia kontrolowanie wersji reguł za pomocą kodu aplikacji i wdrażanie reguł w ramach istniejącego procesu wdrażania.

Wygeneruj plik konfiguracyjny

Konfigurując projekt Firebase za pomocą interfejsu CLI Firebase, tworzysz plik konfiguracyjny .rules w katalogu projektu. Użyj następującego polecenia, aby rozpocząć konfigurowanie projektu Firebase:

Chmura Firestore

// Set up Firestore in your project directory, creates a .rules file
firebase init firestore

Baza danych czasu rzeczywistego

// Set up Realtime Database in your project directory, creates a .rules file
firebase init database

Magazyn w chmurze

// Set up Storage in your project directory, creates a .rules file
firebase init storage

Edytuj i aktualizuj swoje reguły

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

Upewnij się, że wszelkie zmiany wprowadzone w interfejsie CLI Firebase są odzwierciedlone w konsoli Firebase lub że stale wprowadzasz aktualizacje za pomocą konsoli Firebase lub interfejsu wiersza polecenia Firebase. W przeciwnym razie możesz zastąpić wszelkie aktualizacje wprowadzone w konsoli Firebase.

Przetestuj swoje aktualizacje

Pakiet Local Emulator Suite udostępnia emulatory dla wszystkich produktów obsługujących reguły zabezpieczeń. Silnik reguł zabezpieczeń dla każdego emulatora wykonuje zarówno syntaktyczną, jak i semantyczną ocenę reguł, wykraczając w ten sposób poza testowanie syntaktyczne oferowane przez interfejs API zarządzania regułami zabezpieczeń.

Jeśli pracujesz z interfejsem CLI, pakiet jest doskonałym narzędziem do testowania reguł bezpieczeństwa Firebase. Użyj pakietu Local Emulator Suite , aby przetestować aktualizacje lokalnie i potwierdzić, że reguły Twojej aplikacji zachowują się zgodnie z oczekiwaniami.

Wdróż swoje aktualizacje

Po zaktualizowaniu i przetestowaniu reguł wdróż źródła w środowisku produkcyjnym.

W przypadku reguł bezpieczeństwa Cloud Firestore powiąż pliki .rules z domyślnymi i dodatkowymi nazwanymi bazami danych, przeglądając i aktualizując plik firebase.json .

Użyj poniższych poleceń, aby selektywnie wdrożyć same reguły lub wdrożyć je w ramach normalnego procesu wdrażania.

Chmura 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>

Baza danych czasu rzeczywistego

// Deploy your .rules file
firebase deploy --only database

Magazyn w chmurze

// Deploy your .rules file
firebase deploy --only storage

Użyj konsoli Firebase

Możesz także edytować źródła reguł i wdrażać je jako wersje z konsoli Firebase. Testowanie składniowe jest przeprowadzane podczas edycji w interfejsie konsoli Firebase, a testowanie semantyczne jest dostępne w obszarze Plac zabaw z regułami.

Edytuj i aktualizuj swoje zasady

  1. Otwórz konsolę Firebase i wybierz swój projekt.
  2. Następnie wybierz opcję Baza danych czasu rzeczywistego , Cloud Firestore lub Pamięć masowa z nawigacji produktu, a następnie kliknij Reguły , aby przejść do edytora reguł.
  3. Edytuj swoje reguły bezpośrednio w edytorze.

Przetestuj swoje aktualizacje

Oprócz testowania składni w interfejsie edytora możesz testować zachowanie reguł semantycznych, korzystając z bazy danych i zasobów magazynu projektu, bezpośrednio w konsoli Firebase, korzystając z Placu zabaw z regułami . Otwórz ekran Plac zabaw z regułami w edytorze reguł, zmodyfikuj ustawienia i kliknij Uruchom . Poszukaj komunikatu potwierdzającego u góry edytora.

Wdróż swoje aktualizacje

Gdy będziesz mieć pewność, że aktualizacje są takie, jakich oczekujesz, kliknij Opublikuj .

Skorzystaj z pakietu Admin SDK

Możesz użyć pakietu Admin SDK dla zestawów reguł Node.js. Dzięki temu programowemu dostępowi możesz:

  • Implementuj niestandardowe narzędzia, skrypty, pulpity nawigacyjne i potoki CI/CD do zarządzania regułami.
  • Łatwiej zarządzaj regułami w wielu projektach Firebase.

Podczas programowego aktualizowania reguł bardzo ważne jest, aby unikać wprowadzania niezamierzonych zmian w kontroli dostępu do aplikacji. Napisz kod pakietu Admin SDK, mając przede wszystkim na uwadze bezpieczeństwo, zwłaszcza podczas aktualizowania lub wdrażania reguł.

Kolejną ważną rzeczą, o której należy pamiętać, jest to, że pełne rozpowszechnienie nowych wersji reguł zabezpieczeń Firebase zajmuje kilka minut. Korzystając z pakietu Admin SDK do wdrażania reguł, należy unikać sytuacji wyścigu, w których aplikacja natychmiast opiera się na regułach, 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 wykorzystujące Cloud Firestore, które mają na celu ograniczenie warunków wyścigowych pomimo częstych aktualizacji.

Zwróć także uwagę na te ograniczenia:

  • Reguły muszą być mniejsze niż 256 KiB tekstu zakodowanego w formacie UTF-8 po serializacji.
  • W projekcie może znajdować się maksymalnie 2500 wdrożonych zestawów reguł. Po osiągnięciu tego limitu należy usunąć niektóre stare zestawy reguł przed utworzeniem nowych.

Twórz i wdrażaj zestawy reguł Cloud Storage lub Cloud Firestore

Typowy przepływ pracy związany z zarządzaniem regułami bezpieczeństwa za pomocą pakietu Admin SDK może obejmować trzy oddzielne kroki:

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

Pakiet SDK umożliwia połączenie tych kroków w jedno wywołanie interfejsu API dla reguł bezpieczeństwa 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() .

Alternatywnie możesz utworzyć plik reguł jako obiekt w pamięci, utworzyć zestaw reguł i wdrożyć zestaw reguł osobno, aby uzyskać lepszą 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ł bazy danych czasu rzeczywistego

Aby zaktualizować zestawy reguł bazy danych czasu rzeczywistego za pomocą pakietu Admin SDK, użyj metod getRules() i setRules() pliku admin.database . Możesz pobrać zestawy reguł w formacie JSON lub jako ciąg znaków z dołączonymi 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 zestawami reguł, pakiet 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żna utworzyć logikę usuwającą najstarsze reguły w ustalonym cyklu czasowym. Na przykład, aby usunąć wszystkie zestawy 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żyj interfejsu API REST

Narzędzia opisane powyżej dobrze nadają się do różnych przepływów pracy, w tym do zarządzania regułami bezpieczeństwa Firebase dla wielu baz danych Cloud Firestore w Twoim projekcie, ale możesz chcieć zarządzać i wdrażać reguły bezpieczeństwa Firebase za pomocą samego interfejsu API zarządzania. Interfejs API zarządzania zapewnia największą elastyczność.

Zwróć także uwagę na te ograniczenia:

  • Reguły muszą być mniejsze niż 256 KiB tekstu zakodowanego w formacie UTF-8 po serializacji.
  • W projekcie może znajdować się maksymalnie 2500 wdrożonych zestawów reguł. Po osiągnięciu tego limitu należy usunąć niektóre stare zestawy reguł przed utworzeniem nowych.

Twórz i wdrażaj zestawy reguł Cloud Firestore lub Cloud Storage za pomocą REST

W przykładach w tej sekcji wykorzystano Reguły Firestore, choć mają one również zastosowanie do Reguł Cloud Storage.

W przykładach użyto również cURL do wykonywania wywołań API. Pominięto kroki konfigurowania i przekazywania tokenów uwierzytelniających. Możesz eksperymentować z tym API za pomocą Eksploratora API zintegrowanego z dokumentacją referencyjną.

Typowe kroki tworzenia i wdrażania zestawu reguł przy użyciu interfejsu API zarządzania to:

  1. Utwórz źródła plików reguł
  2. Utwórz zestaw reguł
  3. Wydaj (wdróż) nowy zestaw reguł.

Utwórz źródło

Załóżmy, że pracujesz nad projektem secure_commerce Firebase i chcesz wdrożyć zablokowane reguły Cloud Firestore w bazie danych w swoim projekcie o nazwie east_store .

Możesz zaimplementować te reguły w pliku firestore.rules .

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

Utwórz zestaw reguł

Teraz wygeneruj odcisk palca zakodowany w formacie Base64 dla tego pliku. Następnie możesz użyć źródła w tym pliku, aby wypełnić ładunek potrzebny do utworzenia zestawu reguł za pomocą wywołania REST projects.rulesets.create . W tym przypadku użyj polecenia cat , aby wstawić zawartość firestore.rules do ładunku REST.

Aby śledzić, aby 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ź weryfikacyjną i nazwę zestawu reguł, na przykład projects/secure_commerce/rulesets/uuid123 .

Zwolnij (wdróż) zestaw 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'

Należy pamiętać, że pełne rozpowszechnienie wydań reguł bezpieczeństwa Firebase zajmuje kilka minut. W przypadku wdrażania interfejsu API REST zarządzania należy unikać sytuacji wyścigu, w których aplikacja natychmiast opiera się na regułach, których wdrożenie nie zostało jeszcze ukończone.

Zaktualizuj zestawy reguł bazy danych czasu rzeczywistego za pomocą REST

Baza danych Realtime udostępnia własny interfejs REST do zarządzania regułami. Zobacz Zarządzanie regułami bazy danych czasu rzeczywistego Firebase za pośrednictwem REST .

Zarządzaj zestawami reguł za pomocą REST

Aby ułatwić zarządzanie wdrożeniami dużych reguł, oprócz metody REST służącej do tworzenia zestawów reguł i wydań, interfejs API zarządzania udostępnia metody umożliwiające:

  • wyświetlaj, pobieraj i usuwaj zestawy reguł
  • wyświetlaj, pobieraj i usuwaj wydania reguł

W przypadku bardzo dużych wdrożeń, które z czasem osiągają limit 2500 zestawów reguł, można utworzyć logikę usuwającą najstarsze reguły w ustalonym cyklu czasowym. Na przykład, aby 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 ich kluczach createTime , a następnie wywołać project.rulesets.delete na odpowiednich zestawach reguł według ruleset_id .

Przetestuj aktualizacje za pomocą REST

Wreszcie interfejs API zarządzania umożliwia uruchamianie testów składniowych i semantycznych na zasobach Cloud Firestore i Cloud Storage w projektach produkcyjnych.

Testowanie za pomocą tego komponentu API polega na:

  1. Zdefiniowanie obiektu JSON TestSuite reprezentującego zestaw obiektów TestCase
  2. Przesyłanie TestSuite
  3. Analizowanie zwróconych obiektów TestResult

Zdefiniujmy obiekt TestSuite za pomocą pojedynczego TestCase w pliku testcase.json . W tym przykładzie przekazujemy źródło języka Rules bezpośrednio z ładunkiem REST wraz z zestawem testów, które mają działać na tych regułach. Określamy oczekiwanie dotyczące oceny reguł i żądanie klienta, względem którego zestaw reguł ma być testowany. Możesz także określić stopień kompletności raportu z testu, używając wartości „FULL”, aby wskazać wyniki dla wszystkich wyrażeń języka Reguły, które powinny zostać uwzględnione w raporcie, 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 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 TestReport (zawierający status testu SUKCES/FAILURE, listę komunikatów debugowania, listę odwiedzonych wyrażeń Reguł i raporty z ich oceny) potwierdziłby statusem SUKCES, że dostęp jest prawidłowo dozwolony.

Zarządzaj uprawnieniami do reguł bezpieczeństwa Cloud Storage obejmujących wiele usług

Jeśli utworzysz reguły zabezpieczeń Cloud Storage, które będą używać zawartości dokumentów Cloud Firestore do oceny warunków bezpieczeństwa , w konsoli Firebase lub interfejsie wiersza poleceń Firebase zostanie wyświetlony monit o włączenie uprawnień do połączenia obu produktów.

Jeśli zdecydujesz się wyłączyć takie zabezpieczenia międzyusługowe:

  1. Najpierw, przed wyłączeniem tej funkcji, edytuj reguły, usuwając wszystkie instrukcje korzystające z funkcji Reguł w celu uzyskania dostępu do Cloud Firestore. W przeciwnym razie po wyłączeniu tej funkcji oceny reguł spowodują niepowodzenie żądań dotyczących magazynu.

  2. Użyj strony IAM w Google Cloud Console, aby usunąć rolę „Firebase Rules Firestore Service Agent”, postępując zgodnie z przewodnikiem Cloud dotyczącym odwoływania ról .

Zostaniesz poproszony o ponowne włączenie tej funkcji przy następnym zapisywaniu reguł między usługami z poziomu interfejsu wiersza polecenia Firebase lub konsoli Firebase.