Docs Menu
Docs Home
/ /

Políticas de recursos de Atlas

Las políticas de recursos de Atlas son controles que permiten Organization Owners para restringir las opciones de configuración específicas disponibles para los desarrolladores cuando crean o configuran clústeres Atlas.

Con las políticas de recursos, puedes:

  • Limite la cantidad de clústeres que se pueden crear en un proyecto.

  • Limite la implementación del clúster a plataformas de nube específicas (AWS, Google Cloud, Azure).

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

  • Prohibir el tráfico a través de redes públicas exigiendo que la lista de acceso IP permanezca vacía o impidiendo que se agreguen elementos 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).

  • Requerir que un proyecto tenga una ventana de mantenimiento configurada.

  • Evite modificaciones en el emparejamiento de VPC y las conexiones de puntos finales privados entre proveedores de nube.

  • Imponga una versión mínima de TLS o requiera una configuración de conjunto de cifrado TLS específica para las conexiones de clúster.

  • Establezca niveles mínimos y máximos de clúster y tamaños de escalado automático en toda su organización. Si se habilita, esta política impide que los usuarios aprovisionen, actualicen o escalen automáticamente los clústeres a un nivel superior o inferior a un umbral especificado.

  • Exigir que los clústeres fragmentados utilicen solo servidores de configuración dedicados en lugar de servidores de configuración integrados.

  • Imponer un tamaño de disco mínimo y máximo para todos los clústeres.

  • Imponer el uso de una topología de clúster específica únicamente (conjuntode réplicas, clúster fragmentado o clúster global).

  • Imponer un número mínimo y máximo de fragmentos para clústeres fragmentados.

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 ofrece flexibilidad. Puede 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 uniformes de toda la organización, a la vez que permite excepciones para casos con requisitos específicos.

Además de la interfaz de usuario de Atlas y la API de administración de Atlas, puede utilizar el proveedor de Atlas de HashiCorp Terraform MongoDB, losrecursos de AWS CloudFormation de MongoDB Atlas o AWS CloudFormation para configurar y administrar las políticas de recursos de Atlas.

Nota

Para HashiCorp Terraform MongoDB Atlas proveedor, use 1.33.0 o posterior para imponer una versión mínima de TLS o requerir una configuración específica de TLS cipher suite para las conexiones del clúster. Atlas puede bloquear conexiones de versiones anteriores de Terraform.

  • Asegúrese de que su usuario de Atlas tenga el rol de organización adecuado:

  • Para usar la API de administración de Atlas y crear o administrar políticas de recursos de Atlas, localice sus claves de API públicas y privadas para poder autenticarse en la API. Para obtener más información,consulte Introducción a la API de administración de Atlas.

  • Le recomendamos encarecidamente que supervise proactivamente su lista de recursos no conformes mediante el punto de conexión /orgs/{ORG-ID}/nonCompliantResources. Las políticas de recursos de Atlas garantizan el cumplimiento de los objetivos definidos, pero no imponen estados intermedios ni de transición. 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 intenta 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 de Atlas idénticas con nombres diferentes. Si bien esto no causa conflictos funcionales, puede generar redundancia y confusión en la gestión de políticas.

  • Las políticas de recursos de Atlas están permitidas por defecto. Si no existen políticas de recursos de Atlas, los usuarios pueden realizar todas las acciones en los clústeres de Atlas que les permita su rol de usuario.

  • Nuestra versión implementada del lenguaje de políticas de Cedar solo admite una política de Cedar por .cedar archivo, pero puede incluir varias políticas de Cedar.cedar (archivos) en su política de recursos de Atlas. Cada .cedar archivo se identifica en la respuesta de la API de administración de Atlas como una cadena única de 24caracteres hexadecimales después policies.id de.

  • Si los límites de escalado automático de su clúster actual no coinciden con la nueva Política de Recursos de Atlas, el clúster podría superar los límites definidos por la política. Para solucionar este problema, utilice el punto de conexión /orgs/{ORG-ID}/nonCompliantResources para identificar y supervisar los recursos que no cumplen con los requisitos y actualizarlos para que cumplan con los requisitos de la política.

  • Antes de habilitar los controles de la capa de red, revise su lista de acceso IP existente para asegurarse de que contenga todos los puntos de acceso necesarios.

  • Las definiciones de puntos finales privados en el lenguaje de políticas de Cedar requieren que ingrese direcciones IP individuales, ya que no se admiten operaciones con comodines.

  • 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ústeres 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 donde el clúster solo tiene un fragmento.

  • Atlas considera que un conjunto de réplicas tiene un número de fragmentos igual a uno. Si se impone un número mínimo de fragmentos mayor que uno sin comprobar si los clústeres están fragmentados, todos los conjuntos de réplicas del proyecto se marcan como no conformes.

MongoDB utiliza el lenguaje de políticas Cedar 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 la escritura y 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éguelos a Atlas mediante la interfaz de usuario de Atlas o la API de administración de Atlas siguiendo el procedimiento Crear una configuración de política de recursos de Atlas.

Para obtener más información sobre el lenguaje de las políticas de Cedar, consulte:

Cedar Element
Descripton
Opciones de política de recursos del 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 las políticas de recursos de Atlas.

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

principal

Define el usuario afectado por la política.

Se aplica universalmente por defecto. No modificar ni omitir.

action

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

Acciones disponibles:

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

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

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

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

Se refiere a un grupo específico

Para encontrar el ID de su clúster, utilice la API de administración de Atlas para devolver todos los clústeres de un proyecto.

ResourcePolicy::Project::"<PROJECT_ID>"

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

Para encontrar el ID de su proyecto,consulte Administrar configuraciones del proyecto.

context.cluster.project

Especifica el proyecto al que pertenece el clúster.

Para encontrar el ID de su proyecto,consulte Administrar configuraciones del proyecto.

context.cluster.cloudProviders

Especifica los proveedores de nube permitidos.

Opciones disponibles:

  • ResourcePolicy::CloudProvider::"aws"

  • ResourcePolicy::CloudProvider::"azure"

  • ResourcePolicy::CloudProvider::"gcp"

context.cluster.clusterType

Especifica la topología del clúster: conjunto de réplicas, clúster fragmentado 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 coincide con clústeres con menos de 100 GB de almacenamiento.

context.cluster.minShardCount

Número real de fragmentos. Úselo solo para establecer un número mínimo de fragmentos. ADVERTENCIA: No utilice esta propiedad para imponer máximos.

Por ejemplo, context.cluster.minShardCount < 3 coincide con clústeres que actualmente tienen menos de tres fragmentos.

context.cluster.maxShardCount

El número máximo posible de fragmentos. Úselo solo para aplicar límites máximos de fragmentos. ADVERTENCIA: No utiliceesta propiedad para aplicar mínimos.

Por ejemplo, context.cluster.maxShardCount > 10 coincide con clústeres que tienen más de diez fragmentos.

context.cluster.isConvertingToSharded

Comprueba si la operación actual está convirtiendo un conjunto de réplicas en un clúster fragmentado. Es necesario al aplicar un número mínimo de fragmentos para permitir la transición inicial.

Por ejemplo, context.cluster.isConvertingToSharded == true

context.cluster.regions

Limita el acceso según las regiones de implementación.

Por ejemplo,. ResourcePolicy::Region::"aws:us-east-1" Para obtener una lista de las regiones disponibles por proveedor de nube,consulte Amazon Web Services (AWS), Google Cloud Platform (GCP) o Microsoft Azure.

context.cluster has <PROPERTY>

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

Propiedades disponibles:

  • Nivel mínimo de clúster de clase general: minGeneralClassInstanceSizeValue

  • Nivel máximo de clúster de clase general: maxGeneralClassInstanceSizeValue

  • Tamaño del disco (GB): diskSizeGB

context.cluster.minGeneralClassInstanceSizeValue

Establece el nivel de clúster mínimo al que se debe escalar 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 máximo del clúster al que se puede escalar el clúster.

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

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 una ventana de mantenimiento configurada.

Por ejemplo, context.project.hasDefinedMaintenanceWindow == false verifica si el proyecto no tiene ninguna ventana de mantenimiento configurada.

context.project.ipAccessList

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

Puede 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 peering de VPC específica.

Para formatear para su proveedor de nube específico,consulte Evitar modificaciones en el emparejamiento de redes.

context.project.privateEndpoints

Se refiere a un punto final privado específico.

Para formatear para su proveedor de nube específico, consulte Evitar modificaciones en puntos finales privados.

containsAny y containsAll

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

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

unless

Especifica 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 impedir el acceso a través de redes públicas, la lista de acceso IP debe estar vacía.

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

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

Combinar múltiples condiciones en una póliza.

Opciones disponibles:

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

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

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

context.cluster.configServerManagementMode

Comprueba el modo de administració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.

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

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

Le recomendamos que pruebe esta función en un entorno no productivo creando una nueva organización con un clúster nuevo. Esto le garantiza que podrá evaluar la función de forma segura sin afectar sus sistemas existentes a medida que mejora sus habilidades.

Para crear una política de recursos de Atlas mediante la API de administración de Atlas, construya una política utilizando el lenguaje de políticas Cedar y pásela a la API de administración de Atlas mediante una POST solicitud usando el policies parámetro.

1

Especifique las reglas para restringir recursos mediante el lenguaje de políticas de Cedar. Puede copiar y modificar las siguientes políticas de ejemplo para su organización:

Nota

Recomendamos crear varias políticas de recursos de Atlas sencillas 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 al proveedor de nube y otra que restrinja las regiones.

2

Utilice el verbo POST para crear una política de recursos de Atlas para su organización. La solicitud debe incluir:

  • name:El nombre de la Política de Recursos del Atlas.

  • policiesLas restricciones de clúster que definiste en el lenguaje de políticas de Cedar en el paso anterior. Si usas comillas ()" policies.bodyen, escálalas con una barra invertida\ ().

Ejemplo de solicitud POST:

curl --user "{PUBLIC-KEY}:{PRIVATE-KEY}" --digest \
--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\")};"
}
]
}'

Ejemplo de respuesta:

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 utilizando el nuevo editor de interfaz de usuario de Atlas, utilice el siguiente procedimiento para copiar y pegar una política de ejemplo en el editor y luego modifíquela para su 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. Dale un nombre único a tu política de recursos de Atlas.

  2. (Opcional) Agregue una descripción.

  3. Copie y modifique las siguientes políticas de ejemplo para su organización, luego pegue el código en el campo Cedar Policy.

    Nota

    Recomendamos crear varias políticas de recursos de Atlas sencillas 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 al proveedor de nube y otra que restrinja las regiones.

5

Esta Política de Recursos de Atlas se aplica a todos los clústeres nuevos. En el caso de los clústeres existentes que no cumplen con la Política de Recursos de Atlas, Atlas solo permite a los usuarios realizar cambios que lo hagan compatible. Por ejemplo, si cluster0 se ejecuta en AWS y se aplica una Política de Recursos de Atlas que bloquea los clústeres en AWS, el único cambio que los usuarios podrían realizar en mientras no cumpla con la normativa cluster0 es cambiar de 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 feed de actividad al crear, actualizar o eliminar una Política de Recursos de Atlas. Para identificar los eventos de feed de actividad y facilitar su seguimiento, recomendamos crear varias Políticas de Recursos de Atlas sencillas. 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 que restrinja las regiones.

Nota

Requisitos previos adicionales

Complete los siguientes pasos antes de continuar con esta guía:

  • Cree una clave API para su organización de pago 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>"
  • Instalar la CLI de Terraform

Para crear una política de recursos Atlas mediante Terraform, configure el proveedor Terraform de MongoDB Atlas, luego construya una política utilizando el lenguaje de políticas Cedar y especificándola en su main.tf archivo Terraform.

1

Cree un nuevo archivo llamado main.tf en el directorio de su proyecto. Pegue el siguiente código, que configura el proveedor de MongoDB Atlas y especifica sus claves públicas y privadas:

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

Especifique las reglas para restringir recursos mediante el lenguaje de políticas de Cedar. Puede copiar y modificar las siguientes políticas de ejemplo para su organización:

Nota

Recomendamos crear varias políticas de recursos de Atlas sencillas 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 al proveedor de nube y otra que restrinja las regiones.

3

Después de definir las políticas que desea en su archivo main.tf, ejecute el siguiente comando para crear las políticas:

terraform apply

Copie y modifique las siguientes políticas de ejemplo para usarlas en su organización. Todos los ejemplos utilizan el lenguaje de políticas Cedar, pero para la API de administración de Atlas, se incluyen 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 evita 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 evitar 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 evita modificaciones en el clúster con ID 3217e2gdf79a4c54e2d0827 cuando Google Cloud es el proveedor de la 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 evita 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 evita 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 unless cláusula para permitir que los usuarios creen clústeres solo en las regiones aws:us-east-1 azure:westeuropey:

{
"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 que los usuarios editen el 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 creación de 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 evita 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 unless cláusula para permitir que los usuarios editen proyectos solo desde las direcciones 1.2.3.4/32 IP, 8.8.8.8/32 4.4.4.4/32y:

{
"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 al 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 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 una ventana de mantenimiento configurada:

{
"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 evita modificaciones en las conexiones de emparejamiento de VPC entre diferentes proveedores denube(AWS, Google Cloud, Azure).

Cada proveedor de nube requiere información diferente para el emparejamiento de VPC. Recopile la siguiente información de su proveedor de nube y reemplácela en el ejemplo:

AWS: 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.

Azur: azure:<SUBSCRIPTION_ID>:<RESOURCE_GROUP_NAME>:<VNET_NAME>

  • SUBSCRIPTION_ID:Su identificador de suscripción de Azure.

  • RESOURCE_GROUP_NAME:El grupo de recursos en el que existe su red virtual (VNet).

  • VNET_NAME:El nombre de su VNet.

Google Cloud: gcp:<GCP_PROJECT_ID>:<VPC_NAME>

  • GCP_PROJECT_ID:El ID de su 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 evita modificaciones en las conexiones de puntos finales privados entre proveedores denube(AWS, Google Cloud, Azure).

Cada proveedor de nube requiere información diferente para los endpoints privados. Recopile la siguiente información de su proveedor de nube y reemplácela en el ejemplo:

AWS: aws:<VPC_ENDPOINT_ID>

  • VPC_ENDPOINT_ID:El ID del punto final de AWS VPC.

Azur: azure:<PRIVATE_ENDPOINT_RESOURCE_ID>:<PRIVATE_ENDPOINT_IP_ADDRESS>

  • PRIVATE_ENDPOINT_RESOURCE_ID:La ruta de acceso completa del identificador de recurso del punto de conexión privado de Azure.

  • PRIVATE_ENDPOINT_IP_ADDRESS: La dirección IP asignada al nodo privado.

Google Cloud: gcp:<GCP_PROJECT_ID>:<VPC_NAME>

  • GCP_PROJECT_ID:El ID de su proyecto de Google Cloud.

  • VPC_NAME: El nombre de la VPC en Google Cloud asociado 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 1.2 TLS.

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 del conjunto de cifrado TLS personalizado TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ResourcePolicy::CipherConfigMode::\"custom\"configurando.

Los valores posibles para las configuraciones de conjuntos de cifrado TLS personalizados 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 conjunto de cifrado TLS predeterminada.

{
"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 la creación de clústeres más pequeños que un tamaño determinado, utilice un operador menor que (<) en su 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 conjuntos 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:

  • Clúster fragmentado: ResourcePolicy::ClusterType::"sharded" se utiliza para el escalamiento horizontal estándar, donde los datos se distribuyen entre múltiples fragmentos para admitir grandes conjuntos de datos o alto rendimiento.

  • Clúster global: ResourcePolicy::ClusterType::"geosharded" se utiliza para implementaciones que tienen en cuenta la ubicación, donde los datos se distribuyen en zonas geográficas específicas para garantizar que residan cerca de los usuarios.

El siguiente ejemplo requiere que los clústeres fragmentados tengan al menos tres fragmentos.

Importante

  • 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ústeres 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 donde el clúster solo tiene un fragmento.

  • Atlas considera que un conjunto de réplicas tiene un número de fragmentos igual a uno. Si se impone un número mínimo de fragmentos mayor que uno sin comprobar si los clústeres están fragmentados, todos los conjuntos de réplicas del proyecto se marcan como no conformes.

  • Utilice minShardCount para aplicar solo los mínimos (por< 3 ejemplo,) y maxShardCount para aplicar solo los máximos (por ejemplo,). > 10 El uso de operadores de comparación opuestos con estas propiedades provoca 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 evita que los usuarios creen clústeres fragmentados con servidores de configuración integrados, lo que garantiza 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\" };"
}
]
}

El siguiente ejemplo evita 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 evitar 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 evita modificaciones en el clúster con ID 3217e2gdf79a4c54e2d0827 cuando Google Cloud es el proveedor de la 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 evita 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 evita 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 unless cláusula para permitir que los usuarios creen clústeres solo en las regiones aws:us-east-1 azure:westeuropey:

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 que los usuarios editen el 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 evita 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 unless cláusula para permitir que los usuarios editen proyectos solo desde las direcciones 1.2.3.4/32 IP, 8.8.8.8/32 4.4.4.4/32y:

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 al 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 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 una ventana de mantenimiento configurada:

forbid (
principal,
action == ResourcePolicy::Action::"project.maintenanceWindow.modify",
resource
)
when {context.project.hasDefinedMaintenanceWindow == false};

El siguiente ejemplo evita modificaciones en las conexiones de emparejamiento de VPC entre diferentes proveedores denube(AWS, Google Cloud, Azure).

Cada proveedor de nube requiere información diferente para el emparejamiento de VPC. Recopile la siguiente información de su proveedor de nube y reemplácela en el ejemplo:

AWS: 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.

Azur: azure:<SUBSCRIPTION_ID>:<RESOURCE_GROUP_NAME>:<VNET_NAME>

  • SUBSCRIPTION_ID:Su identificador de suscripción de Azure.

  • RESOURCE_GROUP_NAME:El grupo de recursos en el que existe su red virtual (VNet).

  • VNET_NAME:El nombre de su VNet.

Google Cloud: gcp:<GCP_PROJECT_ID>:<VPC_NAME>

  • GCP_PROJECT_ID:El ID de su 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 evita modificaciones en las conexiones de puntos finales privados entre proveedores denube(AWS, Google Cloud, Azure).

Cada proveedor de nube requiere información diferente para los endpoints privados. Recopile la siguiente información de su proveedor de nube y reemplácela en el ejemplo:

AWS: aws:<VPC_ENDPOINT_ID>

  • VPC_ENDPOINT_ID:El ID del punto final de AWS VPC.

Azur: azure:<PRIVATE_ENDPOINT_RESOURCE_ID>:<PRIVATE_ENDPOINT_IP_ADDRESS>

  • PRIVATE_ENDPOINT_RESOURCE_ID:La ruta de acceso completa del identificador de recurso del punto de conexión privado de Azure.

  • PRIVATE_ENDPOINT_IP_ADDRESS: La dirección IP asignada al nodo privado.

Google Cloud: gcp:<GCP_PROJECT_ID>:<PRIVATE_ENDPOINT_GROUP_NAME>

  • GCP_PROJECT_ID:El ID de su proyecto de Google Cloud.

  • PRIVATE_ENDPOINT_GROUP_NAME:El nombre del grupo de puntos finales privados en 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_ID:El ID de su proyecto de Google Cloud.

  • PRIVATE_ENDPOINT_NAME:El nombre del punto final 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 1.2 TLS.

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 del conjunto de cifrado TLS personalizado TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 ResourcePolicy::CipherConfigMode::"custom"configurando.

Los valores posibles para las configuraciones de conjuntos de cifrado TLS personalizados 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 conjunto de cifrado TLS predeterminada.

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 la creación de clústeres más pequeños que un tamaño determinado, utilice un operador menor que (<) en su 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 conjuntos 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:

  • Clúster fragmentado: ResourcePolicy::ClusterType::"sharded" se utiliza para el escalamiento horizontal estándar, donde los datos se distribuyen entre múltiples fragmentos para admitir grandes conjuntos de datos o alto rendimiento.

  • Clúster global: ResourcePolicy::ClusterType::"geosharded" se utiliza para implementaciones que tienen en cuenta la ubicación, donde los datos se distribuyen en zonas geográficas específicas para garantizar que residan cerca de los usuarios.

El siguiente ejemplo requiere que los clústeres fragmentados tengan al menos tres fragmentos.

Importante

  • 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ústeres 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 donde el clúster solo tiene un fragmento.

  • Atlas considera que un conjunto de réplicas tiene un número de fragmentos igual a uno. Si se impone un número mínimo de fragmentos mayor que uno sin comprobar si los clústeres están fragmentados, todos los conjuntos de réplicas del proyecto se marcan como no conformes.

  • Utilice minShardCount para aplicar solo los mínimos (por< 3 ejemplo,) y maxShardCount para aplicar solo los máximos (por ejemplo,). > 10 El uso de operadores de comparación opuestos con estas propiedades provoca 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 evita que los usuarios creen clústeres fragmentados con servidores de configuración integrados, lo que garantiza 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"
};

El siguiente ejemplo evita 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 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 unless cláusula para permitir que los usuarios creen clústeres solo en las regiones aws:us-east-1 aws:eu-central-1y:

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 unless cláusula para permitir que los usuarios creen clústeres solo en Google Cloud o en las regiones aws:us-east-1 aws:eu-central-1y:

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 evita 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 aplica un tamaño máximo de disco de 4 TB al prohibir cualquier valor mayor que (>) el límite.

Para evitar la creación de clústeres más pequeños que un tamaño determinado, utilice un operador menor que (<) en su 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 conjuntos 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:

  • Clúster fragmentado: ResourcePolicy::ClusterType::"sharded" se utiliza para el escalamiento horizontal estándar, donde los datos se distribuyen entre múltiples fragmentos para admitir grandes conjuntos de datos o alto rendimiento.

  • Clúster global: ResourcePolicy::ClusterType::"geosharded" se utiliza para implementaciones que tienen en cuenta la ubicación, donde los datos se distribuyen en zonas geográficas específicas para garantizar que residan cerca de los usuarios.

El siguiente ejemplo requiere que los clústeres fragmentados tengan al menos tres fragmentos.

Importante

  • 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ústeres 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 donde el clúster solo tiene un fragmento.

  • Atlas considera que un conjunto de réplicas tiene un número de fragmentos igual a uno. Si se impone un número mínimo de fragmentos mayor que uno sin comprobar si los clústeres están fragmentados, todos los conjuntos de réplicas del proyecto se marcan como no conformes.

  • Utilice minShardCount para aplicar solo los mínimos (por< 3 ejemplo,) y maxShardCount para aplicar solo los máximos (por ejemplo,). > 10 El uso de operadores de comparación opuestos con estas propiedades provoca 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 evita que los usuarios creen clústeres fragmentados con servidores de configuración integrados, lo que garantiza 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
},
]
}

Volver

Roles de los usuarios de Atlas

En esta página