Arreglar reglas inseguras

Utilice esta guía para comprender las vulnerabilidades comunes en las configuraciones de las reglas de seguridad de Cloud Firestore, revisar y proteger mejor sus propias reglas y probar los cambios antes de implementarlos.

Si recibe una alerta de que su base de datos de Cloud Firestore no está protegida adecuadamente, puede resolver las vulnerabilidades modificando y probando sus reglas de seguridad de Cloud Firestore.

Para ver sus reglas de seguridad existentes, vaya a la pestaña Reglas en Firebase console.

Comprenda las reglas de seguridad de Cloud Firestore

Las reglas de seguridad de Cloud Firestore protegen sus datos de usuarios malintencionados. Las reglas predeterminadas para cualquier instancia de Cloud Firestore creada en Firebase console niegan el acceso a todos los usuarios. Para desarrollar su aplicación y acceder a su base de datos, deberá modificar esas reglas y podría considerar otorgar acceso general a todos los usuarios en un entorno de desarrollo. Sin embargo, antes de implementar su aplicación en un entorno de producción, tómese el tiempo para configurar adecuadamente sus reglas y proteger sus datos.

Mientras desarrolla su aplicación y prueba diferentes configuraciones para sus reglas, use el emulador de Cloud Firestore para ejecutar su aplicación en un entorno de desarrollo local.

Escenarios comunes con reglas inseguras

Las reglas de seguridad de Cloud Firestore que haya configurado de forma predeterminada o cuando trabajó inicialmente en el desarrollo de su aplicación con Cloud Firestore deben revisarse y actualizarse antes de implementar su aplicación. Asegúrese de proteger adecuadamente los datos de sus usuarios evitando los siguientes errores comunes.

Acceso abierto

Al configurar Cloud Firestore, es posible que haya establecido sus reglas para permitir el acceso abierto durante el desarrollo. Podrías pensar que eres la única persona que utiliza tu aplicación, pero si la has implementado, estará disponible en Internet. Si no está autenticando usuarios ni configurando reglas de seguridad, cualquiera que adivine el ID de su proyecto puede robar, modificar o eliminar los datos.

No recomendado: Acceso de lectura y escritura para todos los usuarios.
// Allow read/write access to all users under any conditions
// Warning: **NEVER** use this rule set in production; it allows
// anyone to overwrite your entire database.

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}
Solución: Reglas que restringen el acceso de lectura y escritura.

Cree reglas que tengan sentido para su jerarquía de datos. Una de las soluciones comunes a esta inseguridad es la seguridad basada en el usuario con Firebase Authentication. Obtenga más información sobre cómo autenticar usuarios con reglas .

Solo propietario del contenido

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow only authenticated content owners access
    match /some_collection/{document} {
      allow read, write: if request.auth != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Acceso mixto público y privado

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow write: if request.auth != null && request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Acceso para cualquier usuario autenticado

A veces, las reglas de seguridad de Cloud Firestore verifican que un usuario haya iniciado sesión, pero no restringen aún más el acceso según esa autenticación. Si una de sus reglas incluye auth != null , confirme que desea que cualquier usuario que haya iniciado sesión tenga acceso a los datos.

No recomendado: cualquier usuario que haya iniciado sesión tiene acceso de lectura y escritura a toda su base de datos.
service cloud.firestore {
  match /databases/{database}/documents {
    match /some_collection/{document} {
      allow read, write: if request.auth != null;
    }
  }
}
Solución: Acceso restringido utilizando condiciones de seguridad.

Cuando verifica la autenticación, es posible que también desee utilizar una de las propiedades de autenticación para restringir aún más el acceso a usuarios específicos para conjuntos de datos específicos. Obtenga más información sobre cómo agregar condiciones de seguridad y acceso basado en roles .

Acceso basado en roles

service cloud.firestore {
  match /databases/{database}/documents {
    // Assign roles to all users and refine access based on user roles
    match /some_collection/{document} {
     allow read: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Reader"
     allow write: if request.auth != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == "Writer"

     // Note: Checking for roles in your database using `get` (as in the code
     // above) or `exists` carry standard charges for read operations.
    }
  }
}

Acceso basado en atributos

// Give each user in your database a particular attribute
// and set it to true/false
// Then, use that attribute to grant access to subsets of data
// For example, an "admin" attribute set
// to "true" grants write access to data

service cloud.firestore {
  match /databases/{database}/documents {
    match /collection/{document} {
      allow write: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true;
      allow read: true;
    }
  }
}
  

Acceso mixto público y privado

service cloud.firestore {
  match /databases/{database}/documents {
    // Allow public read access, but only content owners can write
    match /some_collection/{document} {
      allow read: if true
      allow write: if request.auth.uid == request.resource.data.author_uid
    }
  }
}
  

Acceso cerrado

Mientras desarrolla su aplicación, otro enfoque común es mantener sus datos bloqueados. Normalmente, esto significa que ha cerrado el acceso de lectura y escritura a todos los usuarios, de la siguiente manera:

// Deny read/write access to all users under any conditions
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Los SDK de Firebase Admin y las funciones de nube aún pueden acceder a su base de datos. Utilice estas reglas cuando desee utilizar Cloud Firestore como backend solo de servidor junto con el SDK de Firebase Admin. Si bien es seguro, debes probar que los clientes de tu aplicación puedan recuperar datos correctamente.

Obtenga más información sobre las reglas de seguridad de Cloud Firestore y cómo funcionan en Introducción a las reglas de seguridad de Cloud Firestore .

Verifique las reglas de seguridad de Cloud Firestore

Para verificar el comportamiento de su aplicación y verificar las configuraciones de sus reglas de seguridad de Cloud Firestore, use el emulador de Cloud Firestore . Utilice el emulador de Cloud Firestore para ejecutar y automatizar pruebas unitarias en un entorno local antes de implementar cualquier cambio.

Para probar rápidamente sus reglas de seguridad de Cloud Firestore actualizadas en Firebase console, use la herramienta Rules Playground.

  1. Para abrir el Área de juegos de reglas, haga clic en el Área de juegos de reglas en la pestaña Reglas .
  2. En la configuración del área de juego de Reglas , seleccione opciones para su prueba, que incluyen:
    • Pruebas de lectura o escritura
    • Una ubicación específica en su base de datos, como ruta
    • Tipo de autenticación: usuario anónimo autenticado, no autenticado o una identificación de usuario específica
    • Datos específicos del documento a los que sus reglas hacen referencia específica (por ejemplo, si sus reglas requieren la presencia de un campo específico antes de permitir una escritura)
  3. Haga clic en Ejecutar y busque los resultados en el banner encima de la ventana de reglas.