- 为所有集群强制执行最小和最大磁盘大小。
- 实施特定的集群拓扑结构(副本集、集群或Atlas全球集群)。
- 实施分片集群的最小和最大分片数。
Atlas资源策略是控件,启用Organization Owners 来限制开发者在创建或配置Atlas集群时可以使用的特定配置选项。
通过资源策略,您可以:
限制可以在项目中创建的集群数量。
将集群部署限制在特定的云平台( Amazon Web Services 、 Google Cloud Platform、 Azure )。
将集群部署限制在云提供商内的指定区域。 示例,
aws:us-east-1。禁止使用通配符IP (
0.0.0.0/0) 以实施更严格的网络控制。通过要求IP访问列表保持为空或阻止向现有IP访问列表添加内容,禁止通过公共网络的流量。
注意
如果您将
0.0.0.0/0CIDR 添加到项目访问列表,Atlas 会向所有直接被授予项目角色或通过团队成员间接被授予项目角色(如果团队被授予项目角色)的所有用户发送警报电子邮件。要求项目配置维护窗口。
防止修改云提供商的VPC对等互连和私有端点连接。
对集群连接实施最低 TLS 版本或要求特定的 TLS 密码套件配置。
在整个组织中实施最小和最大集群层以及自动伸缩大小。如果启用,此策略将阻止用户将集群预配、更新或自动伸缩到高于或低于指定阈值的层级。
为所有集群强制执行最小和最大磁盘大小。
实施分片集群的最小和最大分片数。
重要
默认情况下,Atlas资源策略是组织范围的。这些策略会自动在组织内的所有项目和集群中实施标准。
但是,Atlas提供了灵活性。如有必要,您可以从Atlas资源策略中排除特定项目。此功能允许大多数项目继承一致的组织范围标准,同时为具有独特需求的案例启用例外。
除了Atlas用户界面和Atlas管理API之外,您还可以使用 HashiCorp Terraform MongoDB Atlas Provider 、 MongoDB Atlas Amazon Web Services CloudFormation Resources 或Amazon Web Services CloudFormation 来配置和管理Atlas资源策略。
注意
对于 HashiCorp Terraform MongoDB Atlas Provider,请使用 1.33.0 或更高版本来实施最低 TLS 版本,或者要求为集群连接配置特定的 TLS 密码套件。Atlas可能会区块来自早期版本的 Terraform 的连接。
先决条件
确保您的Atlas 用户具有适当的组织角色:
要查看Atlas资源策略,您必须至少拥有Atlas
Organization Read Only的Organization Member或 访问权限。Organization Owner要创建、更新或删除Atlas资源策略,您必须拥有Atlas 的 访问权限。
要使用Atlas Administration API创建或管理Atlas资源策略,请找到您的公共和私有API密钥,以便在Atlas Administration API中进行身份验证。要学习;了解更多信息,请参阅Atlas Administration API入门。
限制
我们强烈建议您使用 /orgs/{ORG-ID}/nonCompliantResources 端点主动监控不合规资源列表。Atlas资源策略确保合规既定目标,但不实施中间或过渡状态。示例,如果下游组件发生故障,策略可能会暂时进入不合规中间状态。
每个Atlas资源策略都必须有一个唯一名称。如果您尝试使用现有名称创建Atlas资源策略,服务器将返回
400 (Bad Request)状态代码。可以创建具有不同名称的相同Atlas资源策略。虽然这不会导致功能冲突,但可能导致策略管理冗余和混乱。
Atlas资源策略默认为允许。 如果不存在Atlas资源策略,则用户可以在Atlas集群上执行其Atlas 用户角色允许的所有操作。
我们实施的Cedar 策略语言版本仅支持每个
.cedar文件一个 Cedar 策略,但您可以在Atlas资源策略中列出多个 Cedar 策略(.cedar文件)。每个.cedar文件在Atlas 管理 API响应中都标识为policies.id之后的唯一 24-十六进制字符串。如果现有集群的自动伸缩限制与新的Atlas资源策略不匹配,则集群可能会超出策略定义的边界。要解决此问题,请使用 /orgs/{ORG-ID}/nonCompliantResources 端点识别和监控不合规资源,以便对其更新以满足策略要求。
在启用网络层控制之前,查看现有的IP访问列表,确保其中包含所有必要的访问权限点。
Cedar 策略语言 中的私有端点定义要求您输入单个IP地址,因为不支持通配符操作。
在实施磁盘大小时,请确保考虑实例大小的特定要求和云提供商限制。
如果您实施大于 1 的最小分片数,则必须在策略中明确允许集群转换的过渡状态(示例
&& !context.cluster.isConvertingToSharded)。如果没有这个例外,Atlas会阻止用户将副本集转换为集群,因为转换进程需要一种中间状态,在该状态下,集群只有一个分片。Atlas将副本集视为分片计数为 1。如果您实施大于 1 的最小分片数而不检查集群是否为分片的集群,项目中的所有副本集都将被标记为不合规。
使用 Cedar Policy 语言
MongoDB使用开源Cedar 策略语言来定义Atlas资源策略。Cedar 的设计平衡了表现力和简单性,采用简洁的语法,简化了资源策略的编写和理解。
要快速创建Atlas资源策略,请调整示例并使用Atlas用户界面或Atlas管理API添加到Atlas ,具体方法请参阅创建Atlas资源策略配置。
要学习;了解有关Cedar 策略语言的更多信息,请参阅:
Atlas的关键 Cedar事务语法元素
Cedar Element | Descripton | Atlas资源策略选项 |
|---|---|---|
| 如果满足 | 示例: |
| 定义受策略影响的用户。 | 默认下普遍应用。 请勿更改或省略。 |
| 表示策略中正在控制的动作。 | 可用操作:
|
| 指的是特定集群 | |
| 指的是一个具体的项目。 示例, | 要查找您的项目ID,请参阅 管理项目设置。 |
| 指定集群所属的项目。 | 要查找您的项目ID,请参阅 管理项目设置。 |
| 指定允许的云提供商。 | 可用选项:
|
| 指定集群拓扑结构:副本集、分片集群或Atlas全球集群。 | 可用选项:
|
| 指定磁盘大小(以GB为单位)。 | 示例, |
| 当前的实际分片数量。仅用于实施 最小 分片计数。警告:请勿使用此属性来实施最大值。 | 示例, |
| 分片的最大可能数量。仅用于实施最大分片限制。警告:请勿使用此属性来实施最小值。 | 示例, |
| 检查当前操作是否正在将副本集转换为分片集群。实施最小分片计数以允许初始转换时必需的。 | 例如, |
| 根据部署区域限制访问权限。 | 示例, |
| 检查集群上下文中是否存在特定属性。 | |
| 设置集群扩展到的最小集群层。 | |
| 设置集群扩展到的最大集群层。 | |
| 指定项目中当前集群的数量。 | 示例, |
| 要求项目配置维护窗口。 | 示例, |
| 指定可以访问权限集群的IP地址。 | 您可以区块通配符IP |
| 指特定的VPC对等互连。 | 要针对特定的云提供商进行格式化,请参阅防止修改网络对对等互连。 |
| 指特定的私有端点。 | 要针对特定云提供商进行格式化,请参阅防止修改私有端点。 |
| 检查是否包含列表中的一个或多个元素 ( | 示例: |
| 指定策略的例外情况。 除非满足某些条件,否则禁止采取行动。 | 示例: |
| 检查列表是否为空。示例,禁止访问权限公共网络要求IP访问列表为空。 |
|
逻辑操作符( | 在一项策略中组合多个条件。 | 可用选项:
|
IP寻址 ( | 指策略中的特定IP地址或范围。 | 可用选项:
|
创建Atlas资源策略配置
要创建Atlas资源策略,请按照以下过程使用Cedar 策略语言构建策略,并使用Atlas用户用户界面、 Atlas管理API或 Terraform 添加到Atlas 。
警告
我们建议您在非生产环境中测试此功能,方法是使用新集群创建新组织。 这可确保您可以安全地评估该功能,而在提高技能时不会影响现有系统。
要使用 Atlas 管理 API 创建 Atlas 资源策略,请使用 Cedar 策略语言 构建策略,并通过 POST 请求使用 policies 参数将其传递给 Atlas 管理 API 。
使用 Cedar 策略语言构建策略。
使用 Cedar 策略语言 指定限制资源的规则。您可以复制并修改组织的以下示例策略:
注意
我们建议创建多个简单的Atlas资源策略,以便更轻松地进行跟踪。 示例,如果您想限制云提供商和多个地区,请考虑创建一个限制云提供商的Atlas资源策略和另一个限制地区的Atlas资源策略。
发送POST 请求。
使用 POST 动词为您的组织创建Atlas资源策略。 该请求必须包括:
name: Atlas资源策略的名称。policies: 您在上一步中用Cedar 策略语言定义的集群限制。如果在policies.body中使用引号 ("),请使用反斜杠 (\) 转义。
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\")};" } ] }'
响应示例:
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"
要使用新的Atlas用户界面编辑器创建Atlas资源策略,请使用以下过程将示例策略复制并粘贴到编辑器中,然后根据您的组织对其进行修改。
在Atlas中,转到Organization Settings 页面。
如果尚未显示,组织从导航栏中的Organizations菜单。
在侧边栏中,单击 Organization Settings。
显示“组织设置”页面。
此Atlas资源策略适用于所有新集群。 对于不符合Atlas资源策略的现有集群, Atlas只允许用户对集群进行更改,以使集群合规。 示例,如果cluster0 在Amazon Web Services上运行,而您应用了阻止Amazon Web Services上的集群的Atlas资源策略,则在 cluster0不合规时,用户可以对它进行的唯一更改就是将云提供商切换到Azure或Google Cloud Platform。
要返回不符合Atlas资源策略的现有集群列表,请使用GET /orgs/{ORG- ID}/nonCompliantResources资源。
当您创建、更新或删除Atlas资源策略时, Atlas会生成操作日志事件。为了帮助识别操作日志事件并简化跟踪,我们建议创建多个简单的Atlas资源策略。示例,如果您想限制云提供商和多个区域的使用,可以考虑创建一个限制云提供商的Atlas资源策略和另一个限制区域的Atlas资源策略。
注意
其他先决条件
请先完成以下步骤,然后再继续阅读本指南:
通过运行以下命令,为付款组织创建API密钥,并将API密钥存储为环境变量:
export MONGODB_ATLAS_PUBLIC_KEY="<your public key>" export MONGODB_ATLAS_PRIVATE_KEY="<your private key>"
要使用 Terraform 创建 Atlas 资源策略,请配置 MongoDB Atlas Terraform 提供程序,然后使用 Cedar 策略语言 构建策略并在 main.tf Terraform 文件中指定它。
配置MongoDB Atlas Terraform 提供程序。
在项目目录中创建一个名为 main.tf 的新文件。粘贴以下代码,用于配置MongoDB Atlas Provider 并指定公钥和私钥:
terraform { required_version = ">=1.4" required_providers { mongodbatlas = { source = "mongodb/mongodbatlas" version = "~>1.31" } } } provider "mongodbatlas" {} variable "org_id" { type = string description = "<Organization ID>" }
创建文件后,运行以下命令以下载最新版本的提供商并初始化 Terraform:
terraform init -upgrade
使用 Cedar 策略语言定义策略。
使用 Cedar 策略语言 指定限制资源的规则。您可以复制并修改组织的以下示例策略:
注意
我们建议创建多个简单的Atlas资源策略,以便更轻松地进行跟踪。 示例,如果您想限制云提供商和多个地区,请考虑创建一个限制云提供商的Atlas资源策略和另一个限制地区的Atlas资源策略。
Atlas资源策略示例
复制并修改以下示例策略以用于您的组织。所有示例都使用Cedar 策略语言,但对于 Atlas 管理 API,示例包装在JSON中,因此您可以将它们直接粘贴到API调用中。要学习;了解更多信息,请参阅创建Atlas资源策略配置。
限制集群数量
以下示例禁止用户在项目中创建超过 2 个集群:
{ "name": "Prohibit More Than 2 Clusters in a Project", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { context.project.clustersInProject > 2 };" } ] }
限制云提供商
以下示例禁止用户在Google Cloud Platform上创建集群:
{ "name": "Policy Preventing GCP Clusters", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { context.cluster.cloudProviders.contains(ResourcePolicy::CloudProvider::\"gcp\") };" } ] }
以下示例使用unless 子句允许用户仅在Google Cloud Platform上创建集群:
{ "name": "Policy Allowing Only GCP Clusters", "policies": [ { "body": "forbid(principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) unless { context.cluster.cloudProviders == [ResourcePolicy::CloudProvider::\"gcp\"] };" } ] }
以下示例使用 when 子句防止用户在ID为 6217f7fff7957854e2d09179 的项目中创建或编辑集群,除非Google Cloud Platform是唯一的云提供商:
{ "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\"] };" } ] }
当Google Cloud Platform是云提供商时,以下示例阻止对ID为 3217e2gdf79a4c54e2d0827 的集群进行修改:
{ "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\"]};" } ] }
限制云提供商区域
以下示例禁止用户在地区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\")};" } ] }
以下示例禁止用户在地区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\") };" } ] }
以下示例禁止用户在 aws:us-east-1、aws:us-west-1 或 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\"]) };" } ] }
以下示例使用unless 子句,允许用户仅在区域aws:us-east-1 和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) };" } ] }
以下示例使用 when 子句限制用户在区域 aws:us-east-1 和 aws:us-west-1 中编辑ID为 3217e2gdf79a4c54e2d0827 的集群:
{ "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\"]) };" } ] }
限制云提供商和地区
以下示例限制Atlas用户在Google Cloud Platform或Amazon Web Services区域 aws:us-east-1 或 aws:us-west-1 中创建Atlas集群。
{ "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\"])};"} } ] }
限制IP地址
注意
如果您将 0.0.0.0/0 CIDR 添加到项目访问列表,Atlas 会向所有直接被授予项目角色或通过团队成员间接被授予项目角色(如果团队被授予项目角色)的所有用户发送警报电子邮件。
以下示例禁止用户从通配符IP (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\")) };" } ] }
以下示例使用unless 子句,允许用户仅编辑来自IP地址1.2.3.4/32 、8.8.8.8/32 和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) };" } ] }
以下示例要求IP访问列表为空,以确保禁止通过公共网络流向集群的所有流量。
{ "name": "Policy Preventing Access Over Public Networks", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"project.ipAccessList.modify\", resource) unless {context.project.ipAccessList.isEmpty() };" } ] }
限制集群层大小
以下示例使用 when 子句将Atlas预配或扩展集群限制为小于 M30 或大于 M60:
{ "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) };" } ] }
需要项目维护Windows
以下示例要求项目配置维护窗口:
{ "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};" } ] }
防止修改网络对对等互连
以下示例防止修改不同云提供商( Amazon Web Services 、Google Cloud Platform、 Azure )之间的 VPC 对等互连。
每个云提供商需要不同的VPC对等互连详细信息。收集您的云提供商的以下详细信息,并将其替换到示例中:
Amazon Web Services: aws:<AWS_ACCOUNT_ID>:<VPC_ID>:<VPC_CIDR>
AWS_ACCOUNT_ID:您的Amazon Web Services帐号。VPC_ID:VPC的ID。VPC_CIDR: VPC的 CIDR区块。
Azure: azure:<SUBSCRIPTION_ID>:<RESOURCE_GROUP_NAME>:<VNET_NAME>
SUBSCRIPTION_ID:您的Azure订阅ID。RESOURCE_GROUP_NAME:虚拟网络 (VNet) 所在的资源群组。VNET_NAME:VNet 的名称。
Google Cloud: gcp:<GCP_PROJECT_ID>:<VPC_NAME>
GCP_PROJECT_ID: Google Cloud Platform项目的ID 。VPC_NAME: Google Cloud Platform中VPC的名称。
{ "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\"]};" } ] }
防止修改私有端点
以下示例防止跨云提供商(Amazon Web Services、 Google Cloud Platform、 Azure)修改私有端点连接。
每个云提供商要求提供不同的私有端点详细信息。收集您的云提供商的以下详细信息,并将其替换到示例中:
Amazon Web Services: aws:<VPC_ENDPOINT_ID>
VPC_ENDPOINT_ID: Amazon Web Services VPC端点的ID 。
Azure: azure:<PRIVATE_ENDPOINT_RESOURCE_ID>:<PRIVATE_ENDPOINT_IP_ADDRESS>
PRIVATE_ENDPOINT_RESOURCE_ID: Azure私有端点的完整资源ID路径。PRIVATE_ENDPOINT_IP_ADDRESS:分配给私有端点的IP解决。
Google Cloud: gcp:<GCP_PROJECT_ID>:<VPC_NAME>
GCP_PROJECT_ID: Google Cloud Platform项目的ID 。VPC_NAME: Google Cloud Platform中与该连接关联的VPC的名称。
{ "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\"]};" } ] }
限制 TLS 协议和密码套件
以下示例将集群接受的传入连接的最低TLS版本限制为TLS 1.2。
minTLSVersion 的可能值包括:
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\"};" } ] }
以下示例要求集群通过设置 ResourcePolicy::CipherConfigMode::\"custom\" 使用自定义TLS密码套件配置 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384。
自定义 TLS 密码套件配置的可能值为:
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\"]};" } ] }
以下示例要求集群使用默认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\"};" } ] }
强制执行磁盘大小 (GB)
以下示例通过禁止任何大于 (>) 限制的值来实施 4 TB 的最大磁盘大小。
要防止创建小于特定大小的集群,请在禁止策略中使用小于操作符(<)。
{ "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 };" } ] }
实施集群拓扑结构(副本集、分片的或Atlas全球集群)
以下示例允许用户仅创建副本集集群。
{ "name": "Require Replica Set Clusters", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) unless { context.cluster.clusterType == ResourcePolicy::ClusterType::\"replicaset\" };" } ] }
要支持不同的集群拓扑结构,请使用以下值之一:
分片集群:
ResourcePolicy::ClusterType::"sharded"用于标准水平扩展,其中数据分布式在多个分片上以支持大型数据集或高吞吐量。Atlas全球集群:
ResourcePolicy::ClusterType::"geosharded"用于位置感知部署,其中数据分布式在特定地理区域,以确保数据靠近用户。
强制执行最小分片计数
以下示例要求分片的集群至少有三个分片。
重要
如果实施大于 1 的最小分片数,则必须在策略中明确允许集群转换的过渡状态(示例
&& !context.cluster.isConvertingToSharded)。如果没有这个例外,Atlas会阻止用户将副本集转换为集群,因为转换进程需要一种中间状态,在该状态下,集群只有一个分片。Atlas将副本集视为分片计数为 1。如果您实施大于 1 的最小分片数而不检查集群是否为分片的集群,项目中的所有副本集都将被标记为不合规。
使用
minShardCount仅实施最小值(示例,< 3),使用maxShardCount仅实施最大值(示例,> 10)。对这些属性使用相反的比较操作符会导致策略评估错误。
{ "name": "Require Minimum 3 Shards", "policies": [ { "body": "forbid (principal, action == ResourcePolicy::Action::\"cluster.modify\", resource) when { context.cluster.minShardCount < 3 && !context.cluster.isConvertingToSharded };" } ] }
限制集群数量
以下示例禁止用户在项目中创建超过 2 个集群:
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.project.clustersInProject > 2 };
限制云提供商
以下示例禁止用户在Google Cloud Platform上创建集群:
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster.cloudProviders.contains(ResourcePolicy::CloudProvider::"gcp") };
以下示例使用unless 子句允许用户仅在Google Cloud Platform上创建集群:
forbid( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) unless { context.cluster.cloudProviders == [ResourcePolicy::CloudProvider::"gcp"] };
以下示例使用 when 子句防止用户在ID为 6217f7fff7957854e2d09179 的项目中创建或编辑集群,除非Google Cloud Platform是唯一的云提供商:
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when {resource in ResourcePolicy::Project::"6217f7fff7957854e2d09179" && context.cluster.cloudProviders == [ResourcePolicy::CloudProvider::"gcp"] };
当Google Cloud Platform是云提供商时,以下示例阻止对ID为 3217e2gdf79a4c54e2d0827 的集群进行修改:
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when {resource in ResourcePolicy::Project::"65dcbf5ccd12a54df59a54e6" && resource == ResourcePolicy::Cluster::"670968dfc0a2297ef46bc02a" && context.cluster.cloudProviders == [ResourcePolicy::CloudProvider::"gcp"]};
限制云提供商区域
以下示例禁止用户在地区aws:us-east-1 中创建或编辑集群:
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when {context.cluster.regions.contains(ResourcePolicy::Region::"aws:us-east-1")};
以下示例禁止用户在地区aws:us-west-1 中创建集群:
forbid( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster.regions.contains(ResourcePolicy::Region::"aws:us-west-1") };
以下示例禁止用户在 aws:us-east-1、aws:us-west-1 或 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"]) };
以下示例使用unless 子句,允许用户仅在区域aws:us-east-1 和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) };
以下示例使用 when 子句限制用户在区域 aws:us-east-1 和 aws:us-west-1 中编辑ID为 3217e2gdf79a4c54e2d0827 的集群:
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"]) };
限制IP地址
注意
如果您将 0.0.0.0/0 CIDR 添加到项目访问列表,Atlas 会向所有直接被授予项目角色或通过团队成员间接被授予项目角色(如果团队被授予项目角色)的所有用户发送警报电子邮件。
以下示例禁止用户从通配符IP (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")) };
以下示例使用unless 子句,允许用户仅编辑来自IP地址1.2.3.4/32 、8.8.8.8/32 和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) };
以下示例要求IP访问列表为空,以确保禁止通过公共网络流向集群的所有流量。
forbid ( principal, action == ResourcePolicy::Action::"project.ipAccessList.modify", resource ) unless { context.project.ipAccessList.isEmpty() };
限制集群层大小
以下示例使用 when 子句将Atlas预配或扩展集群限制为小于 M30 或大于 M60:
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) };
需要项目维护Windows
以下示例要求项目配置维护窗口:
forbid ( principal, action == ResourcePolicy::Action::"project.maintenanceWindow.modify", resource ) when {context.project.hasDefinedMaintenanceWindow == false};
防止修改网络对对等互连
以下示例防止修改不同云提供商( Amazon Web Services 、Google Cloud Platform、 Azure )之间的 VPC 对等互连。
每个云提供商需要不同的VPC对等互连详细信息。收集您的云提供商的以下详细信息,并将其替换到示例中:
Amazon Web Services: aws:<AWS_ACCOUNT_ID>:<VPC_ID>:<VPC_CIDR>
AWS_ACCOUNT_ID:您的Amazon Web Services帐号。VPC_ID:VPC的ID。VPC_CIDR: VPC的 CIDR区块。
Azure: azure:<SUBSCRIPTION_ID>:<RESOURCE_GROUP_NAME>:<VNET_NAME>
SUBSCRIPTION_ID:您的Azure订阅ID。RESOURCE_GROUP_NAME:虚拟网络 (VNet) 所在的资源群组。VNET_NAME:VNet 的名称。
Google Cloud: gcp:<GCP_PROJECT_ID>:<VPC_NAME>
GCP_PROJECT_ID: Google Cloud Platform项目的ID 。VPC_NAME: Google Cloud Platform中VPC的名称。
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"]};
防止修改私有端点
以下示例防止跨云提供商(Amazon Web Services、 Google Cloud Platform、 Azure)修改私有端点连接。
每个云提供商要求提供不同的私有端点详细信息。收集您的云提供商的以下详细信息,并将其替换到示例中:
Amazon Web Services: aws:<VPC_ENDPOINT_ID>
VPC_ENDPOINT_ID: Amazon Web Services VPC端点的ID 。
Azure: azure:<PRIVATE_ENDPOINT_RESOURCE_ID>:<PRIVATE_ENDPOINT_IP_ADDRESS>
PRIVATE_ENDPOINT_RESOURCE_ID: Azure私有端点的完整资源ID路径。PRIVATE_ENDPOINT_IP_ADDRESS:分配给私有端点的IP解决。
Google Cloud: gcp:<GCP_PROJECT_ID>:<VPC_NAME>
GCP_PROJECT_ID: Google Cloud Platform项目的ID 。VPC_NAME: Google Cloud Platform中与该连接关联的VPC的名称。
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"]};
限制 TLS 协议和密码套件
以下示例将集群接受的传入连接的最低TLS版本限制为TLS 1.2。
minTLSVersion 的可能值包括:
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" };
以下示例要求集群通过设置 ResourcePolicy::CipherConfigMode::"custom" 使用自定义TLS密码套件配置 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384。
自定义 TLS 密码套件配置的可能值为:
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"] };
以下示例要求集群使用默认TLS密码套件配置。
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) unless { context.cluster.cipherConfigMode == ResourcePolicy::CipherConfigMode::"default" };
强制执行磁盘大小 (GB)
以下示例通过禁止任何大于 (>) 限制的值来实施 4 TB 的最大磁盘大小。
要防止创建小于特定大小的集群,请在禁止策略中使用小于操作符(<)。
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster has diskSizeGB && context.cluster.diskSizeGB > 4096 };
实施集群拓扑结构(副本集、分片的或Atlas全球集群)
以下示例允许用户仅创建副本集集群。
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) unless { context.cluster.clusterType == ResourcePolicy::ClusterType::"replicaset" };
要支持不同的集群拓扑结构,请使用以下值之一:
分片集群:
ResourcePolicy::ClusterType::"sharded"用于标准水平扩展,其中数据分布式在多个分片上以支持大型数据集或高吞吐量。Atlas全球集群:
ResourcePolicy::ClusterType::"geosharded"用于位置感知部署,其中数据分布式在特定地理区域,以确保数据靠近用户。
强制执行最小分片计数
以下示例要求分片的集群至少有三个分片。
重要
如果实施大于 1 的最小分片数,则必须在策略中明确允许集群转换的过渡状态(示例
&& !context.cluster.isConvertingToSharded)。如果没有这个例外,Atlas会阻止用户将副本集转换为集群,因为转换进程需要一种中间状态,在该状态下,集群只有一个分片。Atlas将副本集视为分片计数为 1。如果您实施大于 1 的最小分片数而不检查集群是否为分片的集群,项目中的所有副本集都将被标记为不合规。
使用
minShardCount仅实施最小值(示例,< 3),使用maxShardCount仅实施最大值(示例,> 10)。对这些属性使用相反的比较操作符会导致策略评估错误。
forbid ( principal, action == ResourcePolicy::Action::"cluster.modify", resource ) when { context.cluster.minShardCount < 3 && !context.cluster.isConvertingToSharded };
限制集群数量
以下示例禁止用户在项目中创建超过 2 个集群:
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 }, ] }
限制云提供商
以下示例禁止用户在除Amazon Web Services之外的所有云提供商上创建集群:
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 }] }
限制区域
以下示例使用unless 子句,允许用户仅在区域aws:us-east-1 和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 }, ] }
限制云提供商和地区
以下示例使用 unless 子句,允许用户仅在 Google Cloud Platform 上或在 aws:us-east-1 和 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 }, ] }
限制IP地址
注意
如果您将 0.0.0.0/0 CIDR 添加到项目访问列表,Atlas 会向所有直接被授予项目角色或通过团队成员间接被授予项目角色(如果团队被授予项目角色)的所有用户发送警报电子邮件。
以下示例禁止用户从通配符IP (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 }, ] }
强制执行磁盘大小 (GB)
以下示例通过禁止任何大于 (>) 限制的值来实施 4 TB 的最大磁盘大小。
要防止创建小于特定大小的集群,请在禁止策略中使用小于操作符(<)。
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 }, ] }
实施集群拓扑结构(副本集、分片的或Atlas全球集群)
以下示例允许用户仅创建副本集集群。
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 }, ] }
要支持不同的集群拓扑结构,请使用以下值之一:
分片集群:
ResourcePolicy::ClusterType::"sharded"用于标准水平扩展,其中数据分布式在多个分片上以支持大型数据集或高吞吐量。Atlas全球集群:
ResourcePolicy::ClusterType::"geosharded"用于位置感知部署,其中数据分布式在特定地理区域,以确保数据靠近用户。
强制执行最小分片计数
以下示例要求分片的集群至少有三个分片。
重要
如果实施大于 1 的最小分片数,则必须在策略中明确允许集群转换的过渡状态(示例
&& !context.cluster.isConvertingToSharded)。如果没有这个例外,Atlas会阻止用户将副本集转换为集群,因为转换进程需要一种中间状态,在该状态下,集群只有一个分片。Atlas将副本集视为分片计数为 1。如果您实施大于 1 的最小分片数而不检查集群是否为分片的集群,项目中的所有副本集都将被标记为不合规。
使用
minShardCount仅实施最小值(示例,< 3),使用maxShardCount仅实施最大值(示例,> 10)。对这些属性使用相反的比较操作符会导致策略评估错误。
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 }, ] }