Docs Menu

Atlas 리소스 정책

Atlas 리소스 정책은 Organization Owners 가 개발자가 Atlas 클러스터를 만들거나 구성할 때 사용할 수 있는 특정 구성 옵션을 제한할 활성화 제어 기능입니다.

리소스 정책을 사용하면 다음을 수행할 수 있습니다.

  • 클러스터 배포서버 특정 cloud 플랫폼(Amazon Web Services, Google Cloud Platform, Azure)으로 제한합니다.

  • 클러스터 배포서버 cloud 제공자 내의 지정된 리전으로 제한합니다. 예시: aws:us-east-1.

  • 더 엄격한 네트워크 제어를 시행하다 위해 와일드카드 IP (0.0.0.0/0) 사용을 금지합니다.

  • IP 액세스 목록 비워 두도록 하거나 기존 IP 액세스 목록 에 추가를 방지하여 공용 네트워크를 통한 트래픽을 금지합니다.

  • 사용자가 지정된 임계값보다 높거나 낮은 계층으로 클러스터를 프로비저닝, 업데이트 또는 자동 확장 하지 못하도록 합니다.

  • 프로젝트 에 유지 관리 기간 구성되어 있어야 합니다.

  • cloud 제공자 간에 VPC 피어링 및 비공개 엔드포인트 연결이 수정되지 않도록 방지합니다.

  • 최소 TLS 버전을 부과하거나 클러스터 연결을 위한 특정 TLS 암호 제품군 구성을 요구합니다.

Atlas 리소스 정책은 조직 수준에서 만들면 해당 조직 내의 모든 프로젝트 및 클러스터에 적용 .

Atlas UI 및 Atlas 관리 API 외에도 HashiCorp Terraform MongoDB Atlas 제공자, MongoDB Atlas Amazon Web Services CloudFormation 리소스 또는 Amazon Web Services CloudFormation 을 사용하여 Atlas 리소스 정책을 구성하고 관리 .

참고

HashiCorp Terraform MongoDB Atlas Provider 1.33.0 이상을 사용하여 최소 TLS 버전을 적용하거나 클러스터 연결을 위한 특정 TLS 암호 제품군 구성을 요구합니다. Atlas 이전 버전의 Terraform에서의 연결을 차단 수 있습니다.

  • Atlas user 에게 적절한 조직 역할 있는지 확인합니다.

  • Atlas 관리 API 사용하여 Atlas 리소스 정책을 만들거나 관리 Atlas 관리 API 에 인증할 수 있도록 공개 및 비공개 API 키를 찾습니다. 자세한 학습 은 Atlas 관리 API 시작하기를 참조하세요.

  • /orgs/{ORG- ID }/nonCompliantResources 엔드포인트를 사용하여규정을 준수하지 않는 리소스 목록을 사전에 모니터 할 것을 적극 권장합니다. Atlas 리소스 정책은 정의된 목표의 컴플라이언스 보장하지만 중간 또는 과도기 상태 시행하다 하지는 않습니다. 예시 들어 다운스트림 구성 요소에 장애가 발생하면 정책이 일시적으로 비호환 중간 상태 에 들어갈 수 있습니다.

  • 각 Atlas 리소스 정책에는 고유한 이름이 있어야 합니다. 기존 이름을 사용하여 Atlas 리소스 정책을 만들려고 하면 서버 400 (Bad Request) 상태 코드를 반환합니다.

  • 다른 이름으로 동일한 Atlas 리소스 정책을 만들 수 있습니다. 이로 인해 기능 충돌이 발생하지는 않지만 정책 관리 에서 중복성과 혼동을 초래할 수 있습니다.

  • Atlas 리소스 정책은 기본적으로 허용됩니다. Atlas 리소스 정책이 없는 경우 사용자는 Atlas user role 허용하는 Atlas cluster에서 모든 작업을 수행할 수 있습니다.

  • 구현된 버전의 시더 정책 언어 파일 당 하나의 시더 정책만 .cedar 지원하지만,.cedar Atlas 리소스 정책에 여러 시더 정책( 파일)을 나열할 수 있습니다. 각 .cedar 파일 Atlas Administration API 응답에서 이후에 고유한 24-16진수 문자열로 policies.id 식별됩니다.

  • 기존 클러스터의 자동 확장 제한이 새 Atlas 리소스 정책과 일치하지 않는 경우, 클러스터 정책에 정의된 경계를 초과할 수 있습니다. 이 문제를 주소 하려면 /orgs/{ORG-ID}/nonCompliantResources 엔드포인트를 사용하여 정책을 준수하지 않는 리소스를 식별하고 모니터 정책 요구 사항을 충족하도록 업데이트 할 수 있습니다.

  • 네트워크 계층 제어를 활성화하기 전에 기존 IP 액세스 목록 검토 필요한 액세스 포인트가 모두 포함되어 있는지 확인합니다.

  • 시더 정책 언어 의 비공개 엔드포인트 정의에서는 와일드카드 작업이 지원되지 않으므로 개별 IP 주소를 입력해야 합니다.

MongoDB 오픈 소스 시더 정책 언어 사용하여 Atlas 리소스 정책을 정의합니다. 시더의 디자인은 리소스 정책 작성과 이해를 모두 간소화하는 간결한 구문을 사용하여 표현력과 단순성의 균형을 맞추고 있습니다.

Atlas 리소스 정책을 빠르게 만들려면 예제 를 조정하고 Atlas UI 또는 Atlas 관리 API 사용하여 Atlas 리소스 정책 구성 만들기에 따라 Atlas 에 추가하세요.

시더 정책 언어 에 대해 자세히 학습 다음을 참조하세요.

Cedar Element
Descripton
Atlas 리소스 정책 옵션

forbid

when 절의 조건이 충족되면 지정된 조치 거부합니다. 반대 요소인 permit은(는) Atlas 리소스 정책에서 허용되지 않습니다.

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

principal

정책의 영향을 받는 사용자를 정의합니다.

기본적으로 기본값 으로 적용됩니다. 변경하거나 생략하지 마세요.

action

정책에서 제어되는 조치 나타냅니다.

사용 가능한 조치:

  • IP 액세스 목록 제한: ResourcePolicy::Action::"project.ipAccessList.modify"

  • 클러스터 속성 제한: ResourcePolicy::Action::"cluster.modify"

  • 유지 관리 기간 수정: ResourcePolicy::Action::"project.maintenanceWindow.modify"

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

특정 클러스터 를 나타냅니다.

클러스터 ID 찾으려면 Atlas 관리 API 사용하여 프로젝트 의 모든 클러스터를 반환합니다.

ResourcePolicy::Project::"<PROJECT-ID>"

특정 프로젝트 를 참조합니다. 예시 들어, ResourcePolicy::Project::"6217f7fff7957854e2d09179"

프로젝트 ID 찾으려면 프로젝트 설정 관리를 참조하세요.

context.cluster.project

클러스터 속한 프로젝트 지정합니다.

프로젝트 ID 찾으려면 프로젝트 설정 관리를 참조하세요.

context.cluster.cloudProviders

허용되는 cloud 제공자를 지정합니다.

사용 가능한 옵션:

  • ResourcePolicy::CloudProvider::"aws"

  • ResourcePolicy::CloudProvider::"azure"

  • ResourcePolicy::CloudProvider::"gcp"

context.cluster.regions

배포서버 리전에 따라 액세스 제한합니다.

예시: ResourcePolicy::Region::"aws:us-east-1". cloud 제공자 별 사용 가능한 리전 목록은 Amazon Web Services (Amazon Web Services), Google Cloud Platform (GCP) 또는 Microsoft Azure 참조하세요.

context.cluster has <PROPERTY>

클러스터 컨텍스트 내에 특정 속성 있는지 확인합니다.

사용 가능한 속성:

context.cluster.minGeneralClassInstanceSizeValue

클러스터 축소 확장 위한 최소 클러스터 계층 설정합니다.

예시를 들어 context.cluster.minGeneralClassInstanceSizeValue < 30 은 현재 계층 또는 최소 자동 확장 크기가 M30 미만인 클러스터와 일치합니다.

context.cluster.maxGeneralClassInstanceSizeValue

클러스터 확장 위한 최대 클러스터 계층 설정합니다.

예시를 들어 context.cluster.maxGeneralClassInstanceSizeValue < 60 은 현재 계층 또는 최대 자동 확장 크기가 M60 미만인 클러스터와 일치합니다.

context.project.hasDefinedMaintenanceWindow

프로젝트 에 유지 관리 기간 구성되어 있어야 합니다.

예시 들어 context.project.hasDefinedMaintenanceWindow == false 는 프로젝트 에 구성된 유지 관리 기간 없는지 확인합니다.

context.project.ipAccessList

클러스터 액세스 할 수 있는 IP 주소를 지정합니다.

와일드카드 IP ip("0.0.0.0/0") 를 차단 보안을 강화할 수 있습니다.

context.project.peeringConnections

특정 VPC 피어링 연결을 나타냅니다.

특정 cloud 제공자에 맞게 포맷하려면 네트워크 피어링 수정 방지를 참조하세요.

context.project.privateEndpoints

특정 비공개 엔드포인트를 나타냅니다.

특정 cloud 제공자에 맞게 포맷하려면 비공개 엔드포인트 수정 방지를 참조하세요.

containsAny 개인정보 정책에 containsAll

목록에서 하나 이상의 요소(containsAny) 또는 모든 요소(containsAll)가 포함되어 있는지 확인합니다.

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

unless

정책에 대한 예외를 지정합니다. 특정 조건이 충족되지 않는 한 작업이 금지됩니다.

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

isEmpty

목록이 비어 있는지 확인합니다. 예시, 공용 네트워크를 통한 액세스 금지를 시행하려면 IP 액세스 목록 비어 있어야 합니다.

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

논리 연산자(&&, ||)

정책에서 여러 조건을 결합합니다.

사용 가능한 옵션:

  • && (AND): 모든 조건이 참이어야 합니다.

  • || (OR): 참이 되려면 하나 이상의 조건이 필요합니다.

IP 주소 지정(ip)

정책의 특정 IP 주소 또는 범위를 나타냅니다.

사용 가능한 옵션:

  • ip("0.0.0.0/0") 와일드카드 IP 의 경우.

  • ip("1.2.3.4/32") 특정 IP 주소의 경우.

Atlas 리소스 정책을 생성하려면 다음 절차에 따라 시더 정책 언어 사용하여 정책을 구성하고 Atlas UI, Atlas 관리 API 또는 Terraform을 사용하여 Atlas 에 추가합니다.

경고

새 클러스터 로 새 조직 만들어 비프로덕션 환경에서 이 기능 테스트하는 것이 좋습니다. 이렇게 하면 기술을 스킬 때 기존 시스템에 영향을 주지 않고 기능 안전하게 평가할 수 있습니다.

Atlas 관리 API 사용하여 Atlas 리소스 정책을 만들려면 시더 정책 언어 사용하여 정책을 구성하고 매개 변수를 POST 사용하는 policies 요청 통해 Atlas 관리 API 에 전달합니다.

1

시더 정책 언어 사용하여 리소스를 제한하는 규칙을 지정합니다. 조직 에 대해 다음 예시 정책을 복사하고 수정할 수 있습니다.

참고

더 쉽게 추적할 수 있도록 여러 개의 간단한 Atlas 리소스 정책을 만드는 것이 좋습니다. 예시 들어, cloud 제공자 와 여러 리전을 제한하려면 cloud 제공자 제한하는 하나의 Atlas 리소스 정책과 리전을 제한하는 다른 Atlas 리소스 정책을 만드는 것이 좋습니다.

2

POST 동사를 사용하여 조직 위한 Atlas 리소스 정책을 만듭니다. 요청 다음이 포함되어야 합니다.

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 UI 편집기를 사용하여 Atlas 리소스 정책을 만들려면 다음 절차에 따라 예시 정책을 복사하여 편집기에 붙여넣은 다음 조직 에 맞게 수정합니다.

1

경고

탐색 개선 진행 중

현재 새롭고 향상된 탐색 환경을 출시하고 있습니다. 다음 단계가 Atlas UI 의 보기와 일치하지 않는 경우 미리 보기 설명서를 참조하세요.

  1. 아직 표시되지 않은 경우 다음 목록에서 원하는 조직 을 선택하세요. 탐색 표시줄의 Organizations 메뉴.

  2. 1} 메뉴 옆에 있는 아이콘을 클릭합니다.Organization Settings Organizations

    조직 설정 페이지가 표시됩니다.

2

사이드바에서 Resource Policy를 클릭합니다.

리소스 정책 페이지가 표시됩니다.

3
4
  1. Atlas 리소스 정책에 고유한 이름을 지정합니다.

  2. (선택 사항) 설명을 추가합니다.

  3. 조직 대한 다음 예시 정책을 복사하여 수정한 다음 Cedar Policy 필드 에 코드를 붙여넣습니다.

    참고

    더 쉽게 추적할 수 있도록 여러 개의 간단한 Atlas 리소스 정책을 만드는 것이 좋습니다. 예시 들어, cloud 제공자 와 여러 리전을 제한하려면 cloud 제공자 제한하는 하나의 Atlas 리소스 정책과 리전을 제한하는 다른 Atlas 리소스 정책을 만드는 것이 좋습니다.

5

이 Atlas 리소스 정책은 모든 새 클러스터에 적용됩니다. Atlas 리소스 정책을 준수하지 않는 기존 클러스터의 경우, Atlas 사용자가 클러스터 클러스터 컴플라이언스 로 만드는 변경만 허용합니다. 예시 를 들어 cluster0 이(가) Amazon Web Services 에서 실행 중이고 Amazon Web Services 의 클러스터를 차단하는 Atlas 리소스 정책을 적용 경우, 이 정책을 준수하지 않는 동안 사용자가 변경할 수 있는 유일한 cluster0 것은 cloud 제공자 Azure 로 전환하는 것입니다. 또는 Google Cloud Platform.

Atlas 리소스 정책을 준수하지 않는 기존 클러스터 목록을 반환하려면 GET /orgs/{ORG- ID}/nonCompliantResources 리소스 사용합니다.

Atlas Atlas 리소스 정책을 생성, 업데이트 또는 삭제 때 활동 피드 이벤트 생성합니다. 활동 피드 이벤트를 식별하고 더 쉽게 추적하려면 간단한 Atlas 리소스 정책을 여러 개 생성하는 것이 좋습니다. 예시 를 들어, cloud 제공자 및 여러 리전의 사용을 제한하려면 cloud 제공자 제한하는 하나의 Atlas 리소스 정책과 리전을 제한하는 다른 Atlas 리소스 정책을 생성하는 것이 좋습니다.

참고

추가 전제 조건

이 가이드 계속 진행하기 전에 다음 단계를 완료하세요.

  • 지불 조직 대한 API 키를 생성하고 다음 명령을 실행 하여 API 키를 환경 변수로 저장 .

    export MONGODB_ATLAS_PUBLIC_KEY="<your public key>"
    export MONGODB_ATLAS_PRIVATE_KEY="<your private key>"
  • Terraform CLI설치

Terraform을 사용하여 Atlas 리소스 정책을 만들려면 MongoDB Atlas Terraform Provider를 구성한 다음 Cedar 정책 언어 사용하여 정책을 구성하고 main.tf Terraform 파일에 지정합니다.

1

프로젝트 디렉토리 에 main.tf라는 새 파일 만듭니다. MongoDB Atlas 제공자를 구성하고 공개 키와 비공개 키를 지정하는 다음 코드를 붙여넣습니다.

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
2

시더 정책 언어 사용하여 리소스를 제한하는 규칙을 지정합니다. 조직 에 대해 다음 예시 정책을 복사하고 수정할 수 있습니다.

참고

더 쉽게 추적할 수 있도록 여러 개의 간단한 Atlas 리소스 정책을 만드는 것이 좋습니다. 예시 들어, cloud 제공자 와 여러 리전을 제한하려면 cloud 제공자 제한하는 하나의 Atlas 리소스 정책과 리전을 제한하는 다른 Atlas 리소스 정책을 만드는 것이 좋습니다.

3

main.tf 파일 에 원하는 정책을 정의한 후 다음 명령을 실행 정책을 생성합니다.

terraform apply

조직 에 사용할 다음 예시 정책을 복사하고 수정합니다. 모든 예제는 시더 정책 언어 사용하지만, Atlas 관리 API 의 경우 예제가 JSON 으로 래핑되어 있으므로 API 호출에 직접 붙여넣을 수 있습니다. 자세한 학습 은 Atlas 리소스 정책 구성 생성을 참조하세요.

다음 예시 사용자가 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 절을 사용하여 Google Cloud Platform 이 유일한 cloud 제공자 가 아닌 한 사용자가 ID 6217f7fff7957854e2d09179 인 프로젝트 에서 클러스터 만들거나 편집할 수 없도록 합니다.

{
"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 이 cloud 제공자 인 경우 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-1aws: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 리전 또는 에서 Atlas cluster를 만들 수 aws:us-east-1 없도록 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\"])};"}]
}

다음 예시 사용자가 와일드카드 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 초과로 프로비저닝 하거나 확장 하지 못하도록 제한합니다.

참고

이 정책은 클러스터 클래스가 Low CPU 또는 NVMe SSD 인 클러스터 클래스 를 제한하지 않습니다.

{
"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.maxGeneralClassInstanceSize > 60) };"
}
]
}

다음 예시 에서는 프로젝트 에 유지 관리 기간 구성되어 있어야 합니다.

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

다음 예시 다양한 cloud 제공자(Amazon Web Services, Google Cloud Platform, Azure) 간에 VPC 피어링 연결이 수정되는 것을 방지합니다.

각 cloud 제공자 VPC 피어링에 대해 서로 다른 세부 정보를 요구합니다. cloud 제공자 에 대한 다음 세부 정보를 수집하여 예시 에서 바꿉니다.

Amazon Web Services: aws:<AWS_ACCOUNT_ID>:<VPC_ID>:<VPC_CIDR>

  • AWS_ACCOUNT_ID: Amazon Web Services 계정 번호입니다.

  • VPC_ID: VPC 의 ID .

  • VPC_CIDR: VPCCIDR 차단 입니다.

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:us-east-1:vpc-0316c47cc923ce313:10.0.0.0/16\", \"azure:fd01aafc-b3re-2193-8497-83lp3m83a1a5:rg-name:vnet\", \"gcp:inductive-cocoa-108200:default\"]};"
}
]
}

다음 예시 cloud 제공자(Amazon Web Services, Google Cloud Platform, Azure) 간에 비공개 엔드포인트 연결이 수정되지 않도록 방지합니다.

각 cloud 제공자 비공개 엔드포인트 에 대해 서로 다른 세부 정보를 요구합니다. cloud 제공자 에 대한 다음 세부 정보를 수집하여 예시 에서 바꿉니다.

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

다음 예시 클러스터가 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 을(를)ResourcePolicy::CipherConfigMode::\"custom\" 설정하여 사용자 지정 TLS 암호 제품군 구성 을(를) 사용해야 합니다.

사용자 지정 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\"};"
}
]
}

다음 예시 사용자가 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 절을 사용하여 Google Cloud Platform 이 유일한 cloud 제공자 가 아닌 한 사용자가 ID 6217f7fff7957854e2d09179 인 프로젝트 에서 클러스터 만들거나 편집할 수 없도록 합니다.

forbid (
principal,
action == ResourcePolicy::Action::"cluster.modify",
resource
)
when {resource in ResourcePolicy::Project::"6217f7fff7957854e2d09179" && context.cluster.cloudProviders == [ResourcePolicy::CloudProvider::"gcp"] };

다음 예시 Google Cloud Platform 이 cloud 제공자 인 경우 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-1aws: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)에서 프로젝트 편집할 수 없도록 방지합니다.

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 초과로 프로비저닝 하거나 확장 하지 못하도록 제한합니다.

참고

이 정책은 클러스터 클래스가 Low CPU 또는 NVMe SSD 인 클러스터 클래스 를 제한하지 않습니다.

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

다음 예시 에서는 프로젝트 에 유지 관리 기간 구성되어 있어야 합니다.

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

다음 예시 다양한 cloud 제공자(Amazon Web Services, Google Cloud Platform, Azure) 간에 VPC 피어링 연결이 수정되는 것을 방지합니다.

각 cloud 제공자 VPC 피어링에 대해 서로 다른 세부 정보를 요구합니다. cloud 제공자 에 대한 다음 세부 정보를 수집하여 예시 에서 바꿉니다.

Amazon Web Services: aws:<AWS_ACCOUNT_ID>:<VPC_ID>:<VPC_CIDR>

  • AWS_ACCOUNT_ID: Amazon Web Services 계정 번호입니다.

  • VPC_ID: VPC 의 ID .

  • VPC_CIDR: VPCCIDR 차단 입니다.

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:us-east-1:vpc-0316c47cc923ce313:10.0.0.0/16", "azure:fd01aafc-b3re-2193-8497-83lp3m83a1a5:rg-name:vnet", "gcp:inductive-cocoa-108200:default"]};

다음 예시 cloud 제공자(Amazon Web Services, Google Cloud Platform, Azure) 간에 비공개 엔드포인트 연결이 수정되지 않도록 방지합니다.

각 cloud 제공자 비공개 엔드포인트 에 대해 서로 다른 세부 정보를 요구합니다. cloud 제공자 에 대한 다음 세부 정보를 수집하여 예시 에서 바꿉니다.

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

다음 예시 클러스터가 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 을(를)ResourcePolicy::CipherConfigMode::"custom" 설정하여 사용자 지정 TLS 암호 제품군 구성 을(를) 사용해야 합니다.

사용자 지정 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"
};

다음 예시 사용자가 AWS를 제외한 모든 cloud 제공자에서 클러스터 생성할 수 없습니다.

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 또는 aws:us-east-1aws: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)에서 프로젝트 편집할 수 없도록 방지합니다.

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