Lista kontrolna zabezpieczeń Firebase

Aby zapewnić bezpieczeństwo zasobom Firebase i danym użytkowników, postępuj zgodnie z tymi wskazówkami. Nie wszystkie te elementy będą miały zastosowanie do Twoich wymagań, ale pamiętaj o nich podczas tworzenia aplikacji.

Unikaj nieprawidłowego ruchu

Konfigurowanie monitorowania i alertów dla usług backendu

Aby wykrywać nieprawidłowy ruch, np. ataki typu DoS, skonfiguruj monitorowanie i ostrzeganie w przypadku Cloud Firestore, Realtime Database, Cloud StorageHosting.

Jeśli podejrzewasz, że Twoja aplikacja jest atakowana, jak najszybciej skontaktuj się z zespołem pomocy, aby poinformować zespół o sytuacji.

 Włącz App Check

Aby mieć pewność, że dostęp do usług backendu będą miały tylko Twoje aplikacje, włącz opcję Firebase App Check dla każdej usługi, która ją obsługuje.

Skonfiguruj usługę Cloud Functions tak, aby skalowała się do normalnego ruchu

Cloud Functions automatycznie skaluje się, aby sprostać wymaganiom aplikacji, ale w przypadku ataku może to oznaczać wysoki rachunek. Aby temu zapobiec, możesz ograniczyć liczbę jednoczesnych instancji funkcji na podstawie normalnego ruchu w aplikacji.

Skonfiguruj alerty, aby otrzymywać powiadomienia o zbliżaniu się do limitu

Jeśli Twoja usługa ma nagłe wzrosty liczby żądań, często uruchamiane są limity, które automatycznie ograniczają ruch w Twojej aplikacji. Monitoruj swoje wykorzystanie i rozliczenia na panelu, ale możesz też ustawić alerty dotyczące budżetu w swoim projekcie, aby otrzymywać powiadomienia, gdy wykorzystanie zasobów przekroczy oczekiwania.

Zapobieganie atakom typu DoS: testowanie funkcji lokalnie za pomocą emulatorów

Podczas tworzenia Cloud Functions łatwo jest przypadkowo zablokować własny komputer. Może się to zdarzyć na przykład wtedy, gdy utworzysz nieskończoną pętlę wywołania i zapisu. Aby uniknąć wpływu tych błędów na działanie usług, możesz prowadzić prace programistyczne z użyciem Firebase Local Emulator Suite.

Jeśli przypadkowo wywołasz atak typu DoS, cofnij wdrożenie funkcji, usuwając ją z index.js, a następnie uruchom firebase deploy --only functions.

Gdy szybkość działania w czasie rzeczywistym jest mniej ważna, struktura działa defensywnie

Jeśli nie musisz przedstawiać wyników funkcji w czasie rzeczywistym, możesz zapobiegać nadużywaniu ruchu, przetwarzając wyniki w partiach: publikując wyniki w Pub/Sub temacie i przetwarzając je w regularnych odstępach czasu za pomocą funkcji zaplanowanej.

Klucze interfejsu API

Klucze API usług Firebase nie są tajne

Firebase używa kluczy API tylko do identyfikowania projektu Firebase Twojej aplikacji w usługach Firebase, a nie do kontrolowania dostępu do bazy danych ani danych Cloud Storage, co odbywa się za pomocą Firebase Security Rules. Z tego powodu nie musisz traktować kluczy interfejsu API usług Firebase jako informacji poufnych. Możesz je bezpiecznie umieszczać w kodzie klienta. Dowiedz się więcej o kluczach API Firebase.

Konfigurowanie ograniczeń klucza interfejsu API

Aby dodatkowo zniechęcić atakujących do próby użycia klucza interfejsu API do podszywania się pod Twoją aplikację, możesz dodać ograniczenia kluczy interfejsu API, aby ograniczyć dostęp do kluczy interfejsu API do klientów aplikacji i interfejsów API, których używasz.

Trzymaj w tajemnicy klucze serwera FCM

W przeciwieństwie do kluczy interfejsu API usług Firebase klucze serwera FCM (używane przez starszą wersję interfejsu API HTTP FCM) poufne i muszą być utrzymywane w tajemnicy.

Zachowaj tajność kluczy kont usługi

Również w odróżnieniu od kluczy API usług Firebase klucze prywatne kont usług (używane przez Firebase Admin SDK) poufne i muszą być utrzymywane w tajnych.

Firebase Security Rules

Inicjowanie reguł w wersji produkcyjnej lub w trybie blokady

Podczas konfigurowania usług Cloud Firestore, Realtime DatabaseCloud Storage zainicjuj Firebase Security Rules, aby domyślnie odmówić dostępu do wszystkich zasobów, a podczas tworzenia aplikacji dodaj reguły, które przyznają dostęp do określonych zasobów.

Użyj jednego z domyślnych ustawień dla nowych instancji Cloud Firestore (tryb produkcyjny) i Realtime Database (tryb zablokowany). W przypadku Cloud Storage zacznij od konfiguracji reguł zabezpieczeń, która wygląda tak:

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

Reguły zabezpieczeń to schemat; dodawaj reguły podczas dodawania dokumentów

Nie pisz reguł zabezpieczeń po napisaniu aplikacji jako zadania wykonywanego przed jej opublikowaniem. Zamiast tego, podczas tworzenia aplikacji, twórz reguły bezpieczeństwa, traktując je jak schemat bazy danych: gdy tylko musisz użyć nowego typu dokumentu lub nowej struktury ścieżki, najpierw utwórz regułę bezpieczeństwa.

Testowanie reguł zabezpieczeń za pomocą testów jednostkowych za pomocą narzędzia Local Emulator Suite; dodanie go do CI

Aby mieć pewność, że reguły bezpieczeństwa są zgodne z rozwojem aplikacji, przeprowadź testy jednostkowe reguł za pomocą Firebase Local Emulator Suite i dodaj te testy do potoku CI. Zapoznaj się z tymi przewodnikami dotyczącymi Cloud FirestoreRealtime Database.

Uwierzytelnianie

Niestandardowe uwierzytelnianie: generowanie tokenów JWT z zaufanego środowiska (po stronie serwera)

Jeśli masz już bezpieczny system logowania, np. system niestandardowy lub usługę zewnętrzną, możesz użyć istniejącego systemu do uwierzytelniania się w usługach Firebase. Utwórz niestandardowe tokeny JWT w zaufanym środowisku, a następnie przekaż je klientowi, który używa tokena do uwierzytelniania (iOS+, Android, sieć, Unity, C++).

Przykład korzystania z niestandardowego uwierzytelniania z usługą zewnętrznego dostawcy znajdziesz w poście na blogu Uwierzytelnianie za pomocą Firebase przy użyciu Okta.

Uwierzytelnianie zarządzane: dostawcy OAuth 2.0 zapewniają najwyższy poziom bezpieczeństwa

Jeśli korzystasz z funkcji uwierzytelniania zarządzanego Firebase, najbardziej bezpieczne są opcje dostawców OAuth 2.0 / OpenID Connect (Google, Facebook itp.). Jeśli to możliwe, powinieneś obsługiwać co najmniej jednego z tych dostawców (w zależności od bazy użytkowników).

Uwierzytelnianie za pomocą adresu e-mail i hasła: ustaw ścisłe limity dla punktu końcowego logowania, aby zapobiec atakom typu brute force.

Jeśli korzystasz z usługi zarządzanego uwierzytelniania za pomocą adresu e-mail i hasła w Firebase, zmniejsz domyślny limit punktów końcowych identitytoolkit.googleapis.com, aby zapobiec atakom typu brute force. Możesz to zrobić na stronie Identity Toolkit API w konsoli Google Cloud.

 Uwierzytelnianie za pomocą adresu e-mail i hasła: włączanie ochrony przed wyliczaniem adresów e-mail

Jeśli korzystasz z zarządzanej usługi uwierzytelniania za pomocą adresu e-mail i hasła w Firebase, włącz ochronę przed wyliczaniem adresów e-mail, która uniemożliwia złośliwym użytkownikom wykorzystywanie punktów końcowych uwierzytelniania w Twoim projekcie do zgadywania nazw kont.

Przejdź na Google Cloud Identity Platform, aby korzystać z uwierzytelniania wielopoziomowego

Aby zwiększyć bezpieczeństwo logowania, możesz dodać obsługę uwierzytelniania wielopoziomowego, przechodząc na Google Cloud Identity Platform. Po uaktualnieniu konta kod Firebase Authentication będzie nadal działać.

Anonimowe uwierzytelnianie

Do wprowadzania ciepłego użyj tylko uwierzytelniania anonimowego

Używaj uwierzytelniania anonimowego tylko do zapisywania podstawowego stanu użytkowników przed ich zalogowaniem się. Anonimowe uwierzytelnianie nie zastępuje logowania użytkownika.

Przełączanie użytkowników na inną metodę logowania, jeśli chcą mieć dostęp do swoich danych na innych urządzeniach

Anonimowe dane uwierzytelniające nie zostaną zachowane, jeśli użytkownik wyczyści pamięć lokalną lub zmieni urządzenie. Jeśli chcesz, aby dane były przechowywane na jednym urządzeniu po ponownym uruchomieniu aplikacji, przekształć użytkownika w konto stałe.

Używaj reguł bezpieczeństwa, które wymagają od użytkowników przejścia na dostawcę logowania lub potwierdzenia adresu e-mail.

Każdy może utworzyć anonimowe konto w Twoim projekcie. Mając to na uwadze, zabezpiecz wszystkie dane niepubliczne za pomocą reguł bezpieczeństwa wymagających określonych metod logowania lub zweryfikowanych adresów e-mail.

Przykład:

allow write: if request.auth.token.firebase.sign_in_provider != "anonymous";
allow write: if request.auth.token.email_verified = true;

Cloud Functions bezpieczeństwo

Nigdy nie umieszczaj informacji poufnych w zmiennych środowiskowych

W przypadku aplikacji hostowanej samodzielnie często używasz zmiennych środowiskowych do przechowywania informacji poufnych, takich jak klucze prywatne. Nie rób tego w Cloud Functions. Funkcja Cloud Functions używa tych samych środowisk między wywołaniami funkcji, dlatego nie należy przechowywać w nich informacji poufnych.

  • Aby przechowywać klucze interfejsu API Firebase (które nie są tajne), umieść je w kodzie.

  • Jeśli używasz Firebase Admin SDK w ramach Cloud Functions, nie musisz wyraźnie podawać danych logowania do konta usługi, ponieważ Admin SDK może je automatycznie pobrać podczas inicjalizacji.

  • Jeśli wywołujesz interfejsy API Google i Google Cloud, które wymagają danych logowania do konta usługi, biblioteka Google Auth dla Node.js może pobrać te dane z domyślnych danych logowania aplikacji, które są automatycznie wypełniane w Cloud Functions.

  • Aby udostępnić klucze prywatne i dane logowania do usług innych niż Google, użyj funkcji Cloud Functions: Secret Manager.

Szyfrowanie informacji poufnych

Jeśli nie możesz uniknąć przekazywania funkcji informacji poufnych, musisz zastosować własne rozwiązanie do szyfrowania tych informacji.

Funkcje proste są bezpieczniejsze. Jeśli potrzebujesz złożoności, rozważ użycie funkcji Cloud Run

Staraj się, aby funkcje były jak najbardziej podstawowe i zrozumiałe. Zbyt skomplikowane funkcje mogą często prowadzić do trudnych do wykrycia błędów lub nieoczekiwanego działania.

Jeśli potrzebujesz złożonej logiki lub konfiguracji środowiska, zamiast Cloud Functions użyj Cloud Run.

Zarządzanie środowiskiem

Konfigurowanie projektów programistycznych i testowych

Skonfiguruj oddzielne projekty Firebase do tworzenia, testowania i produkcji. Nie łącz kodu klienta z wersją produkcyjną, dopóki nie przetestujesz go w projekcie testowym.

Ograniczanie dostępu zespołu do danych produkcyjnych

Jeśli pracujesz w większym zespole, możesz ograniczyć skutki błędów i naruszenia zabezpieczeń, ograniczając dostęp do danych produkcyjnych za pomocą zdefiniowanych wstępnie ról uprawnień lub niestandardowych ról uprawnień.

Jeśli Twój zespół używa wersji Firebase Local Emulator Suite (zalecane) do celów programistycznych, nie musisz przyznawać szerszego dostępu do projektu produkcyjnego.

Zarządzanie biblioteką

Uważaj na błędy pisowni w nazwie biblioteki lub nowych administratorów

Podczas dodawania bibliotek do projektu zwróć szczególną uwagę na nazwę biblioteki i osoby, które ją utrzymują. Biblioteka o podobnej nazwie do tej, którą chcesz zainstalować, może zawierać szkodliwy kod.

Nie aktualizuj bibliotek bez zapoznania się ze zmianami

Przed uaktualnieniem sprawdź dzienniki zmian wszystkich bibliotek, których używasz. Upewnij się, że uaktualnienie wnosi wartość, i sprawdź, czy osoba, która będzie pełnić rolę opiekuna, to osoba godna zaufania.

Instalowanie bibliotek watchdog jako zależności programistycznych lub testowych

Aby sprawdzić, czy w projekcie nie ma niezabezpieczonych zależności, użyj biblioteki takiej jak Snyk.

Skonfiguruj monitorowanie usługi Cloud Functions; sprawdź je po aktualizacji biblioteki

Jeśli używasz pakietu SDK do rejestrowania Cloud Functions, możesz monitorować i otrzymywać alerty o nietypowym zachowaniu, w tym o zachowaniu spowodowanym przez aktualizacje biblioteki.