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

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

目標

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

2 つの GKE クラスタ(dev-cluster という名前のステージング クラスタと、prod-cluster という名前の本番環境クラスタ)を作成します。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. Google Cloud コンソールで、[リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ