분석을 위해 BigQuery로 발견 항목 스트리밍

이 페이지에서는 BigQuery용 Security Command Center 내보내기 기능을 사용하여 신규 및 업데이트된 발견 항목을 BigQuery 데이터 세트로 스트리밍하는 방법을 설명합니다. 기존 발견 항목은 업데이트되지 않는 한 BigQuery로 전송되지 않습니다.

BigQuery는 Google Cloud의 페타바이트급 규모의 경제적인 완전 관리형 분석 데이터 웨어하우스로, 거의 실시간으로 방대한 양의 데이터를 분석할 수 있습니다. 사용자는 BigQuery를 사용하여 신규 및 업데이트된 발견 항목에 대한 쿼리를 실행하고, 데이터를 필터링하여 필요한 항목을 찾고, 커스텀 보고서를 생성할 수 있습니다. BigQuery에 대한 상세 설명은 BigQuery 문서를 참조하세요.

개요

이 특성을 사용 설정하면 Security Command Center에 기록된 새 발견 항목이 거의 실시간으로 BigQuery 테이블로 내보내집니다. 그런 다음 데이터를 기존 워크플로에 통합하고 커스텀 분석을 만들 수 있습니다. 조직, 폴더, 프로젝트 수준에서 이 특성을 사용 설정하면 요구사항에 따라 발견 항목을 내보낼 수 있습니다.

완전 관리형 기능으로서 수동 작업을 수행하거나 커스텀 코드를 작성할 필요가 없으므로 Security Command Center 발견 항목을 BigQuery에 내보낼 때 이 기능을 사용하는 것이 좋습니다.

데이터 세트 구조

이 기능은 각각의 새로운 발견 항목과 후속 업데이트를 findings 테이블(source_id ,finding_id ,event_time별로 클러스터링됨)의 새로운 행으로 추가합니다.

발견 항목이 업데이트되면 이 특성은 source_idfinding_id 값은 동일하지만 event_time 값이 다른 여러 발견 항목을 생성합니다. 이 데이터 세트 구조를 사용하면 각 발견 항목의 상태가 시간이 지나면서 어떻게 변하는지 확인할 수 있습니다.

데이터 세트에 중복 항목이 있을 수 있습니다. 이를 파싱하려면 첫 번째 쿼리 예시와 같이 DISTINCT 절을 사용하시면 됩니다.

각 데이터 세트에는 다음 필드가 있는 findings 테이블이 있습니다.

필드 설명
source_id Security Command Center가 발견 항목의 소스에 할당하는 고유 식별자입니다. 예를 들어 Cloud Anomaly Detection 소스의 모든 발견 항목은 source_id 값이 동일합니다.

예시: 1234567890
finding_id 발견 항목을 나타내는 고유 식별자입니다. 조직의 소스 내에서 고유합니다. 영숫자이며 32자(영문 기준) 이하여야 합니다.
event_time 이벤트가 발생한 시간 또는 발견 항목에 대한 업데이트가 발생한 시간입니다. 예를 들어 열린 방화벽을 나타내는 발견 항목의 경우 `event_time`이 감지기에서 방화벽이 열렸다고 판단하는 시간을 캡처합니다. 나중에 발견 항목이 해결되면 발견 항목이 해결된 시점이 이 시간에 반영됩니다.

예: 2019-09-26 12:48:00.985000 UTC
finding 프레젠테이션, 알림, 분석, 정책 테스트, 시행을 위해 Security Command Center에 수집되는 평가 데이터 레코드(예: 보안, 위험, 상태, 개인 정보 보호)입니다. 예를 들어 App Engine 애플리케이션의 교차 사이트 스크립팅(XSS) 취약점이 발견 항목입니다.

중첩 필드에 대한 자세한 내용은 Finding 객체의 API 참조를 확인하세요.
리소스 이 발견 항목과 연결된 Google Cloud 리소스와 관련된 정보입니다.

중첩 필드에 대한 자세한 내용은 Resource 객체의 API 참조를 확인하세요.

비용

이 특성과 관련하여 BigQuery 요금이 발생합니다. 자세한 내용은 BigQuery 가격을 참조하세요.

시작하기 전에

이 특성을 사용 설정하려면 먼저 다음 단계를 완료해야 합니다.

권한 설정

이 가이드를 완료하려면 다음 Identity and Access Management(IAM) 역할이 있어야 합니다.

BigQuery 데이터 세트 만들기

BigQuery 데이터 세트를 만드세요. 자세한 내용은 데이터 세트 만들기를 참조하세요.

데이터 상주 계획

Security Command Center에 대해 데이터 상주가 사용 설정된 경우 BigQuery(BigQueryExport 리소스)로 스트리밍 내보내기를 정의하는 구성에 데이터 상주 제어가 적용되고 선택한 Security Command Center 위치에 저장됩니다.

Security Command Center 위치의 발견 항목을 BigQuery로 내보내려면 발견 항목과 동일한 Security Command Center 위치에 BigQuery Export를 구성해야 합니다.

BigQuery Export에 사용된 필터는 상주 제어가 적용되는 데이터를 포함할 수 있기 때문에 이를 만들기 전에 올바른 위치를 지정해야 합니다. Security Command Center는 내보내기를 만드는 위치를 제한하지 않습니다.

BigQuery Export는 생성되는 위치에만 저장되며 다른 위치에서 보거나 수정할 수 없습니다.

BigQuery Export를 만든 후에는 해당 위치를 변경할 수 없습니다. 위치를 변경하려면 BigQuery Export를 삭제하고 새 위치에 다시 만들어야 합니다.

API 호출을 사용해서 BigQuery Export를 검색하려면 bigQueryExport의 전체 리소스 이름에 위치를 지정해야 합니다. 예를 들면 다음과 같습니다.

GET https://securitycenter.googleapis.com/v2/{name=organizations/123/locations/eu/bigQueryExports/my-export-01}

마찬가지로 gcloud CLI를 사용하여 BigQuery Export를 가져오려면 구성의 전체 리소스 이름 또는 --locations 플래그를 사용하여 위치를 지정해야 합니다. 예를 들면 다음과 같습니다.

gcloud scc scc bqexports get myBigQueryExport organizations/123 \
    --location=locations/us

Security Command Center에서 BigQuery로 발견 항목 내보내기

발견 항목을 내보내려면 먼저 Security Command Center API를 사용 설정하세요.

Security Command Center API 사용 설정

Security Command Center API를 사용 설정하려면 다음 단계를 따르세요.

  1. Google Cloud 콘솔의 API 라이브러리 페이지로 이동합니다.

    API 라이브러리로 이동

  2. Security Command Center API를 사용 설정할 프로젝트를 선택합니다.

  3. 검색 상자에 Security Command Center를 입력한 다음 검색 결과에서 Security Command Center를 클릭합니다.

  4. 표시되는 API 페이지에서 사용 설정을 클릭합니다.

프로젝트에 Security Command Center API가 사용 설정됩니다. 다음으로 gcloud CLI를 사용하여 BigQuery에 내보내기 위한 새로운 구성을 만듭니다.

VPC 서비스 제어에서 경계 액세스 권한 부여

VPC 서비스 제어를 사용하고 BigQuery 데이터 세트가 서비스 경계 내 프로젝트의 일부인 경우 발견 항목을 내보내려면 프로젝트에 대한 액세스 권한을 부여해야 합니다.

프로젝트에 대한 액세스 권한을 부여하려면 발견 항목을 내보낼 주 구성원 및 프로젝트에 대해 인그레스 및 이그레스 규칙을 만듭니다. 이 규칙을 이용하여 보호된 리소스에 대한 액세스를 허용하고 BigQuery가 사용자에게 BigQuery 데이터 세트에 대한 setIamPolicy 권한이 있는지 확인할 수 있습니다.

BigQuery로 새 내보내기를 설정하기 전에

  1. Google Cloud 콘솔에서 VPC 서비스 제어 페이지로 이동합니다.

    VPC 서비스 제어로 이동

  2. 필요한 경우 조직을 선택합니다.

  3. 변경할 서비스 경계의 이름을 클릭합니다.

    수정해야 하는 서비스 경계를 찾으려면 RESOURCES_NOT_IN_SAME_SERVICE_PERIMETER 위반을 표시하는 항목의 로그를 확인하면 됩니다. 해당 항목에서 servicePerimeterName 필드를 확인합니다(accessPolicies/ACCESS_POLICY_ID/servicePerimeters/SERVICE_PERIMETER_NAME).

  4. 경계 수정을 클릭합니다.

  5. 탐색 메뉴에서 인그레스 정책을 클릭합니다.

  6. 사용자 또는 서비스 계정에 대한 인그레스 규칙을 구성하려면 다음 매개변수를 사용합니다.

    • API 클라이언트의 FROM 속성:
      • ID 드롭다운 메뉴에서 선택한 ID를 선택합니다.
      • 소스 드롭다운 메뉴에서 모든 소스를 선택합니다.
      • 선택을 클릭한 후 Security Command Center API를 호출하는 데 사용되는 주 구성원을 입력합니다.
    • Google Cloud 서비스/리소스의 TO 속성:
      • 프로젝트 드롭다운 메뉴에서 선택한 프로젝트를 선택합니다.
      • 선택을 클릭하고 BigQuery 데이터 세트가 포함된 프로젝트를 입력합니다 .
      • 서비스 드롭다운 메뉴에서 선택한 서비스를 선택한 후 BigQuery API를 선택합니다.
      • 메서드 드롭다운 메뉴에서 모든 작업을 선택합니다.
  7. 저장을 클릭합니다.

  8. 탐색 메뉴에서 이그레스 정책을 클릭합니다.

  9. '규칙 추가'를 클릭합니다.

  10. 사용자나 서비스 계정에 대한 이그레스 규칙을 구성하려면 다음 매개변수를 입력합니다.

    • API 클라이언트의 FROM 속성:
      • ID 드롭다운 메뉴에서 선택한 ID를 선택합니다.
      • 선택을 클릭한 후 Security Command Center API를 호출하는 데 사용되는 주 구성원을 입력합니다.
    • Google Cloud 서비스/리소스의 TO 속성:
      • 프로젝트 드롭다운 메뉴에서 모든 프로젝트를 선택합니다.
      • 서비스 드롭다운 메뉴에서 선택한 서비스를 선택한 후 BigQuery API를 선택합니다.
      • 메서드 드롭다운 메뉴에서 모든 작업을 선택합니다.
  11. 저장을 클릭합니다.

BigQuery로 새 내보내기 설정

이 단계에서는 발견 항목을 BigQuery 인스턴스로 내보내는 내보내기 구성을 만듭니다. 내보내기 구성은 프로젝트, 폴더 또는 조직 수준에서 만들 수 있습니다. 예를 들어 프로젝트에서 BigQuery 데이터 세트로 발견 항목을 내보내려면 프로젝트 수준에서 내보내기 구성을 만들어 해당 프로젝트와 관련된 발견 항목만 내보냅니다. 원하는 경우 특정 발견 항목만 내보내도록 필터를 지정할 수 있습니다.

내보내기 구성을 적절한 수준에서 만들어야 합니다. 예를 들어 프로젝트 A에서 발견 항목을 내보내기 위해 프로젝트 B에서 내보내기 구성을 만들고 resource.project_display_name: project-a-id와 같은 필터를 정의하는 경우 구성은 발견 항목을 내보내지 않습니다.

조직에 대해 BigQuery에 최대 500개의 내보내기 구성을 만들 수 있습니다. 여러 내보내기 구성에 동일한 데이터 세트를 사용할 수 있습니다. 동일한 데이터 세트를 사용하는 경우 모든 업데이트가 동일한 발견 항목 테이블에 적용됩니다.

첫 번째 내보내기 구성을 만들면 서비스 계정이 자동으로 생성됩니다. 이 서비스 계정은 데이터 세트에서 발견 항목 테이블을 만들거나 업데이트하고 발견 항목을 테이블로 내보내는 데 필요합니다. 형식은 service-org-ORGANIZATION_ID@gcp-sa-scc-notification.iam.gservicaccount.com이며 BigQuery 데이터 세트 수준에서 BigQuery 데이터 편집자(roles/bigquery.dataEditor) 역할이 부여됩니다.

gcloud

  1. Google Cloud 콘솔로 이동합니다.

    Google Cloud 콘솔로 이동

  2. Security Command Center API를 사용 설정한 프로젝트를 선택합니다.

  3. Cloud Shell 활성화를 클릭합니다.

  4. 새 내보내기 구성을 만들려면 다음 명령어를 실행하세요.

    gcloud scc bqexports create BIG_QUERY_EXPORT \
      --dataset=DATASET_NAME \
      --folder=FOLDER_ID | --organization=ORGANIZATION_ID | --project=PROJECT_ID \
      --location=LOCATION \
      [--description=DESCRIPTION] \
      [--filter=FILTER]
    

    다음을 바꿉니다.

    • BIG_QUERY_EXPORT: 내보내기 구성의 이름

    • DATASET_NAME: BigQuery 데이터 세트의 이름(예: projects/<PROJECT_ID>/datasets/<DATASET_ID>)

    • FOLDER_ID, ORGANIZATION_ID 또는 PROJECT_ID를 폴더, 조직 또는 프로젝트의 이름으로 바꿉니다. 다음 옵션 중 하나를 설정해야 합니다. 폴더 및 조직의 경우 이름은 폴더 ID 또는 조직 ID입니다. 프로젝트 이름은 프로젝트 번호 또는 프로젝트 ID입니다.

    • LOCATION: 데이터 상주가 사용 설정되었으면 BigQuery Export를 만들려는 Security Command Center 위치를 지정합니다. BigQuery Export 구성이 이 위치에 저장됩니다. 이 위치의 발견 항목만 내보내기에 포함됩니다.

      데이터 상주가 사용 설정되지 않은 경우 --location 플래그를 지정하면 Security Command Center API v2를 사용하여 BigQuery Export가 생성되고 플래그에 대한 유효한 유일한 값은 global입니다.

    • DESCRIPTION을 내보내기 구성에 대한 인간이 읽을 수 있는 설명으로 바꿉니다. 이 변수는 선택사항입니다.

    • FILTER를 내보내기에 포함할 발견 항목을 정의하는 표현식으로 바꿉니다. 예를 들어 XSS_SCRIPTING 카테고리로 필터링하려면 "category=\"XSS_SCRIPTING\"을 입력합니다. 이 변수는 선택사항입니다.

Java

Security Command Center에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 v1 API를 사용합니다. v2의 샘플을 수정하려면 v1v2로 바꾸고 /locations/LOCATION을 리소스 이름에 추가합니다.

대부분의 리소스의 경우 /PARENT/PARENT_ID 뒤에 /locations/LOCATION을 리소스 이름에 추가합니다. 여기서 PARENTorganizations, folders 또는 projects입니다.

발견 항목의 경우 /sources/SOURCE_ID 뒤에 /locations/LOCATION을 리소스 이름에 추가합니다. 여기서 SOURCE_ID는 발견 항목을 실행한 Security Command Center 서비스의 ID입니다.


import com.google.cloud.securitycenter.v1.BigQueryExport;
import com.google.cloud.securitycenter.v1.CreateBigQueryExportRequest;
import com.google.cloud.securitycenter.v1.SecurityCenterClient;
import java.io.IOException;
import java.util.UUID;

public class CreateBigQueryExport {

  public static void main(String[] args) throws IOException {
    // TODO(Developer): Modify the following variable values.

    // parent: Use any one of the following resource paths:
    //              - organizations/{organization_id}
    //              - folders/{folder_id}
    //              - projects/{project_id}
    String parent = String.format("projects/%s", "your-google-cloud-project-id");

    // filter: Expression that defines the filter to apply across create/update events of findings.
    String filter =
        "severity=\"LOW\" OR severity=\"MEDIUM\" AND "
            + "category=\"Persistence: IAM Anomalous Grant\" AND "
            + "-resource.type:\"compute\"";

    // bigQueryDatasetId: The BigQuery dataset to write findings' updates to.
    String bigQueryDatasetId = "your-bigquery-dataset-id";

    // bigQueryExportId: Unique identifier provided by the client.
    // For more info, see:
    // https://cloud.google.com/security-command-center/docs/how-to-analyze-findings-in-big-query#export_findings_from_to
    String bigQueryExportId = "default-" + UUID.randomUUID().toString().split("-")[0];

    createBigQueryExport(parent, filter, bigQueryDatasetId, bigQueryExportId);
  }

  // Create export configuration to export findings from a project to a BigQuery dataset.
  // Optionally specify filter to export certain findings only.
  public static void createBigQueryExport(
      String parent, String filter, String bigQueryDatasetId, String bigQueryExportId)
      throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (SecurityCenterClient client = SecurityCenterClient.create()) {

      // Create the BigQuery export configuration.
      BigQueryExport bigQueryExport =
          BigQueryExport.newBuilder()
              .setDescription(
                  "Export low and medium findings if the compute resource "
                      + "has an IAM anomalous grant")
              .setFilter(filter)
              .setDataset(String.format("%s/datasets/%s", parent, bigQueryDatasetId))
              .build();

      CreateBigQueryExportRequest bigQueryExportRequest =
          CreateBigQueryExportRequest.newBuilder()
              .setParent(parent)
              .setBigQueryExport(bigQueryExport)
              .setBigQueryExportId(bigQueryExportId)
              .build();

      // Create the export request.
      BigQueryExport response = client.createBigQueryExport(bigQueryExportRequest);

      System.out.printf("BigQuery export request created successfully: %s\n", response.getName());
    }
  }
}

Python

Security Command Center에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 v1 API를 사용합니다. v2의 샘플을 수정하려면 v1v2로 바꾸고 /locations/LOCATION을 리소스 이름에 추가합니다.

대부분의 리소스의 경우 /PARENT/PARENT_ID 뒤에 /locations/LOCATION을 리소스 이름에 추가합니다. 여기서 PARENTorganizations, folders 또는 projects입니다.

발견 항목의 경우 /sources/SOURCE_ID 뒤에 /locations/LOCATION을 리소스 이름에 추가합니다. 여기서 SOURCE_ID는 발견 항목을 실행한 Security Command Center 서비스의 ID입니다.



def create_bigquery_export(
    parent: str, export_filter: str, bigquery_dataset_id: str, bigquery_export_id: str
):
    from google.cloud import securitycenter

    """
    Create export configuration to export findings from a project to a BigQuery dataset.
    Optionally specify filter to export certain findings only.

    Args:
        parent: Use any one of the following resource paths:
             - organizations/{organization_id}
             - folders/{folder_id}
             - projects/{project_id}
        export_filter: Expression that defines the filter to apply across create/update events of findings.
        bigquery_dataset_id: The BigQuery dataset to write findings' updates to.
        bigquery_export_id: Unique identifier provided by the client.
             - example id: f"default-{str(uuid.uuid4()).split('-')[0]}"
        For more info, see:
        https://cloud.google.com/security-command-center/docs/how-to-analyze-findings-in-big-query#export_findings_from_to
    """
    client = securitycenter.SecurityCenterClient()

    # Create the BigQuery export configuration.
    bigquery_export = securitycenter.BigQueryExport()
    bigquery_export.description = "Export low and medium findings if the compute resource has an IAM anomalous grant"
    bigquery_export.filter = export_filter
    bigquery_export.dataset = f"{parent}/datasets/{bigquery_dataset_id}"

    request = securitycenter.CreateBigQueryExportRequest()
    request.parent = parent
    request.big_query_export = bigquery_export
    request.big_query_export_id = bigquery_export_id

    # Create the export request.
    response = client.create_big_query_export(request)

    print(f"BigQuery export request created successfully: {response.name}\n")

내보내기 구성을 만든 후 약 15분 내에 BigQuery 데이터 세트에 발견 항목이 표시됩니다. BigQuery 테이블이 생성되면 필터 및 범위가 일치하는 모든 새 발견 항목 및 업데이트된 발견 항목이 테이블에 거의 실시간으로 표시됩니다.

발견 항목을 검토하려면 발견 항목 검토를 참조하세요.

BigQuery로 새로 내보내는 인그레스 규칙 만들기

VPC 서비스 제어를 사용하고 BigQuery 데이터 세트가 서비스 경계 내 프로젝트의 일부인 경우, BigQuery로 새 내보내기를 위한 인그레스 규칙을 만들어야 합니다.

  1. BigQuery로 새 내보내기 설정에서 서비스 경계를 다시 엽니다.

    VPC 서비스 제어로 이동

  2. 인그레스 정책을 클릭합니다.

  3. '규칙 추가'를 클릭합니다.

  4. 내보내기 구성에 대한 인그레스 규칙을 구성하려면 다음 매개변수를 입력합니다.

    • API 클라이언트의 FROM 속성:
      • 소스 드롭다운 메뉴에서 모든 소스를 선택합니다.
      • ID 드롭다운 메뉴에서 선택한 ID를 선택합니다.
      • 선택을 클릭하고 BigQuery 내보내기 구성 서비스 계정의 이름(service-org-ORGANIZATION_ID@gcp-sa-scc-notification.iam.gserviceaccount.com)을 입력합니다.
    • GCP 서비스/리소스의 TO 속성:
      • 프로젝트 드롭다운 메뉴에서 선택한 프로젝트를 선택합니다.
      • 선택을 클릭한 후 BigQuery 데이터 세트가 포함된 프로젝트를 선택합니다.
      • 서비스 드롭다운 메뉴에서 선택한 서비스를 선택한 후 BigQuery API를 선택합니다.
      • 메서드 드롭다운 메뉴에서 모든 작업을 선택합니다.
  5. 탐색 메뉴에서 저장을 클릭합니다.

이제 선택한 프로젝트, 사용자, 서비스 계정에서 보호된 리소스에 액세스하고 발견 항목을 내보낼 수 있습니다.

이 가이드의 모든 단계를 수행했고 내보내기가 올바르게 작동하면 이제 다음을 삭제할 수 있습니다.

  • 주 구성원의 인그레스 규칙
  • 주 구성원의 이그레스 규칙

이러한 규칙은 내보내기 구성을 구성하는 데만 필요했습니다. 하지만 내보내기 구성이 계속 작동하면 위에서 만든 인그레스 규칙을 유지해야 합니다. 이렇게 하면 Security Command Center가 서비스 경계 뒤에 있는 BigQuery 데이터 세트로 발견 항목을 내보낼 수 있습니다.

내보내기 구성의 세부정보 보기

gcloud

  1. Google Cloud 콘솔로 이동합니다.

    Google Cloud 콘솔로 이동

  2. Security Command Center API를 사용 설정한 프로젝트를 선택합니다.

  3. Cloud Shell 활성화를 클릭합니다.

  4. 내보내기 구성의 세부정보를 확인하려면 다음 명령어를 실행합니다.

    gcloud scc bqexports get BIG_QUERY_EXPORT \
      --folder=FOLDER_ID | --organization=ORGANIZATION_ID | --project=PROJECT_ID \
      --location=LOCATION
    

    다음을 바꿉니다.

    • BIG_QUERY_EXPORT: 내보내기 구성의 이름

    • FOLDER_ID, ORGANIZATION_ID 또는 PROJECT_ID를 폴더, 조직 또는 프로젝트의 이름으로 바꿉니다. 다음 옵션 중 하나를 설정해야 합니다. 폴더 및 조직의 경우 이름은 폴더 ID 또는 조직 ID입니다. 프로젝트 이름은 프로젝트 번호 또는 프로젝트 ID입니다.

    • LOCATION: 데이터 상주가 사용 설정되었거나 v2 API를 사용하여 BigQueryExport 리소스가 생성된 경우에 필요합니다.

      데이터 상주가 사용 설정되었으면 내보내기가 저장되는 Security Command Center 위치를 지정합니다.

      데이터 상주가 사용 설정되지 않았으면 Security Command Center API v2를 사용하여 BigQueryExport 리소스가 생성된 경우에만 /locations/LOCATION을 포함합니다. 이 경우 유효한 유일한 위치는 global입니다.

    예를 들어 조직 ID가 123으로 설정된 조직에서 my-bq-export라는 내보내기 구성을 가져오려면 다음을 실행합니다.

    gcloud scc bqexports get my-bq-export --organization=123
    

Java

Security Command Center에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 v1 API를 사용합니다. v2의 샘플을 수정하려면 v1v2로 바꾸고 /locations/LOCATION을 리소스 이름에 추가합니다.

대부분의 리소스의 경우 /PARENT/PARENT_ID 뒤에 /locations/LOCATION을 리소스 이름에 추가합니다. 여기서 PARENTorganizations, folders 또는 projects입니다.

발견 항목의 경우 /sources/SOURCE_ID 뒤에 /locations/LOCATION을 리소스 이름에 추가합니다. 여기서 SOURCE_ID는 발견 항목을 실행한 Security Command Center 서비스의 ID입니다.


import com.google.cloud.securitycenter.v1.BigQueryExport;
import com.google.cloud.securitycenter.v1.GetBigQueryExportRequest;
import com.google.cloud.securitycenter.v1.SecurityCenterClient;
import java.io.IOException;

public class GetBigQueryExport {

  public static void main(String[] args) throws IOException {
    // TODO(Developer): Modify the following variable values.

    // parent: Use any one of the following resource paths:
    //              - organizations/{organization_id}
    //              - folders/{folder_id}
    //              - projects/{project_id}
    String parent = String.format("projects/%s", "your-google-cloud-project-id");

    // bigQueryExportId: Unique identifier that is used to identify the export.
    String bigQueryExportId = "export-id";

    getBigQueryExport(parent, bigQueryExportId);
  }

  // Retrieve an existing BigQuery export.
  public static void getBigQueryExport(String parent, String bigQueryExportId) throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (SecurityCenterClient client = SecurityCenterClient.create()) {

      GetBigQueryExportRequest bigQueryExportRequest =
          GetBigQueryExportRequest.newBuilder()
              .setName(String.format("%s/bigQueryExports/%s", parent, bigQueryExportId))
              .build();

      BigQueryExport response = client.getBigQueryExport(bigQueryExportRequest);
      System.out.printf("Retrieved the BigQuery export: %s", response.getName());
    }
  }
}

Python

Security Command Center에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 v1 API를 사용합니다. v2의 샘플을 수정하려면 v1v2로 바꾸고 /locations/LOCATION을 리소스 이름에 추가합니다.

대부분의 리소스의 경우 /PARENT/PARENT_ID 뒤에 /locations/LOCATION을 리소스 이름에 추가합니다. 여기서 PARENTorganizations, folders 또는 projects입니다.

발견 항목의 경우 /sources/SOURCE_ID 뒤에 /locations/LOCATION을 리소스 이름에 추가합니다. 여기서 SOURCE_ID는 발견 항목을 실행한 Security Command Center 서비스의 ID입니다.

def get_bigquery_export(parent: str, bigquery_export_id: str):
    from google.cloud import securitycenter

    """
    Retrieve an existing BigQuery export.
    Args:
        parent: Use any one of the following resource paths:
                 - organizations/{organization_id}
                 - folders/{folder_id}
                 - projects/{project_id}
        bigquery_export_id: Unique identifier that is used to identify the export.
    """

    client = securitycenter.SecurityCenterClient()

    request = securitycenter.GetBigQueryExportRequest()
    request.name = f"{parent}/bigQueryExports/{bigquery_export_id}"

    response = client.get_big_query_export(request)
    print(f"Retrieved the BigQuery export: {response.name}")

내보내기 구성 업데이트

필요한 경우 기존 내보내기 구성의 필터, 데이터 세트, 설명을 수정할 수 있습니다. 내보내기 구성 이름은 변경 불가입니다.

gcloud

  1. Google Cloud 콘솔로 이동합니다.

    Google Cloud 콘솔로 이동

  2. Security Command Center API를 사용 설정한 프로젝트를 선택합니다.

  3. Cloud Shell 활성화를 클릭합니다.

  4. 내보내기 구성을 업데이트하려면 다음 명령어를 실행합니다.

    gcloud scc bqexports update BIG_QUERY_EXPORT \
      --dataset=DATASET_NAME \
      --folder=FOLDER_ID | --organization=ORGANIZATION_ID | --project=PROJECT_ID \
      --location=LOCATION \
      [--description=DESCRIPTION] \
      [--filter=FILTER]
    

    다음을 바꿉니다.

    • BIG_QUERY_EXPORT: 업데이트하려는 내보내기 구성의 이름

    • DATASET_NAME: BigQuery 데이터 세트의 이름(예: projects/<PROJECT_ID>/datasets/<DATASET_ID>)

    • FOLDER_ID, ORGANIZATION_ID 또는 PROJECT_ID를 폴더, 조직 또는 프로젝트의 이름으로 바꿉니다. 다음 옵션 중 하나를 설정해야 합니다. 폴더 및 조직의 경우 이름은 폴더 ID 또는 조직 ID입니다. 프로젝트 이름은 프로젝트 번호 또는 프로젝트 ID입니다.

    • LOCATION: 데이터 상주가 사용 설정되었거나 v2 API를 사용하여 BigQueryExport 리소스가 생성된 경우에 필요합니다.

      데이터 상주가 사용 설정되었으면 내보내기가 저장되는 Security Command Center 위치를 지정합니다.

      데이터 상주가 사용 설정되지 않은 경우 Security Command Center API v2를 사용하여 BigQueryExport 리소스를 만든 경우에만 전체 이름에 /locations/LOCATION을 포함하거나 --location 플래그를 지정합니다. 이 경우 유효한 유일한 위치는 global입니다.

    • DESCRIPTION을 내보내기 구성에 대한 인간이 읽을 수 있는 설명으로 바꿉니다. 이 변수는 선택사항입니다.

    • FILTER를 내보내기에 포함할 발견 항목을 정의하는 표현식으로 바꿉니다. 예를 들어 XSS_SCRIPTING 카테고리로 필터링하려면 "category=\"XSS_SCRIPTING\"을 입력합니다. 이 변수는 선택사항입니다.

Java

Security Command Center에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 v1 API를 사용합니다. v2의 샘플을 수정하려면 v1v2로 바꾸고 /locations/LOCATION을 리소스 이름에 추가합니다.

대부분의 리소스의 경우 /PARENT/PARENT_ID 뒤에 /locations/LOCATION을 리소스 이름에 추가합니다. 여기서 PARENTorganizations, folders 또는 projects입니다.

발견 항목의 경우 /sources/SOURCE_ID 뒤에 /locations/LOCATION을 리소스 이름에 추가합니다. 여기서 SOURCE_ID는 발견 항목을 실행한 Security Command Center 서비스의 ID입니다.


import com.google.cloud.securitycenter.v1.BigQueryExport;
import com.google.cloud.securitycenter.v1.SecurityCenterClient;
import com.google.cloud.securitycenter.v1.UpdateBigQueryExportRequest;
import com.google.protobuf.FieldMask;
import java.io.IOException;

public class UpdateBigQueryExport {

  public static void main(String[] args) throws IOException {
    // TODO(Developer): Modify the following variable values.

    // parent: Use any one of the following resource paths:
    //              - organizations/{organization_id}
    //              - folders/{folder_id}
    //              - projects/{project_id}
    String parent = String.format("projects/%s", "your-google-cloud-project-id");

    // filter: Expression that defines the filter to apply across create/update events of findings.
    String filter =
        "severity=\"LOW\" OR severity=\"MEDIUM\" AND "
            + "category=\"Persistence: IAM Anomalous Grant\" AND "
            + "-resource.type:\"compute\"";

    // bigQueryExportId: Unique identifier provided by the client.
    // For more info, see:
    // https://cloud.google.com/security-command-center/docs/how-to-analyze-findings-in-big-query#export_findings_from_to
    String bigQueryExportId = "big-query-export-id";

    updateBigQueryExport(parent, filter, bigQueryExportId);
  }

  // Updates an existing BigQuery export.
  public static void updateBigQueryExport(String parent, String filter, String bigQueryExportId)
      throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (SecurityCenterClient client = SecurityCenterClient.create()) {

      //  Set the new values for export configuration.
      BigQueryExport bigQueryExport =
          BigQueryExport.newBuilder()
              .setName(String.format("%s/bigQueryExports/%s", parent, bigQueryExportId))
              .setFilter(filter)
              .build();

      UpdateBigQueryExportRequest request =
          UpdateBigQueryExportRequest.newBuilder()
              .setBigQueryExport(bigQueryExport)
              // Set the update mask to specify which properties should be updated.
              // If empty, all mutable fields will be updated.
              // For more info on constructing field mask path, see the proto or:
              // https://cloud.google.com/java/docs/reference/protobuf/latest/com.google.protobuf.FieldMask
              .setUpdateMask(FieldMask.newBuilder().addPaths("filter").build())
              .build();

      BigQueryExport response = client.updateBigQueryExport(request);
      if (!response.getFilter().equalsIgnoreCase(filter)) {
        System.out.println("Failed to update BigQueryExport!");
        return;
      }
      System.out.println("BigQueryExport updated successfully!");
    }
  }
}

Python

Security Command Center에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 v1 API를 사용합니다. v2의 샘플을 수정하려면 v1v2로 바꾸고 /locations/LOCATION을 리소스 이름에 추가합니다.

대부분의 리소스의 경우 /PARENT/PARENT_ID 뒤에 /locations/LOCATION을 리소스 이름에 추가합니다. 여기서 PARENTorganizations, folders 또는 projects입니다.

발견 항목의 경우 /sources/SOURCE_ID 뒤에 /locations/LOCATION을 리소스 이름에 추가합니다. 여기서 SOURCE_ID는 발견 항목을 실행한 Security Command Center 서비스의 ID입니다.

def update_bigquery_export(parent: str, export_filter: str, bigquery_export_id: str):
    """
    Updates an existing BigQuery export.
    Args:
        parent: Use any one of the following resource paths:
                 - organizations/{organization_id}
                 - folders/{folder_id}
                 - projects/{project_id}
        export_filter: Expression that defines the filter to apply across create/update events of findings.
        bigquery_export_id: Unique identifier provided by the client.
        For more info, see:
        https://cloud.google.com/security-command-center/docs/how-to-analyze-findings-in-big-query#export_findings_from_to
    """
    from google.cloud import securitycenter
    from google.protobuf import field_mask_pb2

    client = securitycenter.SecurityCenterClient()

    # Set the new values for export configuration.
    bigquery_export = securitycenter.BigQueryExport()
    bigquery_export.name = f"{parent}/bigQueryExports/{bigquery_export_id}"
    bigquery_export.filter = export_filter

    # Field mask to only update the export filter.
    # Set the update mask to specify which properties should be updated.
    # If empty, all mutable fields will be updated.
    # For more info on constructing field mask path, see the proto or:
    # https://googleapis.dev/python/protobuf/latest/google/protobuf/field_mask_pb2.html
    field_mask = field_mask_pb2.FieldMask(paths=["filter"])

    request = securitycenter.UpdateBigQueryExportRequest()
    request.big_query_export = bigquery_export
    request.update_mask = field_mask

    response = client.update_big_query_export(request)

    if response.filter != export_filter:
        print("Failed to update BigQueryExport!")
        return
    print("BigQueryExport updated successfully!")

모든 내보내기 구성 보기

조직, 폴더 또는 프로젝트 내의 모든 내보내기 구성을 볼 수 있습니다.

gcloud

  1. Google Cloud 콘솔로 이동합니다.

    Google Cloud 콘솔로 이동

  2. Security Command Center API를 사용 설정한 프로젝트를 선택합니다.

  3. Cloud Shell 활성화를 클릭합니다.

  4. 내보내기 구성을 나열하려면 다음 명령어를 실행합니다.

    gcloud scc bqexports list \
      --folder=FOLDER_ID | --organization=ORGANIZATION_ID | --project=PROJECT_ID \
      --location=LOCATION \
      [--limit=LIMIT] \
      [--page-size=PAGE_SIZE]
    

    다음을 바꿉니다.

    • FOLDER_ID, ORGANIZATION_ID 또는 PROJECT_ID를 폴더, 조직 또는 프로젝트의 이름으로 바꿉니다. 다음 옵션 중 하나를 설정해야 합니다. 폴더 및 조직의 경우 이름은 폴더 ID 또는 조직 ID입니다. 프로젝트 이름은 프로젝트 번호 또는 프로젝트 ID입니다.

      조직 ID를 지정하면 목록에 해당 조직에 정의된 모든 내보내기 구성이 포함됩니다(폴더 및 프로젝트 수준에서의 구성 포함). 폴더 ID를 지정하면 폴더 수준 및 해당 폴더 내의 프로젝트에 정의된 모든 내보내기 구성이 목록에 포함됩니다. 프로젝트 번호 또는 프로젝트 ID를 지정하면 목록에 해당 프로젝트의 모든 내보내기 구성만 포함됩니다.

    • LOCATION: 데이터 상주가 사용 설정되었거나 v2 API를 사용하여 BigQueryExport 리소스가 생성된 경우에 필요합니다.

      데이터 상주가 사용 설정되었으면 내보내기가 저장되는 Security Command Center 위치를 지정합니다.

      데이터 상주가 사용 설정되지 않은 경우 --location 플래그를 포함하면 Security Command Center API v2를 사용하여 생성된 BigQueryExport 리소스만 나열되고 유효한 유일한 위치는 global입니다.

    • LIMIT을 보려는 내보내기 구성 수로 바꿉니다. 이 변수는 선택사항입니다.

    • PAGE_SIZE페이지 크기 값으로 바꿉니다. 이 변수는 선택사항입니다.

Java

Security Command Center에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 v1 API를 사용합니다. v2의 샘플을 수정하려면 v1v2로 바꾸고 /locations/LOCATION을 리소스 이름에 추가합니다.

대부분의 리소스의 경우 /PARENT/PARENT_ID 뒤에 /locations/LOCATION을 리소스 이름에 추가합니다. 여기서 PARENTorganizations, folders 또는 projects입니다.

발견 항목의 경우 /sources/SOURCE_ID 뒤에 /locations/LOCATION을 리소스 이름에 추가합니다. 여기서 SOURCE_ID는 발견 항목을 실행한 Security Command Center 서비스의 ID입니다.


import com.google.cloud.securitycenter.v1.BigQueryExport;
import com.google.cloud.securitycenter.v1.ListBigQueryExportsRequest;
import com.google.cloud.securitycenter.v1.SecurityCenterClient;
import com.google.cloud.securitycenter.v1.SecurityCenterClient.ListBigQueryExportsPagedResponse;
import java.io.IOException;

public class ListBigQueryExports {

  public static void main(String[] args) throws IOException {
    // TODO(Developer): Modify the following variable values.

    // parent: The parent, which owns the collection of BigQuery exports.
    //         Use any one of the following resource paths:
    //              - organizations/{organization_id}
    //              - folders/{folder_id}
    //              - projects/{project_id}
    String parent = String.format("projects/%s", "your-google-cloud-project-id");

    listBigQueryExports(parent);
  }

  // List BigQuery exports in the given parent.
  public static void listBigQueryExports(String parent) throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (SecurityCenterClient client = SecurityCenterClient.create()) {

      ListBigQueryExportsRequest request =
          ListBigQueryExportsRequest.newBuilder().setParent(parent).build();

      ListBigQueryExportsPagedResponse response = client.listBigQueryExports(request);

      System.out.println("Listing BigQuery exports:");
      for (BigQueryExport bigQueryExport : response.iterateAll()) {
        System.out.println(bigQueryExport.getName());
      }
    }
  }
}

Python

Security Command Center에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 v1 API를 사용합니다. v2의 샘플을 수정하려면 v1v2로 바꾸고 /locations/LOCATION을 리소스 이름에 추가합니다.

대부분의 리소스의 경우 /PARENT/PARENT_ID 뒤에 /locations/LOCATION을 리소스 이름에 추가합니다. 여기서 PARENTorganizations, folders 또는 projects입니다.

발견 항목의 경우 /sources/SOURCE_ID 뒤에 /locations/LOCATION을 리소스 이름에 추가합니다. 여기서 SOURCE_ID는 발견 항목을 실행한 Security Command Center 서비스의 ID입니다.

def list_bigquery_exports(parent: str):
    from google.cloud import securitycenter

    """
    List BigQuery exports in the given parent.
    Args:
         parent: The parent which owns the collection of BigQuery exports.
             Use any one of the following resource paths:
                 - organizations/{organization_id}
                 - folders/{folder_id}
                 - projects/{project_id}
    """

    client = securitycenter.SecurityCenterClient()

    request = securitycenter.ListBigQueryExportsRequest()
    request.parent = parent

    response = client.list_big_query_exports(request)

    print("Listing BigQuery exports:")
    for bigquery_export in response:
        print(bigquery_export.name)

내보내기 구성 삭제

내보내기 구성이 더 이상 필요하지 않은 경우 삭제할 수 있습니다.

gcloud

  1. Google Cloud 콘솔로 이동합니다.

    Google Cloud 콘솔로 이동

  2. Security Command Center API를 사용 설정한 프로젝트를 선택합니다.

  3. Cloud Shell 활성화를 클릭합니다.

  4. 내보내기 구성을 삭제하려면 다음 명령어를 실행합니다.

    gcloud scc bqexports delete BIG_QUERY_EXPORT \
      --folder=FOLDER_ID | --organization=ORGANIZATION_ID | --project=PROJECT_ID \
      --location=LOCATION
    

    다음을 바꿉니다.

    • BIG_QUERY_EXPORT: 삭제하려는 내보내기 구성의 이름

    • FOLDER_ID, ORGANIZATION_ID 또는 PROJECT_ID를 폴더, 조직 또는 프로젝트의 이름으로 바꿉니다. 다음 옵션 중 하나를 설정해야 합니다. 폴더 및 조직의 경우 이름은 폴더 ID 또는 조직 ID입니다. 프로젝트 이름은 프로젝트 번호 또는 프로젝트 ID입니다.

    • LOCATION: 데이터 상주가 사용 설정되었거나 v2 API를 사용하여 BigQueryExport 리소스가 생성된 경우에 필요합니다.

      데이터 상주가 사용 설정되었으면 내보내기가 저장되는 Security Command Center 위치를 지정합니다.

      데이터 상주가 사용 설정되지 않았으면 Security Command Center API v2를 사용하여 BigQueryExport 리소스가 생성된 경우에만 /locations/LOCATION을 포함합니다. 이 경우 유효한 유일한 위치는 global입니다.

    예를 들어 조직 ID가 123으로 설정된 조직에서 my-bq-export라는 내보내기 구성을 삭제하려면 다음을 실행합니다.

    gcloud scc bqexports delete my-bq-export --organization=123
    

Java

Security Command Center에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 v1 API를 사용합니다. v2의 샘플을 수정하려면 v1v2로 바꾸고 /locations/LOCATION을 리소스 이름에 추가합니다.

대부분의 리소스의 경우 /PARENT/PARENT_ID 뒤에 /locations/LOCATION을 리소스 이름에 추가합니다. 여기서 PARENTorganizations, folders 또는 projects입니다.

발견 항목의 경우 /sources/SOURCE_ID 뒤에 /locations/LOCATION을 리소스 이름에 추가합니다. 여기서 SOURCE_ID는 발견 항목을 실행한 Security Command Center 서비스의 ID입니다.


import com.google.cloud.securitycenter.v1.DeleteBigQueryExportRequest;
import com.google.cloud.securitycenter.v1.SecurityCenterClient;
import java.io.IOException;

public class DeleteBigQueryExport {

  public static void main(String[] args) throws IOException {
    // TODO(Developer): Modify the following variable values.

    // parent: Use any one of the following resource paths:
    //              - organizations/{organization_id}
    //              - folders/{folder_id}
    //              - projects/{project_id}
    String parent = String.format("projects/%s", "your-google-cloud-project-id");

    // bigQueryExportId: Unique identifier that is used to identify the export.
    String bigQueryExportId = "export-id";

    deleteBigQueryExport(parent, bigQueryExportId);
  }

  // Delete an existing BigQuery export.
  public static void deleteBigQueryExport(String parent, String bigQueryExportId)
      throws IOException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (SecurityCenterClient client = SecurityCenterClient.create()) {

      DeleteBigQueryExportRequest bigQueryExportRequest =
          DeleteBigQueryExportRequest.newBuilder()
              .setName(String.format("%s/bigQueryExports/%s", parent, bigQueryExportId))
              .build();

      client.deleteBigQueryExport(bigQueryExportRequest);
      System.out.printf("BigQuery export request deleted successfully: %s", bigQueryExportId);
    }
  }
}

Python

Security Command Center에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음 샘플은 v1 API를 사용합니다. v2의 샘플을 수정하려면 v1v2로 바꾸고 /locations/LOCATION을 리소스 이름에 추가합니다.

대부분의 리소스의 경우 /PARENT/PARENT_ID 뒤에 /locations/LOCATION을 리소스 이름에 추가합니다. 여기서 PARENTorganizations, folders 또는 projects입니다.

발견 항목의 경우 /sources/SOURCE_ID 뒤에 /locations/LOCATION을 리소스 이름에 추가합니다. 여기서 SOURCE_ID는 발견 항목을 실행한 Security Command Center 서비스의 ID입니다.

def delete_bigquery_export(parent: str, bigquery_export_id: str):
    """
    Delete an existing BigQuery export.
    Args:
        parent: Use any one of the following resource paths:
                 - organizations/{organization_id}
                 - folders/{folder_id}
                 - projects/{project_id}
        bigquery_export_id: Unique identifier that is used to identify the export.
    """
    from google.cloud import securitycenter

    client = securitycenter.SecurityCenterClient()

    request = securitycenter.DeleteBigQueryExportRequest()
    request.name = f"{parent}/bigQueryExports/{bigquery_export_id}"

    client.delete_big_query_export(request)
    print(f"BigQuery export request deleted successfully: {bigquery_export_id}")

내보내기 구성을 삭제한 후 Looker Studio에서 데이터를 삭제할 수 있습니다. 자세한 내용은 데이터 소스 제거, 삭제, 복원을 참조하세요.

BigQuery에서 발견 항목 검토

내보내기 구성을 만들면 지정한 프로젝트의 BigQuery 데이터 세트로 새 발견 항목을 내보냅니다.

BigQuery에서 발견 항목을 검토하려면 다음 안내를 따르세요.

  1. BigQuery에서 프로젝트로 이동합니다.

    BigQuery로 이동

  2. 올바른 프로젝트에 있지 않은 경우 다음 단계를 따르세요.

    1. 툴바에서 프로젝트 선택기를 클릭합니다.
    2. 다음 조직에서 선택 옆에서 조직을 선택합니다.
    3. 프로젝트 목록에서 프로젝트를 선택합니다.
  3. 탐색기 창에서 프로젝트 노드를 확장합니다.

  4. 데이터 세트를 확장합니다.

  5. 발견 항목 테이블을 클릭합니다.

  6. 탭이 열리면 미리보기를 클릭합니다. 샘플 데이터세트가 표시됩니다.

유용한 쿼리

이 섹션에서는 발견 항목 데이터 분석을 위한 쿼리의 예시를 제공합니다. 다음 예시에서 DATASET를 데이터 세트에 할당된 이름으로, PROJECT_ID를 데이터 세트의 프로젝트 이름으로 바꾸세요.

발생한 오류를 해결하려면 오류 메시지를 참조하세요.

매일 생성 및 업데이트되는 새 발견 항목 수

SELECT
    FORMAT_DATETIME("%Y-%m-%d", event_time) AS date,
    count(DISTINCT finding_id)
FROM `PROJECT_ID.DATASET.findings`
GROUP BY date
ORDER BY date DESC

각 발견 항목의 최근 발견 항목 레코드

SELECT
    * EXCEPT(row)
FROM (
    SELECT *, ROW_NUMBER() OVER(
        PARTITION BY finding_id
        ORDER BY event_time DESC, finding.mute_update_time DESC
    ) AS row
    FROM `PROJECT_ID.DATASET.findings`
)
WHERE row = 1

활성 상태인 현재 발견 항목(시간순)

WITH latestFindings AS (
    SELECT * EXCEPT(row)
    FROM (
        SELECT *, ROW_NUMBER() OVER(
            PARTITION BY finding_id
            ORDER BY event_time DESC, finding.mute_update_time DESC
        ) AS row
        FROM `PROJECT_ID.DATASET.findings`
    ) WHERE row = 1
)
SELECT finding_id, event_time, finding
FROM latestFindings
WHERE finding.state = "ACTIVE"
ORDER BY event_time DESC

프로젝트의 현재 발견 항목

WITH latestFindings AS (
    SELECT * EXCEPT(row)
    FROM (
        SELECT *, ROW_NUMBER() OVER(
            PARTITION BY finding_id
            ORDER BY event_time DESC, finding.mute_update_time DESC
        ) AS row
        FROM `PROJECT_ID.DATASET.findings`
    ) WHERE row = 1
)
SELECT finding_id, event_time, finding, resource
FROM latestFindings
WHERE resource.project_display_name = 'PROJECT'

PROJECT을 프로젝트 이름으로 바꿉니다.

폴더의 현재 발견 항목

WITH latestFindings AS(
    SELECT * EXCEPT(row)
    FROM (
        SELECT *, ROW_NUMBER() OVER(
            PARTITION BY finding_id
            ORDER BY event_time DESC, finding.mute_update_time DESC
        ) AS row
        FROM `PROJECT_ID.DATASET.findings`
    ) WHERE row = 1
)
SELECT finding_id, event_time, finding, resource
FROM latestFindings
CROSS JOIN UNNEST(resource.folders) AS folder
WHERE folder.resource_folder_display_name = 'FOLDER'

FOLDER를 폴더 이름으로 바꿉니다.

Logging Scanner 스캐너의 현재 발견 항목

WITH latestFindings AS (
    SELECT * EXCEPT(row)
    FROM (
        SELECT *, ROW_NUMBER() OVER(
            PARTITION BY finding_id
            ORDER BY event_time DESC, finding.mute_update_time DESC
        ) AS row
        FROM `PROJECT_ID.DATASET.findings`
    ) WHERE row = 1
)
SELECT finding_id, event_time, finding
FROM latestFindings
CROSS JOIN UNNEST(finding.source_properties) AS source_property
WHERE source_property.key = "ScannerName"
  AND source_property.value = "LOGGING_SCANNER"

Persistence: IAM Anomalous Grant 유형의 현재 활성 발견 항목

WITH latestFindings AS(
    SELECT * EXCEPT(row)
    FROM (
        SELECT *, ROW_NUMBER() OVER(
            PARTITION BY finding_id
            ORDER BY event_time DESC, finding.mute_update_time DESC
        ) AS row
        FROM `PROJECT_ID.DATASET.findings`
    ) WHERE row = 1
)
SELECT finding_id, event_time, finding
FROM latestFindings
WHERE finding.state = "ACTIVE"
  AND finding.category = "Persistence: IAM Anomalous Grant"

Cloud 감사 로그와 지정된 유형의 활성 발견 항목 상관관계

이 예시 쿼리는 Cloud 감사 로그를 사용하여 비정상 IAM 권한 부여 작업의 진행 및 성공 기간 동안의 권한 부여자의 관리자 활동 시퀀스를 표시하여 Event Threat Detection에서 비정상 IAM 권한 부여 결과를 조사하는 데 도움이 됩니다. 다음 쿼리는 발견 항목의 타임스탬프 이전 1시간에서 이후 1시간 사이의 관리자 활동 로그에 대한 상관관계를 보여줍니다.

WITH latestFindings AS(
    SELECT * EXCEPT(row)
    FROM (
        SELECT *, ROW_NUMBER() OVER(
            PARTITION BY finding_id
            ORDER BY event_time DESC, finding.mute_update_time DESC
        ) AS row
        FROM `PROJECT_ID.DATASET.findings`
    ) WHERE row = 1
)
SELECT
  finding_id,
  ANY_VALUE(event_time) as event_time,
  ANY_VALUE(finding.access.principal_email) as grantor,
  JSON_VALUE_ARRAY(ANY_VALUE(finding.source_properties_json), '$.properties.sensitiveRoleGrant.members') as grantees,
  ARRAY_AGG(
    STRUCT(
      timestamp,
      IF(timestamp < event_time, 'before', 'after') as timeline,
      protopayload_auditlog.methodName,
      protopayload_auditlog.resourceName,
      protopayload_auditlog.serviceName
    )
    ORDER BY timestamp ASC
  ) AS recent_activity
FROM (
  SELECT
    f.*,
    a.*,
  FROM latestFindings AS f
  LEFT JOIN `PROJECT_ID.DATASET.cloudaudit_googleapis_com_activity` AS a
  ON a.protopayload_auditlog.authenticationInfo.principalEmail = f.finding.access.principal_email
  WHERE f.finding.state = "ACTIVE"
    AND f.finding.category = "Persistence: IAM Anomalous Grant"
    AND a.timestamp >= TIMESTAMP_SUB(f.event_time, INTERVAL 1 HOUR)
    AND a.timestamp <= TIMESTAMP_ADD(f.event_time, INTERVAL 1 HOUR)
  )
GROUP BY
  finding_id
ORDER BY
  event_time DESC

출력은 다음과 비슷합니다.

상관관계의 감사 로그가 있는 발견 항목을 보여주는 쿼리 결과 스크린샷

Looker Studio에서 차트 만들기

Looker Studio를 사용하면 대화형 보고서 및 대시보드를 만들 수 있습니다.

일반적으로 Looker Studio를 통해 BigQuery에 액세스하면 BigQuery 사용 비용이 발생합니다. 자세한 내용은 Looker Studio를 사용하여 BigQuery 데이터 시각화를 참조하세요.

심각도 및 카테고리별로 발견 항목 데이터를 시각화하는 차트를 만들려면 다음 안내를 따르세요.

  1. Looker Studio를 열고 로그인합니다.
  2. 메시지가 표시되면 추가 정보를 제공하고 다른 환경설정을 지정합니다. 서비스 약관을 읽고 동의한다면 계속 진행합니다.
  3. 빈 보고서를 클릭합니다.
  4. 데이터에 연결 탭에서 BigQuery 카드를 클릭합니다.
  5. 메시지가 표시되면 Looker Studio가 BigQuery 프로젝트에 액세스할 수 있도록 승인합니다.
  6. 발견 항목 데이터에 연결합니다.
    1. 프로젝트에서 데이터 세트에 사용할 프로젝트를 선택합니다. 또는 내 프로젝트 탭에서 검색할 프로젝트 ID를 입력합니다.
    2. 데이터 세트에서 데이터 세트의 이름을 클릭합니다.
    3. 테이블에서 발견 항목을 클릭합니다.
    4. Add(추가)를 클릭합니다.
    5. 대화상자에서 보고서에 추가를 클릭합니다.
  7. 보고서가 추가되면 차트 추가를 클릭합니다.
  8. 누적 열 차트를 클릭한 후 배치할 영역을 클릭합니다.

    차트 선택 스크린샷

  9. 차트 > 막대 창의 데이터 탭에서 다음 필드를 설정합니다.

    1. 측정기준 필드에서 finding.severity를 선택합니다.
    2. 분류 측정기준 필드에서 finding.category를 선택합니다.
    심각도별로 분류된 후 카테고리별로 하위 분류된 발견 항목 차트의 스크린샷

발견 항목이 심각도 및 카테고리별로 분할된 여러 열을 표시하도록 보고서가 업데이트됩니다.

다음 단계

BigQuery에서 쿼리를 실행하는 방법을 알아보세요.