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

Liste de contrôle de sécurité Firebase

Pour assurer la sécurité de vos ressources Firebase et des données de vos utilisateurs, suivez ces instructions. Tous les éléments ne s'appliqueront pas nécessairement à vos besoins, mais gardez-les à l'esprit lorsque vous développez votre application.

Éviter le trafic abusif

Configurer la surveillance et les alertes pour les services backend

Pour détecter le trafic abusif, tel que les attaques par déni de service (DOS), configurez la surveillance et les alertes pour Cloud Firestore , Realtime Database , Cloud Storage et Hosting

Si vous soupçonnez une attaque contre votre application, contactez l'assistance dès que possible pour l'informer de ce qui se passe.

Activer la vérification des applications

Pour vous assurer que seules vos applications peuvent accéder à vos services principaux, activez App Check pour chaque service qui le prend en charge.

Configurez vos fonctions Cloud pour qu'elles s'adaptent au trafic normal

Cloud Functions évolue automatiquement pour répondre aux demandes de votre application, mais en cas d'attaque, cela peut représenter une grosse facture. Pour éviter cela, vous pouvez limiter le nombre d'instances simultanées d'une fonction en fonction du trafic normal de votre application.

Configurer des alertes pour être averti lorsque les limites sont presque atteintes

Si votre service présente des pics de demandes, les quotas entrent souvent en vigueur et limitent automatiquement le trafic vers votre application. Assurez-vous de surveiller votre tableau de bord d'utilisation et de facturation , mais vous pouvez également définir des alertes budgétaires sur votre projet pour être averti lorsque l'utilisation des ressources dépasse les attentes.

Empêcher les auto-DOS : tester les fonctions en local avec les émulateurs

Il peut être facile de se DOS accidentellement lors du développement de Cloud Functions : par exemple, en créant une boucle d'écriture de déclenchement infinie. Vous pouvez éviter que ces erreurs n'affectent les services en direct en effectuant votre développement avec la suite d'émulateurs Firebase .

(Et si vous effectuez vous-même un DOS accidentellement, firebase deploy --only functions votre fonction en la supprimant de index.js puis en exécutant firebase deploy --only functions .)

Là où la réactivité en temps réel est moins importante, la structure fonctionne de manière défensive

Si vous n'avez pas besoin de présenter le résultat d'une fonction en temps réel, vous pouvez atténuer le trafic abusif en traitant les résultats par lots : publiez les résultats dans un sujet Pub/Sub et traitez les résultats à intervalles réguliers avec une fonction planifiée .

Comprendre les clés API

Les clés API pour les services Firebase ne sont pas secrètes

Firebase utilise des clés API uniquement pour identifier le projet Firebase de votre application auprès des services Firebase, et non pour contrôler l'accès à la base de données ou aux données Cloud Storage, ce qui est effectué à l'aide des règles de sécurité Firebase . Pour cette raison, vous n'avez pas besoin de traiter les clés API des services Firebase comme des secrets et vous pouvez les intégrer en toute sécurité dans le code client. En savoir plus sur les clés API pour Firebase .

Configurer la portée de la clé API

Comme moyen de dissuasion supplémentaire contre un attaquant tentant d'utiliser votre clé API pour usurper des requêtes, vous pouvez créer des clés API limitées à vos clients d'application .

Garder les clés du serveur FCM secrètes

Contrairement aux clés API pour les services Firebase, les clés de serveur FCM (utilisées par l' ancienne API HTTP FCM ) sont sensibles et doivent rester secrètes.

Garder les clés de compte de service secrètes

De plus, contrairement aux clés API pour les services Firebase, les clés privées de compte de service (utilisées par le SDK Admin ) sont sensibles et doivent rester secrètes.

Règles de sécurité

Initialiser les règles en production ou en mode verrouillé

Lorsque vous configurez Cloud Firestore, Realtime Database et Cloud Storage, initialisez vos règles de sécurité pour refuser tout accès par défaut et ajoutez des règles qui accordent l'accès à des ressources spécifiques au fur et à mesure que vous développez votre application.

C'est l'un des paramètres par défaut pour les nouvelles instances de Cloud Firestore (mode de production) et Realtime Database (mode verrouillé). Choisissez cette option lors de la configuration d'une nouvelle instance de base de données.

Pour Cloud Storage, commencez par une configuration de règles de sécurité comme celle-ci :

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

Les règles de sécurité sont un schéma ; ajouter des règles lorsque vous ajoutez des documents

N'écrivez pas de règles de sécurité après avoir écrit votre application, comme une sorte de tâche de pré-lancement. Au lieu de cela, écrivez des règles de sécurité lorsque vous écrivez votre application, en les traitant comme un schéma de base de données : chaque fois que vous devez utiliser un nouveau type de document ou une nouvelle structure de chemin, écrivez d'abord sa règle de sécurité.

Règles de sécurité des tests unitaires avec Emulator Suite ; l'ajouter à CI

Pour vous assurer que vos règles de sécurité suivent le développement de votre application, testez vos règles unitairement avec la suite d'émulateurs Firebase et ajoutez ces tests à votre pipeline CI. Consultez ces guides pour Cloud Firestore et Realtime Database .

Authentification

Authentification personnalisée : mint JWT à partir d'un environnement de confiance (côté serveur)

Si vous disposez déjà d'un système de connexion sécurisé, qu'il s'agisse d'un système personnalisé ou d'un service tiers, vous pouvez utiliser votre système existant pour vous authentifier auprès des services Firebase. Créez des JWT personnalisés à partir d'un environnement de confiance, puis transmettez les jetons à votre client, qui utilise le jeton pour s'authentifier ( iOS , Android , Web , Unity , C++ ).

Pour un exemple d'utilisation de l'authentification personnalisée avec un fournisseur tiers, consultez l'article de blog, Authenticate with Firebase using Okta .

Authentification gérée : les fournisseurs OAuth 2.0 sont les plus sécurisés

Si vous utilisez les fonctionnalités d'authentification gérées de Firebase, les options du fournisseur OAuth 2.0 / OpenID Connect (Google, Facebook, etc.) sont les plus sécurisées. Vous devez prendre en charge un ou plusieurs de ces fournisseurs si vous le pouvez (en fonction de votre base d'utilisateurs).

Authentification par mot de passe de messagerie : définissez un quota strict pour le point de terminaison de connexion afin d'empêcher les attaques par force brute

Si vous utilisez le service d'authentification par mot de passe de messagerie géré de Firebase, resserrez le quota par défaut des points de terminaison identitytoolkit.googleapis.com pour empêcher les attaques par force brute. Vous pouvez le faire à partir dela page del'API dans Google Cloud Console .

Mettre à niveau vers Cloud Identity Platform pour une authentification multifacteur

Pour plus de sécurité lors de la connexion, vous pouvez ajouter la prise en charge de l'authentification multifacteur en passant à Cloud Identity Platform . Votre code d'authentification Firebase existant continuera de fonctionner après la mise à niveau.

Authentification anonyme

Utilisez uniquement l'authentification anonyme pour l'intégration à chaud

Utilisez uniquement l'authentification anonyme pour enregistrer l'état de base des utilisateurs avant qu'ils ne se connectent réellement. L'authentification anonyme ne remplace pas la connexion des utilisateurs.

Convertissez les utilisateurs vers une autre méthode de connexion s'ils veulent les données lorsqu'ils perdent leur téléphone

Les données d'authentification anonymes ne persisteront pas si l'utilisateur efface le stockage local ou change d'appareil. Si vous devez conserver les données au-delà du redémarrage de l'application sur un seul appareil, convertissez l'utilisateur en compte permanent .

Utilisez des règles de sécurité qui exigent que les utilisateurs se soient convertis en un fournisseur de connexion ou aient vérifié leur e-mail

Tout le monde peut créer un compte anonyme dans votre projet. Dans cet esprit, protégez toutes les données non publiques avec des règles de sécurité qui nécessitent des méthodes de connexion spécifiques ou des adresses e-mail vérifiées .

Par example:

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

Gestion de l'environnement

Mettre en place des projets de développement et de mise en scène

Configurez des projets Firebase distincts pour le développement, la préparation et la production. Ne fusionnez pas le code client avec la production tant qu'il n'a pas été testé par rapport au projet intermédiaire.

Limiter l'accès de l'équipe aux données de production

Si vous travaillez avec une équipe plus importante, vous pouvez atténuer les conséquences des erreurs et des violations en limitant l'accès aux données de production à l'aide de rôles prédéfinis ou de rôles IAM personnalisés.

Si votre équipe utilise la suite d'émulateurs pour le développement, vous n'aurez peut-être pas besoin d'accorder un accès plus large au projet de production.

Gestion de la bibliothèque

Méfiez-vous des fautes d'orthographe de la bibliothèque ou des nouveaux mainteneurs

Lorsque vous ajoutez des bibliothèques à votre projet, faites très attention au nom de la bibliothèque et de ses mainteneurs. Une bibliothèque du même nom que celle que vous avez l'intention d'installer peut contenir du code malveillant.

Ne mettez pas à jour les bibliothèques sans comprendre les changements

Consultez les journaux des modifications de toutes les bibliothèques que vous utilisez avant de procéder à la mise à niveau. Assurez-vous que la mise à niveau ajoute de la valeur et vérifiez que le mainteneur est toujours une partie en qui vous avez confiance.

Installer des bibliothèques de surveillance en tant que dépendances de développement ou de test

Utilisez une bibliothèque telle que Snyk pour analyser votre projet à la recherche de dépendances non sécurisées.

Configurer la surveillance des fonctions ; vérifiez-le après les mises à jour de la bibliothèque

Si vous utilisez le SDK Cloud Functions logger , vous pouvez surveiller et être alerté des comportements inhabituels, y compris les comportements provoqués par les mises à jour de la bibliothèque.

Sécurité de la fonction Cloud

Ne jamais mettre d'informations sensibles dans les variables d'environnement d'une fonction Cloud

Souvent, dans une application Node.js auto-hébergée, vous utilisez des variables d'environnement pour contenir des informations sensibles telles que des clés privées. Ne faites pas cela dans Cloud Functions . Étant donné que Cloud Functions réutilise les environnements entre les appels de fonction, les informations sensibles ne doivent pas être stockées dans l'environnement.

  • Pour stocker les clés API Firebase, qui ne sont pas secrètes , il suffit de les intégrer dans le code.
  • Si vous utilisez le SDK Firebase Admin dans une fonction cloud, vous n'avez pas besoin de fournir explicitement les informations d'identification du compte de service, car le SDK peut les acquérir automatiquement lors de l'initialisation.
  • Si vous appelez des API Google et Google Cloud qui nécessitent des informations d'identification de compte de service, la bibliothèque Google Auth pour Node.js peut obtenir ces informations d'identification à partir des informations d'identification par défaut de l' application , qui sont automatiquement renseignées dans Cloud Functions.
  • Pour mettre des clés privées et des identifiants de services non Google à la disposition de vos fonctions Cloud, utilisez Cloud Secret Manager .

Crypter les informations sensibles

Si vous ne pouvez pas éviter de transmettre des informations sensibles à votre fonction Cloud, vous devez proposer votre propre solution personnalisée pour chiffrer les informations.

Les fonctions simples sont plus sûres ; si vous avez besoin de complexité, pensez à Cloud Run

Essayez de garder vos fonctions Cloud aussi simples et compréhensibles que possible. La complexité de vos fonctions peut souvent conduire à des bogues difficiles à repérer ou à un comportement inattendu.

Si vous avez besoin de configurations logiques ou d'environnement complexes, envisagez d'utiliser Cloud Run au lieu de Cloud Functions.