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

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

목표

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

시작하기 전에

  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. Artifact Registry, Cloud Build, Cloud Deploy, Google Kubernetes Engine, Container Security, and Container Analysis API를 사용 설정합니다.

    gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com clouddeploy.googleapis.com container.googleapis.com containersecurity.googleapis.com  containeranalysis.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. Artifact Registry, Cloud Build, Cloud Deploy, Google Kubernetes Engine, Container Security, and Container Analysis API를 사용 설정합니다.

    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="SDS 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="SDS 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. Google Cloud 콘솔에서 리소스 관리 페이지로 이동합니다.

    리소스 관리로 이동

  2. 프로젝트 목록에서 삭제할 프로젝트를 선택하고 삭제를 클릭합니다.
  3. 대화상자에서 프로젝트 ID를 입력한 후 종료를 클릭하여 프로젝트를 삭제합니다.

다음 단계