Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

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

Firebase udostępnia kilka narzędzi do zarządzania regułami, z których każde jest przydatne w określonych przypadkach, a każde korzysta z tego samego interfejsu API zarządzania regułami bezpieczeństwa Firebase na zapleczu.

Bez względu na to, które narzędzie zostanie użyte do jego wywołania, API do zarządzania:

  • Spożywa źródła zasad: zestaw reguł, zazwyczaj pliku kodu zawierającego oświadczenia Firebase zasad bezpieczeństwa.
  • Sklepy spożywana źródła jako niezmiennego zestawu reguł.
  • Śledzi wdrażanie każdego zestawu reguł w komunikacie. Usługi obsługujące reguły zabezpieczeń Firebase wyszukują wersję projektu, aby ocenić każde żądanie zabezpieczonego zasobu.
  • Zapewnia możliwość uruchomienia składniowe i semantyczne testy zestawu reguł.

Użyj interfejsu wiersza polecenia Firebase

Z Firebase CLI , możesz przesłać lokalnych źródeł i uwolnień wdrożyć. CLI za Firebase Local Emulator Suite pozwala wykonać pełną lokalnego testowania ź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

Podczas konfigurowania Firebase projekt używając Firebase CLI można utworzyć .rules plik konfiguracyjny w katalogu projektu. Użyj następującego polecenia, aby rozpocząć konfigurowanie projektu Firebase:

Cloud 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 zasady

Edytuj swoje źródło zasadami bezpośrednio w .rules pliku konfiguracyjnym. Upewnij się, że wszelkie zmiany wprowadzane w interfejsie wiersza poleceń Firebase są odzwierciedlane w konsoli Firebase lub 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 lokalnych emulatorów zawiera emulatory dla wszystkich produktów obsługujących reguły zabezpieczeń. Silnik reguł bezpieczeństwa dla każdego emulatora dokonuje oceny zarówno składniowej, jak i semantycznej reguł, tym samym przewyższając testowanie składniowe oferowane przez API zarządzania regułami bezpieczeństwa.

Jeśli pracujesz z CLI, pakiet jest doskonałym narzędziem do testowania reguł zabezpieczeń Firebase. Użyj lokalny Emulator Suite przetestować aktualizacje lokalnie i potwierdzić, że Zasady swoją aplikację za ich zachowanie, które chcesz.

Wdróż aktualizacje

Po zaktualizowaniu i przetestowaniu reguł wdróż źródła w środowisku produkcyjnym. Użyj poniższych poleceń, aby selektywnie wdrożyć same reguły lub wdrożyć je w ramach normalnego procesu wdrażania.

Cloud Firestore

// Deploy your .rules file
firebase deploy --only firestore:rules

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żna również edytować Zasady źródeł i wdrażać je jako uwolnienia z konsoli Firebase. Składniowym testowanie odbywa się podczas edycji w interfejsie konsoli Firebase i testowanie symantic jest dostępna za pomocą reguł zabaw.

Edytuj i aktualizuj swoje zasady

  1. Otwórz konsolę Firebase i wybierz swój projekt.
  2. Następnie wybierz bazę danych w czasie rzeczywistym, chmura FireStore lub przechowywanie produktów z nawigacji, a następnie kliknij pozycję 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żna przetestować zachowanie reguł semantycznych, przy użyciu baz danych i zasobów pamięci masowej Twojego projektu, bezpośrednio w konsoli Firebase, używając reguł Playground . Otworzyć ekran Rules zabaw w edytorze Reguły zmodyfikować ustawienia, a następnie kliknij polecenie Uruchom. Poszukaj wiadomości potwierdzającej w górnej części edytora.

Wdróż aktualizacje

Raz jesteś zadowolony, że aktualizacje są co można oczekiwać, kliknij przycisk Publish.

Użyj pakietu Admin SDK

Można użyć 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 unikanie niezamierzonych zmian w kontroli dostępu do aplikacji. Napisz kod pakietu Admin SDK, mając na uwadze przede wszystkim bezpieczeństwo, zwłaszcza podczas aktualizowania lub wdrażania reguł.

Inną ważną rzeczą, o której należy pamiętać, jest to, że pełne rozpowszechnienie reguł zabezpieczeń Firebase zajmuje kilka minut. Korzystając z pakietu Admin SDK do wdrażania reguł, unikaj sytuacji wyścigowych, w których aplikacja natychmiast opiera się na regułach, 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órego celem jest ograniczenie wyścigów pomimo częstych aktualizacji.

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

  • Podczas serializacji reguły muszą być mniejsze 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 stare zestawy reguł przed utworzeniem nowych.

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

Typowy przepływ pracy zarządzania regułami bezpieczeństwa za pomocą pakietu Admin SDK może obejmować trzy odrębne kroki:

  1. Utwórz źródło pliku reguł (opcjonalnie)
  2. Utwórz zestaw reguł
  3. Wydanie lub wdrożenie nowego zestawu reguł

Pakiet SDK udostępnia metodę łączenia 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);

Te same prace wzór do zasad przechowywania danych w chmurze z releaseFirestoreRulesetFromSource() .

Alternatywnie można utworzyć plik reguł jako obiekt w pamięci, utworzyć zestaw reguł i wdrożyć zestaw reguł osobno, aby lepiej kontrolować te zdarzenia. Na przykład:

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

Aktualizuj zestawy reguł Bazy danych czasu rzeczywistego

Aby zaktualizować bazę danych z zestawów reguł Realtime Admin SDK, użyj getRules() i setRules() metody admin.database . Możesz pobrać zestawy reguł w formacie JSON lub jako ciąg 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żych zestawów reguł, Admin SDK pozwala wyświetlić listę wszystkich istniejących zasad z 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ągną limit zestawu reguł 2500, można utworzyć logikę, aby usunąć najstarsze reguły w ustalonym cyklu czasowym. Na przykład, aby usunąć wszystkie zestawów reguł wdrożonych przez 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.`);

Użyj interfejsu API REST

Opisane powyżej narzędzia dobrze nadają się do różnych przepływów pracy, ale możesz chcieć zarządzać i wdrażać reguły zabezpieczeń Firebase przy użyciu samego interfejsu API zarządzania. Zarządzanie API zapewnia największą elastyczność.

Pamiętaj, że pełne rozpowszechnienie wersji reguł zabezpieczeń Firebase zajmuje kilka minut. Korzystając z interfejsu API zarządzania REST do wdrażania, należy unikać sytuacji wyścigu, w których aplikacja natychmiast opiera się na regułach, których wdrażanie nie zostało jeszcze zakończone.

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

  • Podczas serializacji reguły muszą być mniejsze 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 stare zestawy reguł przed utworzeniem nowych.

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

Przykłady w tej sekcji wykorzystują reguły pamięci masowej, ale dotyczą one również reguł Cloud Firestore.

Przykłady używają również cURL do wykonywania wywołań API. Pominięto kroki konfiguracji i przekazywania tokenów uwierzytelniania. Można eksperymentować z tym API przy użyciu API Explorer zintegrowany z dokumentacji referencyjnej .

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ł

Załóżmy, że pracujesz nad swoim secure_commerce projektu Firebase i chcą wdrożyć zablokowana w dół w chmurze zasadami gromadzenia danych. Można wprowadzić te reguły w storage.rules pliku.

service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if false;
    }
  }
}

Teraz wygeneruj odcisk palca zakodowany w base64 dla tego pliku. Następnie można użyć źródło w tym pliku, aby zapełnić ładunek potrzebny do stworzenia zestawu reguł z projects.rulesets.create wezwanie REST. Tutaj używamy cat polecenia można wstawić zawartość storage.rules do ładowności REST.

curl -X POST -d '{
  "source": {
    {
      "files": [
        {
          "content": "' $(cat storage.rules) '",
          "name": "storage.rules",
          "fingerprint": <sha fingerprint>
        }
      ]
    }
  }
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/rulesets'

API zwraca odpowiedź walidacji i nazwę zestawu reguł, na przykład projects/secure_commerce/rulesets/uuid123 . 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/prod/v23   "  ,
  "rulesetName": "projects/secure_commerce/rulesets/uuid123",
}' 'https://firebaserules.googleapis.com/v1/projects/secure_commerce/releases'

Aktualizuj zestawy reguł Bazy danych czasu rzeczywistego za pomocą REST

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

Zarządzaj zestawami reguł za pomocą REST

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

  • lista, dostać i usuwać zestawy reguł
  • lista, dostać, i usunąć reguły komunikaty

W przypadku bardzo dużych wdrożeń, które z czasem osiągną limit zestawu reguł 2500, można utworzyć logikę, aby usunąć najstarsze reguły w ustalonym cyklu czasowym. Na przykład, aby usunąć wszystkie zestawów reguł wdrożonych przez okres dłuższy niż 30 dni, można wywołać projects.rulesets.list metody analizowania listę JSON Ruleset obiektów na ich createTime kluczy, a następnie zadzwonić project.rulesets.delete na odpowiednich zestawów reguł przez ruleset_id .

Przetestuj swoje aktualizacje za pomocą REST

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

Testowanie za pomocą tego komponentu API składa się z:

  1. Definiowanie TestSuite obiekt JSON do reprezentowania zestaw TestCase obiektów
  2. Złożenie TestSuite
  3. Parsowania zwróconych TestResult przedmiotów

Załóżmy zdefiniować TestSuite obiektu z jednego TestCase w testcase.json pliku. W tym przykładzie przekazujemy źródło języka Rules wraz z ładunkiem REST wraz z zestawem testów do uruchomienia na tych regułach. Określamy oczekiwanie na ocenę Reguł oraz żądanie klienta, względem którego ma być testowany zestaw reguł. Możesz również określić stopień kompletności raportu testowego, używając wartości „FULL”, aby wskazać wyniki dla wszystkich wyrażeń w języku Reguł, które powinny być 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"}}}
            }
          ]
      }
    ]
  }
}

Możemy następnie przesłać ten TestSuite dla evalution z projects.test metody.

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

Zwracany TestReport (zawierający testową sukces / porażka, stan listy wiadomości Debug list odwiedzanych Rules wyrażeń i ich raportów ewaluacyjnych) by potwierdzić sukcesem stanu, że dostęp jest właściwie dozwolone.