Sigue estos lineamientos para mantener seguros tus recursos de Firebase y los datos de los usuarios. No todos los elementos se aplicarán siempre a tus requisitos, pero tenlos en cuenta cuando desarrolles la app.
Evita el tráfico abusivo
Configura la supervisión y las alertas para los servicios de backend
Para detectar tráfico abusivo, como ataques de denegación del servicio (DoS), configura la supervisión y las alertas de Cloud Firestore, Realtime Database, Cloud Storage y Hosting.
Si sospechas que tu aplicación está siendo atacada, comunícate con el equipo de asistencia lo antes posible para informarle lo que sucede.
Habilita App Check
Para garantizar que solo tus apps puedan acceder a los servicios de backend, habilita Firebase App Check en todos los servicios que la admitan.
Configura Cloud Functions para ajustar la escala para lidiar con el tráfico normal
Cloud Functions se escala automáticamente para satisfacer las demandas de tu app, pero en el caso de un ataque, esto puede causar que recibas una gran factura. Para evitar que suceda, puedes limitar la cantidad de instancias simultáneas de una función según el tráfico normal de la app.
Configura alertas para recibir notificaciones cuando los límites estén a punto de alcanzarse
Si tu servicio tiene aumentos de solicitudes, por lo general, se activan las cuotas y limitan automáticamente el tráfico a la aplicación. Asegúrate de supervisar el panel Uso y facturación, pero también puedes configurar alertas de presupuesto en tu proyecto para recibir notificaciones cuando el uso de recursos exceda lo esperado.
Evita generar DoS: prueba las funciones localmente con los emuladores.
Puede ser fácil generar una DoS para tu aplicación de forma accidental mientras desarrollas Cloud Functions. Por ejemplo, puedes crear un bucle de activación y escritura infinito. Para evitar que estos errores afecten los servicios en ejecución, realiza el desarrollo con Firebase Local Emulator Suite.
Y si generas accidentalmente una DoS, anula la implementación de tu función; para ello, bórrala
de index.js
y, luego, ejecuta
firebase deploy --only functions
Cuando la capacidad de respuesta en tiempo real es menos importante, estructura las funciones de manera defensiva
Si no necesitas presentar el resultado de una función en tiempo real, puedes mitigar el tráfico abusivo a través del procesamiento de los resultados en lotes. Para ello, publica los resultados en un tema Pub/Sub y procesa los resultados en intervalos regulares con una función programada.
Información sobre las claves de API
Las claves de API de los servicios de Firebase no son secretas
Firebase usa las claves de API solo para que los servicios de Firebase identifiquen el proyecto de Firebase de tu app y no para controlar el acceso a los datos de Cloud Storage o la base de datos, lo que se hace con Firebase Security Rules. Por este motivo, no necesitas tratar las claves de API para servicios de Firebase como secretos y puedes incorporarlas de forma segura en el código del cliente. Obtén más información sobre las claves de API para Firebase.
Configura restricciones de claves de API
Como medida de seguridad adicional contra un atacante que intenta usar tu clave de API para falsificar solicitudes, puedes agregar restricciones de claves de API para limitar tus claves de API a los clientes de tu app y las APIs que usas.
Mantén las claves de servidor de FCM en secreto
A diferencia de las claves de API para los servicios de Firebase, las claves de servidor de FCM (que usa la API de HTTP para FCM heredado) son sensibles y deben mantenerse en secreto.
Mantén las claves de cuentas de servicio en secreto
A diferencia de las claves de API para los servicios de Firebase, las claves privadas de cuentas de servicio (que usa el Firebase Admin SDK) son sensibles y deben mantenerse en secreto.
Firebase Security Rules
Inicializa reglas en modo de producción o bloqueado
Cuando configures Cloud Firestore, Realtime Database y Cloud Storage, inicializa las reglas de seguridad para denegar todo el acceso de forma predeterminada y agrega reglas que otorguen acceso a recursos específicos a medida que desarrollas tu app.
Usa uno de los parámetros de configuración predeterminados para instancias nuevas de Cloud Firestore (modo de producción) y Realtime Database (modo bloqueado). Para Cloud Storage, comienza con una configuración de reglas de seguridad como la siguiente:
rules_version = '2';
service firebase.storage {
match /b/{bucket}/o {
match /{allPaths=**} {
allow read, write: if false;
}
}
}
Las reglas de seguridad son un esquema; agrega reglas cuando incluyas documentos
No escribas reglas de seguridad después de escribir tu app, como un tipo de tarea previa al lanzamiento. En su lugar, escribe reglas de seguridad a medida que escribes la app y trátalas como un esquema de base de datos: cada vez que debas usar un nuevo tipo de documento o estructura de ruta de acceso, primero escribe su regla de seguridad.
Realiza pruebas de unidades en las reglas de seguridad con Local Emulator Suite y agrégalas a CI
Para asegurarte de que las reglas de seguridad se mantengan al día con el desarrollo de tu app, realiza pruebas de unidades con Firebase Local Emulator Suite y agrega estas pruebas a la canalización de CI. Consulta estas guías para Cloud Firestore y Realtime Database.
Autenticación
Autenticación personalizada: crea JWT a partir de un entorno de confianza (del servidor)
Si ya tienes un sistema de acceso seguro, ya sea un sistema personalizado o un servicio de terceros, puedes usarlo para la autenticación con servicios de Firebase. Crea JWT personalizados a partir de un entorno de confianza y, luego, pasa los tokens a tu cliente, que usa el token para autenticarse (iOS+, Android, Web, Unity y C++).
Para ver un ejemplo de cómo usar la autenticación personalizada con un proveedor externo, consulta la entrada de blog Usa Okta para autenticar con Firebase.
Autenticación administrada: los proveedores de OAuth 2.0 son los más seguros
Si usas las funciones de autenticación administrada de Firebase, las opciones del proveedor de OAuth 2.0 o de OpenID Connect (Google, Facebook, etc.) son las más seguras. Si es posible, deberías admitir uno o más de estos proveedores (según tu base de usuarios).
Autenticación mediante correo electrónico y contraseña: establece una cuota estricta para el extremo de acceso a fin de evitar ataques de fuerza bruta
Si usas el servicio de autenticación administrada mediante correo electrónico y contraseña de Firebase, ajusta la cuota
predeterminada de los extremos identitytoolkit.googleapis.com
para evitar ataques de
fuerza bruta. Puedes hacerlo desde la
página API de Identity Toolkit
en la consola de Google Cloud.
Autenticación con correo electrónico y contraseña: Habilita la protección de enumeración de correo electrónico
Si usas el servicio de autenticación administrada con correo electrónico y contraseña de Firebase, habilita la protección de enumeración de correo electrónico si quieres evitar que usuarios maliciosos abusen de los extremos de autenticación de tu proyecto para adivinar los nombres de las cuentas.
Actualiza a Google Cloud Identity Platform para usar la autenticación de varios factores
Si deseas obtener mayor seguridad durante el acceso, actualiza a Google Cloud Identity Platform para agregar compatibilidad con la autenticación de varios factores. Tu código Firebase Authentication existente seguirá funcionando después de la actualización.
Autenticación anónima
Utiliza la autenticación anónima solo para preparar la integración
Usa la autenticación anónima solo para guardar el estado básico de los usuarios antes de que accedan. La autenticación anónima no reemplaza el acceso de los usuarios.
Cambia los usuarios a otro método de acceso si quieren conservar sus datos en otros dispositivos
Los datos de autenticación anónima no se conservarán si el usuario borra el almacenamiento local o cambia de dispositivo. Si necesitas conservar datos no solo en los reinicios de la app en un único dispositivo, cambia al usuario a una cuenta permanente.
Usa reglas de seguridad que requieran que los usuarios se hayan cambiado a un proveedor de acceso o que hayan verificado su correo electrónico
Cualquier persona puede crear una cuenta anónima en tu proyecto. Con esta información en mente, protege todos los datos no públicos con reglas de seguridad que requieran métodos de acceso específicos o direcciones de correo electrónico verificadas.
Por ejemplo:
allow write: if request.auth.token.firebase.sign_in_provider != "anonymous";
allow write: if request.auth.token.email_verified = true;
Seguridad de Cloud Functions
Nunca coloques información sensible en las variables de entorno
A menudo, en una app de Node.js autoalojada, usarás variables de entorno para contener la información sensible, como claves privadas. No lo hagas en Cloud Functions. Dado que Cloud Functions reutiliza los entornos entre invocaciones de funciones, la información sensible no se debe almacenar en el entorno.
Para almacenar las claves de API de Firebase (que no son secretas), solo incorpóralas en el código.
Si usas Firebase Admin SDK en Cloud Functions, no es necesario que proporciones de manera explícita las credenciales de la cuenta de servicio, ya que Admin SDK puede adquirirlas automáticamente durante la inicialización.
Si llamas a las APIs de Google y Google Cloud que requieren credenciales de la cuenta de servicio, la biblioteca de Google Auth para Node.js puede obtenerlas de las credenciales predeterminadas de la aplicación, que se propagan automáticamente en Cloud Functions.
Si quieres que las claves privadas y las credenciales de servicios que no son de Google estén disponibles para Cloud Functions, usa Secret Manager.
Encripta la información sensible
Si no puedes evitar pasar información sensible a las funciones, debes crear tu propia solución personalizada para encriptar la información.
Las funciones simples son más seguras. Si necesitas complejidad, considera usar Cloud Run
Intenta que tus funciones sean lo más básicas y comprensibles posible. A menudo, la complejidad de las funciones puede generar errores difíciles de detectar o comportamientos inesperados.
Si necesitas configuraciones complejas de entorno o lógica, considera usar Cloud Run en lugar de Cloud Functions.
Administración del entorno
Configura proyectos de desarrollo y de etapa de pruebas
Configura proyectos de Firebase independientes para el desarrollo, la etapa de pruebas y la producción. No combines el código de cliente en la producción hasta que se pruebe en el proyecto de etapa de pruebas.
Limita el acceso del equipo a los datos de producción
Si trabajas con un equipo más grande, puedes mitigar las consecuencias de los errores y los incumplimientos; para ello, limita el acceso a los datos de producción con roles predefinidos de IAM o roles personalizados de IAM.
Si tu equipo usa Firebase Local Emulator Suite (recomendado) para el desarrollo, es posible que no necesites otorgar un acceso más amplio al proyecto de producción.
Administración de las bibliotecas
Presta atención a los encargados de mantenimiento nuevos o las faltas de ortografía de las bibliotecas.
Cuando agregues bibliotecas a tu proyecto, presta mucha atención a su nombre y a sus encargados de mantenimiento. Una biblioteca con un nombre similar al de la que intentas instalar podría contener código malicioso.
No actualices bibliotecas si no comprendes los cambios
Revisa los registros de cambios de las bibliotecas que usas antes de realizar la actualización. Asegúrate de que la actualización agregue valor y verifica que el encargado de mantenimiento aún sea alguien de confianza.
Instala bibliotecas de perro guardián como dependencias de desarrollo o prueba
Usa una biblioteca como Snyk para analizar tu proyecto en busca de dependencias inseguras.
Configura la supervisión de Cloud Functions; revísala después de realizar actualizaciones en la biblioteca
Si usas el SDK del registrador de Cloud Functions, entonces puedes supervisar y recibir alertas de comportamiento inusual, incluido el comportamiento causado por las actualizaciones de la biblioteca.