조직 정책 분석

이 페이지에서는 조직 정책 설정을 분석하여 어떤 리소스가 어떤 조직 정책에 해당하는지 확인하는 방법을 보여줍니다. 조직 정책용 정책 분석 도구를 사용하면 분석 쿼리를 만들어 커스텀 및 사전 정의된 조직 정책에 대한 정보를 가져올 수 있습니다.

분석 쿼리는 범위와 제약조건으로 구성됩니다.

  • 제약조건: 제약조건의 리소스 이름을 지정합니다.
  • 범위: 분석 범위를 지정할 조직을 지정합니다. 이 범위에 정의된 제약조건이 있는 모든 조직 정책이 분석에 포함됩니다.

  • 조직 정책에 대한 자세한 내용은 조직 정책 서비스 소개를 참조하세요.

  • 커스텀 제약 조건을 만드는 방법에 대한 자세한 내용은 커스텀 제약조건 만들기 및 관리를 참조하세요.

  • 관리형 제약조건에 대한 자세한 내용은 제약조건 사용을 참조하세요.

시작하기 전에

  • Enable the Cloud Asset API.

    Enable the API

    쿼리를 전송하는 데 사용할 프로젝트에서 API를 사용 설정해야 합니다. 이것은 쿼리 범위를 지정하는 리소스와 동일할 필요가 없습니다.

  • 선택사항: 조직당 하루에 20개가 넘는 정책 분석 쿼리를 실행하려면 Security Command Center 프리미엄 등급의 조직 수준 활성화가 있는지 확인합니다. 자세한 내용은 결제 관련 문의를 참조하세요.

필수 역할 및 권한

조직 정책 분석을 실행하는 데 필요한 권한을 얻으려면 관리자에게 분석을 수행할 조직 리소스에 다음 IAM 역할을 부여해 달라고 요청하세요.

역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

이러한 사전 정의된 역할에는 조직 정책 분석을 실행하는 데 필요한 권한이 포함되어 있습니다. 필요한 정확한 권한을 보려면 필수 권한 섹션을 펼치세요.

필수 권한

조직 정책 분석을 실행하려면 다음 권한이 필요합니다.

  • 분석을 수행하려면 다음 안내를 따르세요.
    • cloudasset.assets.analyzeOrgPolicy
    • cloudasset.assets.searchAllResources
    • cloudasset.assets.searchAllIamPolicies
  • 커스텀 및 관리형 제약조건 보기: orgpolicy.customConstraints.get

커스텀 역할이나 다른 사전 정의된 역할을 사용하여 이 권한을 부여받을 수도 있습니다.

가격 책정 및 할당량

대규모 조직 정책용 정책 분석 도구(조직당 일일 쿼리 20개 이상) 및 상속 시각화Security Command Center의 조직 수준 활성화를 사용하는 고객에게만 제공됩니다.

조직 정책용 정책 분석 도구의 할당량은 모든 정책 분석 도구에서 공유됩니다. 자세한 내용은 결제 관련 문의를 참조하세요.

구성된 정책 분석

제약조건 및 해당 제약조건이 적용되는 선택적 조건으로부터 조직 정책이 형성됩니다. 정책 분석 도구를 사용하여 특정 제약조건이 있는 조직 정책 및 해당 정책이 연결된 리소스의 목록을 반환할 수 있습니다.

정책 분석 도구는 쿼리 범위에서 감지된 각 조직 정책에 대해 결과 항목을 반환합니다. 결과 항목에는 다음 필드가 포함됩니다.

  • consolidatedPolicy: 조직 정책이 연결된 리소스 및 계층 구조 평가 규칙을 기준으로 해당 리소스에 적용되는 유효한 정책입니다.

  • project: 이 통합 정책이 속한 프로젝트 리소스의 ID입니다.

  • folders: 조직 정책이 연결된 리소스의 상위 항목인 폴더 리소스의 ID입니다.

  • organization: 조직 정책이 연결된 리소스의 상위 항목인 조직 리소스의 ID입니다.

  • policyBundle: 위의 리소스에 연결된 완전히 구성된 조직 정책 및 리소스 계층 구조에서 상위에 정의된 조직 정책입니다.

리소스가 VPC 서비스 제어 서비스 경계로 보호되는 경우 조직 리소스의 경계에서 cloudasset.googleapis.com 서비스 및 google.cloud.asset.v1.AssetService.SearchAllResources 메서드에 대한 액세스를 허용하는 이그레스 규칙을 만들어야 합니다. 이그레스 규칙이 없으면 NETWORK_NOT_IN_SAME_SERVICE_PERIMETER 오류가 발생하여 요청이 실패합니다. 자세한 내용은 VPC 서비스 제어가 차단한 요청 디버깅을 참조하세요.

콘솔

  1. Google Cloud 콘솔에서 정책 분석 도구 페이지로 이동합니다.

    정책 분석 도구로 이동

  2. 조직 정책 분석 섹션에서 특정 조직 정책은 어디에서 구성되나요?이라는 창을 찾고 이 창에서 쿼리 만들기를 클릭합니다.

  3. 쿼리 조직 선택 상자에서 조직 정책을 분석하려는 조직을 선택합니다.

  4. 분석할 제약조건 유형을 선택합니다. 사전 정의된 제약조건 또는 관리형 제약조건의 경우 기본 제공 제약조건을 선택합니다. 커스텀 제약조건의 경우 커스텀 제약조건을 선택합니다.

  5. 분석할 제약조건의 이름을 입력합니다. 분석 중인 제약조건 유형의 프리픽스는 이미 포함됩니다. 예를 들어 사전 정의된 도메인 제한 제약조건의 경우 iam.allowedPolicyMemberDomains를 입력하고, 서비스 계정 만들기 관리형 제약조건의 경우 iam.managed.disableServiceAccountKeyCreation을 입력하고, 커스텀 제약조건의 경우 해당 이름(예: disableGkeAutoUpgrade)을 입력합니다.

  6. 분석을 클릭한 후 쿼리 실행을 클릭합니다. 보고서 페이지에는 사용자가 입력한 쿼리 매개변수와 이 제약조건이 직접 적용되는 모든 리소스의 결과 테이블이 표시됩니다.

  7. 이 쿼리를 저장하여 나중에 쿼리 URL 복사를 클릭하면 다시 볼 수 있습니다. 이 쿼리를 보려면 생성된 URL로 이동합니다.

  8. 목록에서 하나 이상의 리소스를 선택한 다음 상속 보기를 클릭하여 분석한 제약 조건의 상속을 시각화할 수 있습니다. 분석, 시각화를 차례로 클릭하여 분석 쿼리를 만들 때 시각화로 바로 이동할 수도 있습니다. 자세한 내용은 상속 시각화를 참조하세요.

gcloud

조직 내에서 조직 정책 제약조건이 적용되는 방식을 분석하려면 gcloud asset analyze-org-policies 명령어를 사용합니다.

gcloud asset analyze-org-policies \
    --constraint=CONSTRAINT_NAME  \
    --scope=organizations/ORGANIZATION_ID \
    --limit=LIMIT_POLICIES \
    --filter=FILTER_QUERY

다음을 바꿉니다.

  • CONSTRAINT_NAME: 분석할 조직 정책 제약조건의 이름입니다. 제약조건 목록은 조직 정책 제약조건을 참조하세요.

  • ORGANIZATION_ID: 조직 리소스의 ID입니다. 조직 ID를 찾는 방법에 대한 자세한 내용은 조직 만들기 및 관리를 참조하세요.

  • LIMIT_POLICIES: 조회하려는 결과 항목 수입니다. 항목을 무제한으로 보려면 unlimited를 입력합니다.

  • FILTER_QUERY: 필터링 표현식과 일치하는 정책만 표시하는 필터 쿼리입니다. 필터링에 사용할 수 있는 유일한 필드는 consolidated_policy.attached_resource입니다. 예를 들어 consolidated_policy.attached_resource="//cloudresourcemanager.googleapis.com/projects/1234567890"은 프로젝트 ID가 1234567890인 프로젝트에 연결된 정책만 반환합니다.

YAML 응답은 다음 예시와 유사합니다.

샘플 YAML 응답

---
consolidatedPolicy:
  appliedResource: //cloudresourcemanager.googleapis.com/projects/opa-test-project-1-364621
  attachedResource: //cloudresourcemanager.googleapis.com/projects/opa-test-project-1-364621
  rules:
  - enforce: true
policyBundle:
- appliedResource: //cloudresourcemanager.googleapis.com/projects/opa-test-project-1-364621
  attachedResource: //cloudresourcemanager.googleapis.com/projects/opa-test-project-1-364621
  reset: true
- appliedResource: //cloudresourcemanager.googleapis.com/organizations/474566717491
  rules:
  - enforce: true
---
consolidatedPolicy:
  appliedResource: //cloudresourcemanager.googleapis.com/organizations/474566717491
  rules:
  - enforce: true
policyBundle:
- appliedResource: //cloudresourcemanager.googleapis.com/organizations/474566717491
  rules:
  - enforce: true

REST

조직 내에서 조직 정책 제약조건이 적용되는 방식을 분석하려면 Cloud Asset API의 analyzeOrgPolicies 메서드를 사용합니다.

HTTP 메서드 및 URL:

GET https://cloudasset.googleapis.com/v1/organizations/ORGANIZATION_ID:analyzeOrgPolicies

JSON 요청 본문:

JSON_REQUEST="{
  'constraint': 'CONSTRAINT_NAME',
  'filter': 'FILTER_QUERY',
  'page_size': PAGE_SIZE,
  'page_token': PAGE_TOKEN
}"

다음을 바꿉니다.

  • ORGANIZATION_ID: 조직 리소스의 ID입니다. 조직 ID를 찾는 방법에 대한 자세한 내용은 조직 만들기 및 관리를 참조하세요.

  • CONSTRAINT_NAME: 분석할 조직 정책 제약조건의 이름입니다. 제약조건 목록은 조직 정책 제약조건을 참조하세요.

  • FILTER_QUERY: 필터링 표현식과 일치하는 정책만 표시하는 필터 쿼리입니다. 필터링에 사용할 수 있는 유일한 필드는 consolidated_policy.attached_resource입니다. 예를 들어 consolidated_policy.attached_resource="//cloudresourcemanager.googleapis.com/projects/1234567890"은 프로젝트 ID가 1234567890인 프로젝트에 연결된 정책만 반환합니다.

  • PAGE_SIZE: 조회하려는 페이지당 결과 항목 수입니다. 항목을 무제한으로 보려면 unlimited를 입력합니다. 요청에서 이 플래그를 설정하면 총 결과 항목 수가 PAGE_SIZE보다 클 때 nextPageToken 값이 반환됩니다.

  • PAGE_TOKEN: page_size 플래그를 포함하는 최초 요청 이후의 요청에서만 설정해야 합니다. 이전 응답에서 수신한 nextPageToken 값을 사용하여 결과의 특정 페이지를 반환할 수 있습니다.

JSON 응답은 다음 예시와 유사합니다.

샘플 JSON 응답

{
  "orgPolicyResults": [
    {
      "consolidatedPolicy": {
        "attachedResource": "//cloudresourcemanager.googleapis.com/folders/123456789012",
        "rules": [
          {
            "values": {
              "allowedValues": [
                "C0265whk2"
              ]
            }
          },
          {
            "values": {
              "allowedValues": [
                "C03kd36xr"
              ]
            }
          }
        ],
        "appliedResource": "//cloudresourcemanager.googleapis.com/folders/123456789012"
      },
      "policyBundle": [
        {
          "attachedResource": "//cloudresourcemanager.googleapis.com/folders/123456789012",
          "rules": [
            {
              "values": {
                "allowedValues": [
                  "C03kd36xr"
                ]
              }
            }
          ],
          "inheritFromParent": true,
          "appliedResource": "//cloudresourcemanager.googleapis.com/folders/123456789012"
        },
        {
          "attachedResource": "//cloudresourcemanager.googleapis.com/folders/234567890123",
          "rules": [
            {
              "values": {
                "allowedValues": [
                  "C0265whk2"
                ]
              }
            }
          ],
          "appliedResource": "//cloudresourcemanager.googleapis.com/folders/234567890123"
        }
      ]
    },
    {
      "consolidatedPolicy": {
        "attachedResource": "//cloudresourcemanager.googleapis.com/folders/234567890123",
        "rules": [
          {
            "values": {
              "allowedValues": [
                "C0265whk2"
              ]
            }
          }
        ],
        "appliedResource": "//cloudresourcemanager.googleapis.com/folders/234567890123"
      },
      "policyBundle": [
        {
          "attachedResource": "//cloudresourcemanager.googleapis.com/folders/234567890123",
          "rules": [
            {
              "values": {
                "allowedValues": [
                  "C0265whk2"
                ]
              }
            }
          ],
          "appliedResource": "//cloudresourcemanager.googleapis.com/folders/234567890123"
        }
      ]
    }
  ]
  "constraint": {
    "googleDefinedConstraint": {
      "name": "constraints/iam.allowedPolicyMemberDomains",
      "displayName": "Domain restricted sharing",
      "description": "This list constraint defines one or more Cloud Identity or Google Workspace customer IDs whose principals can be added to IAM policies. \u003cbr\u003eBy default, all user identities are allowed to be added to IAM policies. Only allowed values can be defined in this constraint, denied values are not supported. \u003cbr\u003eIf this constraint is active, only principals that belong to the allowed customer IDs can be added to IAM policies.",
      "constraintDefault": "ALLOW",
      "listConstraint": {}
    }
  }
}

컨테이너 분석

이 컨텍스트의 컨테이너는 프로젝트, 폴더, 조직 리소스입니다. 정책 분석 도구를 사용하면 특정 제약조건이 적용된 조직 정책이 있는 모든 컨테이너 목록을 반환할 수 있습니다. 정책 분석 도구는 각 컨테이너의 전체 이름, 계층 구조에서 컨테이너 상위 요소, 컨테이너에서 상속하거나 연결된 태그도 반환합니다.

정책 분석 도구는 쿼리 범위에서 감지된 각 컨테이너에 대해 결과 항목을 반환합니다. 결과 항목에는 다음 필드가 포함됩니다.

  • consolidatedPolicy: 조직 정책이 연결된 컨테이너 및 계층 구조 평가 규칙을 기준으로 해당 컨테이너에 적용되는 유효한 정책입니다.

  • conditionEvaluation: 포함된 조건으로 인해 조직 정책이 시행되는 경우 evaluationValueTRUE입니다. 조건으로 인해 조직 정책이 시행되지 않으면 evaluationValueFALSE입니다. 조직 정책이 시행되는 하나 이상의 리소스에서 조건을 지원하지 않는 경우 조건 자체가 반환됩니다.

  • effectiveTags: 계층 컨테이너와 컨테이너의 상위 요소에 직접 연결되거나 상속되는 모든 태그입니다.

  • folders: 조직 정책이 연결된 컨테이너를 포함하는 폴더 리소스의 ID입니다.

  • fullResourceName: 컨테이너의 전체 이름입니다.

  • organization: 조직 정책이 연결된 컨테이너의 상위 항목인 조직 리소스의 ID입니다.

  • parent: 이 컨테이너의 상위 항목의 전체 리소스 이름입니다.

  • policyBundle: 컨테이너에 직접 구성된 조직 정책(있는 경우) 및 리소스 계층 구조에서 컨테이너 상위에 정의된 조직 정책입니다.

  • project: 조직 정책이 연결되는 컨테이너의 ID입니다(프로젝트 리소스인 경우).

리소스가 VPC 서비스 제어 서비스 경계로 보호되는 경우 조직 리소스의 경계에서 cloudasset.googleapis.com 서비스 및 google.cloud.asset.v1.AssetService.SearchAllResources 메서드에 대한 액세스를 허용하는 이그레스 규칙을 만들어야 합니다. 이그레스 규칙이 없으면 NETWORK_NOT_IN_SAME_SERVICE_PERIMETER 오류가 발생하여 요청이 실패합니다. 자세한 내용은 VPC 서비스 제어가 차단한 요청 디버깅을 참조하세요.

콘솔

  1. Google Cloud 콘솔에서 정책 분석 도구 페이지로 이동합니다.

    정책 분석 도구로 이동

  2. 조직 정책 분석 섹션에서 조직 정책 제약조건의 영향을 받는 프로젝트 또는 폴더는 무엇인가요?이라는 창을 찾고 이 창에서 쿼리 만들기를 클릭합니다.

  3. 쿼리 조직 선택 상자에서 조직 정책을 분석하려는 조직을 선택합니다.

  4. 분석할 제약조건 유형을 선택합니다. 사전 정의된 제약조건 또는 관리형 제약조건의 경우 기본 제공 제약조건을 선택합니다. 커스텀 제약조건의 경우 커스텀 제약조건을 선택합니다.

  5. 분석할 제약조건의 이름을 입력합니다. 분석 중인 제약조건 유형의 프리픽스는 이미 포함됩니다. 예를 들어 사전 정의된 도메인 제한 제약조건의 경우 iam.allowedPolicyMemberDomains를 입력하고, 서비스 계정 만들기 관리형 제약조건의 경우 iam.managed.disableServiceAccountKeyCreation을 입력하고, 커스텀 제약조건의 경우 해당 이름(예: disableGkeAutoUpgrade)을 입력합니다.

  6. 쿼리 실행을 클릭합니다. 보고서 페이지에 사용자가 입력한 쿼리 매개변수와 이 제약조건이 적용되거나 상속된 모든 컨테이너의 결과 테이블이 표시됩니다.

  7. 이 쿼리를 저장하여 나중에 쿼리 URL 복사를 클릭하면 다시 볼 수 있습니다. 이 쿼리를 보려면 생성된 URL로 이동합니다.

  8. 목록에서 하나 이상의 컨테이너를 선택한 다음 상속 보기를 클릭하여 분석한 제약 조건의 상속을 시각화할 수 있습니다. 분석, 시각화를 차례로 클릭하여 분석 쿼리를 만들 때 시각화로 바로 이동할 수도 있습니다. 자세한 내용은 상속 시각화를 참조하세요.

gcloud

조직 내에서 조직 정책 제약조건이 컨테이너에 적용되는 방식을 분석하려면 gcloud asset analyze-org-policy-governed-containers 명령어를 사용합니다.

gcloud asset analyze-org-policy-governed-containers \
    --constraint=CONSTRAINT_NAME  \
    --scope=organizations/ORGANIZATION_ID \
    --limit=LIMIT_CONTAINERS \
    --filter=FILTER_QUERY

다음을 바꿉니다.

  • CONSTRAINT_NAME: 분석할 조직 정책 제약조건의 이름입니다. 제약조건 목록은 조직 정책 제약조건을 참조하세요.

  • ORGANIZATION_ID: 조직 리소스의 ID입니다. 조직 ID를 찾는 방법에 대한 자세한 내용은 조직 만들기 및 관리를 참조하세요.

  • LIMIT_CONTAINERS: 조회하려는 결과 항목 수입니다. 항목을 무제한으로 보려면 unlimited를 입력합니다.

  • FILTER_QUERY: 필터링 표현식과 일치하는 컨테이너만 표시하는 필터 쿼리입니다. 필터링에 사용할 수 있는 유일한 필드는 parent입니다. 예를 들어 parent="//cloudresourcemanager.googleapis.com/organizations/012345678901"은 조직 ID가 012345678901인 조직의 하위 요소인 컨테이너만 반환합니다.

YAML 응답은 다음 예시와 유사합니다.

샘플 YAML 응답

---
consolidatedPolicy:
  appliedResource: //cloudresourcemanager.googleapis.com/projects/donghe-project1
  attachedResource: //cloudresourcemanager.googleapis.com/projects/donghe-project1
  rules:
  - values:
      allowedValues:
      - projects/donghe-project1/zones/us-central1-a/instances/instance-1
fullResourceName: //cloudresourcemanager.googleapis.com/projects/donghe-project1
parent: //cloudresourcemanager.googleapis.com/folders/86513245445
policyBundle:
- appliedResource: //cloudresourcemanager.googleapis.com/projects/donghe-project1
  attachedResource: //cloudresourcemanager.googleapis.com/projects/donghe-project1
  inheritFromParent: true
  rules:
  - values:
      allowedValues:
      - projects/donghe-project1/zones/us-central1-a/instances/instance-1
---
consolidatedPolicy:
  appliedResource: //cloudresourcemanager.googleapis.com/projects/jeffreyai-prj01-on-ipa1
  attachedResource: //cloudresourcemanager.googleapis.com/projects/jeffreyai-prj01-on-ipa1
  rules:
  - denyAll: true
fullResourceName: //cloudresourcemanager.googleapis.com/projects/jeffreyai-prj01-on-ipa1
parent: //cloudresourcemanager.googleapis.com/organizations/474566717491
policyBundle:
- appliedResource: //cloudresourcemanager.googleapis.com/projects/jeffreyai-prj01-on-ipa1
  attachedResource: //cloudresourcemanager.googleapis.com/projects/jeffreyai-prj01-on-ipa1
  inheritFromParent: true
  rules:
  - denyAll: true
---
consolidatedPolicy:
  appliedResource: //cloudresourcemanager.googleapis.com/projects/opa-test-project-1-364621
  attachedResource: //cloudresourcemanager.googleapis.com/projects/opa-test-project-1-364621
  rules:
  - values:
      allowedValues:
      - projects/opa-test-project-1-364621/zones/us-central1-a/instances/instance-1
fullResourceName: //cloudresourcemanager.googleapis.com/projects/opa-test-project-1-364621
parent: //cloudresourcemanager.googleapis.com/folders/666681422980
policyBundle:
- appliedResource: //cloudresourcemanager.googleapis.com/projects/opa-test-project-1-364621
  attachedResource: //cloudresourcemanager.googleapis.com/projects/opa-test-project-1-364621
  rules:
  - values:
      allowedValues:
      - projects/opa-test-project-1-364621/zones/us-central1-a/instances/instance-1

REST

조직 내에서 조직 정책 제약조건이 컨테이너에 적용되는 방식을 분석하려면 Cloud Asset API의 analyzeOrgPolicyGovernedContainers 메서드를 사용합니다.

HTTP 메서드 및 URL:

GET https://cloudasset.googleapis.com/v1/organizations/ORGANIZATION_ID:analyzeOrgPolicyGovernedContainers

JSON 요청 본문:

JSON_REQUEST="{
  'constraint': 'CONSTRAINT_NAME',
  'filter': '"FILTER_QUERY"',
  'page_size': PAGE_SIZE,
  'page_token': PAGE_TOKEN
}"

다음을 바꿉니다.

  • ORGANIZATION_ID: 조직 리소스의 ID입니다. 조직 ID를 찾는 방법에 대한 자세한 내용은 조직 만들기 및 관리를 참조하세요.

  • CONSTRAINT_NAME: 분석할 조직 정책 제약조건의 이름입니다. 제약조건 목록은 조직 정책 제약조건을 참조하세요.

  • FILTER_QUERY: 필터링 표현식과 일치하는 컨테이너만 표시하는 필터 쿼리입니다. 필터링에 사용할 수 있는 유일한 필드는 parent입니다. 예를 들어 parent="//cloudresourcemanager.googleapis.com/organizations/012345678901"은 조직 ID가 012345678901인 조직의 하위 요소인 컨테이너만 반환합니다.

  • PAGE_SIZE: 조회하려는 결과 항목의 페이지 수입니다. 항목을 무제한으로 보려면 unlimited를 입력합니다. 요청에서 이 플래그를 설정하면 총 결과 항목 수가 PAGE_SIZE보다 클 때 nextPageToken 값이 반환됩니다.

  • PAGE_TOKEN: page_size 플래그를 포함하는 최초 요청 이후의 요청에서만 설정해야 합니다. 이전 응답에서 수신한 nextPageToken 값을 사용하여 결과의 특정 페이지를 반환할 수 있습니다.

JSON 응답은 다음 예시와 유사합니다.

샘플 JSON 응답

{
  "governedContainers": [
    {
      "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/opa-test-project-2",
      "parent": "//cloudresourcemanager.googleapis.com/folders/513502730678",
      "consolidatedPolicy": {
        "attachedResource": "//cloudresourcemanager.googleapis.com/folders/513502730678",
        "rules": [
          {
            "enforce": false
          }
        ],
        "appliedResource": "//cloudresourcemanager.googleapis.com/folders/513502730678"
      },
      "policyBundle": [
        {
          "attachedResource": "//cloudresourcemanager.googleapis.com/folders/513502730678",
          "rules": [
            {
              "enforce": false
            }
          ],
          "appliedResource": "//cloudresourcemanager.googleapis.com/folders/513502730678"
        },
        {
          "attachedResource": "//cloudresourcemanager.googleapis.com/folders/666681422980",
          "rules": [
            {
              "enforce": true
            }
          ],
          "appliedResource": "//cloudresourcemanager.googleapis.com/folders/666681422980"
        }
      ]
    },
    {
      "fullResourceName": "//cloudresourcemanager.googleapis.com/projects/opa-test-project-1",
      "parent": "//cloudresourcemanager.googleapis.com/folders/513502730678",
      "consolidatedPolicy": {
        "attachedResource": "//cloudresourcemanager.googleapis.com/folders/513502730678",
        "rules": [
          {
            "enforce": false
          }
        ],
        "appliedResource": "//cloudresourcemanager.googleapis.com/folders/513502730678"
      },
      "policyBundle": [
        {
          "attachedResource": "//cloudresourcemanager.googleapis.com/folders/513502730678",
          "rules": [
            {
              "enforce": false
            }
          ],
          "appliedResource": "//cloudresourcemanager.googleapis.com/folders/513502730678"
        },
        {
          "attachedResource": "//cloudresourcemanager.googleapis.com/folders/666681422980",
          "rules": [
            {
              "enforce": true
            }
          ],
          "appliedResource": "//cloudresourcemanager.googleapis.com/folders/666681422980"
        }
      ]
    }
  ]
  "constraint": {
    "googleDefinedConstraint": {
      "name": "constraints/compute.requireOsLogin",
      "displayName": "Require OS Login",
      "description": "This boolean constraint, when set to \u003ccode\u003etrue\u003c/code\u003e, enables OS Login on all newly created Projects. All VM instances created in new projects will have OS Login enabled. On new and existing projects, this constraint prevents metadata updates that disable OS Login at the project or instance level. \u003cbr\u003eBy default, the OS Login feature is disabled on Compute Engine projects.\u003cbr\u003eGKE instances in private clusters running node pool versions 1.20.5-gke.2000 and later support OS Login. GKE instances in public clusters do not currently support OS Login. If this constraint is applied to a Project running public clusters, GKE instances running in that Project may not function properly.",
      "constraintDefault": "ALLOW",
      "booleanConstraint": {}
    }
  }
}

애셋 분석

이 컨텍스트에서 애셋은 Google Cloud 리소스 또는 Identity and Access Management(IAM) 허용 정책입니다. 정책 분석 도구를 사용하면 특정 제약조건이 적용된 조직 정책이 있는 모든 애셋 목록을 반환할 수 있습니다. 커스텀 제약조건, 관리형 제약조건, 다음과 같은 사전 정의된 제약조건이 지원됩니다.

  • constraints/ainotebooks.accessMode
  • constraints/ainotebooks.disableFileDownloads
  • constraints/ainotebooks.disableRootAccess
  • constraints/ainotebooks.disableTerminal
  • constraints/ainotebooks.environmentOptions
  • constraints/ainotebooks.requireAutoUpgradeSchedule
  • constraints/ainotebooks.restrictVpcNetworks
  • constraints/compute.disableGuestAttributesAccess
  • constraints/compute.disableInstanceDataAccessApis
  • constraints/compute.disableNestedVirtualization
  • constraints/compute.disableSerialPortAccess
  • constraints/compute.disableSerialPortLogging
  • constraints/compute.disableVpcExternalIpv6
  • constraints/compute.requireOsLogin
  • constraints/compute.requireShieldedVm
  • constraints/compute.restrictLoadBalancerCreationForTypes
  • constraints/compute.restrictProtocolForwardingCreationForTypes
  • constraints/compute.restrictXpnProjectLienRemoval
  • constraints/compute.setNewProjectDefaultToZonalDNSOnly
  • constraints/compute.skipDefaultNetworkCreation
  • constraints/compute.trustedImageProjects
  • constraints/compute.vmCanIpForward
  • constraints/compute.vmExternalIpAccess
  • constraints/gcp.detailedAuditLoggingMode
  • constraints/gcp.resourceLocations
  • constraints/iam.allowedPolicyMemberDomains
  • constraints/iam.automaticIamGrantsForDefaultServiceAccounts
  • constraints/iam.disableServiceAccountCreation
  • constraints/iam.disableServiceAccountKeyCreation
  • constraints/iam.disableServiceAccountKeyUpload
  • constraints/iam.restrictCrossProjectServiceAccountLienRemoval
  • constraints/iam.serviceAccountKeyExpiryHours
  • constraints/resourcemanager.accessBoundaries
  • constraints/resourcemanager.allowedExportDestinations
  • constraints/sql.restrictAuthorizedNetworks
  • constraints/sql.restrictNoncompliantDiagnosticDataAccess
  • constraints/sql.restrictNoncompliantResourceCreation
  • constraints/sql.restrictPublicIp
  • constraints/storage.publicAccessPrevention
  • constraints/storage.restrictAuthTypes
  • constraints/storage.uniformBucketLevelAccess

정책 분석 도구는 각 애셋의 전체 이름, 계층 구조에서 애셋의 상위 요소, 계층 구조에서 해당 애셋 위에 있는 모든 상위 프로젝트, 폴더, 조직 리소스를 반환합니다.

정책 분석 도구는 쿼리 범위에서 감지된 각 애셋에 대해 결과 항목을 반환합니다.

리소스의 결과 항목에는 다음 필드가 포함됩니다.

  • consolidatedPolicy: 조직 정책이 연결된 리소스 및 계층 구조 평가 규칙을 기준으로 해당 리소스에 적용되는 유효한 정책입니다.

  • conditionEvaluation: 포함된 조건으로 인해 조직 정책이 시행되는 경우 evaluationValueTRUE입니다. 조건으로 인해 조직 정책이 시행되지 않으면 evaluationValueFALSE입니다. 조직 정책이 시행되는 하나 이상의 리소스에서 조건을 지원하지 않는 경우 조건 자체가 반환됩니다.

  • assetType: 저작물의 리소스 유형입니다.

  • effectiveTags: 조직 정책이 연결된 리소스와 계층 구조의 리소스 상위 항목에 직접 연결되거나 상속되는 모든 태그입니다.

  • folders: 조직 정책이 연결된 리소스를 포함하는 폴더 리소스의 ID입니다.

  • fullResourceName: 리소스의 전체 리소스 이름입니다.

  • organization: 리소스가 포함된 조직의 상대적 리소스 이름입니다.

  • parent: 리소스의 상위 항목에 대한 전체 리소스 이름입니다.

  • project: 리소스가 포함된 프로젝트의 ID입니다.

  • policyBundle: 위의 리소스에 연결된 완전히 구성된 조직 정책 및 리소스 계층 구조에서 상위에 정의된 조직 정책입니다.

허용 정책의 결과 항목에는 다음 필드가 포함됩니다.

  • consolidatedPolicy: 조직 정책이 연결된 리소스 및 계층 구조 평가 규칙을 기준으로 해당 리소스에 적용되는 유효한 정책입니다.

  • assetType: 허용 정책이 연결된 리소스의 리소스 유형입니다.

  • attachedResource: 허용 정책이 연결된 리소스의 전체 이름입니다.

  • folders: 허용 정책을 포함하는 폴더의 상대적 리소스 이름입니다.

  • organization: 허용 정책이 포함된 조직의 상대적 리소스 이름입니다.

  • policy: 허용 정책입니다.

  • project: 허용 정책이 포함된 프로젝트의 상대적 리소스 이름입니다.

  • policyBundle: 위의 리소스에 연결된 완전히 구성된 조직 정책 및 리소스 계층 구조에서 상위에 정의된 조직 정책입니다.

리소스가 VPC 서비스 제어 서비스 경계로 보호되는 경우 조직 리소스의 경계에서 cloudasset.googleapis.com 서비스 및 google.cloud.asset.v1.AssetService.SearchAllResources 메서드에 대한 액세스를 허용하는 이그레스 규칙을 만들어야 합니다. 이그레스 규칙이 없으면 NETWORK_NOT_IN_SAME_SERVICE_PERIMETER 오류가 발생하여 요청이 실패합니다. 자세한 내용은 VPC 서비스 제어가 차단한 요청 디버깅을 참조하세요.

콘솔

  1. Google Cloud 콘솔에서 정책 분석 도구 페이지로 이동합니다.

    정책 분석 도구로 이동

  2. 조직 정책 분석 섹션에서 조직 정책 제약조건의 영향을 받는 리소스는 무엇인가요?이라는 창을 찾고 이 창에서 쿼리 만들기를 클릭합니다.

  3. 쿼리 조직 선택 상자에서 조직 정책을 분석하려는 조직을 선택합니다.

  4. 분석할 제약조건 유형을 선택합니다. 사전 정의된 제약조건 또는 관리형 제약조건의 경우 기본 제공 제약조건을 선택합니다. 커스텀 제약조건의 경우 커스텀 제약조건을 선택합니다.

  5. 분석할 제약조건의 이름을 입력합니다. 분석 중인 제약조건 유형의 프리픽스는 이미 포함됩니다. 예를 들어 사전 정의된 버킷 수준의 액세스 제약조건의 경우 storage.uniformBucketLevelAccess를 입력하고, 서비스 계정 만들기 관리형 제약조건의 경우 iam.managed.disableServiceAccountKeyCreation을 입력하고, 커스텀 제약조건의 경우 해당 이름(예: disableGkeAccess)을 입력합니다.

  6. 쿼리 실행을 클릭합니다. 보고서 페이지에 사용자가 입력한 쿼리 매개변수와 이 제약조건이 적용되거나 상속된 모든 애셋의 결과 테이블이 표시됩니다.

  7. 이 쿼리를 저장하여 나중에 쿼리 URL 복사를 클릭하면 다시 볼 수 있습니다. 이 쿼리를 보려면 생성된 URL로 이동합니다.

  8. 목록에서 하나 이상의 애셋을 선택한 다음 상속 보기를 클릭하여 분석한 제약 조건의 상속을 시각화할 수 있습니다. 분석, 시각화를 차례로 클릭하여 분석 쿼리를 만들 때 시각화로 바로 이동할 수도 있습니다. 자세한 내용은 상속 시각화를 참조하세요.

gcloud

조직 정책 제약조건이 조직 내의 애셋에 적용되는 방식을 분석하려면 gcloud asset analyze-org-policy-governed-assets 명령어를 사용합니다.

gcloud asset analyze-org-policy-governed-assets \
    --constraint=CONSTRAINT_NAME  \
    --scope=organizations/ORGANIZATION_ID \
    --limit=LIMIT_ASSETS \
    --filter=FILTER_QUERY

다음을 바꿉니다.

  • CONSTRAINT_NAME: 분석할 조직 정책 제약조건의 이름입니다. 제약조건 목록은 조직 정책 제약조건을 참조하세요.

  • ORGANIZATION_ID: 조직 리소스의 ID입니다. 조직 ID를 찾는 방법에 대한 자세한 내용은 조직 만들기 및 관리를 참조하세요.

  • LIMIT_ASSETS: 조회하려는 결과 항목 수입니다. 항목을 무제한으로 보려면 unlimited를 입력합니다.

  • FILTER_QUERY: 필터링 표현식과 일치하는 애셋만 표시하는 필터 쿼리입니다. 필터링에 사용할 수 있는 필드는 governed_resource.folders, governed_resource.project, governed_iam_policy.folders, governed_iam_policy.project입니다. 예를 들어 governed_resource.project="projects/1234567890"은 프로젝트 ID가 1234567890인 프로젝트에 연결된 애셋만 반환합니다.

YAML 응답은 다음 예시와 유사합니다.

샘플 YAML 응답

---
consolidatedPolicy:
  appliedResource: //cloudresourcemanager.googleapis.com/projects/opa-test-project-2
  attachedResource: //cloudresourcemanager.googleapis.com/projects/opa-test-project-2
  rules:
  - enforce: false
governedResource:
  folders:
  - folders/513502730678
  - folders/666681422980
  fullResourceName: //container.googleapis.com/projects/opa-test-project-2/zones/us-central1-c/clusters/opa-test-project-2-cluster-1/nodePools/default-pool
  organization: organizations/474566717491
  parent: //container.googleapis.com/projects/opa-test-project-2/zones/us-central1-c/clusters/opa-test-project-2-cluster-1
  project: projects/892625391619
policyBundle:
- appliedResource: //cloudresourcemanager.googleapis.com/projects/opa-test-project-2
  attachedResource: //cloudresourcemanager.googleapis.com/projects/opa-test-project-2
  reset: true
- appliedResource: //cloudresourcemanager.googleapis.com/organizations/474566717491
  attachedResource: //cloudresourcemanager.googleapis.com/organizations/474566717491
  rules:
  - enforce: true
---
consolidatedPolicy:
  appliedResource: //cloudresourcemanager.googleapis.com/projects/project2-244918
  attachedResource: //cloudresourcemanager.googleapis.com/projects/project2-244918
  rules:
  - enforce: false
governedResource:
  folders:
  - folders/800636178739
  - folders/408342778736
  fullResourceName: //container.googleapis.com/projects/project2-244918/zones/us-central1-c/clusters/cluster-1/nodePools/default-pool
  organization: organizations/474566717491
  parent: //container.googleapis.com/projects/project2-244918/zones/us-central1-c/clusters/cluster-1
  project: projects/761097189269
policyBundle:
- appliedResource: //cloudresourcemanager.googleapis.com/projects/project2-244918
  attachedResource: //cloudresourcemanager.googleapis.com/projects/project2-244918
  rules:
  - enforce: false
- appliedResource: //cloudresourcemanager.googleapis.com/folders/408342778736
  attachedResource: //cloudresourcemanager.googleapis.com/folders/408342778736
  rules:
  - condition:
      description: cond-desc1
      expression: resource.matchTag("474566717491/env", "prod")
      title: cond-title1
    enforce: false
  - enforce: true
- appliedResource: //cloudresourcemanager.googleapis.com/organizations/474566717491
  attachedResource: //cloudresourcemanager.googleapis.com/organizations/474566717491
  rules:
  - enforce: true
---
consolidatedPolicy:
  appliedResource: //cloudresourcemanager.googleapis.com/organizations/474566717491
  attachedResource: //cloudresourcemanager.googleapis.com/organizations/474566717491
  rules:
  - enforce: true
governedResource:
  fullResourceName: //container.googleapis.com/projects/probe-per-rt-project/zones/us-west1-a/clusters/test-cluster-for-backup/nodePools/default-pool
  organization: organizations/474566717491
  parent: //container.googleapis.com/projects/probe-per-rt-project/zones/us-west1-a/clusters/test-cluster-for-backup
  project: projects/896190383908
policyBundle:
- appliedResource: //cloudresourcemanager.googleapis.com/organizations/474566717491
  attachedResource: //cloudresourcemanager.googleapis.com/organizations/474566717491
  rules:
  - enforce: true

REST

조직 내에서 조직 정책 제약조건이 애셋에 적용되는 방식을 분석하려면 Cloud Asset API의 analyzeOrgPolicyGovernedAssets 메서드를 사용합니다.

HTTP 메서드 및 URL:

GET https://cloudasset.googleapis.com/v1/organizations/ORGANIZATION_ID:analyzeOrgPolicyGovernedAssets

JSON 요청 본문:

JSON_REQUEST="{
  'constraint': 'CONSTRAINT_NAME',
  'filter': 'FILTER_QUERY',
  'page_size': PAGE_SIZE,
  'page_token': PAGE_TOKEN
}"

다음을 바꿉니다.

  • ORGANIZATION_ID: 조직 리소스의 ID입니다. 조직 ID를 찾는 방법에 대한 자세한 내용은 조직 만들기 및 관리를 참조하세요.

  • CONSTRAINT_NAME: 분석할 조직 정책 제약조건의 이름입니다. 제약조건 목록은 조직 정책 제약조건을 참조하세요.

  • FILTER_QUERY: 필터링 표현식과 일치하는 애셋만 표시하는 필터 쿼리입니다. 필터링에 사용할 수 있는 필드는 governed_resource.folders, governed_resource.project, governed_iam_policy.folders, governed_iam_policy.project입니다. 예를 들어 governed_resource.project="projects/1234567890"은 프로젝트 ID가 1234567890인 프로젝트에 연결된 애셋만 반환합니다.

  • PAGE_SIZE: 조회하려는 결과 항목의 페이지 수입니다. 항목을 무제한으로 보려면 unlimited를 입력합니다. 요청에서 이 플래그를 설정하면 총 결과 항목 수가 PAGE_SIZE보다 클 때 nextPageToken 값이 반환됩니다.

  • PAGE_TOKEN: page_size 플래그를 포함하는 최초 요청 이후의 요청에서만 설정해야 합니다. 이전 응답에서 수신한 nextPageToken 값을 사용하여 결과의 특정 페이지를 반환할 수 있습니다.

JSON 응답은 다음 예시와 유사합니다.

샘플 JSON 응답

{
  "governedAssets": [
    {
      "governedResource": {
        "fullResourceName": "//container.googleapis.com/projects/opa-test-project-2/zones/us-central1-c/clusters/opa-test-project-2-cluster-1/nodePools/default-pool",
        "parent": "//container.googleapis.com/projects/opa-test-project-2/zones/us-central1-c/clusters/opa-test-project-2-cluster-1",
        "project": "projects/892625391619",
        "folders": [
          "folders/513502730678",
          "folders/666681422980"
        ],
        "organization": "organizations/474566717491"
      },
      "consolidatedPolicy": {
        "attachedResource": "//cloudresourcemanager.googleapis.com/projects/opa-test-project-2",
        "rules": [
          {
            "enforce": false
          }
        ],
        "appliedResource": "//cloudresourcemanager.googleapis.com/projects/opa-test-project-2"
      },
      "policyBundle": [
        {
          "attachedResource": "//cloudresourcemanager.googleapis.com/projects/opa-test-project-2",
          "reset": true,
          "appliedResource": "//cloudresourcemanager.googleapis.com/projects/opa-test-project-2"
        },
        {
          "attachedResource": "//cloudresourcemanager.googleapis.com/organizations/474566717491",
          "rules": [
            {
              "enforce": true
            }
          ],
          "appliedResource": "//cloudresourcemanager.googleapis.com/organizations/474566717491"
        }
      ]
    },
    {
      "governedResource": {
        "fullResourceName": "//container.googleapis.com/projects/project2-244918/zones/us-central1-c/clusters/cluster-1/nodePools/default-pool",
        "parent": "//container.googleapis.com/projects/project2-244918/zones/us-central1-c/clusters/cluster-1",
        "project": "projects/761097189269",
        "folders": [
          "folders/800636178739",
          "folders/408342778736"
        ],
        "organization": "organizations/474566717491"
      },
      "consolidatedPolicy": {
        "attachedResource": "//cloudresourcemanager.googleapis.com/projects/project2-244918",
        "rules": [
          {
            "enforce": false
          }
        ],
        "appliedResource": "//cloudresourcemanager.googleapis.com/projects/project2-244918"
      },
      "policyBundle": [
        {
          "attachedResource": "//cloudresourcemanager.googleapis.com/projects/project2-244918",
          "rules": [
            {
              "enforce": false
            }
          ],
          "appliedResource": "//cloudresourcemanager.googleapis.com/projects/project2-244918"
        },
        {
          "attachedResource": "//cloudresourcemanager.googleapis.com/folders/408342778736",
          "rules": [
            {
              "enforce": false,
              "condition": {
                "expression": "resource.matchTag(\"474566717491/env\", \"prod\")",
                "title": "cond-title1",
                "description": "cond-desc1"
              }
            },
            {
              "enforce": true
            }
          ],
          "appliedResource": "//cloudresourcemanager.googleapis.com/folders/408342778736"
        },
        {
          "attachedResource": "//cloudresourcemanager.googleapis.com/organizations/474566717491",
          "rules": [
            {
              "enforce": true
            }
          ],
          "appliedResource": "//cloudresourcemanager.googleapis.com/organizations/474566717491"
        }
      ]
    }
  ]
  "constraint": {
    "customConstraint": {
      "name": "organizations/474566717491/customConstraints/custom.disableGkeAutoUpgrade",
      "resourceTypes": [
        "container.googleapis.com/NodePool"
      ],
      "methodTypes": [
        "CREATE",
        "UPDATE"
      ],
      "condition": "resource.management.autoUpgrade == false",
      "actionType": "ALLOW",
      "displayName": "Disable GKE auto upgrade",
      "description": "Only allow GKE NodePool resource create or updates if AutoUpgrade is not enabled"
    }
  }
}

상속 시각화

Security Command Center 프리미엄 등급의 조직 수준 활성화를 사용하는 경우 Google Cloud 콘솔을 통해 분석한 조직 정책의 상속을 시각화할 수 있습니다.

상속 시각화를 보려면 구성된 정책, 컨테이너 또는 애셋에 대한 조직 정책 분석 쿼리를 만듭니다. 쿼리 분석 실행 페이지에서 분석을 클릭한 다음 시각화를 선택합니다.

저장된 쿼리의 URL로 이동하여 강조 표시할 리소스를 선택한 후 상속 보기를 클릭합니다.

리소스 상속 페이지에서 분석 쿼리에서 선택한 리소스의 리소스 계층 구조의 시각화가 표시됩니다.

리소스 계층 구조의 조직 정책 상속을 시각화한 모습 시행되지 않은 불리언 정책의 시각화

  1. 리소스가 조직, 폴더 또는 프로젝트인지 나타냅니다.

  2. 파란색 점은 쿼리에서 리소스가 선택되었음을 나타냅니다.

  3. 리소스가 상위 리소스의 정책을 재정의함을 나타냅니다.

  4. 리소스가 조직 정책을 해당 정책에 대해 Google에서 관리하는 기본값으로 재설정함을 나타냅니다. 정책을 기본값으로 재설정하는 리소스에는 점선이 그 상위 요소에 연결됩니다.

  5. 상위 요소와 리소스 병합 정책을 나타냅니다.

  6. 이 리소스의 조직 정책이 불리언 제약조건 또는 허용되는 값이 있는 목록 제약조건을 시행함을 나타냅니다.

  7. 이 리소스의 조직 정책이 거부된 값이 있는 목록 제약조건임을 나타냅니다.

  8. 이 리소스의 조직 정책이 시행되지 않는 불리언 제약조건임을 나타냅니다.

다음 단계