VPC 서비스 제어 감사 로깅

이 문서에서는 VPC 서비스 제어에서 Cloud 감사 로그의 일부로 만드는 감사 로그를 설명합니다.

개요

Google Cloud 서비스는 Google Cloud 리소스 내에서 감사 로그를 작성하여 '누가, 언제, 어디서, 무엇을 했는지'라는 질문에 답하는 데 도움을 줍니다.

Google Cloud 프로젝트에는 Google Cloud 프로젝트 내에 있는 리소스의 감사 로그만 있습니다. 폴더, 조직, 결제 계정과 같은 다른 Google Cloud 리소스에는 항목 자체의 감사 로그가 있습니다.

Cloud 감사 로그의 전반적인 개요는 Cloud 감사 로그 개요를 참조하세요. 감사 로그 형식에 대한 자세한 내용은 감사 로그 이해를 참조하세요.

사용 가능한 감사 로그

VPC 서비스 제어에는 다음과 같은 유형의 감사 로그를 사용할 수 있습니다.

  • 정책 거부 감사 로그

    보안 정책 위반으로 인해 사용자 또는 서비스 계정에 액세스가 거부되는 경우를 식별합니다. 정책 거부 감사 로그의 서비스 이름 및 메서드 이름은 사용자 또는 서비스 계정의 액세스가 거부된 리소스 이름을 나타냅니다.

    정책 거부 감사 로그는 사용 중지할 수 없습니다. 하지만 _Default 싱크의 제외 필터에 다음을 추가하여 정책 거부 감사 로그를 제외할 수 있습니다. LOG_ID("cloudaudit.googleapis.com/policy") 또한 Cloud Logging에 대해 _Default 싱크를 사용 중지하여 로그가 _Default 버킷으로 라우팅되지 않도록 할 수 있습니다.

감사 로그 유형에 대한 자세한 내용은 감사 로그 유형을 참조하세요.

감사 대상 작업

다음은 VPC 서비스 제어의 각 감사 로그 유형에 해당하는 API 작업을 요약한 표입니다.

감사 로그 범주 VPC 서비스 제어 메서드
정책 거부 감사 로그 VPC 서비스 제어와 통합되는 서비스의 메서드가 지원됩니다.

로그 레코드 콘텐츠 감사

각 감사 로그 레코드에 포함된 정보는 원래 호출에 대한 정보와 보안 정책 위반에 대한 정보라는 두 가지 범주로 크게 나눌 수 있습니다. 이는 VPC Service Controls API가 다음과 같이 작성합니다.

감사 로그 필드 설명
serviceName 서비스 경계로 액세스가 제한되는 서비스입니다. 이 서비스에 대한 요청이 VPC 서비스 제어 확인을 위반하여 이 감사 로그를 만들었습니다.
methodName 레코드에 설명된 보안 정책 위반을 초래한 메서드 호출의 이름입니다. methodNameserviceName 필드에 지정된 Google Cloud 서비스와 연결된 메서드인 경우가 많습니다.
authenticationInfo.principalEmail 요청을 발급한 사용자 또는 서비스 계정의 이메일 주소입니다.
일부 이메일 주소는 수정될 수 있습니다. 자세한 내용은 감사 로그의 호출자 ID를 참조하세요.
resourceName 클라이언트의 원래 요청에 지정된 Google Cloud 리소스입니다. resourceName는 프로젝트, 폴더, 조직 또는 Google Cloud 버킷과 같은 리소스일 수 있습니다.
requestMetadata.callerIp

호출자의 IP 주소입니다.

호출이 인터넷에서 시작된 경우 requestMetadata.callerIp는 공개 IPv4 또는 IPv6 주소입니다.

호출이 Compute Engine VM에서 시작된 경우 requestMetadata.callerIp는 VM IP 주소입니다. VM IP 주소는 내부 IP 주소 또는 외부 IP 주소일 수 있습니다.

Google의 내부 프로덕션 네트워크 내에서 발생한 호출의 경우 이 필드의 값은 private입니다. 이 경우는 호출이 한 Google Cloud 서비스에서 다른 Google Cloud 서비스로 전송될 때 발생합니다.

request_metadata.caller_network 호출자 네트워크의 이름입니다. 이 값은 네트워크 호스트 프로젝트가 액세스된 리소스가 속한 동일한 Google Cloud 조직 또는 프로젝트에 속하는 경우에만 설정됩니다. 자세한 내용은 VPC 네트워크를 참조하세요.
status 레코드에 설명된 작업의 전반적인 처리 상태입니다.
metadata 보안 정책 위반에 대한 정보입니다.
metadata.resourceNames 레코드에 설명된 보안 정책 위반과 관련된 리소스 이름입니다.
metadata.dryRun 테스트 실행 정책 검사를 위한 감사 로그의 경우 True의 불리언 값입니다.
metadata.vpcServiceControlsUniqueId 레코드에 설명된 VPC 서비스 제어 위반의 고유 식별자입니다.
metadata.violationReason 위반 이유입니다. 예를 들어 RESOURCE_NOT_IN_SAME_SERVICE_PERIMETER는 액세스 중인 리소스가 동일한 서비스 경계에 속하지 않음을 의미합니다.
metadata.securityPolicyInfo 위반이 발생한 서비스 경계의 이름과 경계가 속한 조직의 고유 식별자입니다.
metadata.egressViolations 일반적으로 소스가 서비스 경계로 보호되고 대상 리소스가 경계 외부에 있으므로 이그레스 위반이 발생합니다. 소스는 프로젝트 또는 VPC 네트워크일 수 있습니다.
metadata.ingressViolations 위반 유형입니다. 요청이 서비스 경계로 보호되는 대상 리소스에 액세스하려고 시도하는 경우 이러한 위반이 자주 발생합니다. 소스는 프로젝트 또는 VPC 네트워크일 수 있습니다. 이 필드에는 인그레스 위반을 설명하는 구조가 포함됩니다.
metadata.accessLevels 동일한 액세스 정책에 속하는 조직의 모든 일치하는 액세스 수준입니다. 이러한 액세스 수준은 위반한 경계에 지정되지 않을 수 있으므로 NO_MATCHING_ACCESS_LEVEL 위반이 발생할 수 있습니다.
metadata.intermediateServices 요청 체인과 관련된 서비스 목록입니다. 사용자가 시작한 요청에서는 이 필드가 비어 있습니다.
metadata.deviceState 기기 정책이 사용 설정되었을 때 요청을 만드는 기기의 상태입니다. 이 필드의 기본값은 Unknown입니다.

감사 로그 형식

감사 로그 항목에는 다음과 같은 객체가 포함됩니다.

  • LogEntry 유형의 객체인 로그 항목 자체입니다. 유용한 필드는 다음과 같습니다.

    • logName에는 리소스 ID와 감사 로그 유형이 있습니다.
    • resource에는 감사 작업 대상이 있습니다.
    • timeStamp에는 감사 작업 시간이 있습니다.
    • protoPayload에는 감사 정보가 있습니다.
  • 로그 항목의 protoPayload 필드에 AuditLog 객체로 보관되는 감사 로깅 데이터입니다.

  • 선택적 서비스별 감사 정보로, 서비스별 객체입니다. 이전 통합에서 이 객체는 AuditLog 객체의 serviceData 필드에 보관하고 최신 통합은 metadata 필드를 사용합니다.

이러한 객체의 다른 필드와 필드 해석 방법은 감사 로그 이해를 참조하세요.

로그 이름

Cloud 감사 로그의 로그 이름에는 감사 로그를 소유한 Google Cloud 프로젝트나 기타 Google Cloud 항목을 나타내는 리소스 식별자와 로그에 관리자 활동, 데이터 액세스, 정책 거부 또는 시스템 이벤트 감사 로깅 데이터가 포함되어 있는지 여부가 포함됩니다.

다음은 리소스 식별자 변수를 포함한 감사 로그 이름입니다.

   projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Factivity
   projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fdata_access
   projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fsystem_event
   projects/PROJECT_ID/logs/cloudaudit.googleapis.com%2Fpolicy

   folders/FOLDER_ID/logs/cloudaudit.googleapis.com%2Factivity
   folders/FOLDER_ID/logs/cloudaudit.googleapis.com%2Fdata_access
   folders/FOLDER_ID/logs/cloudaudit.googleapis.com%2Fsystem_event
   folders/FOLDER_ID/logs/cloudaudit.googleapis.com%2Fpolicy

   billingAccounts/BILLING_ACCOUNT_ID/logs/cloudaudit.googleapis.com%2Factivity
   billingAccounts/BILLING_ACCOUNT_ID/logs/cloudaudit.googleapis.com%2Fdata_access
   billingAccounts/BILLING_ACCOUNT_ID/logs/cloudaudit.googleapis.com%2Fsystem_event
   billingAccounts/BILLING_ACCOUNT_ID/logs/cloudaudit.googleapis.com%2Fpolicy

   organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com%2Factivity
   organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com%2Fdata_access
   organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com%2Fsystem_event
   organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com%2Fpolicy

서비스 이름

VPC 서비스 제어 감사 로그는 VPC 서비스 제어와 통합되는 서비스의 서비스 이름을 사용합니다.

모든 Cloud Logging API 서비스 이름과 해당 모니터링 리소스 유형의 목록은 리소스에 서비스 매핑을 참조하세요.

리소스 유형

VPC 서비스 제어 감사 로그는 VPC 서비스 제어와 통합하는 서비스에서 지원하는 리소스 유형을 사용합니다.

모든 Cloud Logging 모니터링 리소스 유형과 설명 정보의 목록은 모니터링 리소스 유형을 참조하세요.

호출자 ID

호출자 IP 주소는 AuditLog 객체의 RequestMetadata.caller_ip 필드에 보관됩니다. Logging은 특정 호출자 ID와 IP 주소를 수정할 수 있습니다.

감사 로그에서 수정된 정보에 대한 자세한 내용은 감사 로그의 호출자 ID를 참조하세요.

감사 로깅 사용 설정

관리자 활동 감사 로그는 항상 사용 설정되며 사용 중지할 수 없습니다.

권한 및 역할

IAM 권한과 역할에 따라 Google Cloud 리소스의 감사 로그 데이터에 액세스할 수 있는지 여부가 결정됩니다.

사용 사례에 적용할 Logging 관련 권한 및 역할을 결정할 때는 다음 사항을 고려하세요.

  • 로그 뷰어 역할(roles/logging.viewer)은 관리자 활동, 정책 거부, 시스템 이벤트 감사 로그에 대한 읽기 전용 액세스 권한을 부여합니다. 이 역할만 있으면 _Default 버킷에 있는 데이터 액세스 감사 로그를 볼 수 없습니다.

  • 비공개 로그 뷰어 역할(roles/logging.privateLogViewer)에는 roles/logging.viewer에 포함된 권한과 _Default 버킷의 데이터 액세스 감사 로그에 대한 읽기 권한도 포함되어 있습니다.

    비공개 로그가 사용자 정의된 버킷에 저장된 경우 이러한 버킷에서 로그 읽기 권한이 있는 모든 사용자가 비공개 로그를 읽을 수 있습니다. 로그 버킷에 대한 상세 설명은 라우팅 및 스토리지 개요를 참조하세요.

감사 로그 데이터에 적용되는 IAM 권한과 역할에 대한 자세한 내용은 IAM으로 액세스 제어를 참조하세요.

로그 보기

모든 감사 로그를 쿼리하거나 감사 로그 이름별로 로그를 쿼리할 수 있습니다. 감사 로그 이름에는 감사 로깅 정보를 보려는 Google Cloud 프로젝트, 폴더, 결제 계정 또는 조직의 리소스 식별자가 포함됩니다. 쿼리에서 색인이 생성된 LogEntry 필드를 지정할 수 있으며 SQL 쿼리를 지원하는 로그 애널리틱스 페이지를 사용하는 경우 쿼리 결과를 차트로 볼 수 있습니다.

로그 쿼리에 대한 자세한 내용은 다음 페이지를 참조하세요.

Google Cloud 콘솔, Google Cloud CLI 또는 Logging API를 사용하여 Cloud Logging에서 감사 로그를 볼 수 있습니다.

콘솔

Google Cloud 콘솔에서 로그 탐색기를 사용하여 Google Cloud 프로젝트, 폴더 또는 조직의 감사 로그 항목을 검색할 수 있습니다.

  1. Google Cloud 콘솔의 탐색 패널에서 Logging을 선택한 후 로그 탐색기를 선택합니다.

    로그 탐색기로 이동

  2. 기존 Google Cloud 프로젝트, 폴더 또는 조직을 선택합니다.

  3. 모든 감사 로그를 표시하려면 쿼리 편집기 필드에 다음 쿼리 중 하나를 입력한 후 쿼리 실행을 클릭합니다.

    logName:"cloudaudit.googleapis.com"
    
    protoPayload."@type"="type.googleapis.com/google.cloud.audit.AuditLog"
    
  4. 특정 리소스 및 감사 로그 유형에 대한 감사 로그를 표시하려면 쿼리 빌더 창에서 다음을 수행합니다.

    • 리소스 유형에서 감사 로그를 확인할 Google Cloud 리소스를 선택하세요.

    • 로그 이름에서 확인할 감사 로그 유형을 선택합니다.

      • 관리자 활동 감사 로그의 경우 activity를 선택합니다.
      • 데이터 액세스 감사 로그의 경우 data_access를 선택합니다.
      • 시스템 이벤트 감사 로그의 경우 system_event를 선택합니다.
      • 정책 거부 감사 로그의 경우 정책을 선택합니다.
    • 쿼리 실행을 클릭합니다.

    이러한 옵션 중 어느 것도 표시되지 않으면 Google Cloud 프로젝트나 폴더, 조직에 해당 유형의 감사 로그가 없다는 의미입니다.

    로그 탐색기에서 로그를 확인하려고 할 때 문제가 발생하는 경우 문제 해결 정보를 참조하세요.

    로그 탐색기를 사용한 쿼리에 대한 상세 설명은 로그 탐색기에서 쿼리 빌드를 참조하세요. Gemini를 사용하여 로그 탐색기에서 로그 항목을 요약하는 방법은 Gemini 지원을 받아 로그 항목 요약을 참조하세요.

gcloud

Google Cloud CLI는 Logging API에 명령줄 인터페이스를 제공합니다. 각 로그 이름에 유효한 리소스 식별자를 제공합니다. 예를 들어 쿼리에 PROJECT_ID가 포함된 경우 제공한 프로젝트 식별자가 현재 선택된 Google Cloud 프로젝트를 참조해야 합니다.

Google Cloud 프로젝트 수준의 감사 로그 항목을 읽으려면 다음 명령어를 실행합니다.

gcloud logging read "logName : projects/PROJECT_ID/logs/cloudaudit.googleapis.com" \
    --project=PROJECT_ID

폴더 수준의 감사 로그 항목을 읽으려면 다음 명령어를 실행합니다.

gcloud logging read "logName : folders/FOLDER_ID/logs/cloudaudit.googleapis.com" \
    --folder=FOLDER_ID

조직 수준의 감사 로그 항목을 읽으려면 다음 명령어를 실행합니다.

gcloud logging read "logName : organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com" \
    --organization=ORGANIZATION_ID

Cloud Billing 계정 수준의 감사 로그 항목을 읽으려면 다음 명령어를 실행합니다.

gcloud logging read "logName : billingAccounts/BILLING_ACCOUNT_ID/logs/cloudaudit.googleapis.com" \
    --billing-account=BILLING_ACCOUNT_ID

1일 이상 된 로그를 읽으려면 명령어에 --freshness 플래그를 추가합니다.

gcloud CLI 사용에 대한 상세 설명은 gcloud logging read를 참조하세요.

API

쿼리를 빌드할 때 각 로그 이름에 유효한 리소스 식별자를 제공합니다. 예를 들어 쿼리에 PROJECT_ID가 포함된 경우 제공한 프로젝트 식별자가 현재 선택된 Google Cloud 프로젝트를 참조해야 합니다.

예를 들어 Logging API를 사용하여 프로젝트 수준의 감사 로그 항목을 보려면 다음을 수행합니다.

  1. entries.list 메서드 문서의 API 사용해 보기 섹션으로 이동합니다.

  2. API 사용해 보기 양식의 요청 본문 부분에 다음을 입력합니다. 이 자동 입력된 양식을 클릭하면 요청 본문이 자동으로 입력되지만 각 로그 이름에 유효한 PROJECT_ID를 입력해야 합니다.

    {
      "resourceNames": [
        "projects/PROJECT_ID"
      ],
      "pageSize": 5,
      "filter": "logName : projects/PROJECT_ID/logs/cloudaudit.googleapis.com"
    }
    
  3. 실행을 클릭합니다.

샘플 쿼리

VPC 서비스 제어의 감사 로그를 찾으려면 로그 탐색기에서 다음 쿼리를 사용합니다.

쿼리 설명 표현식
거부 ID를 기반으로 한 위반 세부정보

log_id("cloudaudit.googleapis.com/policy") severity=ERROR
resource.type="audited_resource"
protoPayload.metadata."@type"="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
protoPayload.metadata.vpcServiceControlsUniqueId="UNIQUE_ID" 

UNIQUE_ID를 거부의 고유 ID로 바꿉니다.

IP 주소 위반

log_id("cloudaudit.googleapis.com/policy")
severity=ERROR
resource.type="audited_resource"
protoPayload.metadata."@type"="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
protoPayload.requestMetadata.callerIp="IP_ADDRESS"

IP_ADDRESS를 호출자의 IP 주소로 바꿉니다.

서비스 위반

log_id("cloudaudit.googleapis.com/policy")
severity=ERROR
resource.type="audited_resource"
protoPayload.metadata."@type"="type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
protoPayload.serviceName="SERVICE_NAME"

SERVICE_NAME을 제한된 서비스의 이름으로 바꿉니다.

경계에 대한 액세스 수준 변경

logName="organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com%2Factivity"
severity=NOTICE
protoPayload.serviceName="accesscontextmanager.googleapis.com"
protoPayload.methodName="google.identity.accesscontextmanager.v1.AccessContextManager.UpdateServicePerimeter"
-protoPayload.metadata.previousState:"ACCESS_LEVEL"
protoPayload.request.servicePerimeter.status.accessLevels:"ACCESS_LEVEL"

ORGANIZATION_ID를 조직의 숫자 ID로 바꾸고 ACCESS_LEVEL을 액세스 수준의 고유한 이름으로 바꿉니다.

경계 CRUD 작업

logName="organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com%2Factivity"
severity=NOTICE
protoPayload.serviceName="accesscontextmanager.googleapis.com"
protoPayload.methodName=~"google.identity.accesscontextmanager.v1.AccessContextManager.ServicePerimeter"
protoPayload.request.servicePerimeter.name=~".PERIMETER_NAME$"
PERIMETER_NAME을 경계의 이름으로 바꿉니다.
액세스 수준 CRUD 작업

logName="organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com%2Factivity"
severity=NOTICE
protoPayload.serviceName="accesscontextmanager.googleapis.com"
protoPayload.methodName=~"google.identity.accesscontextmanager.v1.AccessContextManager.AccessLevel"
protoPayload.request.accessLevel.name=~".ACCESS_LEVEL$"
인그레스 규칙 만들기 및 업데이트 작업

logName="organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com%2Factivity"
protoPayload.serviceName="accesscontextmanager.googleapis.com"
protoPayload.methodName=~"google.identity.accesscontextmanager.v1.AccessContextManager.ServicePerimeter"
protoPayload.request.servicePerimeter.status.ingressPolicies:""
이그레스 규칙 만들기 및 업데이트 작업

logName="organizations/ORGANIZATION_ID/logs/cloudaudit.googleapis.com%2Factivity"
protoPayload.serviceName="accesscontextmanager.googleapis.com"
protoPayload.methodName=~"google.identity.accesscontextmanager.v1.AccessContextManager.ServicePerimeter"
protoPayload.request.servicePerimeter.status.egressPolicies:""

샘플 쿼리를 사용하려면 다음을 수행하세요.

  1. 변수를 자체 프로젝트 정보로 바꾼 다음 클립보드 아이콘 를 사용하여 표현식을 복사합니다.

  2. Google Cloud 콘솔의 탐색 패널에서 Logging을 선택한 후 로그 탐색기를 선택합니다.

    로그 탐색기로 이동

  3. 쿼리 표시를 사용 설정하여 쿼리 편집기 필드를 연 다음 쿼리 편집기 필드에 표현식을 붙여넣습니다.

    샘플 쿼리를 입력하는 쿼리 편집기입니다.

  4. 쿼리 실행을 클릭합니다. 쿼리와 일치하는 로그가 쿼리 결과 창에 나열됩니다.

감사 로그 라우팅

다른 종류의 로그를 라우팅할 때와 같은 방식으로 지원되는 대상에 감사 로그를 라우팅할 수 있습니다. 다음과 같은 이유로 감사 로그를 라우팅해야 할 수 있습니다.

  • 장기간 감사 로그를 보관하거나 더욱 강력한 검색 기능을 사용하려면 감사 로그의 복사본을 Cloud Storage, BigQuery 또는 Pub/Sub로 라우팅하면 됩니다. Pub/Sub을 사용하면 다른 애플리케이션, 다른 저장소, 서드 파티로 라우팅할 수 있습니다.

  • 조직 전체의 감사 로그를 관리하려면 조직의 Google Cloud 프로젝트 일부 또는 전체에서 로그를 라우팅할 수 있는 집계 싱크를 만들면 됩니다.

로그 라우팅에 대한 안내는 지원되는 대상으로 로그 라우팅을 참조하세요.

가격 책정

가격 책정에 대한 자세한 내용은 Cloud Logging 가격 책정 요약을 참조하세요.