조직의 OS 정책에서 맞춤 데이터 보기

이 문서에서는 VM Manager, Cloud 애셋 인벤토리, BigQuery를 사용하여 조직 전체의 OS 정책에서 커스텀 데이터와 시행 오류 메시지를 확인하는 방법을 설명합니다. 표준 규정 준수 상태에서 포착하지 않는 맞춤 VM 구성, 스크립트 출력 또는 정책 실행 실패에 관한 조직 전체 보고가 필요한 경우 이 워크플로를 사용하세요.

맞춤 데이터를 수집하려면 OS 정책에서 outputFilePath를 구성합니다. 이는 정책 스크립트가 맞춤 텍스트 또는 JSON 출력을 작성하는 VM의 로컬 경로입니다. VM Manager는 이 경로에서 출력을 읽고 OS 정책 할당 보고서에 저장합니다. 그런 다음 Cloud Asset Inventory를 사용하여 VM 전체에서 결과를 쿼리하여 이러한 보고서를 BigQuery로 내보낼 수 있습니다.

시작하기 전에

  • VM Manager 설정
  • Cloud 애셋 인벤토리 API를 사용 설정합니다.
  • 내보낸 데이터를 저장할 BigQuery 데이터 세트를 만듭니다.
  • 맞춤 데이터를 출력하는 OS 정책 할당을 만듭니다.
  • 아직 인증을 설정하지 않았다면 설정합니다. 인증은 Google Cloud 서비스 및 API에 액세스하기 위해 ID를 확인합니다. 로컬 개발 환경에서 코드 또는 샘플을 실행하려면 다음 옵션 중 하나를 선택하여 Compute Engine에 인증하면 됩니다.

    이 페이지의 샘플 사용 방법에 대한 탭을 선택하세요.

    콘솔

    Google Cloud 콘솔을 사용하여 Google Cloud 서비스 및 API에 액세스하는 경우 인증을 설정할 필요가 없습니다.

    gcloud

    1. Google Cloud CLI를 설치합니다. 설치 후 다음 명령어를 실행하여 Google Cloud CLI를 초기화합니다.

      gcloud init

      외부 ID 공급업체(IdP)를 사용하는 경우 먼저 제휴 ID로 gcloud CLI에 로그인해야 합니다.

  • 기본 리전 및 영역을 설정합니다.

필요한 역할

리소스 데이터를 BigQuery로 내보내고 맞춤 OS 정책 데이터를 쿼리하는 데 필요한 권한을 얻으려면 관리자에게 프로젝트, 폴더 또는 조직에 대한 다음 IAM 역할을 부여해 달라고 요청하세요.

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

이러한 사전 정의된 역할에는 리소스 데이터를 BigQuery로 내보내고 맞춤 OS 정책 데이터를 쿼리하는 데 필요한 권한이 포함되어 있습니다. 필요한 정확한 권한을 보려면 필수 권한 섹션을 펼치세요.

필수 권한

리소스 데이터를 BigQuery로 내보내고 맞춤 OS 정책 데이터를 쿼리하려면 다음 권한이 필요합니다.

  • cloudasset.assets.exportOSInventories
  • cloudasset.assets.exportResource
  • bigquery.datasets.get
  • bigquery.tables.create
  • bigquery.tables.update
  • bigquery.tables.get
  • bigquery.jobs.create

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

샘플 OS 정책

BigQuery에서 맞춤 데이터를 내보내고 쿼리하려면 먼저 VM에서 맞춤 출력을 수집하는 OS 정책을 만들어 할당해야 합니다. 자세한 내용은 OS 정책 할당 만들기를 참고하세요.

맞춤 데이터를 수집하려면 다음 섹션이 포함된 exec 리소스를 사용하여 OS 정책을 정의합니다.

  • validate: VM이 선택된 상태와 일치하는지 확인합니다. 다음 샘플 정책에서 validate 스크립트는 리소스가 선택한 상태와 일치하지 않음을 나타내기 위해 코드 101로 종료됩니다. 이 종료 코드는 평가마다 enforce 스크립트를 트리거합니다.
  • enforce: outputFilePath 필드를 지정하고, 맞춤 명령어를 실행하고, 지정된 경로에 출력을 쓰고, 코드 100로 종료하여 시행이 성공했음을 나타냅니다.

문자열을 출력하는 OS 정책

다음 샘플 OS 정책은 VM 인스턴스의 커널 버전이 포함된 문자열을 출력합니다.

id: return-kernel-version-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      id: return-kernel-version
      exec:
        validate:
          interpreter: SHELL
          script: exit 101
        enforce:
          interpreter: SHELL
          outputFilePath: policy-output.txt
          script: uname -r > policy-output.txt && exit 100

JSON 파일을 출력하는 OS 정책

다음 샘플 OS 정책은 운영체제 이름과 커널 버전이 포함된 JSON 객체를 출력합니다.

id: return-kernel-version-js-policy
mode: ENFORCEMENT
resourceGroups:
  - resources:
      id: return-kernel-version-js
      exec:
        validate:
          interpreter: SHELL
          script: exit 101
        enforce:
          interpreter: SHELL
          outputFilePath: policy-output.json
          script: |-
            k=$(uname -r)
            o=$(uname -a)
            echo "{ \"name\": \""$o"\", \"kernel\": \""$k"\" }" > policy-output.json
            exit 100

BigQuery로 VM Manager 데이터 내보내기

VM Manager가 OS 정책을 적용하면 Cloud 애셋 인벤토리가 조직 전체에서 결과 OS 인벤토리와 OS 정책 할당 보고서를 수집합니다. --per-asset-type 플래그를 사용하여 이 데이터를 BigQuery로 내보내면 Cloud 애셋 인벤토리는 각 애셋 유형에 대해 별도의 테이블을 만듭니다. 결과 <prefix>_osconfig_googleapis_com_OSPolicyAssignmentReport 테이블에는 맞춤 정책 출력과 시행 오류 메시지가 저장됩니다.

OS 인벤토리 및 리소스 데이터를 BigQuery로 내보내려면 다음 단계를 따르세요.

  1. 조직 ID를 확인하려면 다음 명령어를 실행합니다.

    gcloud projects get-ancestors PROJECT_ID
    

    PROJECT_ID를 프로젝트 ID로 바꿉니다.

  2. VM Manager가 VM 인스턴스에서 수집하는 OS 인벤토리 데이터를 내보내려면 다음 명령어를 실행합니다.

    gcloud asset export \
        --content-type=os-inventory \
        --organization=ORGANIZATION_ID \
        --per-asset-type \
        --bigquery-table="projects/BQ_PROJECT_ID/datasets/DATASET_ID/tables/os"
    

    다음 자리표시자를 사용자 값으로 바꿉니다.

    • ORGANIZATION_ID: 조직 ID입니다.
    • BQ_PROJECT_ID: BigQuery 데이터 세트가 포함된 프로젝트의 ID입니다.
    • DATASET_ID: BigQuery 데이터 세트의 ID입니다 (예: cai_exp).
  3. OS 정책 할당 보고서를 포함한 리소스 메타데이터를 BigQuery로 내보내려면 다음 명령어를 실행합니다.

    gcloud asset export \
        --content-type=resource \
        --organization=ORGANIZATION_ID \
        --per-asset-type \
        --bigquery-table="projects/BQ_PROJECT_ID/datasets/DATASET_ID/tables/res"
    

    다음 자리표시자를 사용자 값으로 바꿉니다.

    • ORGANIZATION_ID: 조직 ID입니다.
    • BQ_PROJECT_ID: BigQuery 데이터 세트가 포함된 프로젝트의 ID입니다.
    • DATASET_ID: BigQuery 데이터 세트의 ID입니다 (예: cai_exp).

    내보내기가 완료되면 Cloud 애셋 인벤토리는 BigQuery 데이터 세트에 res_osconfig_googleapis_com_OSPolicyAssignmentReport 테이블을 만듭니다. 자세한 내용은 애셋 스냅샷 내보내기를 참고하세요.

BigQuery에서 맞춤 OS 정책 데이터 쿼리

애셋 데이터를 BigQuery로 내보낸 후 res_osconfig_googleapis_com_OSPolicyAssignmentReport 테이블을 쿼리하여 OS 정책의 맞춤 출력과 시정 조치 오류 메시지를 확인할 수 있습니다.

BigQuery에서 쿼리를 실행하려면 다음 단계를 따르세요.

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

    BigQuery로 이동

  2. 쿼리 편집기에 다음 SQL 쿼리 중 하나를 붙여넣습니다.

    • 질문 텍스트 출력:

      다음 쿼리는 OS 정책이 각 VM 인스턴스에 대해 수집하는 커널 버전을 반환합니다.

      SELECT
        resource.data.instance as instance,
        ANY_VALUE(
          SAFE_CONVERT_BYTES_TO_STRING(FROM_BASE64(REPLACE(REPLACE(
            resource_compliances.execResourceOutput.enforcementOutput
            , '-', '+'), '_', '/')))
          HAVING MAX updateTime) as compliance_results
      FROM
        `DATASET_ID.res_osconfig_googleapis_com_OSPolicyAssignmentReport`,
        UNNEST(resource.data.osPolicyCompliances[OFFSET(0)].osPolicyResourceCompliances) as resource_compliances,
        UNNEST(resource_compliances.configSteps) as config_steps
      WHERE
        resource.data.osPolicyCompliances[OFFSET(0)].osPolicyId = "return-kernel-version-policy"
        AND resource_compliances.osPolicyResourceId = "return-kernel-version"
        AND config_steps.type = "VALIDATION"
      GROUP BY
        instance
      

      DATASET_ID을 BigQuery 데이터 세트의 ID (예: cai_exp)로 바꿉니다.

      쿼리 출력은 다음 표와 비슷합니다.

      instance compliance_results
      ubuntu-1 5.15.0-1036-gcp
      ubuntu-2 5.15.0-1044-gcp
      rhel9-1 5.14.0-162.18.1.el9_1.x86_64
    • 쿼리 JSON 출력:

      다음 쿼리는 JSON 출력에서 name 및 kernel 필드를 추출하고 각 VM 인스턴스에 대해 별도의 열로 반환합니다.

      WITH compliance_history AS (
        SELECT
          updateTime,
          resource.data.instance,
          SAFE_CONVERT_BYTES_TO_STRING(
            FROM_BASE64(
              REPLACE(
                REPLACE(
                  resource_compliances.execResourceOutput.enforcementOutput, '-', '+'
                ), '_', '/'
              )
            )
          ) as compliance_results
        FROM
          `DATASET_ID.res_osconfig_googleapis_com_OSPolicyAssignmentReport`,
          UNNEST(resource.data.osPolicyCompliances[OFFSET(0)].osPolicyResourceCompliances) as resource_compliances,
          UNNEST(resource_compliances.configSteps) as config_steps
        WHERE
          resource.data.osPolicyCompliances[OFFSET(0)].osPolicyId = "return-kernel-version-js-policy"
          AND resource_compliances.osPolicyResourceId = "return-kernel-version-js"
          AND config_steps.type = "VALIDATION"
      ),
      compliance_latest AS (
        SELECT
          instance,
          ANY_VALUE(compliance_results HAVING MAX updateTime) as compliance_results
        FROM compliance_history
        GROUP BY instance
      )
      SELECT
        instance,
        JSON_EXTRACT_SCALAR(compliance_results, "$.name") as os_name,
        JSON_EXTRACT_SCALAR(compliance_results, "$.kernel") as kernel_version
      FROM compliance_latest
      

      DATASET_ID을 BigQuery 데이터 세트의 ID (예: cai_exp)로 바꿉니다.

      쿼리 출력은 다음 표와 비슷합니다.

      instance os_name kernel_version
      ubuntu-1 Linux ubuntu-1 5.15.0-1036-gcp #39-Ubuntu SMP 5.15.0-1036-gcp
      rhel9-1 Linux rhel9-1 5.14.0-162.18.1.el9_1.x86_64 #1 SMP 5.14.0-162.18.1.el9_1.x86_64
  3. 쿼리를 실행하기 위해 실행을 클릭합니다.

자세한 내용은 쿼리 실행을 참조하세요.

시정 조치 오류 메시지 검토

OS 정책 리소스의 유효성 검사 또는 시행이 실패하면 VM Manager는 res_osconfig_googleapis_com_OSPolicyAssignmentReport 테이블의 configSteps.errorMessage 필드에 오류 메시지를 기록합니다. BigQuery에서 이 필드를 쿼리하여 조직 전체의 정책 실행 실패를 해결할 수 있습니다.

다음 쿼리는 각 VM 인스턴스의 최신 검증 또는 시행 오류 메시지를 반환합니다.

SELECT
  resource.data.instance AS instance,
  resource.data.osPolicyCompliances[OFFSET(0)].osPolicyId AS policy_id,
  resource_compliances.osPolicyResourceId AS resource_id,
  config_steps.type AS step_type,
  ANY_VALUE(config_steps.errorMessage HAVING MAX updateTime) AS error_message
FROM
  `DATASET_ID.res_osconfig_googleapis_com_OSPolicyAssignmentReport`,
  UNNEST(resource.data.osPolicyCompliances[OFFSET(0)].osPolicyResourceCompliances) AS resource_compliances,
  UNNEST(resource_compliances.configSteps) AS config_steps
WHERE
  config_steps.errorMessage IS NOT NULL
  AND config_steps.errorMessage != ""
GROUP BY
  instance,
  policy_id,
  resource_id,
  step_type

DATASET_ID을 BigQuery 데이터 세트의 ID (예: cai_exp)로 바꿉니다.

쿼리 출력은 다음 표와 비슷합니다.

instance policy_id resource_id step_type error_message
ubuntu-2 return-kernel-version-policy return-kernel-version DESIRED_STATE_ENFORCEMENT Error running enforce script: exit status 1

다음 단계

OS 정책 관리 및 규정 준수 데이터 분석에 대한 자세한 내용은 다음 리소스를 참고하세요.