GKE에 앱 배포 및 보안 통계 보기

의도적으로 취약한 컨테이너를 GKE 클러스터에 배포하고 보안 상태 대시보드에서 취약점에 대한 보안 정보를 얻는 방법을 알아봅니다. GKE 보안 상황 대시보드에는 알려진 운영체제 취약점에 대한 정보가 표시됩니다. Go 또는 Java 패키지에 취약점이 있는지 검색해야 하는 경우 애플리케이션 빌드 및 보안 통계 보기를 참조하세요.

목표

  • Cloud Build를 사용하여 컨테이너화된 애플리케이션을 Artifact Registry에 빌드하고 푸시합니다.
  • Cloud Deploy에서 전송 파이프라인을 만듭니다.
  • 애플리케이션을 스테이징 GKE 클러스터에 배포하고 프로덕션 클러스터로 승격합니다.
  • Google Cloud 콘솔의 보안 상태 대시보드를 사용하여 배포된 애플리케이션의 취약점에 대한 통계를 봅니다.

시작하기 전에

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Install the Google Cloud CLI.
  3. To initialize the gcloud CLI, run the following command:

    gcloud init
  4. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  5. Make sure that billing is enabled for your Google Cloud project.

  6. Enable the Artifact Registry, Cloud Build, Cloud Deploy, Google Kubernetes Engine, Container Security, and Container Analysis APIs:

    gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com clouddeploy.googleapis.com container.googleapis.com containersecurity.googleapis.com  containeranalysis.googleapis.com
  7. Install the Google Cloud CLI.
  8. To initialize the gcloud CLI, run the following command:

    gcloud init
  9. Create or select a Google Cloud project.

    • Create a Google Cloud project:

      gcloud projects create PROJECT_ID

      Replace PROJECT_ID with a name for the Google Cloud project you are creating.

    • Select the Google Cloud project that you created:

      gcloud config set project PROJECT_ID

      Replace PROJECT_ID with your Google Cloud project name.

  10. Make sure that billing is enabled for your Google Cloud project.

  11. Enable the Artifact Registry, Cloud Build, Cloud Deploy, Google Kubernetes Engine, Container Security, and Container Analysis APIs:

    gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com clouddeploy.googleapis.com container.googleapis.com containersecurity.googleapis.com  containeranalysis.googleapis.com

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

개발 환경 준비하기

  1. 프로젝트 ID를 환경 변수로 설정합니다.

    export PROJECT_ID=$(gcloud config get project)
    
  2. Cloud Deploy의 기본 Google Cloud 리전을 설정합니다.

    gcloud config set deploy/region us-central1
    
  3. 이 태스크의 샘플 코드가 포함된 GitHub 저장소를 클론합니다.

    git clone https://github.com/googlecloudplatform/software-delivery-shield-demo-java.git
    cd ~/software-delivery-shield-demo-java/backend
    
  4. GKE의 IAM 서비스 계정을 만듭니다.

    사용할 클러스터:

    gcloud iam service-accounts create sds-runtime \
        --display-name="Security insights with GKE service account"
    
  5. IAM 서비스 계정에 권한 부여:

    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member=serviceAccount:sds-runtime@${PROJECT_ID}.iam.gserviceaccount.com \
        --role="roles/container.nodeServiceAccount"
    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member=serviceAccount:sds-runtime@${PROJECT_ID}.iam.gserviceaccount.com \
        --role="roles/clouddeploy.jobRunner"
    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member=serviceAccount:sds-runtime@${PROJECT_ID}.iam.gserviceaccount.com \
        --role="roles/container.developer"
    gcloud projects add-iam-policy-binding $PROJECT_ID \
        --member=serviceAccount:sds-runtime@${PROJECT_ID}.iam.gserviceaccount.com \
        --role="roles/artifactregistry.reader"
    
  6. 기본 Compute Engine 서비스 계정에 GKE 클러스터에 대한 액세스 권한을 부여합니다. Cloud Deploy는 이 액세스를 사용하여 전송 파이프라인의 클러스터에 앱을 배포합니다.

    PROJECT_NUMBER="$(gcloud projects describe ${PROJECT_ID} --format='get(projectNumber)')"
    gcloud projects add-iam-policy-binding ${PROJECT_NUMBER} \
        --member=serviceAccount:${PROJECT_NUMBER}-compute@developer.gserviceaccount.com \
        --role=roles/container.developer
    

이미지의 Artifact Registry 저장소 만들기

  1. 저장소를 만듭니다.

    gcloud artifacts repositories create containers \
        --repository-format=docker \
        --location=us-central1 \
        --description="Security insights with GKE repository"
    
  2. 저장소가 있는지 확인합니다.

    gcloud artifacts repositories list \
        --location=us-central1 \
        --filter="REPOSITORY:containers"
    

    만든 containers 저장소가 출력에 표시됩니다.

GKE 클러스터 만들기

GKE 클러스터 두 개(dev-cluster라는 스테이징 클러스터와 prod-cluster라는 프로덕션 클러스터)를 만듭니다. Autopilot에서 워크로드 취약점 스캔은 버전 1.27 이상을 실행하는 새 클러스터에 자동으로 사용 설정됩니다. 표준 클러스터를 사용하는 경우 --workload-vulnerability-scanning=standard 플래그를 지정합니다.

gcloud container clusters create-auto dev-cluster \
    --region=us-central1 \
    --release-channel=rapid \
    --service-account=sds-runtime@${PROJECT_ID}.iam.gserviceaccount.com
gcloud container clusters create-auto prod-cluster \
    --region=us-central1 \
    --release-channel=rapid \
    --service-account=sds-runtime@${PROJECT_ID}.iam.gserviceaccount.com

클러스터 생성을 완료되는 데 최대 5분이 걸릴 수 있습니다. 기존 GKE 클러스터를 업데이트하여 워크로드 취약점 스캔을 사용 설정할 수도 있습니다.

이미지 빌드

Cloud Build를 사용하여 이미지를 빌드하고 제출합니다.

gcloud builds submit --region us-central1 --config cloudbuild.yaml

빌드가 완료되면 출력은 다음과 비슷합니다.

DONE
-----------------------------------------------------------------------------
ID: 3e23094f-7f57-4449-bc68-51c37hn34d03
CREATE_TIME: 2022-09-19T15:41:07+00:00
DURATION: 54S
SOURCE: gs://my-project_cloudbuild/source/1663602066.777581-6ebe4b2d6fd741ffa18936d7f.tgz
IMAGES: us-central1-docker.pkg.dev/PROJECT_ID/containers/java-guestbook-backend:quickstart
STATUS: SUCCESS

Cloud Deploy를 사용하여 GKE에 이미지 배포

  1. 프로젝트 ID로 Cloud Deploy 구성 파일을 업데이트합니다.

    sed -i "s/PROJECT_ID/${PROJECT_ID}/g" clouddeploy.yaml
    
  2. 파이프라인 및 대상을 등록합니다.

    gcloud deploy apply --file=clouddeploy.yaml
    
  3. 파이프라인이 있는지 확인하려면 Google Cloud 콘솔에서 전송 파이프라인 페이지로 이동합니다.

    배포 파이프라인으로 이동

    파이프라인 목록에 새 파이프라인 guestbook-app-delivery가 표시됩니다.

  4. 진행 상황을 모니터링하려는 파이프라인 이름을 클릭합니다. 배포 파이프라인 세부정보 페이지가 열립니다.

  5. Cloud Deploy에서 새 출시 버전을 만듭니다.

    gcloud deploy releases create guestbook-release-001 \
        --delivery-pipeline=guestbook-app-delivery \
        --images=java-guestbook-backend=us-central1-docker.pkg.dev/${PROJECT_ID}/containers/java-guestbook-backend:quickstart
    

    새 출시 버전은 배포 파이프라인 세부정보 페이지의 출시 섹션에 표시됩니다.

  6. 배포 파이프라인 세부정보 페이지에서 dev-cluster에 대해 승격 버튼이 표시될 때까지 파이프라인 시각화 보기를 모니터링합니다. 페이지를 새로 고쳐야 할 수도 있습니다.

  7. dev-cluster 시각화에서 승격을 클릭합니다.

  8. 승격 출시 창에서 승격을 클릭하여 프로덕션 클러스터에 대한 승격을 확인합니다.

  9. 출시가 성공적인지 확인하려면 출시 섹션을 확인하세요. 마지막 출시 상태 열에 Successfully deployed to prod-cluster가 표시됩니다.

취약점 보기

이 섹션에서 보안 상황 대시보드를 사용하여 OS 취약점 통계를 확인합니다. 실행 중인 워크로드를 클러스터에 배포한 후 실행 중인 워크로드의 취약점에 대한 정보가 대시보드에 표시됩니다.

  1. Google Cloud 콘솔에서 GKE 보안 상황 페이지로 이동합니다.

    GKE 보안 상황으로 이동

  2. 스캔 결과를 보려면 페이지를 새로고침합니다. 첫 스캔을 완료하는 데 최대 15분이 걸릴 수 있습니다.

  3. GKE 보안 상황 페이지에서 워크로드 OS 취약점 섹션을 검토합니다. 이 섹션에는 배포된 워크로드에 영향을 주는 주요 CVE가 나열되어 있습니다.

  4. 자세한 내용은 모든 취약점 문제 보기를 클릭하세요. 문제 탭이 열리고 취약점 문제 유형에 대한 필터가 적용됩니다. 다음 표에서는 각 취약점의 개요 및 영향이 표시됩니다.

  5. 특정 취약점의 세부정보를 보려면 표에서 문제 이름을 클릭합니다. 취약점 창이 열립니다. 이 창에서 다음을 수행할 수 있습니다.

    • 영향을 받는 버전, 패키지, CVSS 점수를 포함하여 CVE에 대한 자세한 설명을 확인합니다.
    • 문서 및 패치 버전 정보와 같은 문제 완화를 위한 권장 조치를 확인합니다.
    • 영향을 받는 워크로드 탭에서 취약점의 영향을 받는 특정 워크로드를 확인합니다.

삭제

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

개별 리소스 삭제

  1. Cloud Deploy 파이프라인을 삭제합니다.

    gcloud deploy delivery-pipelines delete guestbook-app-delivery --force
    
  2. GKE 클러스터를 삭제합니다.

    gcloud container clusters delete dev-cluster \
        --region=us-central1
    gcloud container clusters delete prod-cluster \
        --region=us-central1
    
  3. Artifact Registry 저장소를 삭제합니다.

    gcloud artifacts repositories delete containers \
        --location=us-central1
    
  4. IAM 서비스 계정을 삭제합니다.

    gcloud iam service-accounts delete sds-runtime@${PROJECT_ID}.iam.gserviceaccount.com
    

프로젝트 삭제

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

다음 단계