BigQuery에 정책 분석 기록

이 페이지에서는 Identity and Access Management(IAM) 정책을 비동기식으로 분석하고 결과를 BigQuery에 쓰는 방법을 설명합니다. 분석 결과가 BigQuery 테이블에 작성된다는 점을 제외하면 이 프로세스는 IAM 정책 분석과 유사합니다.

시작하기 전에

Enable the Cloud Asset API.

Enable the API

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

필수 역할 및 권한

정책 분석을 실행하고 결과를 BigQuery로 내보내려면 다음 역할 및 권한이 필요합니다.

필요한 IAM 역할

정책을 분석하고 결과를 BigQuery로 내보내기 위해 필요한 권한을 가져오려면 쿼리 범위를 지정할 프로젝트, 폴더, 조직에 대해 다음 IAM 역할을 부여해 달라고 관리자에게 요청합니다.

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

이러한 사전 정의된 역할에는 정책을 분석하고 결과를 BigQuery로 내보내는 데 필요한 권한이 포함되어 있습니다. 필요한 정확한 권한을 보려면 필수 권한 섹션을 펼치세요.

필수 권한

정책을 분석하고 결과를 BigQuery로 내보내려면 다음 권한이 필요합니다.

  • bigquery.datasets.create
  • bigquery.jobs.create
  • bigquery.tables.create
  • bigquery.tables.get
  • bigquery.tables.updateData
  • bigquery.tables.update
  • cloudasset.assets.analyzeIamPolicy
  • cloudasset.assets.searchAllResources
  • cloudasset.assets.searchAllIamPolicies
  • 커스텀 IAM 역할을 사용하여 정책 분석: iam.roles.get
  • Google Cloud CLI를 사용하여 정책 분석: serviceusage.services.use

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

필요한 Google Workspace 권한

Google Workspace 그룹에서 멤버십의 결과로 주 구성원에 특정 역할 또는 권한이 있는지 확인하려면 groups.read Google Workspace 권한이 필요합니다. 이 권한은 그룹 리더 관리자와 그룹 관리자 또는 최고 관리자 역할과 같은 보다 강력한 역할에 포함되어 있습니다. 자세한 내용은 특정 관리자 역할 할당을 참조하세요.

정책 분석 및 결과 내보내기

콘솔

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

    정책 분석 도구로 이동

  2. 정책 분석 섹션에서 사용할 쿼리 템플릿을 찾은 후 쿼리 만들기를 클릭합니다. 커스텀 쿼리를 만들려면 커스텀 쿼리 만들기를 클릭합니다.

  3. 쿼리 범위 선택 필드에서 쿼리 범위로 지정할 프로젝트, 폴더, 조직을 선택합니다. 정책 분석 도구는 프로젝트, 폴더, 조직 내 리소스는 물론 프로젝트, 폴더, 조직에 대한 액세스 권한을 분석합니다.

  4. 쿼리 매개변수가 설정되었는지 확인합니다.

    • 쿼리 템플릿을 사용하는 경우 미리 채워진 쿼리 매개변수를 확인합니다.
    • 커스텀 쿼리를 만드는 경우 쿼리할 리소스, 주 구성원, 역할, 권한을 설정합니다.

    만들 수 있는 쿼리 유형에 대한 자세한 내용은 IAM 정책 분석을 참조하세요.

  5. 쿼리 이름으로 라벨이 지정된 창에서 분석 > 결과만 내보내기를 클릭합니다. 결과 내보내기 창이 열립니다.

  6. 내보내기 대상 설정 섹션에서 다음 정보를 입력합니다.

    • 프로젝트: BigQuery 데이터 세트가 있는 프로젝트입니다.
    • 데이터 세트: 결과를 내보낼 BigQuery 데이터 세트입니다.
    • 테이블: 분석 결과가 기록되는 BigQuery 테이블의 프리픽스입니다. 지정된 프리픽스의 테이블이 없으면 BigQuery가 새 테이블을 만듭니다.
  7. 계속을 클릭합니다.

  8. 선택사항: 추가 설정 구성 섹션에서 원하는 옵션을 선택합니다.

    • 파티셔닝: 테이블 파티션을 나눌지 여부입니다. 파티션을 나눈 테이블에 대한 자세한 내용은 파티션을 나눈 테이블 소개를 참조하세요.
    • 쓰기 환경설정: 대상 테이블 또는 파티션이 이미 있는 경우 발생하는 작업을 지정합니다. 기본적으로 테이블 또는 파티션이 이미 있으면 BigQuery가 데이터를 테이블 또는 최근 파티션에 추가합니다.
  9. 내보내기를 클릭합니다.

정책 분석 도구는 쿼리를 실행하고 결과를 지정된 테이블로 내보냅니다.

gcloud

AnalyzeIamPolicyLongrunning 메서드를 사용하면 분석 요청을 실행하고 지정된 BigQuery 대상에서 결과를 가져올 수 있습니다.

아래의 명령어 데이터를 사용하기 전에 다음을 바꿉니다.

  • RESOURCE_TYPE: 검색 범위를 지정할 리소스 유형입니다. 이 리소스 및 해당 종속 항목에 연결된 IAM 허용 정책만 분석됩니다. project, folder, organization 값을 사용합니다.
  • RESOURCE_ID: 검색 범위를 지정할 Google Cloud 프로젝트, 폴더, 조직의 ID입니다. 이 리소스 및 해당 종속 항목에 연결된 IAM 허용 정책만 분석됩니다. 프로젝트 ID는 my-project 같은 영숫자 문자열입니다. 폴더 및 조직 ID는 123456789012와 같은 숫자입니다.
  • PRINCIPAL: PRINCIPAL_TYPE:ID 형식의 분석할 액세스를 갖는 주 구성원입니다(예: user:my-user@example.com). 주 구성원 유형의 전체 목록은 주 구성원 식별자를 참조하세요.
  • PERMISSIONS: 쉼표로 구분된 확인할 권한 목록입니다(예: compute.instances.get,compute.instances.start). 여러 권한을 나열하면 정책 분석 도구가 나열된 권한을 확인합니다.
  • DATASET: projects/PROJECT_ID/datasets/DATASET_ID 형식의 BigQuery 데이터 세트입니다. 여기서 PROJECT_ID는 Google Cloud 프로젝트의 영숫자 ID이고 DATASET_ID는 데이터 세트의 ID입니다.
  • TABLE_PREFIX: 분석 결과가 기록되는 BigQuery 테이블의 프리픽스입니다. 지정된 프리픽스의 테이블이 없으면 BigQuery가 새 테이블을 만듭니다.
  • PARTITION_KEY: 선택사항. BigQuery 파티션을 나눈 테이블의 파티션 키입니다. 정책 분석 도구는 REQUEST_TIME 파티션 키만 지원합니다.
  • WRITE_DISPOSITION: 선택사항. 대상 테이블 또는 파티션이 이미 있는 경우 발생하는 작업을 지정합니다. 가능한 값 목록은 writeDisposition을 참조하세요. 기본적으로 테이블 또는 파티션이 이미 있으면 BigQuery가 데이터를 테이블 또는 최근 파티션에 추가합니다.

gcloud asset analyze-iam-policy-longrunning 명령어를 실행합니다.

Linux, macOS 또는 Cloud Shell

gcloud asset analyze-iam-policy-longrunning --RESOURCE_TYPE=RESOURCE_ID \
    --full-resource-name=FULL_RESOURCE_NAME \
    --identity=PRINCIPAL \
    --permissions='PERMISSIONS' \
    --bigquery-dataset=DATASET \
    --bigquery-table-prefix=TABLE_PREFIX \
    --bigquery-partition-key=PARTITION_KEY \
    --bigquery-write-disposition=WRITE_DISPOSITION

Windows(PowerShell)

gcloud asset analyze-iam-policy-longrunning --RESOURCE_TYPE=RESOURCE_ID `
    --full-resource-name=FULL_RESOURCE_NAME `
    --identity=PRINCIPAL `
    --permissions='PERMISSIONS' `
    --bigquery-dataset=DATASET `
    --bigquery-table-prefix=TABLE_PREFIX `
    --bigquery-partition-key=PARTITION_KEY `
    --bigquery-write-disposition=WRITE_DISPOSITION

Windows(cmd.exe)

gcloud asset analyze-iam-policy-longrunning --RESOURCE_TYPE=RESOURCE_ID ^
    --full-resource-name=FULL_RESOURCE_NAME ^
    --identity=PRINCIPAL ^
    --permissions='PERMISSIONS' ^
    --bigquery-dataset=DATASET ^
    --bigquery-table-prefix=TABLE_PREFIX ^
    --bigquery-partition-key=PARTITION_KEY ^
    --bigquery-write-disposition=WRITE_DISPOSITION

다음과 비슷한 응답이 표시됩니다.

Analyze IAM Policy in progress.
Use [gcloud asset operations describe projects/my-project/operations/AnalyzeIamPolicyLongrunning/1195028485971902504711950280359719028666] to check the status of the operation.

REST

AnalyzeIamPolicyLongrunning 메서드를 사용하면 분석 요청을 실행하고 지정된 BigQuery 대상에서 결과를 가져올 수 있습니다.

IAM 허용 정책을 분석하고 결과를 BigQuery로 내보내려면 Cloud Asset Inventory API의 analyzeIamPolicyLongrunning 메서드를 사용합니다.

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • RESOURCE_TYPE: 검색 범위를 지정할 리소스 유형입니다. 이 리소스 및 해당 종속 항목에 연결된 IAM 허용 정책만 분석됩니다. projects, folders, organizations 값을 사용합니다.
  • RESOURCE_ID: 검색 범위를 지정할 Google Cloud 프로젝트, 폴더, 조직의 ID입니다. 이 리소스 및 해당 종속 항목에 연결된 IAM 허용 정책만 분석됩니다. 프로젝트 ID는 my-project 같은 영숫자 문자열입니다. 폴더 및 조직 ID는 123456789012와 같은 숫자입니다.
  • FULL_RESOURCE_NAME: 선택사항. 액세스를 분석할 리소스의 전체 리소스 이름입니다. 전체 리소스 이름 형식 목록은 리소스 이름 형식을 참조하세요.
  • PRINCIPAL: (선택사항) PRINCIPAL_TYPE:ID 형식의 분석할 액세스를 갖는 주 구성원입니다(예: user:my-user@example.com). 주 구성원 유형의 전체 목록은 주 구성원 식별자를 참조하세요.
  • PERMISSION_1, PERMISSION_2... PERMISSION_N: (선택사항) 확인할 권한입니다(예: compute.instances.get). 여러 권한을 나열하면 정책 분석 도구가 나열된 권한을 확인합니다.
  • DATASET: projects/PROJECT_ID/datasets/DATASET_ID 형식의 BigQuery 데이터 세트입니다. 여기서 PROJECT_ID는 Google Cloud 프로젝트의 영숫자 ID이고 DATASET_ID는 데이터 세트의 ID입니다.
  • TABLE_PREFIX: 분석 결과가 기록되는 BigQuery 테이블의 프리픽스입니다. 지정된 프리픽스의 테이블이 없으면 BigQuery가 새 테이블을 만듭니다.
  • PARTITION_KEY: 선택사항. BigQuery 파티션을 나눈 테이블의 파티션 키입니다. 정책 분석 도구는 REQUEST_TIME 파티션 키만 지원합니다.
  • WRITE_DISPOSITION: 선택사항. 대상 테이블 또는 파티션이 이미 있는 경우 발생하는 작업을 지정합니다. 가능한 값 목록은 writeDisposition을 참조하세요. 기본적으로 테이블 또는 파티션이 이미 있으면 BigQuery가 데이터를 테이블 또는 최근 파티션에 추가합니다.

HTTP 메서드 및 URL:

POST https://cloudasset.googleapis.com/v1/RESOURCE_TYPE/RESOURCE_ID:analyzeIamPolicyLongrunning

JSON 요청 본문:

{
  "analysisQuery": {
    "resourceSelector": {
      "fullResourceName": "FULL_RESOURCE_NAME"
    },
    "identitySelector": {
      "identity": "PRINCIPAL"
    },
    "accessSelector": {
      "permissions": [
        "PERMISSION_1",
        "PERMISSION_2",
        "PERMISSION_N"
      ]
    }
  },
  "outputConfig": {
    "bigqueryDestination": {
      "dataset": "DATASET",
      "tablePrefix": "TABLE_PREFIX",
      "partitionKey": "PARTITION_KEY",
      "writeDisposition": "WRITE_DISPOSITION"
    }
  }
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "name": "projects/my-project/operations/AnalyzeIamPolicyLongrunning/1206385342502762515812063858425027606003",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.asset.v1.AnalyzeIamPolicyLongrunningMetadata",
    "createTime": "2022-04-12T21:31:10.753173929Z"
  }
}

IAM 정책 분석 결과 보기

IAM 정책 분석 결과를 보려면 다음 안내를 따르세요.

콘솔

  1. Google Cloud 콘솔에서 BigQuery 페이지로 이동합니다.

    BigQuery로 이동

  2. 데이터 세트의 테이블과 뷰를 표시하려면 탐색 패널을 엽니다. 탐색기 섹션에서 프로젝트를 선택하여 펼친 다음 데이터 세트를 선택합니다.

  3. 목록에서 프리픽스가 있는 테이블을 선택합니다. analysis 서픽스가 있는 테이블에는 쿼리 및 메타데이터(예: 작업 이름, 요청 시간, 중요하지 않은 오류)가 포함됩니다. analysis_result 서픽스가 있는 테이블에는 {identity, role(s)/permission(s), resource}의 튜플과 이러한 튜플을 생성하는 IAM 정책이 함께 나열됩니다.

  4. 샘플 데이터를 보려면 미리보기 탭을 선택합니다.

API

테이블 데이터를 찾아보려면 tabledata.list를 호출하세요. tableId 매개변수에 테이블 이름을 지정합니다.

다음과 같은 선택적 매개변수를 구성하여 출력을 제어할 수 있습니다.

  • maxResults는 반환할 최대 결과 수입니다.
  • selectedFields는 반환할 열을 쉼표로 구분한 목록입니다. 지정하지 않으면 모든 열이 반환됩니다.
  • startIndex는 읽기를 시작할 행의 0부터 시작하는 색인입니다.

반환되는 값은 JSON 객체에 래핑되므로 tabledata.list 참고 문서의 설명에 따라 객체를 파싱해야 합니다.

BigQuery 쿼리

이 섹션에서는 AnalyzeIamPolicyLongrunning이 작성한 BigQuery 테이블을 사용하는 방법을 보여주는 SQL 쿼리 예시를 제공합니다. BigQuery 문법에 대한 자세한 내용은 표준 SQL 쿼리 구문을 참조하세요.

대부분의 쿼리에는 OP_ID가 필요하며 AnalyzeIamPolicyLongrunning 응답에서 가져올 수 있습니다. 예를 들어 gcloud에서 사용자는 '[gcloud asset operations describe organizations/123456789/operations/AnalyzeIamPolicyLongrunning/123456]를 사용하여 작업 상태를 확인하세요.'에서 OP_ID123456인 것을 확인할 수 있습니다.

작업 나열

테이블에는 여러 AnalyzeIamPolicyLongrunning 작업의 결과가 저장될 수 있습니다. 다음 쿼리를 사용하여 모두 나열할 수 있습니다.

SELECT DISTINCT
  requestTime,
  opName
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis`
ORDER BY 1 DESC
;

작업 하나의 분석 결과 나열

AnalyzeIamPolicyLongrunning 작업 하나를 수행하면 여러 분석 레코드가 생성될 수 있습니다. 예를 들어 요청에서 analyze_service_account_impersonation 옵션을 사용 설정하면 결과에는 하나의 기본 분석(analysisId 0) 및 여러 서비스 계정 명의 도용 분석이 포함될 수 있습니다.

다음 쿼리를 사용하여 작업 이름을 지정하면 모든 분석을 찾을 수 있습니다.

DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID";

SELECT
  analysisId,
  requestTime,
  TO_JSON_STRING(analysis.analysisQuery, true) as analysisQuery,
  analysis.fullyExplored,
  TO_JSON_STRING(analysis.nonCriticalErrors, true) as nonCriticalErrors
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis`
WHERE opName=_opName
ORDER BY 1
;

하나의 분석에 ACE(액세스 제어 엔트리) 나열

ACE는 액세스 제어 엔트리 {identity, role(s)/permission(s), resource}입니다. 다음 쿼리를 사용하여 하나의 분석에서 ACE를 나열할 수 있습니다.

DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID";

SELECT DISTINCT
  ids.name AS identity,
  resources.fullResourceName AS resource,
  accesses.role AS role,
  accesses.permission AS permission
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result`,
  UNNEST(analysisResult.identityList.identities) AS ids,
  UNNEST(analysisResult.accessControlLists) AS acls,
  UNNEST(acls.accesses) AS accesses,
  UNNEST(acls.resources) AS resources
WHERE opName=_opName
AND analysisId = 0
ORDER BY 1,2,3,4
;

하나의 분석에 IAM 정책 바인딩이 있는 ACE(액세스 제어 엔트리) 나열

이 쿼리에서는 하나의 분석에 대한 ACE를 생성하는 ACE와 IAM 정책 binding을 모두 나열합니다.

DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID";

SELECT
  ids.name AS identity,
  resources.fullResourceName AS resource,
  accesses.role AS role,
  accesses.permission AS permission,
  analysisResult.attachedResourceFullName as iam_policy_attached_resource,
  TO_JSON_STRING(analysisResult.iamBinding, true) as iam_policy_binding
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result`,
  UNNEST(analysisResult.identityList.identities) AS ids,
  UNNEST(analysisResult.accessControlLists) AS acls,
  UNNEST(acls.accesses) AS accesses,
  UNNEST(acls.resources) AS resources
WHERE opName=_opName AND analysisId = 0
ORDER BY 1,2,3,4
;

하나의 분석에 IAM 정책 바인딩 나열

이 쿼리에서는 하나의 분석에 나타나는 IAM 정책 바인딩을 나열합니다.

DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID";

SELECT DISTINCT
  analysisResult.attachedResourceFullName as iam_policy_attached_resource,
  TO_JSON_STRING(analysisResult.iamBinding, true) as iam_policy_binding
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result`
WHERE opName=_opName AND analysisId = 0
ORDER BY 1, 2
;

하나의 분석에 ACE(액세스 제어 엔트리)와 IAM 정책 바인딩 나열

이 쿼리에서는 하나의 분석에 IAM 정책 바인딩을 파생된 ACE와 함께 나열합니다.

DECLARE _opName STRING DEFAULT "organizations/ORG_ID/operations/AnalyzeIamPolicyLongrunning/OP_ID";

SELECT
  analysisResult.attachedResourceFullName as iam_policy_attached_resource,
  TO_JSON_STRING(analysisResult.iamBinding, true) as iam_policy_binding,
  TO_JSON_STRING(analysisResult.identityList.identities, true) as identities,
  TO_JSON_STRING(acls.accesses, true) as accesses,
  TO_JSON_STRING(acls.resources, true) as resources
FROM `BQ_PROJECT_ID.BQ_DATASET_NAME.BQ_TABLE_PREFIX_analysis_result`,
  UNNEST(analysisResult.accessControlLists) AS acls
WHERE opName=_opName AND analysisId = 0
ORDER BY 1,2
;