Las políticas de recursos de Atlas son controles que permiten a Organization Owners restringir las opciones de configuración específicas disponibles para los desarrolladores cuando crean o configuran clústeres de Atlas.
Nota
El Modelo de Responsabilidad Compartida de MongoDB Atlas define los deberes complementarios de MongoDB y sus clientes en el mantenimiento de un entorno de datos seguro y resiliente. Bajo este marco, MongoDB gestiona la seguridad y la integridad operativa de la plataforma subyacente, mientras que los clientes son responsables de la configuración, gestión y políticas de datos de sus implementaciones específicas. Para obtener un desglose detallado de la propiedad en materia de seguridad y excelencia operativa, consulta el Modelo de Responsabilidad Compartida.
Con las políticas de recursos, puedes:
Limita el número de clústeres que se pueden crear en un proyecto.
Limite la implementación de clústeres a plataformas específicas en la nube (AWS, Google Cloud, Azure).
Restringe la implementación del clúster a regiones designadas dentro de un proveedor de nube. Por ejemplo,
aws:us-east-1.Prohíbe el uso de la IP comodín (
0.0.0.0/0) para aplicar controles de red más estrictos.Prohíbe el tráfico a través de redes públicas al exigir que la lista de acceso IP permanezca vacía o al impedir la incorporación a una lista de acceso IP existente.
Nota
Si se añade el CIDR
0.0.0.0/0a la lista de acceso de un proyecto, Atlas envía un correo electrónico de alerta a todos los usuarios a los que se les haya otorgado un rol en el proyecto de forma directa o indirecta a través de la pertenencia al equipo (si al equipo se le otorga un rol en el proyecto).Exigir que un Proyecto tenga un periodo de mantenimiento configurado.
Evita modificaciones a VPC de emparejamiento y conexiones de nodos privados entre proveedores de nube.
Imponer una versión mínima de TLS o exigir una configuración específica del conjunto de cifrado TLS para las conexiones de clústeres.
Aplica los niveles mínimos y máximos de clúster y los tamaños de escalado automático en toda tu organización. Si está activada, esta política impide que los usuarios aprovisionen, actualicen o realicen el escalado automático clústeres a un nivel superior o inferior a un umbral especificado.
Exigir que los clusters particionados usen únicamente servidores de configuración dedicados en lugar de servidores de configuración integrados.
Aplicar un tamaño mínimo y máximo de disco para todos los clústeres.
Aplique el uso de una topología de clúster específica únicamente (set de réplicas, clúster o clúster global).
Aplicar un número mínimo y máximo de particiones para clústeres particionados.
Requerir la auditoría de la base de datos en todos los clústeres de un proyecto.
Se requieren claves administradas por el cliente para el cifrado en reposo en todos los clústeres de un proyecto.
Requerir Claves Gestionadas por el Cliente para el cifrado en reposo en todas las implementaciones de búsqueda dedicadas en un proyecto.
Importante
Por defecto, las Políticas de Recursos de Atlas son para toda la organización. Estas políticas aplican automáticamente estándares en todos los proyectos y clústeres de la organización.
Sin embargo, Atlas brinda flexibilidad. Puedes excluir proyectos específicos de una política de recursos de Atlas si es necesario. Esta funcionalidad permite que la mayoría de los proyectos hereden estándares coherentes en toda la organización, al mismo tiempo que posibilita excepciones para casos con requisitos únicos.
Además de la interfaz de usuario de Atlas y la API de administración de Atlas, puede usar el Proveedor de HashiCorp Terraform para MongoDB Atlas, los Recursos de MongoDB Atlas para AWS CloudFormation o AWS CloudFormation para configurar y gestionar las Políticas de Recursos de Atlas.
Nota
Para HashiCorp Terraform MongoDB Atlas proveedor, utiliza o 1.33.0 una versión posterior para imponer una versión mínima de TLS o requerir una configuración específica del grupo de cifrado TLS para conexiones a clústeres. Atlas podría bloquear las conexiones de versiones anteriores de Terraform.
Requisitos previos
Asegúrate de que tu usuario Atlas tenga el rol de organización adecuado:
Para ver las Políticas de Recursos de Atlas, debes tener al menos acceso
Organization Read OnlyoOrganization Membera Atlas.Para crear, actualizar o borrar una política de recursos de Atlas, debe tener acceso
Organization Ownera Atlas.
Para usar la API de administración de Atlas para crear o administrar las políticas de recursos de Atlas, localice las claves de API públicas y llaves privadas de API API para que pueda autenticarse en la API de administración de Atlas. Para obtener más información, consulta Cómo empezar con la API de administración de Atlas.
Limitaciones
Recomendamos encarecidamente que supervise de forma proactiva su lista de recursos no conformes utilizando el endpoint /orgs/{ORG-ID}/nonCompliantResources. Las Políticas de Recursos de Atlas garantizan el cumplimiento de objetivos definidos, pero no aplican estados intermedios o transicionales. Por ejemplo, si un componente posterior falla, la política podría entrar temporalmente en un estado intermedio no conforme.
Cada política de recursos de Atlas debe tener un nombre único. Si intentas crear una política de recursos de Atlas con un nombre existente, el servidor devuelve un código de estado
400 (Bad Request).Es posible crear Políticas de recursos Atlas idénticas con diferentes nombres. Si bien esto no causa conflictos funcionales, puede llevar a la redundancia y confusión en la gestión de políticas.
Las políticas de recursos de Atlas son permitir por defecto. Si no existen políticas de recursos de Atlas, los usuarios pueden realizar todas las acciones en los clusters de Atlas que permita su Atlas user role.
Nuestra versión implementada de lenguaje de políticas Cedar solo admite una política Cedar por archivo
.cedar, pero puedes enumerar varias políticas Cedar (archivos.cedar) en tu Política de recursos de Atlas. Cada archivo.cedarse identifica en la respuesta de la API de administración de Atlas como una unique 24-hexadecimal character string después depolicies.id.Si los límites de escalado automático en tu clúster existente no coinciden con la nueva Política de Recursos de Atlas, el clúster podría exceder los límites definidos por la política. Para abordar este problema, use el endpoint /orgs/{ORG-ID}/nonCompliantResources para identificar y supervisar los recursos que no cumplen, a fin de que puedan actualizarse para cumplir con los requisitos de la política.
Si los límites existentes de autoescalado superan una nueva política de recursos de Atlas, el clúster puede seguir escalar automáticamente más allá de los límites de la política. Sin embargo, no se puede escalar manualmente el clúster más allá de los límites de la política. Utiliza el endpoint /orgs/{ORG-ID}/nonCompliantResources para identificar y supervisar los recursos que no cumplan con los requisitos.
Antes de habilitar los controles de nivel de red, revisa tu lista de acceso IP existente para asegurarte de que incluiya todos los puntos de acceso necesarios.
Las definiciones de nodos privados en el lenguaje de políticas Cedar requieren que introduzcas direcciones IP individuales, ya que las operaciones de comodín no son compatibles.
Al aplicar el tamaño del disco, asegúrate de tener en cuenta los requisitos específicos de los tamaños de la instancia y los límites del proveedor de nube.
Si se exige un número mínimo de fragmentos mayor que uno, se debe permitir explícitamente el estado de transición para las conversiones de clúster en la política (por ejemplo,).
&& !context.cluster.isConvertingToShardedSin esta excepción, Atlas impide que los usuarios conviertan un conjunto de réplicas en un clúster fragmentado, ya que el proceso de conversión requiere un estado intermedio en el que el clúster tenga un solo fragmento.Atlas trata un set de réplicas como si tuviera una cantidad de particiones de uno. Si se aplica un recuento mínimo de particiones mayor que uno sin comprobar si los clústeres son clústeres fragmentados, todos los sets de réplicas del Proyecto se marcan como no conformes.
Uso del lenguaje de políticas Cedar
MongoDB utiliza el cedar lenguaje de políticas de código abierto para definir las Políticas de Recursos de Atlas. El diseño de Cedar equilibra la expresividad con la simplicidad, empleando una sintaxis concisa que agiliza tanto la escritura como la comprensión de las políticas de recursos.
Para crear rápidamente una política de recursos de Atlas, adapte los ejemplos y agréguela a Atlas mediante la interfaz de usuario de Atlas o la API de administración de Atlas siguiendo las instrucciones para crear una configuración de política de recursos de Atlas.
Para obtener más información sobre El lenguaje de políticas Cedar, consulta:
Elementos clave de la sintaxis de Cedar para Atlas
Cedar Element | Descripton | Opciones de política de recursos de Atlas |
|---|---|---|
| Deniega la acción especificada si se cumplen las condiciones de la cláusula | Ejemplo: |
| Define el usuario afectado por la política. | Aplicado universalmente por defecto. No cambiar ni omitir. |
| Representa la acción que se controla en la política. | Acciones disponibles:
|
| Se refiere a un clúster específico | Para encontrar tu ID de clúster, usa la API de administración de Atlas para devolver todos los clústeres en un proyecto. |
| Se refiere a un proyecto específico. Por ejemplo, | Para encontrar el ID del grupo, consulta Administrar la configuración del Proyecto. |
| Especifica el proyecto al que pertenece el clúster. | Para encontrar el ID del grupo, consulta Administrar la configuración del Proyecto. |
| Especifica los proveedores de nube permitidos. | Opciones disponibles:
El valor varía según la acción. Para |
| Especifica la topología del clúster: set de réplicas, clúster particionado o clúster global. | Opciones disponibles:
|
| Especifica el tamaño del disco en GB. | Por ejemplo, |
| El número real actual de particiones. Usar únicamente para aplicar los recuentos de particiones mínimos. ADVERTENCIA: No utilices esta propiedad para aplicar los máximos. | Por ejemplo, |
| El número máximo posible de particiones. Usar solo para aplicar los límites máximos de particiones. ADVERTENCIA: No utilizar esta propiedad para aplicar mínimos. | Por ejemplo, |
| Comprueba si la operación actual consiste en convertir un set de réplicas en un clúster. Obligatorio al aplicar recuentos mínimos de particiones para permitir la transición inicial. | Por ejemplo, |
| Limita el acceso en función de las regiones de implementación. | Por ejemplo, |
| Verifica si una propiedad específica existe dentro del contexto del clúster. | Propiedades disponibles:
|
| Establece el nivel mínimo de clúster para reducir el clúster. | Por ejemplo, |
| Establece el nivel de clúster máximo para escalar el clúster. | Por ejemplo, |
| Comprueba si las llaves administradas por el cliente para el cifrado en reposo están habilitadas para el clúster. Utiliza con la acción | Por ejemplo, |
| Especifica el número de clústeres que existen actualmente en un proyecto. | Por ejemplo, |
| Requiere que un Proyecto tenga un periodo de mantenimiento configurado. | Por ejemplo, |
| Verifica si la auditoría de la base de datos está habilitada para el proyecto. Utiliza con la acción | Por ejemplo, |
| Especifica las direcciones IP que pueden acceder al clúster. | Puedes bloquear una IP comodín |
| Se refiere a una conexión de emparejamiento de VPC específica. | Para formatear para tu proveedor de nube específico, consulta Prevent Modifications to Network emparejamiento. |
| Se refiere a un nodo privado específico. | Para formatear para su proveedor de nube específico, consulte Prevenir modificaciones en los nodos privados. |
| Comprueba la inclusión de uno o más elementos ( | Ejemplo: |
| Especifica las excepciones a una política. Las acciones están prohibidas a menos que se cumplan ciertas condiciones. | Ejemplo: |
| Comprueba si una lista está vacía. Por ejemplo, para aplicar el acceso cero sobre redes públicas, se requiere que la lista de acceso IP esté vacía. |
|
Operadores lógicos ( | Combina múltiples condiciones en una política. | Opciones disponibles:
|
| Realiza comprobaciones para el modo de gestión del servidor de configuración en clústeres fragmentados. | Opciones disponibles:
|
| Comprueba si el clúster tiene nodos dedicados de MongoDB Search. Para | Por ejemplo, |
| Verifica si el clúster tiene índices de búsqueda de MongoDB Search. | Por ejemplo, |
| Verifica si las Claves administradas por el cliente para el cifrado en reposo están efectivamente habilitadas para implementaciones de búsqueda dedicadas. Esto se evalúa como | Por ejemplo, |
Dirección IP ( | Se refiere a direcciones IP o rangos específicos en las políticas. | Opciones disponibles:
|
| Verifica si un índice de búsqueda utiliza incrustación automática. Si | Ejemplo: Esto coincide con los índices que utilizan incrustación automática y permite restringir la creación o modificación de índices de incrustación automática para el cumplimiento o la gestión de costos. Todavía puedes crear índices de tipo |
Crea una configuración de directiva de recursos de Atlas
Para crear una Política de Recursos de Atlas, utiliza el siguiente procedimiento para elaborar una política utilizando el lenguaje de políticas Cedar y agrégalo a Atlas mediante la interfaz de usuario de Atlas, la API de administración de Atlas o Terraform.
Advertencia
Recomendamos que pruebes esta funcionalidad en un entorno que no sea de producción creando una nueva organización con un clúster nuevo. Esto asegura que puedas evaluar la funcionalidad de manera segura sin afectar tus sistemas existentes mientras adquieres nuevas habilidades.
Para crear una Política de Recursos de Atlas mediante la API de administración de Atlas, crea una política con lenguaje de políticas de Cedar y pásala a la API de administración de Atlas mediante una solicitud POST utilizando el parámetro policies.
Construya la política en el lenguaje de políticas de Cedar.
Especifica las reglas para restringir los recursos utilizando el lenguaje de políticas Cedar. Puedes copiar y modificar las siguientes políticas de ejemplo para tu organización:
Nota
Te recomendamos crear múltiples Políticas de Recursos Atlas simples para facilitar el seguimiento. Por ejemplo, si desea restringir el proveedor de nube y varias regiones, considere crear una política de recursos de Atlas que restrinja el proveedor de nube y otra política de recursos de Atlas que restrinja las regiones.
Envía una solicitud POST.
Usa el verbo POST para crear una Política de recursos de Atlas para tu organización. La solicitud debe incluir:
name: El nombre de la política de recursos de Atlas.policiesLos siguientes pasos: Las restricciones del clúster que definiste en Cedar policy lenguaje en el paso anterior. Si se utilizan comillas (") enpolicies.body, usa una barra invertida (\) como escape.
Solicitud de ejemplo POST:
Nota
Este comando curl utiliza un token de acceso de cuenta de servicio (OAuth 2.0) para autenticar en lugar de claves API. Para obtener más información, consulte Introducción a la API de administración de Atlas.
curl --header "Authorization: Bearer {ACCESS-TOKEN}" \ --header "Content-Type: application/json" \ --header "Accept: application/vnd.atlas.2024-08-05+json" \ --include \ --request POST "https://cloud.mongodb.com/api/atlas/v2/orgs/{ORG-ID}/resourcePolicies?pretty=true" \ --data '{ "name": "MyResourcePolicy", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when {context.cluster.regions.contains(ResourcePolicy::Region::\"aws:us-west-1\")};" } ] }'
Respuesta de ejemplo:
1 { 2 "createdByUser" : { 3 "id" : "66ce81217d08f463824f3b80", 4 "name" : "ecwwjhop" 5 }, 6 "createdDate" : "2024-08-28T02:22:49Z", 7 "id" : "66ce89f9b535d00a2cb02f83", 8 "lastUpdatedByUser" : { 9 "id" : "66ce81217d08f463824f3b80", 10 "name" : "ecwwjhop" 11 }, 12 "lastUpdatedDate" : "2024-08-28T02:22:49Z", 13 "name" : "MyResourcePolicy", 14 "orgId" : "{ORG-ID}", 15 "policies" : [ { 16 "body" : "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when {context.cluster.regions.contains(ResourcePolicy::Region::\"aws:us-west-1\")};", 17 "id" : "66ce89f9b535d00a2cb02f82" 18 } ], 19 "version" : "v1"
Para crear una Política de Recursos de Atlas usando el nuevo editor de Atlas Interfaz de Usuario, utiliza el siguiente procedimiento para copiar y pegar una política de ejemplo en el editor, luego modifícala según las necesidades de tu organización.
En Atlas, diríjase a la página Organization Settings.
Si aún no se muestra, selecciona la organización deseada en el menú Organizations de la barra de navegación.
En la barra lateral, haga clic en Organization Settings.
Se muestra la página Configuración de la organización.
Ve a la Resource Policies página.
En la barra lateral, haz clic en Resource Policies bajo el encabezado Configurations.
Se muestra la página Políticas de recursos.
Haz clic Create policyen.
Nombra, describe y define tu política de recursos de Atlas.
Da un nombre único a tu Atlas recurso Policy.
(Opcional) Agrega una descripción.
Copia y modifica las siguientes políticas de ejemplo para tu organización y luego pega el código en el campo Cedar Policy.
Nota
Te recomendamos crear múltiples Políticas de Recursos Atlas simples para facilitar el seguimiento. Por ejemplo, si desea restringir el proveedor de nube y varias regiones, considere crear una política de recursos de Atlas que restrinja el proveedor de nube y otra política de recursos de Atlas que restrinja las regiones.
Haz clic Create policyen.
Esta Política de recursos de Atlas se aplica a todos los clústeres nuevos. Para los clústeres existentes que no cumplan con la Política de Recursos de Atlas, Atlas solo permite a los usuarios realizar cambios en el clúster que lo pongan en cumplimiento. Por ejemplo, si cluster0 se ejecuta en AWS y se aplica una política de recursos de Atlas que bloquea clústeres en AWS, el único cambio que los usuarios podrían realizar en cluster0 mientras no cumpla es cambiar el proveedor de nube a Azure o Google Cloud.
Para devolver una lista de clústeres existentes que no cumplen con su Política de recursos de Atlas, utilice el recurso GET /orgs/{ORG-ID}/nonCompliantResources.
Atlas genera un evento de fuente de actividad cuando creas, actualizas o eliminas una Política de Recursos de Atlas. Para ayudar a identificar tus eventos de fuente de actividad y hacer el seguimiento más fácil, recomendamos crear múltiples políticas de recursos simples en Atlas. Por ejemplo, si desea restringir el uso de un proveedor de nube y varias regiones, considere crear una política de recursos de Atlas que restrinja el proveedor de nube y otra política de recursos de Atlas que restrinja las regiones.
Nota
Requisitos previos adicionales
Completa los siguientes pasos antes de continuar con esta guía:
Cree una clave de API para su organización pagadora y almacene sus claves API como variables de entorno ejecutando los siguientes comandos:
export MONGODB_ATLAS_PUBLIC_KEY="<your public key>" export MONGODB_ATLAS_PRIVATE_KEY="<your private key>" Instala el Terraform CLI
Para crear una política de recursos de Atlas utilizando Terraform, configure el Proveedor de Terraform de MongoDB Atlas, luego construya una política utilizando el lenguaje de políticas Cedar y especifíquelo en su archivo Terraform main.tf.
Configurar el proveedor de Terraform de MongoDB Atlas.
Crea un nuevo archivo en tu directorio de proyecto llamado main.tf. Pega el siguiente código, que configura el proveedor MongoDB Atlas y especifica tus claves pública y privada:
terraform { required_version = ">=1.4" required_providers { mongodbatlas = { source = "mongodb/mongodbatlas" version = "~>1.31" } } } provider "mongodbatlas" {} variable "org_id" { type = string description = "<Organization ID>" }
Después de crear el archivo, ejecuta el siguiente comando para descargar la última versión del proveedor e inicializar Terraform:
terraform init -upgrade
Defina la política en el lenguaje de políticas de Cedar.
Especifica las reglas para restringir los recursos utilizando el lenguaje de políticas Cedar. Puedes copiar y modificar las siguientes políticas de ejemplo para tu organización:
Nota
Te recomendamos crear múltiples Políticas de Recursos Atlas simples para facilitar el seguimiento. Por ejemplo, si desea restringir el proveedor de nube y varias regiones, considere crear una política de recursos de Atlas que restrinja el proveedor de nube y otra política de recursos de Atlas que restrinja las regiones.
Ejemplos de políticas de recursos de Atlas
Copie y modifique las siguientes políticas de ejemplo para adaptarlas a su organización. Todos los ejemplos utilizan el lenguaje de políticas de Cedar, pero para la API de administración de Atlas, están en formato JSON para que pueda pegarlos directamente en sus llamadas a la API. Para obtener más información,consulte Crear una configuración de política de recursos de Atlas.
Restringir número de clústeres
El siguiente ejemplo impide que los usuarios creen más de 2 clústeres en un proyecto:
{ "name": "Prohibit More Than 2 Clusters in a Project", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { context.project.clustersInProject > 2 };" } ] }
Restringir proveedor de nube
El siguiente ejemplo evita que los usuarios creen un clúster en Google Cloud:
{ "name": "Policy Preventing GCP Clusters", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { context.cluster.cloudProviders.contains(ResourcePolicy::CloudProvider::\"gcp\") };" } ] }
El siguiente ejemplo utiliza la cláusula unless para permitir que los usuarios creen clústeres solo en Google Cloud:
{ "name": "Policy Allowing Only GCP Clusters", "policies": [ { "body": "forbid(principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) unless { context.cluster.cloudProviders == [ResourcePolicy::CloudProvider::\"gcp\"] };" } ] }
El siguiente ejemplo utiliza la cláusula when para impedir que los usuarios creen o editen un clúster en el Proyecto con ID 6217f7fff7957854e2d09179 a menos que Google Cloud sea el único proveedor de nube:
{ "name": "Policy Allowing Only GCP Clusters for One Project", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { resource in ResourcePolicy::Project::\"6217f7fff7957854e2d09179\" && context.cluster.cloudProviders == [ResourcePolicy::CloudProvider::\"gcp\"] };" } ] }
El siguiente ejemplo previene modificaciones en el clúster con la ID 3217e2gdf79a4c54e2d0827 cuando Google Cloud es el proveedor de nube:
{ "name": "Forbid Modifications to Specific GCP Cluster", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { resource in ResourcePolicy::Project::\"65dcbf5ccd12a54df59a54e6\" && resource == ResourcePolicy::Cluster::\"670968dfc0a2297ef46bc02a\" && context.cluster.cloudProviders == [ResourcePolicy::CloudProvider::\"gcp\"]};" } ] }
Restringir región del proveedor de nube
El siguiente ejemplo impide que los usuarios creen o editen un clúster en la región aws:us-east-1:
{ "name": "Prohibit Cluster Deployment in the US-EAST-1 Region", "policies": [ { "body": "forbid (principal,action == ResourcePolicy::Action::\"cluster.modify\",resource) when {context.cluster.regions.contains(ResourcePolicy::Region::\"aws:us-east-1\")};" } ] }
El siguiente ejemplo impide que los usuarios creen un clúster en la región aws:us-west-1:
{ "name": "Policy Preventing Clusters in AWS:us-west-1", "policies": [ { "body": "forbid(principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { context.cluster.regions.contains(ResourcePolicy::Region::\"aws:us-west-1\") };" } ] }
El siguiente ejemplo impide que los usuarios creen un clúster en las regiones aws:us-east-1, aws:us-west-1, o azure:westeurope:
{ "name": "Policy Preventing Clusters in 3 AWS Regions", "policies": [ { "body": "forbid(principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { context.cluster.regions.containsAny([ResourcePolicy::Region::\"aws:us-east-1\", ResourcePolicy::Region::\"aws:us-west-1\", ResourcePolicy::Region::\"azure:westeurope\"]) };" } ] }
El siguiente ejemplo utiliza la cláusula unless para permitir a los usuarios crear clústeres solo en las regiones aws:us-east-1 y azure:westeurope:
{ "name": "Policy Allowing Clusters Only in 2 AWS Regions", "policies": [ { "body": "forbid(principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) unless { [ResourcePolicy::Region::\"aws:us-east-1\", ResourcePolicy::Region::\"azure:westeurope\"].containsAll(context.cluster.regions) };" } ] }
El siguiente ejemplo utiliza la cláusula when para restringir a los usuarios la edición del clúster con ID 3217e2gdf79a4c54e2d0827 en las regiones aws:us-east-1 y aws:us-west-1:
{ "name": "Policy Restricting Edits to One Cluster from 2 AWS Regions", "policies": [ { "body": "forbid(principal, action == ResourcePolicy::Action::\"cluster.modify\", resource == ResourcePolicy::Cluster::\"3217e2gdf79a4c54e2d0827\") when { context.cluster.regions.containsAny([ResourcePolicy::Region::\"aws:us-east-1\",ResourcePolicy::Region::\"aws:us-west-1\"]) };" } ] }
Restringir proveedor de nube y región
El siguiente ejemplo restringe a los usuarios de Atlas la posibilidad de crear clústeres de Atlas en Google Cloud o en las regiones de AWS aws:us-east-1 o aws:us-west-1.
{ "name": "Policy Restricting All GCP Clusters and Some AWS Regions", "policies": [ { "body": "forbid (principal,action == ResourcePolicy::Action::\"cluster.modify\", resource) when {context.cluster.cloudProviders.containsAny([ResourcePolicy::CloudProvider::\"gcp\"]) || context.cluster.regions.containsAny([ResourcePolicy::Region::\"aws:us-east-1\", ResourcePolicy::Region::\"aws:us-west-1\"])};"} } ] }
Restringir direcciones IP
Nota
Si se añade el CIDR 0.0.0.0/0 a la lista de acceso de un proyecto, Atlas envía un correo electrónico de alerta a todos los usuarios a los que se les haya otorgado un rol en el proyecto de forma directa o indirecta a través de la pertenencia al equipo (si al equipo se le otorga un rol en el proyecto).
El siguiente ejemplo impide que los usuarios editen un proyecto desde una IP comodín (0.0.0.0/0):
{ "name": "Policy Restricting Wildcard IP", "policies": [ { "body": "forbid(principal, action == ResourcePolicy::Action::\"project.ipAccessList.modify\", resource) when { context.project.ipAccessList.contains(ip(\"0.0.0.0/0\")) };" } ] }
El siguiente ejemplo utiliza la cláusula unless para permitir que los usuarios editen los proyectos únicamente desde las direcciones IP 1.2.3.4/32, 8.8.8.8/32 y 4.4.4.4/32:
{ "name": "Policy Restricting Project Edits to Specified IPs", "policies": [ { "body": "forbid(principal, action == ResourcePolicy::Action::\"project.ipAccessList.modify\", resource) unless { [ip(\"1.2.3.4/32\"), ip(\"8.8.8.8/32\"), ip(\"4.4.4.4/32\")].containsAll(context.project.ipAccessList) };" } ] }
El siguiente ejemplo garantiza que todo el tráfico hacia el clúster esté prohibido a través de redes públicas al requerir que la lista de acceso IP esté vacía.
{ "name": "Policy Preventing Access Over Public Networks", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"project.ipAccessList.modify\", resource) unless {context.project.ipAccessList.isEmpty() };" } ] }
Restringe los tamaños del nivel de clúster
El siguiente ejemplo utiliza la cláusula when para restringir que Atlas aprovisione o escale clústeres a menos de M30 o a más de M60:
Nota
Esta política no restringe los clústeres con una clase de clúster de CPU baja o SSD NVMe.
{ "name": "Policy Restricting Min/Max Cluster Size", "policies": [ { "body": "forbid(principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { (context.cluster has minGeneralClassInstanceSizeValue && context.cluster.minGeneralClassInstanceSizeValue < 30) || (context.cluster has maxGeneralClassInstanceSizeValue && context.cluster.maxGeneralClassInstanceSizeValue > 60) };" } ] }
Requerir Windows de Mantenimiento del Proyecto
El siguiente ejemplo requiere que un Proyecto tenga configurado un periodo de mantenimiento:
{ "name": "Policy Enforcing Existence of a Project Maintenance Window", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"project.maintenanceWindow.modify\", resource) when {context.project.hasDefinedMaintenanceWindow == false};" } ] }
Requerir auditoría de base de datos
El siguiente ejemplo exige que la auditoría de la base de datos esté habilitada en un proyecto antes de que se puedan crear o modificar clústeres:
{ "name": "Require database auditing", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { !context.project.databaseAuditing.enabled };" } ] }
Exigir claves gestionadas por el cliente en todos los clústeres
El siguiente ejemplo requiere que las claves administradas por el cliente para el cifrado en reposo estén habilitadas en todos los clústeres de un proyecto:
{ "name": "Require CMK on clusters", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { !context.cluster.encryptionAtRest.customerManagedKey.enabled };" } ] }
Solicite claves gestionadas por el cliente en todas las implementaciones de búsqueda dedicadas
El siguiente ejemplo requiere que las claves gestionadas por el cliente para el cifrado en reposo estén habilitadas en todas las implementaciones de búsqueda dedicadas en un proyecto:
{ "name": "Require CMK on search deployments", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"search.deployment.modify\", resource) when { !context.search.encryptionAtRest.customerManagedKey.enabled };" } ] }
Aplicar claves gestionadas por el cliente para todos los datos de la organización (solo AWS)
El siguiente ejemplo aplica claves administradas por el cliente a todos los datos de la organización (clústeres y nodos de búsqueda) y restringe las implementaciones solo a AWS. Se deben aplicar tres políticas simultáneamente:
Política 1: Requiere llave maestra de cliente en todos los clústeres de este Proyecto
{ "name": "Require CMK on clusters", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { !context.cluster.encryptionAtRest.customerManagedKey.enabled };" } ] }
Política 2: Requerir llave maestra de cliente en todas las implementaciones de búsqueda en este Proyecto
{ "name": "Require CMK on search deployments", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"search.deployment.modify\", resource) when { !context.search.encryptionAtRest.customerManagedKey.enabled };" } ] }
Política:3 Restringir los clústeres y las implementaciones de búsqueda solo a AWS.
{ "name": "Restrict to AWS only", "policies": [ { "body": "forbid (principal, action in [ResourcePolicy::Action::\"cluster.modify\", ResourcePolicy::Action::\"search.deployment.modify\"], resource) when { !([ResourcePolicy::CloudProvider::\"aws\"].containsAll(context.cluster.cloudProviders)) };" } ] }
Nota
Los nodos de búsqueda heredan el cifrado de su clúster, por lo que para aplicar CMK a los datos en reposo, el propio clúster también debe usar CMK. Tanto los clústeres como las implementaciones de búsqueda pueden implementarse en distintos proveedores de nube. Actualmente, solo AWS admite CMK para los nodos de búsqueda, por lo que se necesitan las tres políticas para garantizar una cobertura completa.
Evitar modificaciones en el emparejamiento de redes
El siguiente ejemplo impide modificaciones a las conexiones de emparejamiento de VPC entre diferentes proveedores de nube (AWS, Google Cloud, Azure).
Cada proveedor de nube requiere detalles diferentes para el emparejamiento de VPC. Reúne los siguientes detalles de tu proveedor de nube y reemplázalos en el ejemplo:
Amazon Web Services: aws:<AWS_ACCOUNT_ID>:<VPC_ID>:<VPC_CIDR>
AWS_ACCOUNT_ID: Tu número de cuenta de AWS.VPC_ID: El ID de la VPC.VPC_CIDR: El bloque CIDR de la VPC.
Azure: azure:<SUBSCRIPTION_ID>:<RESOURCE_GROUP_NAME>:<VNET_NAME>
SUBSCRIPTION_ID: Su ID de suscripción de Azure.RESOURCE_GROUP_NAMEGrupo de recursos en el que se encuentra su Red Virtual (VNet).VNET_NAMENombre de la VNet.
Google Cloud Platform: gcp:<GCP_PROJECT_ID>:<VPC_NAME>
GCP_PROJECT_IDID de tu proyecto de Google Cloud.VPC_NAME: El nombre de la VPC en Google Cloud.
{ "name": "Policy Preventing Modifications to Peering Across Providers", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"project.vpcPeering.modify\", resource) when {context.project.peeringConnections == [\"aws:000123456789:vpc-0316c47cc923ce313:10.0.0.0/16\", \"azure:fd01aafc-b3re-2193-8497-83lp3m83a1a5:rg-name:vnet\", \"gcp:inductive-cocoa-108200:default\"]};" } ] }
Prevenir modificaciones en los nodos privados
El siguiente ejemplo impide las modificaciones en las conexiones de nodos privados entre proveedores de nube (AWS, Google Cloud, Azure).
Cada proveedor de nube requiere diferentes detalles para los nodos privados. Reúne los siguientes detalles de tu proveedor en la nube y reemplázalos en el ejemplo:
Amazon Web Services: aws:<VPC_ENDPOINT_ID>
VPC_ENDPOINT_ID: El ID del punto final de la VPC de AWS.
Azure: azure:<PRIVATE_ENDPOINT_RESOURCE_ID>:<PRIVATE_ENDPOINT_IP_ADDRESS>
PRIVATE_ENDPOINT_RESOURCE_ID: La ruta completa del ID del recurso del punto de conexión privado de Azure.PRIVATE_ENDPOINT_IP_ADDRESS: La dirección IP asignada al nodo privado.
Google Cloud Platform: gcp:<GCP_PROJECT_ID>:<VPC_NAME>
GCP_PROJECT_IDID de tu proyecto de Google Cloud.VPC_NAME: El nombre de la VPC en Google Cloud asociada con la conexión.
{ "name": "Policy Preventing Modifications to Private Endpoints Across Providers", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"project.privateEndpoint.modify\", resource) when {context.project.privateEndpoints == [\"aws:vpce-042d72ded1748f314\", \"azure:/subscriptions/fd01aafc-b3re-2193-8497-83lp3m83a1a5/resourceGroups/rg-name/providers/Microsoft.Network/privateEndpoints/pe-name:10.0.0.4\", \"gcp:inductive-cocoa-108200:default\"]};" } ] }
Restringir el protocolo TLS y los conjuntos de cifrado.
El siguiente ejemplo restringe la versión mínima de TLS que su clúster acepta para las conexiones entrantes a TLS 1.2.
Los valores posibles para minTLSVersion incluyen:
TLS 1.0:
ResourcePolicy::TLSVersion::\"tls1_0\"TLS 1.1:
ResourcePolicy::TLSVersion::\"tls1_1\"TLS 1.2:
ResourcePolicy::TLSVersion::\"tls1_2\"
{ "name": "Policy Restricting Cluster Connections to Minimum TLS 1.2", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) unless {context.cluster.minTLSVersion == ResourcePolicy::TLSVersion::\"tls1_2\"};" } ] }
El siguiente ejemplo requiere que los clústeres utilicen la configuración personalizada de la suite de cifrado TLS TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 mediante el ajuste de ResourcePolicy::CipherConfigMode::\"custom\".
Los valores posibles para las configuraciones personalizadas del conjunto de cifrado de TLS son:
ResourcePolicy::CipherSuite::\"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384\"ResourcePolicy::CipherSuite::\"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256\"
{ "name": "Policy Requiring Specific TLS Cipher Suite", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) unless {context.cluster.cipherConfigMode == ResourcePolicy::CipherConfigMode::\"custom\" && context.cluster.cipherSuites == [ResourcePolicy::CipherSuite::\"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384\"]};" } ] }
El siguiente ejemplo requiere que los clústeres utilicen la configuración del paquete de cifrado TLS por defecto.
{ "name": "Policy Requiring Default TLS Cipher Suite", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) unless {context.cluster.cipherConfigMode == ResourcePolicy::CipherConfigMode::\"default\"};" } ] }
Aplicar tamaño del disco (GB)
El siguiente ejemplo aplica un tamaño máximo de disco de 4 TB al prohibir cualquier valor mayor que (>) el límite.
Para evitar crear clústeres de un tamaño inferior a un cierto valor, utiliza un operador menor que (<) en la política de prohibición.
{ "name": "Limit Max Disk Size to 4000GB", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { context.cluster has diskSizeGB && context.cluster.diskSizeGB > 4096 };" } ] }
Aplicar topología de clúster (set de réplicas, particionado o clúster global)
El siguiente ejemplo permite a los usuarios crear únicamente clústeres de sets de réplicas.
{ "name": "Require Replica Set Clusters", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) unless { context.cluster.clusterType == ResourcePolicy::ClusterType::\"replicaset\" };" } ] }
Para permitir una topología de clúster diferente, utiliza uno de los siguientes valores:
Cluster fragmentado:
ResourcePolicy::ClusterType::"sharded"se utiliza para el escalado horizontal estándar, en la que los datos se distribuyen en varias particiones para gestionar grandes conjuntos de datos o un alto rendimiento.Clúster global:
ResourcePolicy::ClusterType::"geosharded"Se utiliza para implementaciones conscientes de la ubicación, donde los datos se distribuyen en zonas geográficas específicas para garantizar que los datos residan cerca de los usuarios.
Aplicar recuento mínimo de particiones
El siguiente ejemplo requiere que los clústeres tengan al menos tres particiones.
Importante
Si aplicas una cantidad mínima de particiones mayor que uno, debes permitir explícitamente el estado de transición para las conversiones de clúster en tu política (por ejemplo,
&& !context.cluster.isConvertingToSharded). Sin esta excepción, Atlas impide que los usuarios conviertan un set de réplicas en un clúster porque el proceso de conversión requiere un estado intermedio en el que el clúster tenga sólo una partición.Atlas trata un set de réplicas como si tuviera una cantidad de particiones de uno. Si se aplica un recuento mínimo de particiones mayor que uno sin comprobar si los clústeres son clústeres fragmentados, todos los sets de réplicas del Proyecto se marcan como no conformes.
Utilice
minShardCountpara aplicar solo mínimos (por ejemplo,< 3) ymaxShardCountpara aplicar solo máximos (por ejemplo,> 10). El uso de operadores de comparación opuestos con estas propiedades causa errores en la evaluación de políticas.
{ "name": "Require Minimum 3 Shards", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { context.cluster.minShardCount < 3 && !context.cluster.isConvertingToSharded };" } ] }
Aplicar servidores de configuración dedicados para clústeres particionados
El siguiente ejemplo impide que los usuarios creen clústeres particionados con servidores de configuración integrados, garantizando que utilicen servidores de configuración dedicados desde el principio.
{ "name": "Enforce config server management mode to fixed_to_dedicated for sharded clusters", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { context.cluster.clusterType == ResourcePolicy::ClusterType::\"sharded\" && context.cluster has configServerManagementMode && context.cluster.configServerManagementMode != ResourcePolicy::ConfigServerManagementMode::\"fixed_to_dedicated\" };" } ] }
Restringir las operaciones de los índices de MongoDB Search
Nota
La acción search.index.modify restringe únicamente la creación y modificación de índices de MongoDB Search. Atlas siempre permite la eliminación de índices de búsqueda de MongoDB.
El siguiente ejemplo impide que los usuarios agreguen o editen índices de MongoDB Search a menos que existan nodos dedicados para MongoDB Search:
{ "name": "Require Search Nodes Before Adding Search Indexes", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"search.index.modify\", resource) when { !context.search.hasDedicatedNodes };" } ] }
Restringir la incrustación automática para la búsqueda vectorial de MongoDB
El siguiente ejemplo impide que los usuarios creen o modifiquen índices de búsqueda que utilicen el tipo autoEmbed. Esto permite restringir el uso de la incrustación automatizada por cumplimiento o control de costos, y al mismo tiempo permitir la creación de índices tipo vector.
{ "name": "Prevent Automated Embedding Indexes", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"search.index.modify\", resource) when { context.search.index.isAutoEmbed };" } ] }
El siguiente ejemplo evita que los usuarios agreguen o editen índices de MongoDB Search a menos que existan nodos de MongoDB Search dedicados y que todos estén en AWS:
{ "name": "Require Search Nodes on AWS Before Adding Search Indexes", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"search.index.modify\", resource) when { !context.search.hasDedicatedNodes || !([ResourcePolicy::CloudProvider::\"aws\"].containsAll(context.cluster.cloudProviders)) };" } ] }
Restringir las operaciones de implementación de MongoDB Search
El siguiente ejemplo impide que los usuarios eliminen nodos dedicados de MongoDB Search de un clúster que tenga índices de MongoDB Search:
{ "name": "Prevent Removing Search Nodes When Indexes Exist", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"search.deployment.modify\", resource) when { context.search.hasIndexes && !context.search.hasDedicatedNodes };" } ] }
El siguiente ejemplo previene la implementación de MongoDB Search en proveedores que no seanAWS en un clúster que tiene índices de MongoDB Search:
{ "name": "Prevent Non-AWS Search Deployment When Indexes Exist", "policies": [ { "body": "forbid (principal, action in [ResourcePolicy::Action::\"cluster.modify\", ResourcePolicy::Action::\"search.deployment.modify\"], resource) when { context.search.hasIndexes && !([ResourcePolicy::CloudProvider::\"aws\"].containsAll(context.cluster.cloudProviders)) };" } ] }
Restringir número de clústeres
El siguiente ejemplo impide que los usuarios creen más de 2 clústeres en un proyecto:
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.project.clustersInProject > 2 };
Restringir proveedor de nube
El siguiente ejemplo evita que los usuarios creen un clúster en Google Cloud:
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster.cloudProviders.contains(ResourcePolicy::CloudProvider::"gcp") };
El siguiente ejemplo utiliza la cláusula unless para permitir que los usuarios creen clústeres solo en Google Cloud:
forbid( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) unless { context.cluster.cloudProviders == [ResourcePolicy::CloudProvider::"gcp"] };
El siguiente ejemplo utiliza la cláusula when para impedir que los usuarios creen o editen un clúster en el Proyecto con ID 6217f7fff7957854e2d09179 a menos que Google Cloud sea el único proveedor de nube:
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when {resource in ResourcePolicy::Project::"6217f7fff7957854e2d09179" && context.cluster.cloudProviders == [ResourcePolicy::CloudProvider::"gcp"] };
El siguiente ejemplo previene modificaciones en el clúster con la ID 3217e2gdf79a4c54e2d0827 cuando Google Cloud es el proveedor de nube:
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when {resource in ResourcePolicy::Project::"65dcbf5ccd12a54df59a54e6" && resource == ResourcePolicy::Cluster::"670968dfc0a2297ef46bc02a" && context.cluster.cloudProviders == [ResourcePolicy::CloudProvider::"gcp"]};
Restringir región del proveedor de nube
El siguiente ejemplo impide que los usuarios creen o editen un clúster en la región aws:us-east-1:
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when {context.cluster.regions.contains(ResourcePolicy::Region::"aws:us-east-1")};
El siguiente ejemplo impide que los usuarios creen un clúster en la región aws:us-west-1:
forbid( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster.regions.contains(ResourcePolicy::Region::"aws:us-west-1") };
El siguiente ejemplo impide que los usuarios creen un clúster en las regiones aws:us-east-1, aws:us-west-1, o azure:westeurope:
forbid( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster.regions.containsAny([ResourcePolicy::Region::"aws:us-east-1",ResourcePolicy::Region::"aws:us-west-1",ResourcePolicy::Region::"azure:westeurope"]) };
El siguiente ejemplo utiliza la cláusula unless para permitir a los usuarios crear clústeres solo en las regiones aws:us-east-1 y azure:westeurope:
forbid( principal, action == ResourcePolicy::Action::\"cluster.modify\", resource ) unless { [ResourcePolicy::Region::"aws:us-east-1", ResourcePolicy::Region::"azure:westeurope"].containsAll(context.cluster.regions) };
El siguiente ejemplo utiliza la cláusula when para restringir a los usuarios la edición del clúster con ID 3217e2gdf79a4c54e2d0827 en las regiones aws:us-east-1 y aws:us-west-1:
forbid( principal, action == ResourcePolicy::Action::"cluster.modify", resource == ResourcePolicy::Cluster::"3217e2gdf79a4c54e2d0827" ) when { context.cluster.regions.containsAny([ResourcePolicy::Region::"aws:us-east-1",ResourcePolicy::Region::"aws:us-west-1"]) };
Restringir direcciones IP
Nota
Si se añade el CIDR 0.0.0.0/0 a la lista de acceso de un proyecto, Atlas envía un correo electrónico de alerta a todos los usuarios a los que se les haya otorgado un rol en el proyecto de forma directa o indirecta a través de la pertenencia al equipo (si al equipo se le otorga un rol en el proyecto).
El siguiente ejemplo impide que los usuarios editen un proyecto desde una IP comodín (0.0.0.0/0):
forbid( principal, action == ResourcePolicy::Action::"project.ipAccessList.modify", resource ) when { context.project.ipAccessList.contains(ip("0.0.0.0/0")) };
El siguiente ejemplo utiliza la cláusula unless para permitir que los usuarios editen los proyectos únicamente desde las direcciones IP 1.2.3.4/32, 8.8.8.8/32 y 4.4.4.4/32:
forbid( principal, action == ResourcePolicy::Action::"project.ipAccessList.modify", resource ) unless { [ip("1.2.3.4/32"), ip("8.8.8.8/32"), ip("4.4.4.4/32")].containsAll(context.project.ipAccessList) };
El siguiente ejemplo garantiza que todo el tráfico hacia el clúster esté prohibido a través de redes públicas al requerir que la lista de acceso IP esté vacía.
forbid ( principal, action == ResourcePolicy::Action::"project.ipAccessList.modify", resource ) unless { context.project.ipAccessList.isEmpty() };
Restrinja los tamaños de nivel de clúster
El siguiente ejemplo utiliza la cláusula when para restringir que Atlas aprovisione o escale clústeres a menos de M30 o a más de M60:
Nota
Esta política no restringe los clústeres con una clase de clúster de CPU baja o SSD NVMe.
forbid( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { (context.cluster has minGeneralClassInstanceSizeValue && context.cluster.minGeneralClassInstanceSizeValue < 30) || (context.cluster has maxGeneralClassInstanceSizeValue && context.cluster.maxGeneralClassInstanceSizeValue > 60) };
Requerir Windows de Mantenimiento del Proyecto
El siguiente ejemplo requiere que un Proyecto tenga configurado un periodo de mantenimiento:
forbid ( principal, action == ResourcePolicy::Action::"project.maintenanceWindow.modify", resource ) when {context.project.hasDefinedMaintenanceWindow == false};
Requerir auditoría de base de datos
El siguiente ejemplo exige que la auditoría de la base de datos esté habilitada en un proyecto antes de que se puedan crear o modificar clústeres:
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { !context.project.databaseAuditing.enabled };
Exigir claves gestionadas por el cliente en todos los clústeres
El siguiente ejemplo requiere que las claves administradas por el cliente para el cifrado en reposo estén habilitadas en todos los clústeres de un proyecto:
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { !context.cluster.encryptionAtRest.customerManagedKey.enabled };
Solicite claves gestionadas por el cliente en todas las implementaciones de búsqueda dedicadas
El siguiente ejemplo requiere que las claves gestionadas por el cliente para el cifrado en reposo estén habilitadas en todas las implementaciones de búsqueda dedicadas en un proyecto:
forbid ( principal, action == ResourcePolicy::Action::"search.deployment.modify", resource ) when { !context.search.encryptionAtRest.customerManagedKey.enabled };
Aplicar claves gestionadas por el cliente para todos los datos de la organización (solo AWS)
El siguiente ejemplo aplica claves administradas por el cliente a todos los datos de la organización (clústeres y nodos de búsqueda) y restringe las implementaciones solo a AWS. Se deben aplicar tres políticas simultáneamente:
Política 1: Requiere llave maestra de cliente en todos los clústeres de este Proyecto
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { !context.cluster.encryptionAtRest.customerManagedKey.enabled };
Política 2: Requerir llave maestra de cliente en todas las implementaciones de búsqueda en este Proyecto
forbid ( principal, action == ResourcePolicy::Action::"search.deployment.modify", resource ) when { !context.search.encryptionAtRest.customerManagedKey.enabled };
Política:3 Restringir los clústeres y las implementaciones de búsqueda solo a AWS.
forbid ( principal, action in [ ResourcePolicy::Action::"cluster.modify", ResourcePolicy::Action::"search.deployment.modify" ], resource ) when { !([ResourcePolicy::CloudProvider::"aws"].containsAll(context.cluster.cloudProviders)) };
Nota
Los nodos de búsqueda heredan el cifrado de su clúster, por lo que para aplicar CMK a los datos en reposo, el propio clúster también debe usar CMK. Tanto los clústeres como las implementaciones de búsqueda pueden implementarse en distintos proveedores de nube. Actualmente, solo AWS admite CMK para los nodos de búsqueda, por lo que se necesitan las tres políticas para garantizar una cobertura completa.
Evitar modificaciones en el emparejamiento de redes
El siguiente ejemplo impide modificaciones a las conexiones de emparejamiento de VPC entre diferentes proveedores de nube (AWS, Google Cloud, Azure).
Cada proveedor de nube requiere detalles diferentes para el emparejamiento de VPC. Reúne los siguientes detalles de tu proveedor de nube y reemplázalos en el ejemplo:
Amazon Web Services: aws:<AWS_ACCOUNT_ID>:<VPC_ID>:<VPC_CIDR>
AWS_ACCOUNT_ID: Tu número de cuenta de AWS.VPC_ID: El ID de la VPC.VPC_CIDR: El bloque CIDR de la VPC.
Azure: azure:<SUBSCRIPTION_ID>:<RESOURCE_GROUP_NAME>:<VNET_NAME>
SUBSCRIPTION_ID: Su ID de suscripción de Azure.RESOURCE_GROUP_NAMEGrupo de recursos en el que se encuentra su Red Virtual (VNet).VNET_NAMENombre de la VNet.
Google Cloud Platform: gcp:<GCP_PROJECT_ID>:<VPC_NAME>
GCP_PROJECT_IDID de tu proyecto de Google Cloud.VPC_NAME: El nombre de la VPC en Google Cloud.
forbid ( principal, action == ResourcePolicy::Action::"project.vpcPeering.modify", resource ) when {context.project.peeringConnections == ["aws:000123456789:vpc-0316c47cc923ce313:10.0.0.0/16", "azure:fd01aafc-b3re-2193-8497-83lp3m83a1a5:rg-name:vnet", "gcp:inductive-cocoa-108200:default"]};
Prevenir modificaciones en los nodos privados
El siguiente ejemplo impide las modificaciones en las conexiones de nodos privados entre proveedores de nube (AWS, Google Cloud, Azure).
Cada proveedor de nube requiere diferentes detalles para los nodos privados. Reúne los siguientes detalles de tu proveedor en la nube y reemplázalos en el ejemplo:
Amazon Web Services: aws:<VPC_ENDPOINT_ID>
VPC_ENDPOINT_ID: El ID del punto final de la VPC de AWS.
Azure: azure:<PRIVATE_ENDPOINT_RESOURCE_ID>:<PRIVATE_ENDPOINT_IP_ADDRESS>
PRIVATE_ENDPOINT_RESOURCE_ID: La ruta completa del ID del recurso del punto de conexión privado de Azure.PRIVATE_ENDPOINT_IP_ADDRESS: La dirección IP asignada al nodo privado.
Google Cloud Platform: gcp:<GCP_PROJECT_ID>:<PRIVATE_ENDPOINT_GROUP_NAME>
GCP_PROJECT_IDID de tu proyecto de Google Cloud.PRIVATE_ENDPOINT_GROUP_NAME: El nombre del grupo de nodos privados de Google Cloud asociado con la conexión.
Enrutamiento basado en puertos de Google Cloud: gcp:<GCP_PROJECT_ID>:<PRIVATE_ENDPOINT_NAME>:<PRIVATE_ENDPOINT_IP_ADDRESS>
GCP_PROJECT_IDID de tu proyecto de Google Cloud.PRIVATE_ENDPOINT_NAMENombre del endpoint privado en Google Cloud asociado con la conexión.PRIVATE_ENDPOINT_IP_ADDRESS: La dirección IP asignada al nodo privado.
forbid ( principal, action == ResourcePolicy::Action::"project.privateEndpoint.modify", resource ) when {context.project.privateEndpoints == ["aws:vpce-042d72ded1748f314", "azure:/subscriptions/fd01aafc-b3re-2193-8497-83lp3m83a1a5/resourceGroups/rg-name/providers/Microsoft.Network/privateEndpoints/pe-name:10.0.0.4", "gcp:inductive-cocoa-108200:default"]};
Restringir el protocolo TLS y los conjuntos de cifrado.
El siguiente ejemplo restringe la versión mínima de TLS que su clúster acepta para las conexiones entrantes a TLS 1.2.
Los valores posibles para minTLSVersion incluyen:
TLS 1.0:
ResourcePolicy::TLSVersion::"tls1_0"TLS 1.1:
ResourcePolicy::TLSVersion::"tls1_1"TLS 1.2:
ResourcePolicy::TLSVersion::"tls1_2"
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) unless { context.cluster.minTLSVersion == ResourcePolicy::TLSVersion::"tls1_2" };
El siguiente ejemplo requiere que los clústeres utilicen la configuración personalizada de la suite de cifrado TLS TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 mediante el ajuste de ResourcePolicy::CipherConfigMode::"custom".
Los valores posibles para las configuraciones personalizadas del conjunto de cifrado de TLS son:
ResourcePolicy::CipherSuite::"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"ResourcePolicy::CipherSuite::"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) unless { context.cluster.cipherConfigMode == ResourcePolicy::CipherConfigMode::"custom" && context.cluster.cipherSuites == [ResourcePolicy::CipherSuite::"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"] };
El siguiente ejemplo requiere que los clústeres utilicen la configuración del paquete de cifrado TLS por defecto.
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) unless { context.cluster.cipherConfigMode == ResourcePolicy::CipherConfigMode::"default" };
Aplicar tamaño del disco (GB)
El siguiente ejemplo aplica un tamaño máximo de disco de 4 TB al prohibir cualquier valor mayor que (>) el límite.
Para evitar crear clústeres de un tamaño inferior a un cierto valor, utiliza un operador menor que (<) en la política de prohibición.
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster has diskSizeGB && context.cluster.diskSizeGB > 4096 };
Aplicar topología de clúster (set de réplicas, particionado o clúster global)
El siguiente ejemplo permite a los usuarios crear únicamente clústeres de sets de réplicas.
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) unless { context.cluster.clusterType == ResourcePolicy::ClusterType::"replicaset" };
Para permitir una topología de clúster diferente, utiliza uno de los siguientes valores:
Cluster fragmentado:
ResourcePolicy::ClusterType::"sharded"se utiliza para el escalado horizontal estándar, en la que los datos se distribuyen en varias particiones para gestionar grandes conjuntos de datos o un alto rendimiento.Clúster global:
ResourcePolicy::ClusterType::"geosharded"Se utiliza para implementaciones conscientes de la ubicación, donde los datos se distribuyen en zonas geográficas específicas para garantizar que los datos residan cerca de los usuarios.
Aplicar recuento mínimo de particiones
El siguiente ejemplo requiere que los clústeres tengan al menos tres particiones.
Importante
Si aplicas una cantidad mínima de particiones mayor que uno, debes permitir explícitamente el estado de transición para las conversiones de clúster en tu política (por ejemplo,
&& !context.cluster.isConvertingToSharded). Sin esta excepción, Atlas impide que los usuarios conviertan un set de réplicas en un clúster porque el proceso de conversión requiere un estado intermedio en el que el clúster tenga sólo una partición.Atlas trata un set de réplicas como si tuviera una cantidad de particiones de uno. Si se aplica un recuento mínimo de particiones mayor que uno sin comprobar si los clústeres son clústeres fragmentados, todos los sets de réplicas del Proyecto se marcan como no conformes.
Utilice
minShardCountpara aplicar solo mínimos (por ejemplo,< 3) ymaxShardCountpara aplicar solo máximos (por ejemplo,> 10). El uso de operadores de comparación opuestos con estas propiedades causa errores en la evaluación de políticas.
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster.minShardCount < 3 && !context.cluster.isConvertingToSharded };
Aplicar servidores de configuración dedicados para clústeres particionados
El siguiente ejemplo impide que los usuarios creen clústeres particionados con servidores de configuración integrados, garantizando que utilicen servidores de configuración dedicados desde el principio.
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster.clusterType == ResourcePolicy::ClusterType::"sharded" && context.cluster has configServerManagementMode && context.cluster.configServerManagementMode != ResourcePolicy::ConfigServerManagementMode::"fixed_to_dedicated" };
Restringir las operaciones de los índices de MongoDB Search
Nota
La acción search.index.modify restringe únicamente la creación y modificación de índices de MongoDB Search. Atlas siempre permite la eliminación de índices de búsqueda de MongoDB.
El siguiente ejemplo impide que los usuarios agreguen o editen índices de MongoDB Search a menos que existan nodos dedicados para MongoDB Search:
forbid ( principal, action == ResourcePolicy::Action::"search.index.modify", resource ) when { !context.search.hasDedicatedNodes };
Restringir la incrustación Automatizada para la Búsqueda Vectorial
El siguiente ejemplo impide que los usuarios creen o modifiquen índices de búsqueda que utilicen el tipo autoEmbed. Esto permite restringir el uso de la incrustación automatizada por cumplimiento o control de costos, y al mismo tiempo permitir la creación de índices tipo vector.
forbid ( principal, action == ResourcePolicy::Action::"search.index.modify", resource ) when { context.search.index.isAutoEmbed == true };
El siguiente ejemplo evita que los usuarios agreguen o editen índices de MongoDB Search a menos que existan nodos de MongoDB Search dedicados y que todos estén en AWS:
forbid ( principal, action == ResourcePolicy::Action::"search.index.modify", resource ) when { !context.search.hasDedicatedNodes || !([ResourcePolicy::CloudProvider::"aws"].containsAll( context.cluster.cloudProviders)) };
Restringir las operaciones de implementación de MongoDB Search
El siguiente ejemplo impide que los usuarios eliminen nodos dedicados de MongoDB Search de un clúster que tenga índices de MongoDB Search:
forbid ( principal, action == ResourcePolicy::Action::"search.deployment.modify", resource ) when { context.search.hasIndexes && !context.search.hasDedicatedNodes };
El siguiente ejemplo previene la implementación de MongoDB Search en proveedores que no seanAWS en un clúster que tiene índices de MongoDB Search:
forbid ( principal, action in [ ResourcePolicy::Action::"cluster.modify", ResourcePolicy::Action::"search.deployment.modify" ], resource ) when { context.search.hasIndexes && !([ResourcePolicy::CloudProvider::"aws"].containsAll( context.cluster.cloudProviders)) };
Restringir número de clústeres
El siguiente ejemplo impide que los usuarios creen más de 2 clústeres en un proyecto:
resource "mongodbatlas_resource_policy" "forbid_more_than_two_clusters" { org_id = var.org_id name = "forbid-more-than-two-clusters" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.project.clustersInProject > 2 }; EOF }, ] }
Restringir proveedor de nube
El siguiente ejemplo evita que los usuarios creen un clúster en todos los proveedores de la nube excepto AWS:
resource "mongodbatlas_resource_policy" "allow_only_aws_cloud_provider" { org_id = var.org_id name = "cluster-allow-only-aws-cloud-provider" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) unless { context.cluster.cloudProviders == [ResourcePolicy::CloudProvider::"aws"] }; EOF }] }
Restringir región
El siguiente ejemplo utiliza la cláusula unless para permitir a los usuarios crear clústeres solo en las regiones aws:us-east-1 y aws:eu-central-1:
resource "mongodbatlas_resource_policy" "allow_only_regions" { org_id = var.org_id name = "cluster-allow-only-regions" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) unless { [ResourcePolicy::Region::"aws:eu-west-1", ResourcePolicy::Region::"aws:eu-central-1"] .containsAll(context.cluster.regions)}; EOF }, ] }
Restringir proveedor de nube y región
El siguiente ejemplo utiliza la cláusula unless para permitir que los usuarios creen clústeres solo en Google Cloud o en las regiones aws:us-east-1 y aws:eu-central-1:
resource "mongodbatlas_resource_policy" "allow_only_provider_regions" { org_id = var.org_id name = "cluster-allow-only-provider-regions" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) unless { context.cluster.cloudProviders == [ResourcePolicy::CloudProvider::"gcp"] || [ResourcePolicy::Region::"aws:eu-west-1", ResourcePolicy::Region::"aws:eu-central-1"] .containsAll(context.cluster.regions)}; EOF }, ] }
Restringir direcciones IP
Nota
Si se añade el CIDR 0.0.0.0/0 a la lista de acceso de un proyecto, Atlas envía un correo electrónico de alerta a todos los usuarios a los que se les haya otorgado un rol en el proyecto de forma directa o indirecta a través de la pertenencia al equipo (si al equipo se le otorga un rol en el proyecto).
El siguiente ejemplo impide que los usuarios editen un proyecto desde una IP comodín (0.0.0.0/0):
resource "mongodbatlas_resource_policy" "forbid_project_access_anywhere" { org_id = var.org_id name = "forbid-project-access-anywhere" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"project.ipAccessList.modify", resource ) when {context.project.ipAccessList.contains(ip("0.0.0.0/0"))}; EOF }, ] }
Requerir auditoría de base de datos
El siguiente ejemplo exige que la auditoría de la base de datos esté habilitada en un proyecto antes de que se puedan crear o modificar clústeres:
resource "mongodbatlas_resource_policy" "require_database_auditing" { org_id = var.org_id name = "require-database-auditing" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { !context.project.databaseAuditing.enabled }; EOF }, ] }
Exigir claves gestionadas por el cliente en todos los clústeres
El siguiente ejemplo requiere que las claves administradas por el cliente para el cifrado en reposo estén habilitadas en todos los clústeres de un proyecto:
resource "mongodbatlas_resource_policy" "require_cmk_clusters" { org_id = var.org_id name = "require-cmk-on-clusters" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { !context.cluster.encryptionAtRest.customerManagedKey.enabled }; EOF }, ] }
Solicite claves gestionadas por el cliente en todas las implementaciones de búsqueda dedicadas
El siguiente ejemplo requiere que las claves gestionadas por el cliente para el cifrado en reposo estén habilitadas en todas las implementaciones de búsqueda dedicadas en un proyecto:
resource "mongodbatlas_resource_policy" "require_cmk_search" { org_id = var.org_id name = "require-cmk-on-search-deployments" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"search.deployment.modify", resource ) when { !context.search.encryptionAtRest.customerManagedKey.enabled }; EOF }, ] }
Aplicar claves gestionadas por el cliente para todos los datos de la organización (solo AWS)
El siguiente ejemplo aplica claves administradas por el cliente a todos los datos de la organización (clústeres y nodos de búsqueda) y restringe las implementaciones únicamente a AWS.
resource "mongodbatlas_resource_policy" "require_cmk_clusters_aws" { org_id = var.org_id name = "require-cmk-clusters-aws-policy" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { !context.cluster.encryptionAtRest.customerManagedKey.enabled }; EOF }, ] } resource "mongodbatlas_resource_policy" "require_cmk_search_aws" { org_id = var.org_id name = "require-cmk-search-aws-policy" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"search.deployment.modify", resource ) when { !context.search.encryptionAtRest.customerManagedKey.enabled }; EOF }, ] } resource "mongodbatlas_resource_policy" "restrict_to_aws_only" { org_id = var.org_id name = "restrict-to-aws-only" policies = [ { body = <<EOF forbid ( principal, action in [ ResourcePolicy::Action::"cluster.modify", ResourcePolicy::Action::"search.deployment.modify" ], resource ) when { !([ResourcePolicy::CloudProvider::"aws"].containsAll(context.cluster.cloudProviders)) }; EOF }, ] }
Nota
Los nodos de búsqueda heredan el cifrado de su clúster, por lo que para aplicar CMK a los datos en reposo, el propio clúster también debe usar CMK. Tanto los clústeres como las implementaciones de búsqueda pueden implementarse en distintos proveedores de nube. Actualmente, solo AWS admite CMK para los nodos de búsqueda, por lo que se necesitan las tres políticas para garantizar una cobertura completa.
Aplicar tamaño del disco (GB)
El siguiente ejemplo aplica un tamaño máximo de disco de 4 TB al prohibir cualquier valor mayor que (>) el límite.
Para evitar crear clústeres de un tamaño inferior a un cierto valor, utiliza un operador menor que (<) en la política de prohibición.
resource "mongodbatlas_resource_policy" "limit_max_disk_size" { org_id = var.org_id name = "limit-max-4096gb-disk" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster has diskSizeGB && context.cluster.diskSizeGB > 4096 }; EOF }, ] }
Aplicar topología de clúster (set de réplicas, particionado o clúster global)
El siguiente ejemplo permite a los usuarios crear únicamente clústeres de sets de réplicas.
resource "mongodbatlas_resource_policy" "require_replica_set" { org_id = var.org_id name = "require-replica-set" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) unless { context.cluster.clusterType == ResourcePolicy::ClusterType::"replicaset" }; EOF }, ] }
Para permitir una topología de clúster diferente, utiliza uno de los siguientes valores:
Cluster fragmentado:
ResourcePolicy::ClusterType::"sharded"se utiliza para el escalado horizontal estándar, en la que los datos se distribuyen en varias particiones para gestionar grandes conjuntos de datos o un alto rendimiento.Clúster global:
ResourcePolicy::ClusterType::"geosharded"Se utiliza para implementaciones conscientes de la ubicación, donde los datos se distribuyen en zonas geográficas específicas para garantizar que los datos residan cerca de los usuarios.
Aplicar recuento mínimo de particiones
El siguiente ejemplo requiere que los clústeres tengan al menos tres particiones.
Importante
Si aplicas una cantidad mínima de particiones mayor que uno, debes permitir explícitamente el estado de transición para las conversiones de clúster en tu política (por ejemplo,
&& !context.cluster.isConvertingToSharded). Sin esta excepción, Atlas impide que los usuarios conviertan un set de réplicas en un clúster porque el proceso de conversión requiere un estado intermedio en el que el clúster tenga sólo una partición.Atlas trata un set de réplicas como si tuviera una cantidad de particiones de uno. Si se aplica un recuento mínimo de particiones mayor que uno sin comprobar si los clústeres son clústeres fragmentados, todos los sets de réplicas del Proyecto se marcan como no conformes.
Utilice
minShardCountpara aplicar solo mínimos (por ejemplo,< 3) ymaxShardCountpara aplicar solo máximos (por ejemplo,> 10). El uso de operadores de comparación opuestos con estas propiedades causa errores en la evaluación de políticas.
resource "mongodbatlas_resource_policy" "require_min_shards" { org_id = var.org_id name = "require-min-3-shards" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster.minShardCount < 3 && !context.cluster.isConvertingToSharded }; EOF }, ] }
Aplicar servidores de configuración dedicados para clústeres particionados
El siguiente ejemplo impide que los usuarios creen clústeres particionados con servidores de configuración integrados, garantizando que utilicen servidores de configuración dedicados desde el principio.
resource "mongodbatlas_resource_policy" "enforce_dedicated_config_server" { org_id = var.org_id name = "enforce-dedicated-config-server" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster.clusterType == ResourcePolicy::ClusterType::"sharded" && context.cluster has configServerManagementMode && context.cluster.configServerManagementMode != ResourcePolicy::ConfigServerManagementMode::"fixed_to_dedicated" }; EOF }, ] }
Restringir la incrustación automática para la búsqueda vectorial de MongoDB
El siguiente ejemplo impide que los usuarios creen o modifiquen índices de búsqueda que utilicen el tipo autoEmbed. Esto permite restringir el uso de la incrustación automatizada por cumplimiento o control de costos, y al mismo tiempo permitir la creación de índices tipo vector.
resource "mongodbatlas_resource_policy" "restrict_auto_embedding" { org_id = var.org_id name = "prevent-automated-embedding-indexes" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"search.index.modify", resource ) when { context.search.index.isAutoEmbed }; EOF }, ] }