- Requiere que los clústeres particionados utilicen exclusivamente 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:
Limita el número 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).
Restringe la implementación del clúster a regiones designadas dentro de un proveedor de nube. Por ejemplo,
aws:us-east-1.Prohíbe el uso de la IP comodín (
0.0.0.0/0) para aplicar controles de red más estrictos.Prohíbe el tráfico a través de redes públicas al exigir que la lista de acceso IP permanezca vacía o al impedir la incorporación a una lista de acceso IP existente.
Nota
Si se añade el CIDR
0.0.0.0/0a la lista de acceso de un proyecto, Atlas envía un correo electrónico de alerta a todos los usuarios a los que se les haya otorgado un rol en el proyecto de forma directa o indirecta a través de la pertenencia al equipo (si al equipo se le otorga un rol en el proyecto).Requerir que un proyecto tenga una ventana de mantenimiento configurada.
Evitar modificaciones en el emparejamiento de VPC y las conexiones de nodos privados entre proveedores de la 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 clusters particionados usen únicamente 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 (set de réplicas, clúster fragmentado, o clúster global).
Aplicar un número mínimo y máximo de particiones para clústeres particionados.
Importante
Por defecto, las Políticas de Recursos de Atlas son para toda la organización. Estas políticas aplican automáticamente estándares en todos los proyectos y clústeres de la organización.
Sin embargo, Atlas brinda flexibilidad. Puedes excluir proyectos específicos de una política de recursos de Atlas si es necesario. Esta funcionalidad permite que la mayoría de los proyectos hereden estándares coherentes en toda la organización, al mismo tiempo que posibilita excepciones para casos con requisitos únicos.
Además de la interfaz de usuario de Atlas y la API de administración de Atlas, puede 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, debes tener al menos acceso
Organization Read OnlyoOrganization Membera Atlas.Para crear, actualizar o borrar una política de recursos de Atlas, debe tener acceso
Organization Ownera Atlas.
Para usar la API de Administración de Atlas para crear o gestionar Políticas de Recursos de Atlas, localice sus claves públicas y privadas de API para poder autenticarse en la API de Administración de Atlas. Para obtener más información, consulta Comienza con la API de administración de Atlas.
Limitaciones
Recomendamos encarecidamente que supervise de forma proactiva su lista de recursos no conformes utilizando el endpoint /orgs/{ORG-ID}/nonCompliantResources. Las Políticas de Recursos de Atlas garantizan el cumplimiento de objetivos definidos, pero no aplican estados intermedios o transicionales. Por ejemplo, si un componente posterior falla, la política podría entrar temporalmente en un estado intermedio no conforme.
Cada política de recursos de Atlas debe tener un nombre único. Si 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 Atlas idénticas con diferentes nombres. Si bien esto no causa conflictos funcionales, puede llevar a la redundancia y confusión en la gestión de políticas.
Las políticas de recursos de Atlas 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 de lenguaje de políticas Cedar solo admite una política Cedar por archivo
.cedar, pero puedes enumerar varias políticas Cedar (archivos.cedar) en tu Política de recursos de Atlas. Cada archivo.cedarse identifica en la respuesta de la API de administración de Atlas como una unique 24-hexadecimal character string después depolicies.id.Si los límites de escalado automático en tu clúster existente no coinciden con la nueva Política de Recursos de Atlas, el clúster podría exceder los límites definidos por la política. Para abordar este problema, use el endpoint /orgs/{ORG-ID}/nonCompliantResources para identificar y supervisar los recursos que no cumplen, a fin de que puedan actualizarse para cumplir con los requisitos de la política.
Antes de habilitar los controles de nivel de red, revisa tu lista de acceso IP existente para asegurarte de que incluiya todos los puntos de acceso necesarios.
Las definiciones de 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 aplicas un recuento mínimo de particiones mayor a uno, deberás permitir explícitamente el estado de transición para las conversiones de clúster en tu política (por ejemplo,
&& !context.cluster.isConvertingToSharded). Sin esta excepción, Atlas impide que los usuarios conviertan un set de réplicas en un clúster porque el proceso de conversión requiere un estado intermedio donde el clúster tenga solo una partición.Atlas trata un set de réplicas como si tuviera una cantidad de particiones de uno. Si se aplica un recuento mínimo de particiones mayor que uno sin comprobar si los clústeres son clústeres fragmentados, todos los sets de réplicas del Proyecto se marcan como no conformes.
Uso del lenguaje de políticas Cedar
MongoDB utiliza el cedar lenguaje de políticas de código abierto para definir las Políticas de Recursos de Atlas. El diseño de Cedar equilibra la expresividad con la simplicidad, empleando una sintaxis concisa que agiliza tanto la escritura como la comprensión de las políticas de recursos.
Para crear rápidamente una Política de Recursos Atlas, adapta los ejemplos y añádelos a Atlas usando la Interfaz de Usuario de Atlas o la API de administración de Atlas siguiendo Crea una configuración de política de recursos Atlas.
Para obtener más información sobre El lenguaje de políticas Cedar, consulta:
Elementos clave de la sintaxis de Cedar para Atlas
Cedar Element | Descripton | Opciones de política de recursos de Atlas |
|---|---|---|
| Deniega la acción especificada si se cumplen las condiciones de la cláusula | Ejemplo: |
| Define el usuario afectado por la política. | Aplicado universalmente por defecto. No cambiar ni omitir. |
| Representa la acción que se controla en la política. | Acciones disponibles:
|
| Se refiere a un clúster específico | Para encontrar tu ID de clúster, usa la API de administración de Atlas para devolver todos los clústeres en un proyecto. |
| Se refiere a un proyecto específico. Por ejemplo, | Para encontrar el ID del grupo, consulta Administrar la configuración del Proyecto. |
| Especifica el proyecto al que pertenece el clúster. | Para encontrar el ID del grupo, consulta Administrar la configuración del Proyecto. |
| Especifica los proveedores de nube permitidos. | Opciones disponibles:
|
| 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 uses esta propiedad para aplicar los máximos. | Por ejemplo, |
| El número máximo posible de particiones. Usar solo para aplicar los límites máximos de particiones. ADVERTENCIA: No utilizar esta propiedad para aplicar mínimos. | Por ejemplo, |
| Comprueba si la operación actual consiste en convertir un set de réplicas en un clúster. Obligatorio al aplicar recuentos mínimos de particiones para permitir la transición inicial. | Por ejemplo, |
| Limita el acceso según las regiones de implementación. | Por ejemplo, |
| Verifica si una propiedad específica existe dentro del contexto del clúster. | Propiedades disponibles:
|
| Establece el nivel mínimo de clúster para reducir el clúster. | Por ejemplo, |
| Establece el nivel de clúster máximo para escalar el clúster. | Por ejemplo, |
| Especifica el número de clústeres que existen actualmente en un proyecto. | Por ejemplo, |
| Requiere que un Proyecto tenga un periodo de mantenimiento configurado. | Por ejemplo, |
| 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 tu proveedor de nube específico, consulta Prevent Modifications to Network emparejamiento. |
| Se refiere a un nodo privado específico. | Para formatear para su proveedor de nube específico, consulte Prevenir modificaciones en los nodos privados. |
| Comprueba la inclusión de uno o más elementos ( | Ejemplo: |
| Especifica excepciones a una política. Las acciones están prohibidas a menos que se cumplan ciertas condiciones. | Ejemplo: |
| Comprueba si una lista está vacía. Por ejemplo, para aplicar el acceso cero sobre redes públicas, se requiere que la lista de acceso IP esté vacía. |
|
Operadores lógicos ( | Combina múltiples condiciones en una política. | Opciones disponibles:
|
| Realiza comprobaciones para el modo de gestión del servidor de configuración en clústeres fragmentados. | Opciones disponibles:
|
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
Recomendamos que pruebes esta funcionalidad en un entorno que no sea de producción creando una nueva organización con un clúster nuevo. Esto asegura que puedas evaluar la funcionalidad de manera segura sin afectar tus sistemas existentes mientras adquieres nuevas habilidades.
Para crear una Política de Recursos de Atlas mediante la API de administración de Atlas, crea una política con lenguaje de políticas de Cedar y pásala a la API de administración de Atlas mediante una solicitud POST utilizando el parámetro policies.
Construya la política en el lenguaje de políticas de Cedar.
Especifica las reglas para restringir los recursos utilizando el lenguaje de políticas Cedar. Puedes copiar y modificar las siguientes políticas de ejemplo para tu organización:
Aplicar topología de clúster (set de réplicas, particionado o clúster global)
Aplicar servidores de configuración dedicados para clústeres particionados
Nota
Te recomendamos crear múltiples Políticas de Recursos Atlas simples para facilitar el seguimiento. Por ejemplo, si desea restringir el proveedor de nube y varias regiones, considere crear una política de recursos de Atlas que restrinja el proveedor de nube y otra política de recursos de Atlas que restrinja las regiones.
Envía una solicitud POST.
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 de Atlas.policiesLos siguientes pasos: Las restricciones del clúster que definiste en Cedar policy lenguaje en el paso anterior. Si se utilizan comillas (") enpolicies.body, usa una barra invertida (\) como escape.
Solicitud de ejemplo POST:
Nota
Este curl comando utiliza un token de acceso a la cuenta de servicio(OAuth) 2.0 para autenticarse en lugar de claves de API. Para obtener más información, consulte la guía de inicio rápido de la API de administración de Atlas.
curl --header "Authorization: Bearer {ACCESS-TOKEN}" \ --header "Content-Type: application/json" \ --header "Accept: application/vnd.atlas.2024-08-05+json" \ --include \ --request POST "https://cloud.mongodb.com/api/atlas/v2/orgs/{ORG-ID}/resourcePolicies?pretty=true" \ --data '{ "name": "MyResourcePolicy", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when {context.cluster.regions.contains(ResourcePolicy::Region::\"aws:us-west-1\")};" } ] }'
Respuesta de ejemplo:
1 { 2 "createdByUser" : { 3 "id" : "66ce81217d08f463824f3b80", 4 "name" : "ecwwjhop" 5 }, 6 "createdDate" : "2024-08-28T02:22:49Z", 7 "id" : "66ce89f9b535d00a2cb02f83", 8 "lastUpdatedByUser" : { 9 "id" : "66ce81217d08f463824f3b80", 10 "name" : "ecwwjhop" 11 }, 12 "lastUpdatedDate" : "2024-08-28T02:22:49Z", 13 "name" : "MyResourcePolicy", 14 "orgId" : "{ORG-ID}", 15 "policies" : [ { 16 "body" : "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when {context.cluster.regions.contains(ResourcePolicy::Region::\"aws:us-west-1\")};", 17 "id" : "66ce89f9b535d00a2cb02f82" 18 } ], 19 "version" : "v1"
Para crear una Política de Recursos de Atlas usando el nuevo editor de Atlas Interfaz de Usuario, utiliza el siguiente procedimiento para copiar y pegar una política de ejemplo en el editor, luego modifícala según las necesidades de tu organización.
En Atlas, ve a 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.
Nombra, describe y define tu política de recursos de Atlas.
Dale un nombre único a tu política de recursos de Atlas.
(Opcional) Agrega una descripción.
Copia y modifica las siguientes políticas de ejemplo para tu organización y luego pega el código en el campo Cedar Policy.
Aplicar topología de clúster (set de réplicas, particionado o clúster global)
Aplicar servidores de configuración dedicados para clústeres particionados
Nota
Te recomendamos crear múltiples Políticas de Recursos Atlas simples para facilitar el seguimiento. Por ejemplo, si desea restringir el proveedor de nube y varias regiones, considere crear una política de recursos de Atlas que restrinja el proveedor de nube y otra política de recursos de Atlas que restrinja las regiones.
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 fuente de actividad cuando creas, actualizas o eliminas una Política de Recursos de Atlas. Para ayudar a identificar tus eventos de fuente de actividad y hacer el seguimiento más fácil, recomendamos crear múltiples políticas de recursos simples en Atlas. Por ejemplo, si desea restringir el uso de un proveedor de nube y varias regiones, considere crear una política de recursos de Atlas que restrinja el proveedor de nube y otra política de recursos de Atlas que restrinja las regiones.
Nota
Requisitos previos adicionales
Complete los siguientes pasos antes de continuar con esta guía:
Cree una clave de API para su organización pagadora y almacene sus claves API como variables de entorno ejecutando los siguientes comandos:
export MONGODB_ATLAS_PUBLIC_KEY="<your public key>" export MONGODB_ATLAS_PRIVATE_KEY="<your private key>" Instala el Terraform CLI
Para crear una política de recursos 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 de 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.
Especifica las reglas para restringir los recursos utilizando el lenguaje de políticas Cedar. Puedes copiar y modificar las siguientes políticas de ejemplo para tu organización:
Aplicar topología de clúster (set de réplicas, particionado o clúster global)
Aplicar servidores de configuración dedicados para clústeres particionados
Nota
Te recomendamos crear múltiples Políticas de Recursos Atlas simples para facilitar el seguimiento. Por ejemplo, si desea restringir el proveedor de nube y varias regiones, considere crear una política de recursos de Atlas que restrinja el proveedor de nube y otra política de recursos de Atlas que restrinja las regiones.
Ejemplos de políticas de recursos 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 Atlas Administration API, los ejemplos se envuelven en JSON para que puedas pegarlos directamente en tus llamadas API. Para aprender más, consulte Crear una política de recursos de Atlas.
Restringir número de clústeres
El siguiente ejemplo impide que los usuarios creen más de 2 clústeres en un proyecto:
{ "name": "Prohibit More Than 2 Clusters in a Project", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { context.project.clustersInProject > 2 };" } ] }
Restringir proveedor de nube
El siguiente ejemplo evita que los usuarios creen un clúster en Google Cloud:
{ "name": "Policy Preventing GCP Clusters", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { context.cluster.cloudProviders.contains(ResourcePolicy::CloudProvider::\"gcp\") };" } ] }
El siguiente ejemplo utiliza la cláusula unless para permitir que los usuarios creen clústeres solo en Google Cloud:
{ "name": "Policy Allowing Only GCP Clusters", "policies": [ { "body": "forbid(principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) unless { context.cluster.cloudProviders == [ResourcePolicy::CloudProvider::\"gcp\"] };" } ] }
El siguiente ejemplo utiliza la cláusula when para impedir que los usuarios creen o editen un clúster en el Proyecto con ID 6217f7fff7957854e2d09179 a menos que Google Cloud sea el único proveedor de nube:
{ "name": "Policy Allowing Only GCP Clusters for One Project", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { resource in ResourcePolicy::Project::\"6217f7fff7957854e2d09179\" && context.cluster.cloudProviders == [ResourcePolicy::CloudProvider::\"gcp\"] };" } ] }
El siguiente ejemplo 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 región del proveedor de nube
El siguiente ejemplo impide que los usuarios creen o editen un clúster en la región aws:us-east-1:
{ "name": "Prohibit Cluster Deployment in the US-EAST-1 Region", "policies": [ { "body": "forbid (principal,action == ResourcePolicy::Action::\"cluster.modify\",resource) when {context.cluster.regions.contains(ResourcePolicy::Region::\"aws:us-east-1\")};" } ] }
El siguiente ejemplo impide que los usuarios creen un clúster en la región aws:us-west-1:
{ "name": "Policy Preventing Clusters in AWS:us-west-1", "policies": [ { "body": "forbid(principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { context.cluster.regions.contains(ResourcePolicy::Region::\"aws:us-west-1\") };" } ] }
El siguiente ejemplo impide que los usuarios creen un clúster en las regiones aws:us-east-1, aws:us-west-1, o azure:westeurope:
{ "name": "Policy Preventing Clusters in 3 AWS Regions", "policies": [ { "body": "forbid(principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { context.cluster.regions.containsAny([ResourcePolicy::Region::\"aws:us-east-1\", ResourcePolicy::Region::\"aws:us-west-1\", ResourcePolicy::Region::\"azure:westeurope\"]) };" } ] }
El siguiente ejemplo utiliza la cláusula unless para permitir a los usuarios crear clústeres solo en las regiones aws:us-east-1 y azure:westeurope:
{ "name": "Policy Allowing Clusters Only in 2 AWS Regions", "policies": [ { "body": "forbid(principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) unless { [ResourcePolicy::Region::\"aws:us-east-1\", ResourcePolicy::Region::\"azure:westeurope\"].containsAll(context.cluster.regions) };" } ] }
El siguiente ejemplo utiliza la cláusula when para restringir a los usuarios la edición del clúster con ID 3217e2gdf79a4c54e2d0827 en las regiones aws:us-east-1 y aws:us-west-1:
{ "name": "Policy Restricting Edits to One Cluster from 2 AWS Regions", "policies": [ { "body": "forbid(principal, action == ResourcePolicy::Action::\"cluster.modify\", resource == ResourcePolicy::Cluster::\"3217e2gdf79a4c54e2d0827\") when { context.cluster.regions.containsAny([ResourcePolicy::Region::\"aws:us-east-1\",ResourcePolicy::Region::\"aws:us-west-1\"]) };" } ] }
Restringir proveedor de nube y región
El siguiente ejemplo restringe a los usuarios de Atlas la 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 cláusula unless para permitir que los usuarios editen los proyectos únicamente desde las direcciones IP 1.2.3.4/32, 8.8.8.8/32 y 4.4.4.4/32:
{ "name": "Policy Restricting Project Edits to Specified IPs", "policies": [ { "body": "forbid(principal, action == ResourcePolicy::Action::\"project.ipAccessList.modify\", resource) unless { [ip(\"1.2.3.4/32\"), ip(\"8.8.8.8/32\"), ip(\"4.4.4.4/32\")].containsAll(context.project.ipAccessList) };" } ] }
El siguiente ejemplo garantiza que todo el tráfico 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() };" } ] }
Restringe los tamaños del nivel de clúster
El siguiente ejemplo utiliza la cláusula when para restringir que Atlas aprovisione o escale clústeres a menos de M30 o más de M60:
Nota
Esta política no restringe los clústeres con una clase de clúster de CPU baja o SSD NVMe.
{ "name": "Policy Restricting Min/Max Cluster Size", "policies": [ { "body": "forbid(principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { (context.cluster has minGeneralClassInstanceSizeValue && context.cluster.minGeneralClassInstanceSizeValue < 30) || (context.cluster has maxGeneralClassInstanceSizeValue && context.cluster.maxGeneralClassInstanceSizeValue > 60) };" } ] }
Requerir Windows de Mantenimiento del Proyecto
El siguiente ejemplo requiere que un Proyecto tenga configurado un periodo de mantenimiento:
{ "name": "Policy Enforcing Existence of a Project Maintenance Window", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"project.maintenanceWindow.modify\", resource) when {context.project.hasDefinedMaintenanceWindow == false};" } ] }
Evitar modificaciones en el emparejamiento de redes
El siguiente ejemplo previene modificaciones en las conexiones de emparejamiento de VPC entre diferentes proveedores de nube (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:
Amazon Web Services: aws:<AWS_ACCOUNT_ID>:<VPC_ID>:<VPC_CIDR>
AWS_ACCOUNT_ID: Tu número de cuenta de AWS.VPC_ID: El ID de la VPC.VPC_CIDR: El bloque CIDR de la VPC.
Azure: azure:<SUBSCRIPTION_ID>:<RESOURCE_GROUP_NAME>:<VNET_NAME>
SUBSCRIPTION_ID: Tu ID de suscripción de Azure.RESOURCE_GROUP_NAMEGrupo de recursos en el que se encuentra su Red Virtual (VNet).VNET_NAMENombre de la VNet.
Google Cloud Platform: gcp:<GCP_PROJECT_ID>:<VPC_NAME>
GCP_PROJECT_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 los nodos privados
El siguiente ejemplo evita las modificaciones de las conexiones de nodos privados en los proveedores de nube (AWS, Google Cloud, Azure).
Cada proveedor de nube requiere diferentes detalles para los nodos privados. Reúne los siguientes detalles de tu proveedor en la nube y reemplázalos en el ejemplo:
Amazon Web Services: aws:<VPC_ENDPOINT_ID>
VPC_ENDPOINT_ID: El ID del AWS VPC endpoint (punto final).
Azure: 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 Platform: 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 TLS Protocolo y conjuntos de cifrados
El siguiente ejemplo restringe la versión mínima TLS que tu clúster acepta para conexiones entrantes a TLS 1.2.
Los valores posibles para minTLSVersion incluyen:
TLS 1.0:
ResourcePolicy::TLSVersion::\"tls1_0\"TLS 1.1:
ResourcePolicy::TLSVersion::\"tls1_1\"TLS 1.2:
ResourcePolicy::TLSVersion::\"tls1_2\"
{ "name": "Policy Restricting Cluster Connections to Minimum TLS 1.2", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) unless {context.cluster.minTLSVersion == ResourcePolicy::TLSVersion::\"tls1_2\"};" } ] }
El siguiente ejemplo requiere que los clusters utilicen la configuración personalizada de la suite de cifrado TLS TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 configurando ResourcePolicy::CipherConfigMode::\"custom\".
Los posibles valores para configuraciones personalizadas de la suite de cifrado TLS son:
ResourcePolicy::CipherSuite::\"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384\"ResourcePolicy::CipherSuite::\"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256\"
{ "name": "Policy Requiring Specific TLS Cipher Suite", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) unless {context.cluster.cipherConfigMode == ResourcePolicy::CipherConfigMode::\"custom\" && context.cluster.cipherSuites == [ResourcePolicy::CipherSuite::\"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384\"]};" } ] }
El siguiente ejemplo requiere que los clústeres utilicen la configuración por defecto del conjunto de cifrado TLS.
{ "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 crear clústeres de un tamaño inferior a un cierto valor, utiliza un operador menor que (<) en la política de prohibición.
{ "name": "Limit Max Disk Size to 4000GB", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { context.cluster has diskSizeGB && context.cluster.diskSizeGB > 4096 };" } ] }
Aplicar topología de clúster (set de réplicas, particionado o clúster global)
El siguiente ejemplo permite a los usuarios crear únicamente clústeres de sets de réplicas.
{ "name": "Require Replica Set Clusters", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) unless { context.cluster.clusterType == ResourcePolicy::ClusterType::\"replicaset\" };" } ] }
Para permitir una topología de clúster diferente, utiliza uno de los siguientes valores:
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 recuento mínimo de particiones
El siguiente ejemplo requiere que los clústeres tengan al menos tres particiones.
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 trata un set de réplicas como si tuviera una cantidad de particiones de uno. Si se aplica un recuento mínimo de particiones mayor que uno sin comprobar si los clústeres son clústeres fragmentados, todos los sets de réplicas del Proyecto se marcan como no conformes.
Utilice
minShardCountpara aplicar solo mínimos (por ejemplo,< 3) ymaxShardCountpara aplicar solo máximos (por ejemplo,> 10). El uso de operadores de comparación opuestos con estas propiedades causa errores en la evaluación de políticas.
{ "name": "Require Minimum 3 Shards", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { context.cluster.minShardCount < 3 && !context.cluster.isConvertingToSharded };" } ] }
Aplicar servidores de configuración dedicados para clústeres particionados
El siguiente ejemplo impide que los usuarios creen clústeres particionados con servidores de configuración integrados, garantizando que utilicen servidores de configuración dedicados desde el principio.
{ "name": "Enforce config server management mode to fixed_to_dedicated for sharded clusters", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { context.cluster.clusterType == ResourcePolicy::ClusterType::\"sharded\" && context.cluster has configServerManagementMode && context.cluster.configServerManagementMode != ResourcePolicy::ConfigServerManagementMode::\"fixed_to_dedicated\" };" } ] }
Restringir número de clústeres
El siguiente ejemplo impide que los usuarios creen más de 2 clústeres en un proyecto:
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.project.clustersInProject > 2 };
Restringir proveedor de nube
El siguiente ejemplo evita que los usuarios creen un clúster en Google Cloud:
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster.cloudProviders.contains(ResourcePolicy::CloudProvider::"gcp") };
El siguiente ejemplo utiliza la cláusula unless para permitir que los usuarios creen clústeres solo en Google Cloud:
forbid( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) unless { context.cluster.cloudProviders == [ResourcePolicy::CloudProvider::"gcp"] };
El siguiente ejemplo utiliza la cláusula when para impedir que los usuarios creen o editen un clúster en el Proyecto con ID 6217f7fff7957854e2d09179 a menos que Google Cloud sea el único proveedor de nube:
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when {resource in ResourcePolicy::Project::"6217f7fff7957854e2d09179" && context.cluster.cloudProviders == [ResourcePolicy::CloudProvider::"gcp"] };
El siguiente ejemplo 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 región del proveedor de nube
El siguiente ejemplo impide que los usuarios creen o editen un clúster en la región aws:us-east-1:
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when {context.cluster.regions.contains(ResourcePolicy::Region::"aws:us-east-1")};
El siguiente ejemplo impide que los usuarios creen un clúster en la región aws:us-west-1:
forbid( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster.regions.contains(ResourcePolicy::Region::"aws:us-west-1") };
El siguiente ejemplo impide que los usuarios creen un clúster en las regiones aws:us-east-1, aws:us-west-1, o azure:westeurope:
forbid( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster.regions.containsAny([ResourcePolicy::Region::"aws:us-east-1",ResourcePolicy::Region::"aws:us-west-1",ResourcePolicy::Region::"azure:westeurope"]) };
El siguiente ejemplo utiliza la cláusula unless para permitir a los usuarios crear clústeres solo en las regiones aws:us-east-1 y azure:westeurope:
forbid( principal, action == ResourcePolicy::Action::\"cluster.modify\", resource ) unless { [ResourcePolicy::Region::"aws:us-east-1", ResourcePolicy::Region::"azure:westeurope"].containsAll(context.cluster.regions) };
El siguiente ejemplo utiliza la cláusula when para restringir a los usuarios la edición del clúster con ID 3217e2gdf79a4c54e2d0827 en las regiones aws:us-east-1 y aws:us-west-1:
forbid( principal, action == ResourcePolicy::Action::"cluster.modify", resource == ResourcePolicy::Cluster::"3217e2gdf79a4c54e2d0827" ) when { context.cluster.regions.containsAny([ResourcePolicy::Region::"aws:us-east-1",ResourcePolicy::Region::"aws:us-west-1"]) };
Restringir direcciones IP
Nota
Si se añade el CIDR 0.0.0.0/0 a la lista de acceso de un proyecto, Atlas envía un correo electrónico de alerta a todos los usuarios a los que se les haya otorgado un rol en el proyecto de forma directa o indirecta a través de la pertenencia al equipo (si al equipo se le otorga un rol en el proyecto).
El siguiente ejemplo 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 cláusula unless para permitir que los usuarios editen los proyectos únicamente desde las direcciones IP 1.2.3.4/32, 8.8.8.8/32 y 4.4.4.4/32:
forbid( principal, action == ResourcePolicy::Action::"project.ipAccessList.modify", resource ) unless { [ip("1.2.3.4/32"), ip("8.8.8.8/32"), ip("4.4.4.4/32")].containsAll(context.project.ipAccessList) };
El siguiente ejemplo garantiza que todo el tráfico 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() };
Restrinja los tamaños de nivel de clúster
El siguiente ejemplo utiliza la cláusula when para restringir que Atlas aprovisione o escale clústeres a menos de M30 o más de M60:
Nota
Esta política no restringe los clústeres con una clase de clúster de CPU baja o SSD NVMe.
forbid( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { (context.cluster has minGeneralClassInstanceSizeValue && context.cluster.minGeneralClassInstanceSizeValue < 30) || (context.cluster has maxGeneralClassInstanceSizeValue && context.cluster.maxGeneralClassInstanceSizeValue > 60) };
Requerir Windows de Mantenimiento del Proyecto
El siguiente ejemplo requiere que un Proyecto tenga configurado un periodo de mantenimiento:
forbid ( principal, action == ResourcePolicy::Action::"project.maintenanceWindow.modify", resource ) when {context.project.hasDefinedMaintenanceWindow == false};
Evitar modificaciones en el emparejamiento de redes
El siguiente ejemplo previene modificaciones en las conexiones de emparejamiento de VPC entre diferentes proveedores de nube (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:
Amazon Web Services: aws:<AWS_ACCOUNT_ID>:<VPC_ID>:<VPC_CIDR>
AWS_ACCOUNT_ID: Tu número de cuenta de AWS.VPC_ID: El ID de la VPC.VPC_CIDR: El bloque CIDR de la VPC.
Azure: azure:<SUBSCRIPTION_ID>:<RESOURCE_GROUP_NAME>:<VNET_NAME>
SUBSCRIPTION_ID: Tu ID de suscripción de Azure.RESOURCE_GROUP_NAMEGrupo de recursos en el que se encuentra su Red Virtual (VNet).VNET_NAMENombre de la VNet.
Google Cloud Platform: gcp:<GCP_PROJECT_ID>:<VPC_NAME>
GCP_PROJECT_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 los nodos privados
El siguiente ejemplo evita las modificaciones de las conexiones de nodos privados en los proveedores de nube (AWS, Google Cloud, Azure).
Cada proveedor de nube requiere diferentes detalles para los nodos privados. Reúne los siguientes detalles de tu proveedor en la nube y reemplázalos en el ejemplo:
Amazon Web Services: aws:<VPC_ENDPOINT_ID>
VPC_ENDPOINT_ID: El ID del AWS VPC endpoint (punto final).
Azure: 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 Platform: 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 nodos privados de Google Cloud asociado con la conexión.
Enrutamiento basado en puertos de Google Cloud: gcp:<GCP_PROJECT_ID>:<PRIVATE_ENDPOINT_NAME>:<PRIVATE_ENDPOINT_IP_ADDRESS>
GCP_PROJECT_ID:El ID de su proyecto de Google Cloud.PRIVATE_ENDPOINT_NAMENombre del endpoint privado en Google Cloud asociado con la conexión.PRIVATE_ENDPOINT_IP_ADDRESS: La dirección IP asignada al nodo privado.
forbid ( principal, action == ResourcePolicy::Action::"project.privateEndpoint.modify", resource ) when {context.project.privateEndpoints == ["aws:vpce-042d72ded1748f314", "azure:/subscriptions/fd01aafc-b3re-2193-8497-83lp3m83a1a5/resourceGroups/rg-name/providers/Microsoft.Network/privateEndpoints/pe-name:10.0.0.4", "gcp:inductive-cocoa-108200:default"]};
Restringir el TLS Protocolo y conjuntos de cifrados
El siguiente ejemplo restringe la versión mínima TLS que tu clúster acepta para conexiones entrantes a TLS 1.2.
Los valores posibles para minTLSVersion incluyen:
TLS 1.0:
ResourcePolicy::TLSVersion::"tls1_0"TLS 1.1:
ResourcePolicy::TLSVersion::"tls1_1"TLS 1.2:
ResourcePolicy::TLSVersion::"tls1_2"
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) unless { context.cluster.minTLSVersion == ResourcePolicy::TLSVersion::"tls1_2" };
El siguiente ejemplo requiere que los clusters utilicen la configuración personalizada de la suite de cifrado TLS TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 configurando ResourcePolicy::CipherConfigMode::"custom".
Los posibles valores para configuraciones personalizadas de la suite de cifrado TLS son:
ResourcePolicy::CipherSuite::"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"ResourcePolicy::CipherSuite::"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) unless { context.cluster.cipherConfigMode == ResourcePolicy::CipherConfigMode::"custom" && context.cluster.cipherSuites == [ResourcePolicy::CipherSuite::"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"] };
El siguiente ejemplo requiere que los clústeres utilicen la configuración por defecto del conjunto de cifrado TLS.
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 crear clústeres de un tamaño inferior a un cierto valor, utiliza un operador menor que (<) en la política de prohibición.
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster has diskSizeGB && context.cluster.diskSizeGB > 4096 };
Aplicar topología de clúster (set de réplicas, particionado o clúster global)
El siguiente ejemplo permite a los usuarios crear únicamente clústeres de sets de réplicas.
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) unless { context.cluster.clusterType == ResourcePolicy::ClusterType::"replicaset" };
Para permitir una topología de clúster diferente, utiliza uno de los siguientes valores:
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 recuento mínimo de particiones
El siguiente ejemplo requiere que los clústeres tengan al menos tres particiones.
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 trata un set de réplicas como si tuviera una cantidad de particiones de uno. Si se aplica un recuento mínimo de particiones mayor que uno sin comprobar si los clústeres son clústeres fragmentados, todos los sets de réplicas del Proyecto se marcan como no conformes.
Utilice
minShardCountpara aplicar solo mínimos (por ejemplo,< 3) ymaxShardCountpara aplicar solo máximos (por ejemplo,> 10). El uso de operadores de comparación opuestos con estas propiedades causa errores en la evaluación de políticas.
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster.minShardCount < 3 && !context.cluster.isConvertingToSharded };
Aplicar servidores de configuración dedicados para clústeres particionados
El siguiente ejemplo impide que los usuarios creen clústeres particionados con servidores de configuración integrados, garantizando que utilicen servidores de configuración dedicados desde el principio.
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster.clusterType == ResourcePolicy::ClusterType::"sharded" && context.cluster has configServerManagementMode && context.cluster.configServerManagementMode != ResourcePolicy::ConfigServerManagementMode::"fixed_to_dedicated" };
Restringir número de clústeres
El siguiente ejemplo impide que los usuarios creen más de 2 clústeres en un proyecto:
resource "mongodbatlas_resource_policy" "forbid_more_than_two_clusters" { org_id = var.org_id name = "forbid-more-than-two-clusters" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.project.clustersInProject > 2 }; EOF }, ] }
Restringir proveedor de nube
El siguiente ejemplo impide a los usuarios crear un clúster en todos los proveedores de nube excepto en AWS:
resource "mongodbatlas_resource_policy" "allow_only_aws_cloud_provider" { org_id = var.org_id name = "cluster-allow-only-aws-cloud-provider" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) unless { context.cluster.cloudProviders == [ResourcePolicy::CloudProvider::"aws"] }; EOF }] }
Restringir región
El siguiente ejemplo utiliza la cláusula unless para permitir a los usuarios crear clústeres solo en las regiones aws:us-east-1 y aws:eu-central-1:
resource "mongodbatlas_resource_policy" "allow_only_regions" { org_id = var.org_id name = "cluster-allow-only-regions" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) unless { [ResourcePolicy::Region::"aws:eu-west-1", ResourcePolicy::Region::"aws:eu-central-1"] .containsAll(context.cluster.regions)}; EOF }, ] }
Restringir proveedor de nube y región
El siguiente ejemplo utiliza la cláusula unless para permitir que los usuarios creen clústeres solo en Google Cloud o en las regiones aws:us-east-1 y aws:eu-central-1:
resource "mongodbatlas_resource_policy" "allow_only_provider_regions" { org_id = var.org_id name = "cluster-allow-only-provider-regions" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) unless { context.cluster.cloudProviders == [ResourcePolicy::CloudProvider::"gcp"] || [ResourcePolicy::Region::"aws:eu-west-1", ResourcePolicy::Region::"aws:eu-central-1"] .containsAll(context.cluster.regions)}; EOF }, ] }
Restringir direcciones IP
Nota
Si se añade el CIDR 0.0.0.0/0 a la lista de acceso de un proyecto, Atlas envía un correo electrónico de alerta a todos los usuarios a los que se les haya otorgado un rol en el proyecto de forma directa o indirecta a través de la pertenencia al equipo (si al equipo se le otorga un rol en el proyecto).
El siguiente ejemplo 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 crear clústeres de un tamaño inferior a un cierto valor, utiliza un operador menor que (<) en la política de prohibición.
resource "mongodbatlas_resource_policy" "limit_max_disk_size" { org_id = var.org_id name = "limit-max-4096gb-disk" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster has diskSizeGB && context.cluster.diskSizeGB > 4096 }; EOF }, ] }
Aplicar topología de clúster (set de réplicas, particionado o clúster global)
El siguiente ejemplo permite a los usuarios crear únicamente clústeres de sets de réplicas.
resource "mongodbatlas_resource_policy" "require_replica_set" { org_id = var.org_id name = "require-replica-set" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) unless { context.cluster.clusterType == ResourcePolicy::ClusterType::"replicaset" }; EOF }, ] }
Para permitir una topología de clúster diferente, utiliza uno de los siguientes valores:
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 recuento mínimo de particiones
El siguiente ejemplo requiere que los clústeres tengan al menos tres particiones.
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 trata un set de réplicas como si tuviera una cantidad de particiones de uno. Si se aplica un recuento mínimo de particiones mayor que uno sin comprobar si los clústeres son clústeres fragmentados, todos los sets de réplicas del Proyecto se marcan como no conformes.
Utilice
minShardCountpara aplicar solo mínimos (por ejemplo,< 3) ymaxShardCountpara aplicar solo máximos (por ejemplo,> 10). El uso de operadores de comparación opuestos con estas propiedades causa errores en la evaluación de políticas.
resource "mongodbatlas_resource_policy" "require_min_shards" { org_id = var.org_id name = "require-min-3-shards" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster.minShardCount < 3 && !context.cluster.isConvertingToSharded }; EOF }, ] }
Aplicar servidores de configuración dedicados para clústeres particionados
El siguiente ejemplo impide que los usuarios creen clústeres particionados con servidores de configuración integrados, garantizando que utilicen servidores de configuración dedicados desde el principio.
resource "mongodbatlas_resource_policy" "enforce_dedicated_config_server" { org_id = var.org_id name = "enforce-dedicated-config-server" policies = [ { body = <<EOF forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster.clusterType == ResourcePolicy::ClusterType::"sharded" && context.cluster has configServerManagementMode && context.cluster.configServerManagementMode != ResourcePolicy::ConfigServerManagementMode::"fixed_to_dedicated" }; EOF }, ] }