Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
MongoDB Branding Shape
Click here >
Docs Menu

Políticas de recursos de Atlas

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/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).

  • 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.

  • 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 .cedar se identifica en la respuesta de la API de administración de Atlas como una unique 24-hexadecimal character string después de policies.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.isConvertingToSharded Sin 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.

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:

Cedar Element
Descripton
Opciones de política de recursos de Atlas

forbid

Deniega la acción especificada si se cumplen las condiciones de la cláusula when. El elemento inverso, permit, no está permitido en Atlas recursos Policies.

Ejemplo: forbid (principal, action, resource) when { ... };

principal

Define el usuario afectado por la política.

Aplicado universalmente por defecto. No cambiar ni omitir.

action

Representa la acción que se controla en la política.

Acciones disponibles:

  • Restringir la lista de acceso IP: ResourcePolicy::Action::"project.ipAccessList.modify"

  • Restringir atributos del clúster: ResourcePolicy::Action::"cluster.modify"

  • Modificar periodo de mantenimiento: ResourcePolicy::Action::"project.maintenanceWindow.modify"

  • Restringir las modificaciones del índice de búsqueda: ResourcePolicy::Action::"search.index.modify"

  • Restringir las operaciones de implementación de búsquedas: ResourcePolicy::Action::"search.deployment.modify"

ResourcePolicy::Cluster::"<CLUSTER-ID>"

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.

ResourcePolicy::Project::"<PROJECT_ID>"

Se refiere a un proyecto específico. Por ejemplo, ResourcePolicy::Project::"6217f7fff7957854e2d09179"

Para encontrar el ID del grupo, consulta Administrar la configuración del Proyecto.

context.cluster.project

Especifica el proyecto al que pertenece el clúster.

Para encontrar el ID del grupo, consulta Administrar la configuración del Proyecto.

context.cluster.cloudProviders

Especifica los proveedores de nube permitidos.

Opciones disponibles:

  • ResourcePolicy::CloudProvider::"aws"

  • ResourcePolicy::CloudProvider::"azure"

  • ResourcePolicy::CloudProvider::"gcp"

El valor varía según la acción. Para cluster.modify, contiene los proveedores de nube de los nodos mongod del clúster. Para search.index.modify, contiene los proveedores de nube de nodos mongod y MongoDB Search (estado actual). Para search.deployment.modify, contiene los proveedores de la nube de los nodos de MongoDB Search después de completar la solicitud. Para las operaciones de eliminación, este valor está vacío.

context.cluster.clusterType

Especifica la topología del clúster: set de réplicas, clúster particionado o clúster global.

Opciones disponibles:

  • ResourcePolicy::ClusterType::"replicaset"

  • ResourcePolicy::ClusterType::"sharded"

  • ResourcePolicy::ClusterType::"geosharded"

context.cluster.diskSizeGB

Especifica el tamaño del disco en GB.

Por ejemplo, context.cluster.diskSizeGB < 100 encuentra coincidencias en clústeres con menos de 100 GB de almacenamiento.

context.cluster.minShardCount

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, context.cluster.minShardCount < 3 coincide con clústeres que actualmente tienen menos de tres particiones.

context.cluster.maxShardCount

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, context.cluster.maxShardCount > 10 encuentra coincidencias entre los clústeres que tienen más de diez particiones.

context.cluster.isConvertingToSharded

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, context.cluster.isConvertingToSharded == true

context.cluster.regions

Limita el acceso en función de las regiones de implementación.

Por ejemplo, ResourcePolicy::Region::"aws:us-east-1". Para ver una lista de regiones disponibles por proveedor de nube, consulta Amazon Web Services (AWS), Google Cloud Platform (GCP) o Microsoft Azure. Cuando se utiliza con search.deployment.modify, contiene las regiones de los nodos de MongoDB Search después de que se complete la solicitud. Para las operaciones de eliminación, este valor está vacío.

context.cluster has <PROPERTY>

Verifica si una propiedad específica existe dentro del contexto del clúster.

Propiedades disponibles:

  • Clase general mínima nivel de clúster: minGeneralClassInstanceSizeValue

  • Clase General máxima nivel de clúster: maxGeneralClassInstanceSizeValue

  • Tamaño del disco (GB): diskSizeGB

context.cluster.minGeneralClassInstanceSizeValue

Establece el nivel mínimo de clúster para reducir el clúster.

Por ejemplo, context.cluster.minGeneralClassInstanceSizeValue < 30 coincide con clústeres cuyo nivel actual o el tamaño mínimo de escalado automático es menor que M30.

context.cluster.maxGeneralClassInstanceSizeValue

Establece el nivel de clúster máximo para escalar el clúster.

Por ejemplo, context.cluster.maxGeneralClassInstanceSizeValue < 60 coincide con clústeres cuyo nivel actual o tamaño máximo de escalado automático es menor que M60.

context.cluster.encryptionAtRest.customerManagedKey.enabled

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 cluster.modify.

Por ejemplo, context.cluster.encryptionAtRest.customerManagedKey.enabled == false verifica si el clúster no tiene llave maestra de cliente habilitado.

context.project.clustersInProject

Especifica el número de clústeres que existen actualmente en un proyecto.

Por ejemplo, context.project.clustersInProject <= 3 coincide con proyectos con tres o menos clústeres.

context.project.hasDefinedMaintenanceWindow

Requiere que un Proyecto tenga un periodo de mantenimiento configurado.

Por ejemplo, context.project.hasDefinedMaintenanceWindow == false comprueba si el Proyecto no tiene un periodo de mantenimiento configurado.

context.project.databaseAuditing.enabled

Verifica si la auditoría de la base de datos está habilitada para el proyecto. Utiliza con la acción cluster.modify.

Por ejemplo, context.project.databaseAuditing.enabled == false verifica si la auditoría de la base de datos del proyecto está deshabilitada.

context.project.ipAccessList

Especifica las direcciones IP que pueden acceder al clúster.

Puedes bloquear una IP comodín ip("0.0.0.0/0") para mejorar la seguridad.

context.project.peeringConnections

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.

context.project.privateEndpoints

Se refiere a un nodo privado específico.

Para formatear para su proveedor de nube específico, consulte Prevenir modificaciones en los nodos privados.

containsAny y containsAll

Comprueba la inclusión de uno o más elementos (containsAny) o de todos los elementos (containsAll) de una lista.

Ejemplo: context.cluster.regions.containsAny([ResourcePolicy::Region::"aws:us-east-1"])

unless

Especifica las excepciones a una política. Las acciones están prohibidas a menos que se cumplan ciertas condiciones.

Ejemplo: forbid (principal, action, resource) unless { condition };

isEmpty

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.

forbid (principal, action == ResourcePolicy::Action::"project.ipAccessList.modify", resource) unless { context.project.ipAccessList.isEmpty() };

Operadores lógicos (&&, ||, !)

Combina múltiples condiciones en una política.

Opciones disponibles:

  • && (AND): Requiere que todas las condiciones sean verdaderas.

  • || (OR): requiere que al menos una condición sea verdadera.

  • ! (NOT): Requiere que una condición sea falsa.

context.cluster.configServerManagementMode

Realiza comprobaciones para el modo de gestión del servidor de configuración en clústeres fragmentados.

Opciones disponibles:

  • ResourcePolicy::ConfigServerManagementMode::"fixed_to_dedicated" para servidores de configuración dedicados.

  • ResourcePolicy::ConfigServerManagementMode::"atlas_managed" para servidores de configuración integrados.

context.search.hasDedicatedNodes

Comprueba si el clúster tiene nodos dedicados de MongoDB Search. Para search.deployment.modify, este atributo refleja el estado después de que se completa la solicitud, no el estado actual.

Por ejemplo, context.search.hasDedicatedNodes == true. Usar con las acciones search.index.modify y search.deployment.modify.

context.search.hasIndexes

Verifica si el clúster tiene índices de búsqueda de MongoDB Search.

Por ejemplo, context.search.hasIndexes == true. Usar con las acciones search.deployment.modify y cluster.modify.

context.search.encryptionAtRest.customerManagedKey.enabled

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 true solo cuando tanto "search-nodo llave maestra de cliente" está habilitado COMO cuando al menos un proveedor de KMS está configurado a nivel de proyecto. Use con la acción search.deployment.modify.

Por ejemplo, context.search.encryptionAtRest.customerManagedKey.enabled == false comprueba si la implementación de búsqueda no tiene activada efectivamente la llave maestra de cliente.

Dirección IP (ip)

Se refiere a direcciones IP o rangos específicos en las políticas.

Opciones disponibles:

  • ip("0.0.0.0/0") para IP comodín.

  • ip("1.2.3.4/32") para direcciones IP específicas.

context.search.index.isAutoEmbed

Verifica si un índice de búsqueda utiliza incrustación automática. Si true, el índice de búsqueda genera automáticamente vector embeddings utilizando un embedding model de Voyage AI.

Ejemplo: context.search.index.isAutoEmbed == true

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 vector.

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.

1

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.

2

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 (") en policies.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.

1
  1. Si aún no se muestra, selecciona la organización deseada en el menú Organizations de la barra de navegación.

  2. En la barra lateral, haga clic en Organization Settings.

Se muestra la página Configuración de la organización.

2

En la barra lateral, haz clic en Resource Policies bajo el encabezado Configurations.

Se muestra la página Políticas de recursos.

3
4
  1. Da un nombre único a tu Atlas recurso Policy.

  2. (Opcional) Agrega una descripción.

  3. 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.

5

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.

1

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
2

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.

3

Después de definir las políticas que deseas en tu archivo main.tf, ejecuta el siguiente comando para crear las políticas:

terraform apply

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.

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 };"
}
]
}

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\"]};"
}
]
}

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\"]) };"
}
]
}

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\"])};"}
}
]
}

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() };"
}
]
}

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) };"
}
]
}

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};"
}
]
}

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 };"
}
]
}

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 };"
}
]
}

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 };"
}
]
}

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.

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\"]};"
}
]
}

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\"]};"
}
]
}

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\"};"
}
]
}

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 };"
}
]
}

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.

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 minShardCount para aplicar solo mínimos (por ejemplo, < 3) y maxShardCount para 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 };"
}
]
}

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\" };"
}
]
}

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 };"
}
]
}

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)) };"
}
]
}

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)) };"
}
]
}

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 };

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"]};

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"]) };

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() };

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) };

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};

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 };

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 };

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 };

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.

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"]};

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"]};

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"
};

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
};

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.

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 minShardCount para aplicar solo mínimos (por ejemplo, < 3) y maxShardCount para 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
};

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"
};

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 };

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))
};

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))
};

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
},
]
}

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
}]
}

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
},
]
}

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
},
]
}

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
},
]
}

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
},
]
}

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
},
]
}

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
},
]
}

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.

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
},
]
}

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.

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 minShardCount para aplicar solo mínimos (por ejemplo, < 3) y maxShardCount para 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
},
]
}

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
},
]
}

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
},
]
}