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 koniecznie odpowiadał Twoim wymaganiom, ale pamiętaj o nich podczas tworzenia aplikacji.

Unikaj niewłaściwego ruchu

Skonfiguruj monitorowanie i alerty dla usług backendu

Aby wykryć nadużycia ruchu, 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 działem wsparcia i poinformuj go, co się dzieje.

Włącz sprawdzanie aplikacji

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

Skonfiguruj funkcje Cloud Functions tak, aby skalowały się pod kątem normalnego ruchu

Cloud Functions automatycznie skaluje się, aby spełnić wymagania Twojej aplikacji, ale w przypadku ataku może to oznaczać duży rachunek. Aby temu zapobiec, możesz ograniczyć liczbę jednoczesnych wystąpień funkcji w oparciu o normalny ruch w aplikacji.

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

Jeśli w Twojej usłudze występuje gwałtowny wzrost liczby żądań, często uruchamiane są przydziały i automatycznie ograniczają ruch do Twojej aplikacji. Pamiętaj o monitorowaniu panelu wykorzystania i rozliczeń , ale możesz także ustawić alerty budżetowe dla swojego projektu, aby otrzymywać powiadomienia, gdy wykorzystanie zasobów przekroczy oczekiwania.

Zapobiegaj samodzielnym DOS-om: testuj funkcje lokalnie za pomocą emulatorów

Przypadkowe uruchomienie DOS-u podczas tworzenia funkcji Cloud Functions może być łatwe: na przykład tworząc nieskończoną pętlę zapisu i wyzwalacza. Możesz zapobiec wpływowi tych błędów na usługi działające na żywo, wykonując swój program za pomocą pakietu emulatorów Firebase .

(A jeśli sam przypadkowo wykonasz DOS, cofnij wdrożenie swojej funkcji, usuwając ją z index.js , a następnie uruchamiając firebase deploy --only functions .)

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

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

Zrozumienie kluczy API

Klucze API do usług Firebase nie są tajne

Firebase używa kluczy API wyłącznie do identyfikowania projektu Firebase Twojej aplikacji z usługami Firebase, a nie do kontrolowania dostępu do bazy danych lub danych Cloud Storage, co odbywa się za pomocą reguł bezpieczeństwa Firebase . Z tego powodu nie musisz traktować kluczy API usług Firebase jako sekretów i możesz bezpiecznie osadzić je w kodzie klienta. Dowiedz się więcej o kluczach API dla Firebase .

Skonfiguruj zakres kluczy API

Aby dodatkowo odstraszyć osobę atakującą próbującą użyć Twojego klucza API do sfałszowania żądań, możesz utworzyć klucze API obejmujące klientów 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

Również 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

Po skonfigurowaniu Cloud Firestore, Bazy danych czasu rzeczywistego i Cloud Storage zainicjuj reguły bezpieczeństwa, aby domyślnie odmawiać wszelkiego dostępu, i dodaj reguły, które przyznają dostęp do określonych zasobów w trakcie tworzenia aplikacji.

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

W przypadku Cloud Storage zacznij od konfiguracji reguł bezpieczeństwa podobnej do poniższej:

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

Reguły bezpieczeństwa są schematem; dodaj reguły podczas dodawania dokumentów

Nie pisz reguł bezpieczeństwa po napisaniu aplikacji, jako rodzaj zadania przed uruchomieniem. Zamiast tego pisz reguły bezpieczeństwa podczas pisania aplikacji, traktując je jak schemat bazy danych: za każdym razem, gdy musisz użyć nowego typu dokumentu lub struktury ścieżki, najpierw napisz jego regułę bezpieczeństwa.

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

Aby mieć pewność, że reguły bezpieczeństwa nadążają za rozwojem Twojej aplikacji, przetestuj jednostkowo swoje reguły za pomocą pakietu emulatorów Firebase i dodaj te testy do swojego potoku CI. Zobacz te przewodniki dotyczące Cloud Firestore i bazy danych czasu rzeczywistego .

Uwierzytelnianie

Uwierzytelnianie niestandardowe: twórz 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 strony trzeciej, możesz użyć istniejącego systemu do uwierzytelnienia w usługach Firebase. Utwórz niestandardowe JWT z zaufanego środowiska, a następnie przekaż tokeny swojemu klientowi, który używa tokena do uwierzytelnienia ( iOS+ , Android , Web , Unity , C++ ).

Przykład użycia niestandardowego uwierzytelniania u zewnętrznego dostawcy można znaleźć w poście na blogu Uwierzytelnianie w Firebase przy użyciu Okta .

Uwierzytelnianie zarządzane: dostawcy OAuth 2.0 są najbezpieczniejsi

Jeśli korzystasz z funkcji uwierzytelniania zarządzanego Firebase, opcje dostawcy OAuth 2.0 / OpenID Connect (Google, Facebook itp.) są najbezpieczniejsze. Jeśli możesz, 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 wąski limit dla punktu końcowego logowania, aby zapobiec atakom typu brute-force

Jeśli korzystasz z zarządzanej usługi uwierzytelniania za pomocą hasła e-mail 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 API w konsoli Google Cloud .

Uwierzytelnianie za pomocą hasła e-mail: Włącz ochronę wyliczeń e-maili

Jeśli korzystasz z zarządzanej usługi uwierzytelniania e-mail za pomocą hasła Firebase, włącz ochronę wyliczeń e-maili , która uniemożliwia złośliwym aktorom nadużywanie punktów końcowych uwierzytelniania Twojego projektu w celu odgadnięcia nazw kont.

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

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

Uwierzytelnianie anonimowe

Używaj anonimowego uwierzytelniania tylko w przypadku ciepłego wdrożenia

Używaj uwierzytelniania anonimowego tylko w celu zapisania podstawowego stanu użytkowników przed faktycznym zalogowaniem. Uwierzytelnianie anonimowe nie zastępuje logowania użytkownika.

Przekonwertuj użytkowników na inną metodę logowania, jeśli będą potrzebować danych, gdy zgubią telefon

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

Stosuj reguły bezpieczeństwa wymagające od użytkowników przejścia na dostawcę logowania lub zweryfikowania adresu e-mail

Każdy może założyć anonimowe konto w Twoim projekcie. Mając to na uwadze, chroń wszystkie niepubliczne dane za pomocą zasad 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

Konfigurowanie projektów deweloperskich i inscenizacyjnych

Skonfiguruj osobne projekty Firebase na potrzeby programowania, testowania i produkcji. Nie łącz 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ą predefiniowanych ról lub niestandardowych ról IAM.

Jeśli Twój zespół korzysta z pakietu emulatorów do programowania, być może nie będzie konieczne udzielanie szerszego dostępu do projektu produkcyjnego.

Zarządzanie biblioteką

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

Dodając biblioteki do 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

Przed aktualizacją przejrzyj dzienniki zmian wszystkich używanych bibliotek. Upewnij się, że aktualizacja dodaje wartość i sprawdź, czy opiekun nadal jest stroną, której ufasz.

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

Użyj biblioteki takiej jak Snyk, aby przeskanować projekt pod kątem niepewnych 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 nietypowych zachowaniach, w tym o zachowaniach spowodowanych aktualizacjami bibliotek.

Bezpieczeństwo funkcji chmury

Nigdy nie umieszczaj poufnych informacji w zmiennych środowiskowych Cloud Function

Często w samodzielnie hostowanej 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 wykorzystuje środowiska między wywołaniami funkcji, informacje poufne nie powinny być przechowywane w środowisku.

  • Aby przechowywać klucze API Firebase, które nie są tajne , wystarczy osadzić je w kodzie.
  • Jeśli używasz pakietu SDK administratora Firebase w funkcji chmury, nie musisz jawnie podawać danych uwierzytelniających konta usługi, ponieważ zestaw SDK może je automatycznie uzyskać podczas inicjalizacji.
  • Jeśli wywołujesz interfejsy API Google i Google Cloud, które wymagają danych uwierzytelniających konta usługi, biblioteka Google Auth dla Node.js może uzyskać te dane uwierzytelniające z domyślnych danych uwierzytelniających aplikacji , które są automatycznie wypełniane w Cloud Functions.
  • Aby udostępnić swoim Cloud Functions klucze prywatne i dane uwierzytelniające usług innych niż Google, użyj Cloud Secret Manager .

Szyfruj poufne informacje

Jeśli nie możesz uniknąć przekazywania poufnych informacji do swojej funkcji w chmurze, 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 chmury 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.