- Exigir que los clústeres fragmentados utilicen solo servidores de configuración dedicados en lugar de servidores de configuración integrados.
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/0a la lista de acceso de un proyecto, Atlas envía un correo electrónico de alerta a todos los usuarios a los que se les haya otorgado un rol en el proyecto de forma directa o indirecta a través de la pertenencia al equipo (si al equipo se le otorga un rol en el proyecto).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.
Requisitos previos
Asegúrese de que su usuario de Atlas tenga el rol de organización adecuado:
Para ver las políticas de recursos de Atlas, debe tener al menos
Organization Read OnlyoOrganization Memberacceso a Atlas.Para crear, actualizar o borrar una política de recursos de Atlas, debe tener acceso
Organization Ownera Atlas.
Para usar la API de administración de Atlas 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.
Limitaciones
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
.cedararchivo, pero puede incluir varias políticas de Cedar.cedar(archivos) en su política de recursos de Atlas. Cada.cedararchivo se identifica en la respuesta de la API de administración de Atlas como una cadena única de 24caracteres hexadecimales despuéspolicies.idde.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.isConvertingToShardedSin esta excepción, Atlas impide que los usuarios conviertan un conjunto de réplicas en un clúster fragmentado, ya que el proceso de conversión requiere un estado intermedio 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.
Utilizando el lenguaje de la política de Cedar
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:
Elementos clave de sintaxis de Cedar para Atlas
Cedar Element | Descripton | Opciones de política de recursos del Atlas |
|---|---|---|
| Deniega la acción especificada si se cumplen las condiciones de la cláusula | Ejemplo: |
| Define el usuario afectado por la política. | Se aplica universalmente por defecto. No modificar ni omitir. |
| Representa la acción que se controla en la política. | Acciones disponibles:
|
| 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. |
| Se refiere a un proyecto específico. Por ejemplo, | Para encontrar el ID de su proyecto,consulte Administrar configuraciones del proyecto. |
| Especifica el proyecto al que pertenece el clúster. | Para encontrar el ID de su proyecto,consulte Administrar configuraciones del proyecto. |
| Especifica los proveedores de nube permitidos. | Opciones disponibles:
|
| Especifica la topología del clúster: conjunto de réplicas, clúster fragmentado o clúster global. | Opciones disponibles:
|
| Especifica el tamaño del disco en GB. | Por ejemplo, |
| 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, |
| 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, |
| 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, |
| Limita el acceso según las regiones de implementación. | Por ejemplo,. |
| Comprueba si existe una propiedad específica dentro del contexto del clúster. | Propiedades disponibles:
|
| Establece el nivel de clúster mínimo al que se debe escalar el clúster. | Por ejemplo, |
| Por ejemplo, | |
| Especifica el número de clústeres que existen actualmente en un proyecto. | Por ejemplo, |
| Requiere que un proyecto tenga una ventana de mantenimiento configurada. | Por ejemplo, |
| Especifica las direcciones IP que pueden acceder al clúster. | Puede bloquear una IP comodín |
| 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. |
| 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. |
| Comprueba la inclusión de uno o más elementos ( | Ejemplo: |
| Especifica excepciones a una política. Las acciones están prohibidas a menos que se cumplan ciertas condiciones. | Ejemplo: |
| Comprueba si una lista está vacía. Por ejemplo, para impedir el acceso a través de redes públicas, la lista de acceso IP debe estar vacía. |
|
Operadores lógicos ( | Combinar múltiples condiciones en una póliza. | Opciones disponibles:
|
| Comprueba el modo de administración del servidor de configuración en clústeres fragmentados. | Opciones disponibles:
|
Direccionamiento IP ( | Se refiere a direcciones IP o rangos específicos en las políticas. | Opciones disponibles:
|
Crea una configuración de directiva de recursos de Atlas
Para crear una Política de Recursos de Atlas, utiliza el siguiente procedimiento para elaborar una política utilizando el lenguaje de políticas Cedar y agrégalo a Atlas mediante la interfaz de usuario de Atlas, la API de administración de Atlas o Terraform.
Advertencia
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.
Construya la política en el lenguaje de políticas de Cedar.
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:
Aplicar la topología del clúster (conjunto de réplicas, fragmentado o clúster global)
Implementar servidores de configuración dedicados para clústeres fragmentados
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.
Enviar una POST solicitud.
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.
En Atlas, vaya a la Organization Settings página.
Si aún no se muestra, selecciona la organización deseada en el menú Organizations de la barra de navegación.
En la barra lateral, haga clic en Organization Settings.
Se muestra la página Configuración de la organización.
Ir a la página Resource Policies.
En la barra lateral, haz clic en Resource Policies bajo el encabezado Configurations.
Se muestra la página Políticas de recursos.
Nombre, describa y defina su Política de Recursos Atlas.
Dale un nombre único a tu política de recursos de Atlas.
(Opcional) Agregue una descripción.
Copie y modifique las siguientes políticas de ejemplo para su organización, luego pegue el código en el campo Cedar Policy.
Aplicar la topología del clúster (conjunto de réplicas, fragmentado o clúster global)
Implementar servidores de configuración dedicados para clústeres fragmentados
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.
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.
Configurar el proveedor Terraform de MongoDB Atlas.
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
Defina la política en el lenguaje de políticas de Cedar.
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:
Aplicar la topología del clúster (conjunto de réplicas, fragmentado o clúster global)
Implementar servidores de configuración dedicados para clústeres fragmentados
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.
Ejemplos de políticas de recursos del Atlas
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.
Restringir el número de clústeres
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 };" } ] }
Restringir proveedor de nube
El siguiente ejemplo evita que los usuarios creen un clúster en Google Cloud:
{ "name": "Policy Preventing GCP Clusters", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { context.cluster.cloudProviders.contains(ResourcePolicy::CloudProvider::\"gcp\") };" } ] }
El siguiente ejemplo utiliza la cláusula unless para permitir que los usuarios creen clústeres solo en Google Cloud:
{ "name": "Policy Allowing Only GCP Clusters", "policies": [ { "body": "forbid(principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) unless { context.cluster.cloudProviders == [ResourcePolicy::CloudProvider::\"gcp\"] };" } ] }
El siguiente ejemplo utiliza la cláusula when para 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\"]};" } ] }
Restringir la región del proveedor de la nube
El siguiente ejemplo impide que los usuarios creen o editen un clúster en la región aws:us-east-1:
{ "name": "Prohibit Cluster Deployment in the US-EAST-1 Region", "policies": [ { "body": "forbid (principal,action == ResourcePolicy::Action::\"cluster.modify\",resource) when {context.cluster.regions.contains(ResourcePolicy::Region::\"aws:us-east-1\")};" } ] }
El siguiente ejemplo 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\"]) };" } ] }
Restringir proveedor de nube y región
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\"])};"} } ] }
Restringir direcciones IP
Nota
Si se añade el CIDR 0.0.0.0/0 a la lista de acceso de un proyecto, Atlas envía un correo electrónico de alerta a todos los usuarios a los que se les haya otorgado un rol en el proyecto de forma directa o indirecta a través de la pertenencia al equipo (si al equipo se le otorga un rol en el proyecto).
El siguiente ejemplo 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() };" } ] }
Restringir el tamaño de los niveles del clúster
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) };" } ] }
Requerir Windows de Mantenimiento del Proyecto
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};" } ] }
Prevenir modificaciones en el peering de red
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\"]};" } ] }
Prevenir modificaciones en puntos finales privados
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\"]};" } ] }
Restringir el protocolo TLS y los conjuntos de cifrado
El siguiente ejemplo restringe la versión mínima de TLS que su clúster acepta para las conexiones entrantes a 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\"};" } ] }
Aplicar tamaño de disco (GB)
El siguiente ejemplo aplica un tamaño máximo de disco de 4 TB al prohibir cualquier valor mayor que (>) el límite.
Para evitar 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 };" } ] }
Aplicar la topología del clúster (conjunto de réplicas, fragmentado o clúster global)
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.
Aplicar un recuento mínimo de fragmentos
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
minShardCountpara aplicar solo los mínimos (por< 3ejemplo,) ymaxShardCountpara aplicar solo los máximos (por ejemplo,).> 10El 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 };" } ] }
Implementar servidores de configuración dedicados para clústeres fragmentados
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\" };" } ] }
Restringir el número de clústeres
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 };
Restringir proveedor de nube
El siguiente ejemplo evita que los usuarios creen un clúster en Google Cloud:
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster.cloudProviders.contains(ResourcePolicy::CloudProvider::"gcp") };
El siguiente ejemplo utiliza la cláusula unless para permitir que los usuarios creen clústeres solo en Google Cloud:
forbid( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) unless { context.cluster.cloudProviders == [ResourcePolicy::CloudProvider::"gcp"] };
El siguiente ejemplo utiliza la cláusula when para 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"]};
Restringir la región del proveedor de la nube
El siguiente ejemplo impide que los usuarios creen o editen un clúster en la región aws:us-east-1:
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when {context.cluster.regions.contains(ResourcePolicy::Region::"aws:us-east-1")};
El siguiente ejemplo 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"]) };
Restringir direcciones IP
Nota
Si se añade el CIDR 0.0.0.0/0 a la lista de acceso de un proyecto, Atlas envía un correo electrónico de alerta a todos los usuarios a los que se les haya otorgado un rol en el proyecto de forma directa o indirecta a través de la pertenencia al equipo (si al equipo se le otorga un rol en el proyecto).
El siguiente ejemplo 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() };
Restringir el tamaño de los niveles del clúster
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) };
Requerir Windows de Mantenimiento del Proyecto
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};
Prevenir modificaciones en el peering de red
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"]};
Prevenir modificaciones en puntos finales privados
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"]};
Restringir el protocolo TLS y los conjuntos de cifrado
El siguiente ejemplo restringe la versión mínima de TLS que su clúster acepta para las conexiones entrantes a 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" };
Aplicar tamaño de disco (GB)
El siguiente ejemplo aplica un tamaño máximo de disco de 4 TB al prohibir cualquier valor mayor que (>) el límite.
Para evitar 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 };
Aplicar la topología del clúster (conjunto de réplicas, fragmentado o clúster global)
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.
Aplicar un recuento mínimo de fragmentos
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
minShardCountpara aplicar solo los mínimos (por< 3ejemplo,) ymaxShardCountpara aplicar solo los máximos (por ejemplo,).> 10El 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 };
Implementar servidores de configuración dedicados para clústeres fragmentados
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" };
Restringir el número de clústeres
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 }, ] }
Restringir proveedor de nube
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 }] }
Restringir región
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 }, ] }
Restringir proveedor de nube y región
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 }, ] }
Restringir direcciones IP
Nota
Si se añade el CIDR 0.0.0.0/0 a la lista de acceso de un proyecto, Atlas envía un correo electrónico de alerta a todos los usuarios a los que se les haya otorgado un rol en el proyecto de forma directa o indirecta a través de la pertenencia al equipo (si al equipo se le otorga un rol en el proyecto).
El siguiente ejemplo 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 }, ] }
Aplicar tamaño de disco (GB)
El siguiente ejemplo aplica un tamaño máximo de disco de 4 TB al prohibir cualquier valor mayor que (>) el límite.
Para evitar 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 }, ] }
Aplicar la topología del clúster (conjunto de réplicas, fragmentado o clúster global)
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.
Aplicar un recuento mínimo de fragmentos
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
minShardCountpara aplicar solo los mínimos (por< 3ejemplo,) ymaxShardCountpara aplicar solo los máximos (por ejemplo,).> 10El 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 }, ] }
Implementar servidores de configuración dedicados para clústeres fragmentados
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 }, ] }