[BigQuery] 드라이버 감사 로그 내보내기(후편)

개시하다


전편에서는 BigQuery Export 기능을 사용하여 감사 로그를 구동하는 출력 방법을 설명합니다.
후편에서는 VPC Service Controls를 효과적으로 사용할 때의 설정에 대해 설명합니다.

운영 환경


Product
version
Google Workspace
Enterprise Edition
BigQuery
2021년 12월 5일 기준
VPC Service Controls
2021년 12월 5일 기준
【구성도】

【보충】
• Google Workspce와 BigQuery는 같은 조직에 속합니다.

전제 조건

  • 아무것도 고려하지 않고 VPC 서비스 경계에서 BigQuery를 포위하면 로그가 출력되지 않습니다.
  • Cloud Logging을 통해 로그[1]와 오류 로그를 볼 수 있습니다.
  • 로그의 상세한 내용은 다음과 같다.
  • ERROR_MESSAGE1
    {
      "protoPayload": {
        "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
        "status": {
          "code": 7,
          "message": "Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: E5iKrWnTk1vKv1QaCyimHrd72QKravJFneBr-jrN2emWz1WMx5CqjQ",
          "details": [
            {
              "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
              "violations": [
                {
                  "type": "VPC_SERVICE_CONTROLS",
                  "description": "E5iKrWnTk1vKv1QaCyimHrd72QKravJFneBr-jrN2emWz1WMx5CqjQ"
                }
              ]
            }
          ]
        },
        "authenticationInfo": {
          "principalEmail": "[email protected]"
        },
        "requestMetadata": {
          "requestAttributes": {},
          "destinationAttributes": {}
        },
        "serviceName": "bigquery.googleapis.com",
        "methodName": "permission:bigquery.datasets.create",
        "resourceName": "projects/xxxxxxxxxxxx",
        "metadata": {
          "ingressViolations": [
            {
              "targetResourcePermissions": [
                "bigquery.datasets.create"
              ],
              "targetResource": "projects/xxxxxxxxxxxx",
              "servicePerimeter": "accessPolicies/xxxxxxxxxxx/servicePerimeters/from_my_home"
            }
          ],
          "vpcServiceControlsUniqueId": "E5iKrWnTk1vKv1QaCyimHrd72QKravJFneBr-jrN2emWz1WMx5CqjQ",
          "violationReason": "NO_MATCHING_ACCESS_LEVEL",
          "securityPolicyInfo": {
            "servicePerimeterName": "accessPolicies/xxxxxxxxxxx/servicePerimeters/from_my_home",
            "organizationId": "xxxxxxxxxxxx"
          },
          "@type": "type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata",
          "resourceNames": [
            "projects/xxxxxxxxxxxx"
          ]
        }
      },
      "insertId": "lxecooeb98md",
      "resource": {
        "type": "audited_resource",
        "labels": {
          "service": "bigquery.googleapis.com",
          "method": "permission:bigquery.datasets.create",
          "project_id": "composed-arbor-332218"
        }
      },
      "timestamp": "2021-11-29T13:09:36.774176499Z",
      "severity": "ERROR",
      "logName": "projects/composed-arbor-332218/logs/cloudaudit.googleapis.com%2Fpolicy",
      "receiveTimestamp": "2021-11-29T13:09:36.890253258Z"
    }
    
    ERROR_MESSAGE2
    {
      "protoPayload": {
        "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
        "status": {
          "code": 7,
          "message": "VPC Service Controls: Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: E5iKrWnTk1vKv1QaCyimHrd72QKravJFneBr-jrN2emWz1WMx5CqjQ."
        },
        "authenticationInfo": {
          "principalEmail": "[email protected]"
        },
        "requestMetadata": {
          "requestAttributes": {},
          "destinationAttributes": {}
        },
        "serviceName": "bigquery.googleapis.com",
        "methodName": "datasetservice.insert",
        "authorizationInfo": [
          {
            "resource": "projects/composed-arbor-332218",
            "permission": "bigquery.datasets.create",
            "resourceAttributes": {}
          }
        ],
        "resourceName": "projects/composed-arbor-332218/datasets",
        "serviceData": {
          "@type": "type.googleapis.com/google.cloud.bigquery.logging.v1.AuditData",
          "datasetInsertRequest": {
            "resource": {
              "datasetName": {
                "projectId": "composed-arbor-332218",
                "datasetId": "test_dataset01"
              },
              "info": {},
              "acl": {}
            }
          },
          "datasetInsertResponse": {
            "resource": {
              "datasetName": {},
              "info": {},
              "acl": {}
            }
          }
        },
        "resourceLocation": {
          "currentLocations": [
            "US"
          ]
        }
      },
      "insertId": "-1xu7wfdomww",
      "resource": {
        "type": "bigquery_resource",
        "labels": {
          "project_id": "composed-arbor-332218"
        }
      },
      "timestamp": "2021-11-29T13:09:36.786871Z",
      "severity": "ERROR",
      "logName": "projects/composed-arbor-332218/logs/cloudaudit.googleapis.com%2Factivity",
      "receiveTimestamp": "2021-11-29T13:09:37.260699618Z"
    }
    
    ERROR_MESSAGE3
    {
      "protoPayload": {
        "@type": "type.googleapis.com/google.cloud.audit.AuditLog",
        "status": {
          "code": 7,
          "message": "VPC Service Controls: Request is prohibited by organization's policy. vpcServiceControlsUniqueIdentifier: E5iKrWnTk1vKv1QaCyimHrd72QKravJFneBr-jrN2emWz1WMx5CqjQ."
        },
        "authenticationInfo": {
          "principalEmail": "[email protected]"
        },
        "requestMetadata": {
          "requestAttributes": {},
          "destinationAttributes": {}
        },
        "serviceName": "bigquery.googleapis.com",
        "methodName": "google.cloud.bigquery.v2.DatasetService.InsertDataset",
        "authorizationInfo": [
          {
            "resource": "projects/composed-arbor-332218",
            "permission": "bigquery.datasets.create",
            "resourceAttributes": {}
          }
        ],
        "resourceName": "projects/composed-arbor-332218/datasets/test_dataset01",
        "metadata": {
          "@type": "type.googleapis.com/google.cloud.audit.BigQueryAuditMetadata",
          "datasetCreation": {
            "dataset": {
              "datasetName": "projects/composed-arbor-332218/datasets/test_dataset01",
              "acl": {
                "policy": {}
              }
            },
            "reason": "CREATE"
          }
        }
      },
      "insertId": "-1xu7wfdomwy",
      "resource": {
        "type": "bigquery_dataset",
        "labels": {
          "project_id": "composed-arbor-332218",
          "dataset_id": "test_dataset01"
        }
      },
      "timestamp": "2021-11-29T13:09:36.788652Z",
      "severity": "ERROR",
      "logName": "projects/composed-arbor-332218/logs/cloudaudit.googleapis.com%2Factivity",
      "receiveTimestamp": "2021-11-29T13:09:37.260699618Z"
    }
    
    [해설]
    ・principal Email에 표시[email protected].
    • 이 계정은 BigQuery에 로그를 출력하는 데 사용되는 서비스 계정입니다.
    · VPC 서비스 경계에서 이 계정으로부터의 접근을 허가해야 합니다.

    구현 단계

  • VM용 서비스 계정 생성
  • 서비스 계정의 방문 등급 등록
  • VPC 서비스 경계 구축
  • 1. VM이 서비스 계정으로 생성

  • 로그 출력 서비스 계정gapps-reports을 Access Context Manager에 등록하는 액세스 수준에는 다음과 같은 제한이 있습니다.
  • 서비스 계정의 등록은 관리 컨트롤러를 통해 할 수 없기 때문에glcloud 명령을 사용해야 합니다.[2]
    또한 Cloud Shell에서는 Access Context Manager를 사용할 수 없으므로 Compute Engine 등의 환경에서 구현해야 합니다.

  • [IAM 및 관리][IAM]을 조직 수준에서 엽니다.
  • gcloud 명령을 실행하는 VM에 속하는 서비스 계정을 추가합니다.
  • 서비스 계정에 분배Access Context Manager編集者작용.

  • Access Content Manager는 조직 수준의 서비스를 제공합니다.프로젝트 수준의 IAM과 관리에서 서비스 계정에 역할Access Context Manager編集者을 할당해도 권한이 부여되지 않는다.

    2. 서비스 계정의 방문 등급 등록

  • [API 및 서비스]>[대시보드]를 열고 [API 및 서비스 유효성]을 클릭합니다.
  • Access Context Manager API를 설정합니다.
  • [Computee Engine][VM 인스턴스]가 열립니다.
  • 서비스 계정for_vm을 업무용 VM에 첨부한 후 시작합니다.
  • 우선 아래 명령으로 등록된 서비스 계정 목록을 만듭니다.
  • 등록 서비스 계정 목록 만들기
    $ vi memberspec.yaml
    
  • memberspec.yaml의 내용은 다음과 같이 저장됩니다.
  • memberspec.yaml
    - members:
      - serviceAccount:gapps-[email protected]
    
  • gcloud 명령을 통해 서비스 계정gapps-reports에 로그인합니다.
  • 액세스 수준 설정 추가
    $ gcloud access-context-manager levels create export_gdrive_auditlog_access \
        --basic-level-spec=memberspec.yaml \
        --combine-function=OR \
        --description="Access level for export Google Drive auditlog permission." \
        --title="Access_Level for Export Google Drive AuditLog"
    
  • 아래 정보를 출력하면 됩니다.
  • Create request issued for: [export_gdrive_auditlog_access]
    Created level [export_gdrive_auditlog_access].
    
  • export_gdrive_auditlog_access라는 액세스 레벨을 생성합니다.

  • 3. VPC 서비스 경계의 창설


    [보안] [VPC Service Controls]를 열고 [새 경계]를 클릭합니다.
  • 다음 설정값을 사용하여 서비스 경계를 만듭니다.
  • 항목

    시험을 준비하다
    경계 이름
    for_reports
    이름 입력
    경계 유형
    기본 테두리
    기본 상태 유지
    항목
    My Project 89493
    보호할 BigQuery 항목 지정
    서비스 이름
    BigQuery API
    보호할 서비스 API 지정
    VPC 액세스 서비스
    모든 서비스
    기본 상태 유지
    업로드 정책:액세스 수준
    Access_Level for Export Google Drive AuditLog
    등록된 액세스 수준 지정
    Ingress rules
    없음
    기본 상태 유지
    Egress rules
    없음
    기본 상태 유지
  • 서비스 경계에 둘러싸여 있기 때문에 등록된 액세스 수준을 제외하고는 BigQuery에 접근할 수 없습니다.(데이터 세트 표시 안 함)

  • 총결산


    그럼, 어때요?
    Google Workspace의 감사 로그라면 보안을 유지할 필요가 있다고 생각합니다.
    IP 주소로는 BigQuery에 감사 로그를 쓰는 작업을 제어할 수 없을 것 같습니다.
    클라우드 로그링은 서비스 계정을 정할 수 있기 때문에 VPC 서비스 경계에서 제어할 수 있다.
    Google Workspace 관리 콘솔에서 BigQuery Export 시점 설정
    Cloud IAM 중[email protected] 제작
    깨달았지만 실제로 일지를 보면 확실히 확실해.
    의외로 여러 가지 설정이 필요한데 전편에 맞춰서 해보시면 좋을 것 같아요^^
    각주
    VPC Service Controls 경계 문제 해결을 위한 Unique Identifier ↩︎
    사용자 또는 서비스 계정에 대한 액세스 제한 ↩︎

    좋은 웹페이지 즐겨찾기