mcpField
G
gke-workload-security

gke-workload-security

github.com/googlecloudplatformセキュリティ16948 回インストール3 日前に更新
リポジトリ

gke-workload-security について

GKE の運用担当者向けに、セキュリティ監査、Workload Identity、ネットワークポリシー、ノード保護、シークレット管理の手順と例を紹介します。

主な機能

  1. 01クラスタのセキュリティ設定を監査
  2. 02Workload Identity の設定
  3. 03ネットワークポリシーとデフォルト拒否の適用
  4. 04Shielded Nodes と GKE Sandbox の有効化
  5. 05Pod Security Standards の適用
  6. 06CSI Driver で Secret Manager のシークレットをマウント

活用シーン

  1. 01クラスタの ID とノードのセキュリティを確認
  2. 02Pod 間の通信を制限
  3. 03信頼できないワークロードを隔離
  4. 04Secret Manager のシークレットを Pod にマウント

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/googlecloudplatform/gke-mcp --skill gke-workload-security

インストール後、Claude Code で/gke-workload-securityを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

assets/
default-deny-netpol.yaml
workload-identity-pod.yaml
scripts/
audit_cluster.sh

詳細

GKE ワークロードのセキュリティ

このスキルでは、GKE ワークロードを保護するためのワークフローとベストプラクティスを紹介します。 セキュリティ監査、Identity and Access Management(Workload Identity)、ネットワークセキュリティ(Network Policies)、ノードセキュリティを取り上げます。

ワークフロー

1. セキュリティ監査

付属の監査スクリプトを使用して、クラスターの現在のセキュリティ状態を評価します。

機能:

  • Workload Identity が有効か確認します。
  • Network Policy が有効か確認します。
  • Shielded Nodes が有効か確認します。
  • Binary Authorization が有効か確認します。
  • Private Cluster の構成を確認します。

コマンド:

./scripts/audit_cluster.sh <cluster-name> <region> <project-id>
2. Workload Identity の構成

Workload Identity を使用すると、Kubernetes Service Account(KSA)が Google Service Account(GSA)になりすますことができます。これは、ワークロードから Google Cloud API にアクセスするための推奨方法です。

手順:

  1. Namespace と KSA を作成します:

    kubectl create namespace workload-identity-test-ns
    kubectl create serviceaccount <ksa-name> \
        --namespace workload-identity-test-ns
    
  2. KSA を GSA にバインドします:

    gcloud iam service-accounts add-iam-policy-binding <gsa-name>@<project-id>.iam.gserviceaccount.com \
        --role roles/iam.workloadIdentityUser \
        --member "serviceAccount:<project-id>.svc.id.goog[workload-identity-test-ns/<ksa-name>]"
    
  3. KSA にアノテーションを付与します:

    kubectl annotate serviceaccount <ksa-name> \
        --namespace workload-identity-test-ns \
        iam.gke.io/gcp-service-account=<gsa-name>@<project-id>.iam.gserviceaccount.com
    
  4. サンプル Pod を検証します: 既存のアセット assets/workload-identity-pod.yaml を使用して構成をテストします。先にファイル内の <ksa-name> を更新してください。

    kubectl apply -f ./assets/workload-identity-pod.yaml -n workload-identity-test-ns
    
3. Network Policies の実装

Network Policies を使用して Pod 間のトラフィックフローを制御します。デフォルトでは、すべてのトラフィックが許可されています。

Network Policy の適用を有効にする:

gcloud container clusters update <cluster-name> \
    --update-addons=NetworkPolicy=ENABLED \
    --region <region>

メモ

クラスターで Dataplane V2(--enable-dataplane-v2)を使用している場合、Network Policy の適用機能は組み込まれているため、この手順は不要です(失敗する可能性もあります)。

デフォルト拒否ポリシーを適用する: デフォルトですべてのイングレスおよびエグレスのトラフィックを拒否し、Namespace を分離します。

分離する Namespace に <target-namespace> を置き換えてください。

kubectl apply -f ./assets/default-deny-netpol.yaml -n <target-namespace>
4. Shielded Nodes を有効にする

ノードが検証可能なインテグリティで稼働していることを確認します。

コマンド:

gcloud container clusters update <cluster-name> \
    --enable-shielded-nodes \
    --region <region>
5. GKE Sandbox(gVisor)

信頼できないワークロードをサンドボックスで実行し、分離を強化します。

GKE Sandbox を有効にする:

gcloud container clusters update <cluster-name> \
    --enable-gke-sandbox \
    --region <region>

サンドボックス化された Pod を実行する: Pod の仕様に runtimeClassName: gvisor を追加します。

6. Pod Security Standards

ラベルを使用して Namespace にセキュリティポリシーを適用します。

Restricted プロファイルを適用する:

kubectl label --overwrite ns <namespace> \
    pod-security.kubernetes.io/enforce=restricted \
    pod-security.kubernetes.io/enforce-version=latest

メモ

latest を使用すると、クラスターの現在のバージョンに対応するポリシーが適用されます。特定のリリースのポリシーに Namespace を固定するには、特定のバージョン(例:v1.30)を指定できます。

7. Secret Manager の統合(CSI Driver)

Google Cloud Secret Manager のシークレットを、Pod 内のボリュームとして直接マウントします。

前提条件:クラスターで Secret Manager CSI driver が有効になっている必要があります。

SecretProviderClass の例:

apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: my-secret-provider
spec:
  provider: gcp
  parameters:
    secrets: |
      - resourceName: "projects/<project-id>/secrets/my-secret/versions/latest"
        fileName: "my-secret-file"

Pod 仕様の抜粋例:

spec:
  containers:
    - name: my-app
      volumeMounts:
        - name: secrets-store-inline
          mountPath: "/mnt/secrets"
          readOnly: true
  volumes:
    - name: secrets-store-inline
      csi:
        driver: secrets-store.csi.k8s.io
        readOnly: true
        volumeAttributes:
          secretProviderClass: "my-secret-provider"
8. Network Policy Logging を有効にする

GKE Dataplane V2 を使用している場合、許可および拒否された接続をログに記録できます。

手順:

  1. NetworkLogging カスタムリソースを構成します。

NetworkLogging マニフェストの例:

apiVersion: networking.gke.io/v1alpha1
kind: NetworkLogging
metadata:
  name: default
spec:
  cluster:
    allow:
      log: true
      delegate: true
    deny:
      log: true
      delegate: true

これにより、接続の詳細が Cloud Logging に記録されます。

ベストプラクティス

  1. 最小権限: 最小限の IAM ロールで Workload Identity を常に使用してください。Node のデフォルトのサービスアカウントは使用しないでください。
  2. ネットワークの分離: Network Policies を使用して Pod 間の通信を制限します。可視性を高めるため、Network Policy Logging を有効にしてください。
  3. イメージのセキュリティ: Binary Authorization を使用して、信頼できるイメージのみがデプロイされるようにします。
  4. シークレット管理:機密データには、デフォルトの Kubernetes シークレットではなく Secret Manager CSI driver を使用してください。
  5. Pod のセキュリティ: システム以外のすべての Namespace で、baseline または restricted の Pod Security Standards を適用します。
  6. ポリシーの適用: クラスター全体でカスタムのセキュリティおよびコンプライアンスポリシーを適用するために、Policy Controller(Gatekeeper)の使用を検討してください。

コメント