Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

Lista kontrolna zabezpieczeń Firebase

Aby zapewnić bezpieczeństwo zasobów Firebase i danych użytkowników, postępuj zgodnie z tymi wskazówkami. Nie każdy element będzie pasował do Twoich wymagań, ale pamiętaj o nich podczas tworzenia aplikacji.

Unikaj nadużyć ruchu

Skonfiguruj monitorowanie i alerty dla usług zaplecza

Aby wykrywać nadużycia, takie jak ataki typu „odmowa usługi” (DOS), skonfiguruj monitorowanie i alerty dla Cloud Firestore , Bazy danych czasu rzeczywistego , Przechowywania w chmurze i Hostingu

Jeśli podejrzewasz atak na Twoją aplikację, jak najszybciej skontaktuj się z pomocą techniczną, aby poinformować ich, co się dzieje.

Włącz sprawdzanie aplikacji

Aby upewnić się, że tylko Twoje aplikacje mają dostęp do usług zaplecza, włącz funkcję App Check dla każdej usługi, która ją obsługuje.

Skonfiguruj Cloud Functions do skalowania dla normalnego ruchu

Cloud Functions automatycznie skaluje się do wymagań Twojej aplikacji, ale w przypadku ataku może to oznaczać duży rachunek. Aby temu zapobiec, możesz ograniczyć liczbę jednoczesnych wystąpień funkcji na podstawie normalnego ruchu w Twojej aplikacji.

Skonfiguruj alerty, aby otrzymywać powiadomienia, gdy limity zostaną prawie osiągnięte

Jeśli Twoja usługa ma skoki żądań, często uruchamiają się limity i automatycznie ograniczają ruch do Twojej aplikacji. Pamiętaj, aby monitorować panel użycia i rozliczeń , ale możesz też ustawić alerty budżetu w projekcie, aby otrzymywać powiadomienia, gdy wykorzystanie zasobów przekroczy oczekiwania.

Zapobiegaj autodosom: testuj funkcje lokalnie za pomocą emulatorów

Przypadkowy DOS może być łatwy podczas opracowywania Cloud Functions: na przykład tworząc nieskończoną pętlę zapisu wyzwalacza. Możesz zapobiec wpływowi tych błędów na działające usługi, wykonując programowanie za pomocą pakietu emulatorów Firebase .

(A jeśli przez przypadek sam wykonasz DOS, firebase deploy --only functions funkcji, usuwając ją z index.js a następnie uruchamiając firebase deploy --only functions ).

Tam, gdzie responsywność w czasie rzeczywistym jest mniej ważna, struktura działa defensywnie

Jeśli nie musisz prezentować wyniku funkcji w czasie rzeczywistym, możesz ograniczyć ruch generujący nadużycia, przetwarzając wyniki w partiach: publikuj wyniki w temacie Pub/Sub i przetwarzaj wyniki w regularnych odstępach czasu za pomocą zaplanowanej funkcji .

Zrozum klucze API

Klucze API dla 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 lub danych Cloud Storage, co odbywa się za pomocą reguł zabezpieczeń Firebase . Z tego powodu nie musisz traktować kluczy API dla usług Firebase jako tajnych i możesz je bezpiecznie osadzić w kodzie klienta. Dowiedz się więcej o kluczach API dla Firebase .

Skonfiguruj zakres klucza API

Jako dodatkowy środek odstraszający od atakującego, który próbuje użyć Twojego klucza API do sfałszowania żądań, możesz utworzyć klucze API, których zakres obejmuje klienty Twojej aplikacji .

Zachowaj klucze serwera FCM w tajemnicy

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

Zachowaj klucze konta usługi w tajemnicy

W przeciwieństwie do kluczy API usług Firebase klucze prywatne konta usługi (używane przez pakiet Admin SDK ) poufne i muszą być utrzymywane w tajemnicy.

Zasady bezpieczeństwa

Zainicjuj reguły w trybie produkcyjnym lub zablokowanym

Podczas konfigurowania Cloud Firestore, Bazy danych czasu rzeczywistego i Cloud Storage zainicjuj reguły zabezpieczeń, aby domyślnie odmawiać dostępu, i dodaj reguły, które przyznają dostęp do określonych zasobów podczas tworzenia aplikacji.

To jedno z domyślnych ustawień dla nowych instancji Cloud Firestore (tryb produkcyjny) i Baza danych czasu rzeczywistego (tryb zablokowany). Wybierz tę opcję podczas konfigurowania nowej instancji bazy danych.

W przypadku Cloud Storage zacznij od konfiguracji reguł bezpieczeństwa, jak poniżej:

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

Reguły bezpieczeństwa to schemat; dodaj reguły podczas dodawania dokumentów

Nie pisz reguł zabezpieczeń po napisaniu aplikacji, co jest rodzajem zadania przed uruchomieniem. Zamiast tego pisz reguły zabezpieczeń podczas pisania aplikacji, traktując je jak schemat bazy danych: zawsze, gdy musisz użyć nowego typu dokumentu lub struktury ścieżki, najpierw napisz regułę zabezpieczeń.

Reguły bezpieczeństwa testów jednostkowych z pakietem emulatorów; dodaj to do CI

Aby upewnić się, że reguły zabezpieczeń nadążają za rozwojem aplikacji, przetestuj jednostki za pomocą zestawu emulatorów Firebase i dodaj te testy do potoku CI. Zapoznaj się z tymi przewodnikami dotyczącymi Cloud Firestore i Bazy danych czasu rzeczywistego .

Poświadczenie

Uwierzytelnianie niestandardowe: mint tokeny JWT z zaufanego środowiska (po stronie serwera)

Jeśli masz już bezpieczny system logowania, niezależnie od tego, czy jest to system niestandardowy, czy usługa innej firmy, możesz użyć istniejącego systemu do uwierzytelniania w usługach Firebase. Utwórz niestandardowe tokeny JWT z zaufanego środowiska, a następnie przekaż tokeny do klienta, który używa tokenu do uwierzytelniania ( iOS , Android , Web , Unity , C++ ).

Aby zapoznać się z przykładem korzystania z uwierzytelniania niestandardowego u zewnętrznego dostawcy, zobacz wpis na blogu Uwierzytelnianie w Firebase przy użyciu Okta .

Uwierzytelnianie zarządzane: dostawcy OAuth 2.0 są najbezpieczniejsi

Jeśli korzystasz z zarządzanych funkcji uwierzytelniania Firebase, opcje dostawcy OAuth 2.0 / OpenID Connect (Google, Facebook itp.) są najbezpieczniejsze. Jeśli to możliwe, powinieneś wspierać jednego lub więcej z tych dostawców (w zależności od bazy użytkowników).

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

Jeśli korzystasz z zarządzanej usługi uwierzytelniania poczty e-mail za pomocą hasła Firebase, zwiększ domyślny limit punktów końcowych identitytoolkit.googleapis.com aby zapobiec atakom typu brute force. Możesz to zrobićna stronie interfejsu API w Google Cloud Console .

Przejdź na Cloud Identity Platform, aby korzystać z uwierzytelniania wieloskładnikowego

Aby zapewnić dodatkowe bezpieczeństwo podczas logowania, możesz dodać obsługę uwierzytelniania wieloskładnikowego, przechodząc na Cloud Identity Platform . Twój dotychczasowy kod uwierzytelniania Firebase będzie nadal działał po uaktualnieniu.

Uwierzytelnianie anonimowe

Używaj tylko anonimowego uwierzytelniania do ciepłego onboardingu

Używaj tylko uwierzytelniania anonimowego, aby zapisać podstawowy stan użytkowników przed faktycznym zalogowaniem się. Uwierzytelnianie anonimowe nie zastępuje logowania użytkownika.

Przekonwertuj użytkowników na inną metodę logowania, jeśli będą potrzebować danych po utracie telefonu

Dane uwierzytelniania anonimowego nie zostaną zachowane, jeśli użytkownik wyczyści magazyn lokalny lub przełączy urządzenia. Jeśli chcesz zachować dane po ponownym uruchomieniu aplikacji na jednym urządzeniu, przekonwertuj użytkownika na konto stałe .

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

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

Na przykład:

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

Zarządzanie środowiskiem

Skonfiguruj projekty deweloperskie i postojowe

Skonfiguruj oddzielne projekty Firebase na potrzeby programowania, testowania i produkcji. Nie scalaj kodu klienta z produkcją, dopóki nie zostanie przetestowany pod kątem projektu tymczasowego.

Ogranicz dostęp zespołu do danych produkcyjnych

Jeśli pracujesz z większym zespołem, możesz złagodzić konsekwencje błędów i naruszeń, ograniczając dostęp do danych produkcyjnych za pomocą wstępnie zdefiniowanych ról lub niestandardowych ról uprawnień.

Jeśli Twój zespół używa pakietu emulatorów do programowania, może nie być konieczne przyznawanie szerszego dostępu do projektu produkcyjnego.

Zarządzanie biblioteką

Uważaj na błędy ortograficzne w bibliotece lub nowych opiekunów

Dodając biblioteki do swojego projektu, zwróć szczególną uwagę na nazwę biblioteki i jej opiekunów. Biblioteka o podobnej nazwie do tej, którą zamierzasz zainstalować, może zawierać złośliwy kod.

Nie aktualizuj bibliotek bez zrozumienia zmian

Przejrzyj dzienniki zmian wszystkich używanych bibliotek przed aktualizacją. Upewnij się, że aktualizacja dodaje wartości i upewnij się, że opiekun jest nadal stroną, której ufasz.

Zainstaluj biblioteki watchdog jako zależności deweloperskie lub testowe

Użyj biblioteki takiej jak Snyk, aby przeskanować projekt w poszukiwaniu niezabezpieczonych zależności.

Skonfiguruj monitorowanie funkcji; sprawdź to po aktualizacji biblioteki

Jeśli korzystasz z pakietu SDK rejestratora Cloud Functions , możesz monitorować i otrzymywać powiadomienia o nietypowym zachowaniu, w tym o zachowaniu spowodowanym aktualizacjami biblioteki.

Bezpieczeństwo funkcji chmury

Nigdy nie umieszczaj poufnych informacji w zmiennych środowiskowych Cloud Function

Często w samoobsługowej aplikacji Node.js używasz zmiennych środowiskowych do przechowywania poufnych informacji, takich jak klucze prywatne. Nie rób tego w Cloud Functions . Ponieważ Cloud Functions ponownie używa środowisk między wywołaniami funkcji, poufne informacje nie powinny być przechowywane w środowisku.

  • Aby przechowywać klucze Firebase API, które nietajne , po prostu umieść je w kodzie.
  • Jeśli używasz pakietu Firebase Admin SDK w funkcji Cloud Functions, nie musisz jawnie podawać danych logowania do konta usługi, ponieważ pakiet SDK może je automatycznie uzyskać podczas inicjowania.
  • 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 logowania z domyślnych danych logowania aplikacji , które są automatycznie wypełniane w Cloud Functions.
  • Aby udostępnić w Cloud Functions klucze prywatne i dane logowania do usług innych niż Google, użyj Cloud Secret Manager .

Szyfruj poufne informacje

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

Proste funkcje są bezpieczniejsze; jeśli potrzebujesz złożoności, rozważ Cloud Run

Staraj się, aby funkcje Cloud Functions były tak proste i zrozumiałe, jak to tylko możliwe. Złożoność funkcji może często prowadzić do trudnych do wykrycia błędów lub nieoczekiwanego zachowania.

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