GKE にアプリをデプロイしてセキュリティ分析情報を表示する

GKE クラスタに意図的に脆弱化させたコンテナをデプロイし、セキュリティ対策ダッシュボードで脆弱性に関するセキュリティ分析情報を取得する方法を学びます。GKE のセキュリティ対策ダッシュボードには、オペレーティング システムの既知の脆弱性に関する情報が表示されます。Go または Java パッケージの脆弱性の言語スキャンも行う場合は、アプリケーションをビルドしてセキュリティ分析情報を表示するをご覧ください。

目標

  • Cloud Build を使用して、コンテナ化されたアプリケーションをビルドして Artifact Registry に push します。
  • 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 クラスタを作成する

dev-cluster という名前のステージング クラスタと prod-cluster という名前の本番環境クラスタの 2 つの GKE クラスタを作成します。Autopilot では、バージョン 1.27 以降を実行する新しいクラスタに対して、ワークロードの脆弱性スキャンが自動的に有効になります。Standard クラスタを使用する場合は、--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 Security Posture] ページで、[ワークロード 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.

次のステップ