Aby zapewnić bezpieczeństwo zasobów Firebase i danych użytkowników, postępuj zgodnie z tymi wskazówkami. Nie każdy element musi spełniać Twoje wymagania, ale pamiętaj o nich podczas opracowywania aplikacji.
Unikaj niewłaściwego ruchu
Skonfiguruj monitorowanie i alerty dla usług zaplecza
Aby wykrywać nadużycia w ruchu, takie jak ataki typu „odmowa usługi” (DOS), skonfiguruj monitorowanie i alerty dla Cloud Firestore , Realtime Database , Cloud Storage i Hosting
Jeśli podejrzewasz atak na swoją 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 Twoich usług zaplecza, włącz Sprawdzanie aplikacji dla każdej usługi, która to obsługuje.
Skonfiguruj funkcje Cloud Functions, aby skalowały się pod kątem normalnego ruchu
Cloud Functions automatycznie skaluje się, aby sprostać wymaganiom 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 są bliskie osiągnięcia
Jeśli Twoja usługa ma skoki żądań, często uruchamiane są limity i automatycznie ograniczają ruch do Twojej aplikacji. Pamiętaj, aby monitorować pulpit nawigacyjny użycia i rozliczeń , ale możesz także ustawić alerty budżetowe w swoim projekcie, aby otrzymywać powiadomienia, gdy wykorzystanie zasobów przekroczy oczekiwania.
Zapobiegaj samo-DOS-om: testuj funkcje lokalnie za pomocą emulatorów
Podczas opracowywania funkcji Cloud Functions można łatwo przypadkowo uruchomić DOS, na przykład tworząc nieskończoną pętlę wyzwalania i zapisu. Możesz zapobiec wpływowi tych błędów na usługi na żywo, wykonując programowanie za pomocą pakietu emulatorów Firebase .
(A jeśli sam przypadkowo wykonasz DOS, wycofaj swoją funkcję, usuwając ją z index.js
, a następnie uruchamiając
.)
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ć nadużycia, 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 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ł bezpieczeństwa Firebase . Z tego powodu nie musisz traktować kluczy API dla usług Firebase jako sekretów i możesz je bezpiecznie osadzać w kodzie klienta. Dowiedz się więcej o kluczach API dla Firebase .
Skonfiguruj zakres klucza interfejsu API
Jako dodatkowy środek odstraszający atakującego próbującego użyć Twojego klucza API do podszywania się pod żądania, możesz utworzyć klucze API o zasięgu obejmującym klientów Twojej aplikacji .
Zachowaj klucze serwera FCM w tajemnicy
W przeciwieństwie do kluczy API dla usług Firebase, klucze serwera FCM (używane przez starsze API HTTP FCM ) są wrażliwe i muszą być utrzymywane w tajemnicy.
Zachowaj klucze konta usługi w tajemnicy
W przeciwieństwie do kluczy API dla usług Firebase, klucze prywatne konta usługi (używane przez pakiet Admin SDK ) są 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 bezpieczeństwa, aby domyślnie odmawiać wszelkiego dostępu, i dodaj reguły, które przyznają dostęp do określonych zasobów podczas opracowywania 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, takiej jak ta:
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ł 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: zawsze, gdy potrzebujesz 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 upewnić się, że Twoje reguły bezpieczeństwa nadążają za rozwojem Twojej aplikacji, przetestuj swoje reguły w pakiecie emulatorów Firebase i dodaj te testy do swojego potoku CI. Zobacz te przewodniki dotyczące Cloud Firestore i Realtime Database .
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 innej firmy, możesz użyć istniejącego systemu do uwierzytelnienia w usługach Firebase. Utwórz niestandardowe tokeny JWT z zaufanego środowiska, a następnie przekaż tokeny klientowi, który używa tokenu do uwierzytelnienia ( iOS+ , Android , Web , Unity , C++ ).
Aby zapoznać się z przykładem użycia niestandardowego uwierzytelniania z dostawcą zewnętrznym, zobacz wpis na blogu, Uwierzytelnianie za pomocą 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 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 ścisły limit dla punktu końcowego logowania, aby zapobiec atakom siłowym
Jeśli korzystasz z zarządzanej usługi uwierzytelniania za pomocą hasła poczty e-mail Firebase, zmniejsz domyślny limit punktów końcowych identitytoolkit.googleapis.com
, aby zapobiec atakom siłowym. Możesz to zrobić na stronie interfejsu API w Google Cloud Console .
Uwierzytelnianie za pomocą hasła e-mail: Włącz ochronę wyliczania wiadomości e-mail
Jeśli korzystasz z zarządzanej usługi uwierzytelniania haseł poczty e-mail Firebase, włącz ochronę wyliczania wiadomości e-mail , która zapobiega nadużywaniu przez złośliwe podmioty punktów końcowych uwierzytelniania Twojego projektu w celu odgadywania nazw kont.
Przejdź na platformę Cloud Identity, aby korzystać z uwierzytelniania wieloskładnikowego
Aby zapewnić dodatkowe bezpieczeństwo podczas logowania, możesz dodać obsługę uwierzytelniania wieloskładnikowego, przechodząc na platformę Cloud Identity . Twój istniejący kod uwierzytelniania Firebase będzie nadal działał po uaktualnieniu.
Uwierzytelnianie anonimowe
Uwierzytelniania anonimowego używaj tylko do ciepłego wdrażania
Uwierzytelniania anonimowego używaj tylko do zapisywania podstawowego stanu 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, 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, przekształć użytkownika w konto stałe .
Używaj reguł bezpieczeństwa, które wymagają, aby użytkownicy przeszli na dostawcę logowania lub zweryfikowali swój adres e-mail
Każdy może utworzyć anonimowe konto w Twoim projekcie. Mając to na uwadze, chroń wszystkie niepubliczne dane 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 rozwojowe i etapowe
Skonfiguruj osobne projekty Firebase do programowania, testowania i produkcji. Nie scalaj kodu klienta z produkcją, dopóki nie zostanie przetestowany pod kątem projektu przejściowego.
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ół używa pakietu emulatorów do programowania, być może nie musisz udzielać szerszego dostępu do projektu produkcyjnego.
Zarządzanie biblioteką
Uważaj na błędy ortograficzne w bibliotece lub na 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ć szkodliwy 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 nadzorujące jako zależności deweloperskie lub testowe
Użyj biblioteki, takiej jak Snyk , aby przeskanować swój projekt pod kątem niezabezpieczonych zależności.
Skonfiguruj monitorowanie funkcji; sprawdź to po aktualizacji biblioteki
Jeśli używasz pakietu SDK rejestratora Cloud Functions , możesz monitorować i otrzymywać powiadomienia o nietypowym zachowaniu, w tym o zachowaniu spowodowanym aktualizacjami biblioteki.
Bezpieczeństwo funkcji Cloud
Nigdy nie umieszczaj poufnych informacji w zmiennych środowiskowych Funkcji w chmurze
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, poufne informacje nie powinny być przechowywane w środowisku.
- Aby przechowywać klucze Firebase API, które nie są tajne , wystarczy osadzić je w kodzie.
- Jeśli używasz pakietu Firebase Admin SDK w funkcji Cloud, nie musisz jawnie podawać danych logowania do konta usługi, ponieważ pakiet SDK może je automatycznie uzyskać podczas inicjalizacji.
- Jeśli wywołujesz Google i Google Cloud API, które wymagają danych logowania konta usługi, biblioteka Google Auth dla Node.js może uzyskać te dane logowania z domyślnych danych logowania aplikacji , które są automatycznie wypełniane w Cloud Functions.
- Aby udostępnić swoim 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 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
Postaraj się, aby Twoje Cloud Functions były jak najprostsze i zrozumiałe. 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.