빠른 시작: 지속적 검증으로 포드 보안 모니터링

검사 기반 정책으로 Binary Authorization 지속적 검증(CV)을 시작하는 방법을 알아봅니다. 이 빠른 시작에서는 다음 CV 검사를 사용해서 다음 조건에 따라 실행 중인 포드를 지속적으로 검증합니다.

  • 신뢰할 수 있는 디렉터리: 포드와 연결된 이미지가 정책에 지정한 하나 이상의 신뢰할 수 있는 디렉터리로 빌드되었는지 검사합니다.
  • 이미지 최신 상태: 포드 이미지가 정책에 지정한 기간(일 수) 내에 업로드되었는지 검사합니다.

시작하기 전에

  1. Google Cloud 계정에 로그인합니다. Google Cloud를 처음 사용하는 경우 계정을 만들고 Google 제품의 실제 성능을 평가해 보세요. 신규 고객에게는 워크로드를 실행, 테스트, 배포하는 데 사용할 수 있는 $300의 무료 크레딧이 제공됩니다.
  2. Google Cloud CLI를 설치합니다.
  3. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  4. Google Cloud 프로젝트를 만들거나 선택합니다.

    • Google Cloud 프로젝트를 만듭니다.

      gcloud projects create PROJECT_ID

      PROJECT_ID를 만들려는 Google Cloud 프로젝트의 이름으로 바꿉니다.

    • 만든 Google Cloud 프로젝트를 선택합니다.

      gcloud config set project PROJECT_ID

      PROJECT_ID를 Google Cloud 프로젝트 이름으로 바꿉니다.

  5. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  6. Binary Authorization and Google Kubernetes Engine API를 사용 설정합니다.

    gcloud services enable container.googleapis.com binaryauthorization.googleapis.com
  7. Google Cloud CLI를 설치합니다.
  8. gcloud CLI를 초기화하려면 다음 명령어를 실행합니다.

    gcloud init
  9. Google Cloud 프로젝트를 만들거나 선택합니다.

    • Google Cloud 프로젝트를 만듭니다.

      gcloud projects create PROJECT_ID

      PROJECT_ID를 만들려는 Google Cloud 프로젝트의 이름으로 바꿉니다.

    • 만든 Google Cloud 프로젝트를 선택합니다.

      gcloud config set project PROJECT_ID

      PROJECT_ID를 Google Cloud 프로젝트 이름으로 바꿉니다.

  10. Google Cloud 프로젝트에 결제가 사용 설정되어 있는지 확인합니다.

  11. Binary Authorization and Google Kubernetes Engine API를 사용 설정합니다.

    gcloud services enable container.googleapis.com binaryauthorization.googleapis.com
  12. kubectl 명령줄 도구 설치
  13. Binary Authorization 정책과 GKE 클러스터가 서로 다른 프로젝트에 있으면 Binary Authorization이 두 프로젝트 모두에 사용 설정되었는지 확인합니다.

플랫폼 정책 만들기

CV GKE 플랫폼 정책을 설정하려면 다음을 수행합니다.

  1. 플랫폼 정책 YAML 파일을 만듭니다.

    cat << EOF > /tmp/my-policy.yaml
    gkePolicy:
      checkSets:
      - checks:
        - trustedDirectoryCheck:
            trustedDirPatterns:
            - us-central1-docker.pkg.dev/my-project/my-directory
          displayName: My trusted directory check
        - imageFreshnessCheck:
            maxUploadAgeDays: 30
          displayName: My image freshness check
        displayName: My trusted directory and image freshness check set
    EOF
    

    이 신뢰할 수 있는 디렉터리 검사는 다음 조건을 확인합니다.

    • 포드 이미지가 us-central1-docker.pkg.dev/my-project/my-directory라는 Artifact Registry 저장소에 저장되었는지 확인합니다.

    • 포드 이미지가 최근 30일 동안 Artifact Registry 또는 Container Registry 저장소에 업로드되었는지 확인합니다.

  2. 플랫폼 정책을 만듭니다.

    gcloud beta container binauthz policy create POLICY_ID \
        --platform=gke \
        --policy-file=/tmp/my-policy.yaml \
        --project=POLICY_PROJECT_ID
    

    다음을 바꿉니다.

    • POLICY_ID: 선택한 ID입니다.
    • POLICY_PROJECT_ID: 정책 프로젝트 ID입니다.

클러스터 만들기 또는 업데이트

클러스터에서 CV를 사용 설정하려면 새 클러스터를 만들거나 기존 클러스터를 업데이트하면 됩니다.

  • 검사 기반 플랫폼 정책이 사용 설정된 클러스터를 만들려면 다음 명령어를 실행합니다.

    gcloud beta container clusters create CLUSTER_NAME \
        --location=LOCATION \
        --binauthz-evaluation-mode=POLICY_BINDINGS \
        --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
        --project=CLUSTER_PROJECT_ID
    

    다음을 바꿉니다.

    • CLUSTER_NAME: 클러스터의 이름입니다.
    • LOCATION: 위치입니다(예: us-central1 또는 asia-south1).
    • POLICY_PROJECT_ID: 정책이 저장된 프로젝트의 ID입니다.
    • POLICY_ID: 정책 ID입니다.
    • CLUSTER_PROJECT_ID: 클러스터 프로젝트 ID입니다.

    클러스터가 생성될 때까지 기다립니다.

  • 검사 기반 정책이 사용 설정된 기존 클러스터를 업데이트하려면 다음 명령어를 실행합니다.

    gcloud beta container clusters update CLUSTER_NAME \
        --location=LOCATION \
        --binauthz-evaluation-mode=POLICY_BINDINGS \
        --binauthz-policy-bindings=name=projects/POLICY_PROJECT_ID/platforms/gke/policies/POLICY_ID \
        --project=CLUSTER_PROJECT_ID
    

    다음을 바꿉니다.

    • CLUSTER_NAME: 클러스터의 이름입니다.
    • LOCATION: 위치입니다(예: us-central1 또는 asia-south1).
    • POLICY_PROJECT_ID: 정책이 저장된 프로젝트의 ID입니다.
    • POLICY_ID: 정책 ID입니다.
    • CLUSTER_PROJECT_ID: 클러스터 프로젝트 ID입니다.

    클러스터가 업데이트될 때까지 기다립니다.

이미지 배포

  1. kubectl의 사용자 인증 정보를 가져옵니다.

    gcloud container clusters get-credentials CLUSTER_NAME
    
  2. 이미지를 배포합니다.

    kubectl run hello-app \
        --image=us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0
    

    us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 이미지는 최근 30일 내에 저장소에 업로드되었기 때문에 최신 상태 검사를 충족합니다. 하지만 이미지가 us-central1-docker.pkg.dev/my-project/my-directory에 없기 때문에 신뢰할 수 있는 디렉터리 검사를 충족하지 않습니다. 따라서 CV는 Cloud Logging에 TrustedDirectoryCheck 로그 항목을 생성합니다.

로그 보기

포드가 배포되고 24시간 이내에 로그 항목이 Cloud Logging에 표시되지만 몇 시간 만에 나타날 수도 있습니다.

Cloud Logging에서 로그를 보려면 다음 필터를 사용합니다.

logName:"binaryauthorization.googleapis.com%2Fcontinuous_validation"
"policyName"

hello-app 포드의 로그는 아래 로그와 비슷합니다. 일부 필드는 프로젝트 ID, 클러스터 이름 등에 따라 다를 수 있습니다.

{
  "insertId": "637c2de7-0000-2b64-b671-24058876bb74",
  "jsonPayload": {
    "podEvent": {
      "endTime": "2022-11-22T01:14:30.430151Z",
      "policyName": "projects/1234567890/platforms/gke/policies/my-policy",
      "images": [
        {
          "result": "DENY",
          "checkResults": [
            {
              "explanation": "TrustedDirectoryCheck at index 0 with display name \"My trusted directory check\" has verdict NOT_CONFORMANT. Image is not in a trusted directory",
              "checkSetName": "Default check set",
              "checkSetIndex": "0",
              "checkName": "My trusted directory check",
              "verdict": "NON_CONFORMANT",
              "checkType": "TrustedDirectoryCheck",
              "checkIndex": "0"
            }
          ],
          "image": "us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0"
        }
      ],
      "verdict": "VIOLATES_POLICY",
      "podNamespace": "default",
      "deployTime": "2022-11-22T01:06:53Z",
      "pod": "hello-app"
    },
    "@type": "type.googleapis.com/google.cloud.binaryauthorization.v1beta1.ContinuousValidationEvent"
  },
  "resource": {
    "type": "k8s_cluster",
    "labels": {
      "project_id": "my-project",
      "location": "us-central1-a",
      "cluster_name": "my-cluster"
    }
  },
  "timestamp": "2022-11-22T01:44:28.729881832Z",
  "severity": "WARNING",
  "logName": "projects/my-project/logs/binaryauthorization.googleapis.com%2Fcontinuous_validation",
  "receiveTimestamp": "2022-11-22T03:35:47.171905337Z"
}

로그 항목은 다음 필드를 포함하여 정책 위반에 대한 정보를 표시합니다.

  • policyName: CV가 위반을 식별했을 때 사용한 플랫폼 정책입니다.
  • checkResults: 다음 필드를 포함하는 결과 블록입니다.

    • explanation: 오류 메시지입니다.
    • checkSetName: 검사 집합의 displayName 값입니다.
    • checkSetIndex: 정책에서 검사 집합의 색인입니다.
    • checkName: 검사 이름입니다.
    • checkIndex: 검사 집합에 있는 검사의 색인입니다.
    • verdict: 로그 항목을 발생시킨 결과입니다. 이 경우 검사가 충족되지 않았기 때문에 NOT_CONFORMANT입니다.

일부 검사에는 검사가 충족되지 않은 이유를 이해하는 데 도움이 되는 추가 정보가 포함될 수 있습니다.

이미지가 최신 상태 검사를 충족했기 때문에 최신 상태 검사가 로그에 표시되지 않습니다.

삭제

이 페이지에서 사용한 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 Google Cloud 프로젝트를 삭제하면 됩니다.

이 섹션에서는 이 가이드의 앞부분에서 구성한 CV 모니터링을 삭제하는 방법을 설명합니다.

클러스터에서 CV 모니터링을 사용 중지하거나 Binary Authorization과 CV를 모두 사용 중지할 수 있습니다.

클러스터에서 Binary Authorization 사용 중지

클러스터에서 CV 및 Binary Authorization 시행을 모두 사용 중지하려면 다음 명령어를 실행합니다.

gcloud beta container clusters update CLUSTER_NAME \
    --binauthz-evaluation-mode=DISABLED \
    --location=LOCATION \
    --project=CLUSTER_PROJECT_ID

다음을 바꿉니다.

  • CLUSTER_NAME: 클러스터의 이름입니다.
  • LOCATION: 클러스터 위치입니다.
  • CLUSTER_PROJECT_ID: 클러스터 프로젝트 ID입니다.

클러스터에서 검사 기반 정책 모니터링 사용 중지

클러스터에서 검사 기반 정책으로 CV를 사용 중지하고 Binary Authorization 시행 정책을 사용하여 시행을 다시 사용 설정하려면 다음 명령어를 실행합니다.

gcloud beta container clusters update CLUSTER_NAME  \
    --binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE \
    --location=LOCATION \
    --project="CLUSTER_PROJECT_ID"

다음을 바꿉니다.

  • CLUSTER_NAME: 클러스터의 이름입니다.
  • LOCATION: 클러스터 위치입니다.
  • CLUSTER_PROJECT_ID: 클러스터 프로젝트 ID입니다.

--binauthz-evaluation-mode=PROJECT_SINGLETON_POLICY_ENFORCE는 이전 플래그 --enable-binauthz와 동일합니다.

정책 삭제

정책을 삭제하려면 다음 명령어를 실행합니다. 검사 기반 정책 감사를 사용 중지하기 위해 검사 기반 플랫폼 정책을 삭제할 필요는 없습니다.

gcloud beta container binauthz policy delete POLICY_ID \
    --platform=gke \
    --project="POLICY_PROJECT_ID"

다음을 바꿉니다.

  • POLICY_ID: 정책의 ID입니다.
  • POLICY_PROJECT_ID: 정책 프로젝트 ID입니다.

다음 단계