DoiTが開発したGKE Workload Identity Analyzerをご紹介します。GKE上で稼働するworkloadsを分析し、Workload Identityが正しく設定されているかを確認できるツールです。

GKE Workload Identity AnalyzerでWorkload Identityの設定を検証
Google Kubernetes Engine(GKE)を利用していて、workloadsがGoogle Cloud内の他サービスと通信しているなら、おそらく Workload Identity をお使いでしょう。まだ導入していないなら、ぜひ使うべきです。Googleは、GKE上のworkloadsからGoogle Cloudサービスへ安全かつ管理しやすい形でアクセスする手段として、Workload Identityを推奨しています。
Workload Identity以外の選択肢
GKEとGoogle Cloud間の認証方法としては、以下のような従来型の選択肢もあります。
- Compute Engineのデフォルトサービスアカウントを使う方法。スコープが広すぎるうえ、workloadごとにカスタマイズできません。
- workloadsに サービスアカウントのシークレットを渡す方法。これらのキーは長期間有効な認証情報のため、セキュリティのベストプラクティスに沿った慎重な管理と定期的なローテーションが欠かせず、セキュリティ上のリスクとなります。
Workload Identityの仕組み
Workload Identityなら、こうした懸念はありません。workload単位で設定でき、シークレットの管理や注入も不要だからです。
仕組みとしては、Kubernetes Service Account(KSA)とGoogle Service Account(GSA)を結び付けることで動作します。KSAはGKE上で稼働するworkloadをGSAの利用者として識別する役割を担い、GSA側にはGoogle Cloudリソースへの必要なアクセス権が設定されます。アクセス範囲はworkloadの要件に応じて柔軟に調整可能で、たとえばプロジェクト内の_すべての_ PubSubトピックへアクセスする必要があるworkloadもあれば、特定の1つ(または数個)だけにアクセスすればよいworkloadもあります。
Workload Identityのメリットは明らかですが、利用にあたっては 追加の設定作業が必要で、最初は少々わかりにくく感じるかもしれません。
GKE上のPodからGCPプロジェクト内のサービスに至る認証経路には複数の段階があり、そのいずれでも設定ミスが起こり得ます。そのため、トラブルシューティングはかなり手間のかかる作業になりがちです。
GKE Workload Identity Analyzerでできること
そこでDoiTが開発したのが GKE Workload Identity Analyzerです。Workload Identity(WI)Analyzerはコマンドラインツールで、Pod名を引数として渡すと、対象workloadのWI設定が正しく行われているかを以下の観点でチェックします。
- GKEクラスタでWorkload Identityが有効になっているか
- Podに.spec.serviceAccountNameが設定されているか
- (前のステップで設定した)KSAが存在するか
- KSAにGSAのアノテーションが正しく付与されているか
- (前のステップで設定した)GSAがプロジェクト内に存在するか
- KSAがGSAに対してroles/iam.workloadIdentityUserを保持しているか
最終的には、GSAがプロジェクト内で持つIAMロールも一覧で表示します(ただし、PubSubトピックやCloudSQLインスタンスといった特定のGCPリソース単位で付与されたIAMロールは確認対象外です)。
実行は10秒もかからず、コンソールでリソースを調べたり、ターミナルでコマンドを叩いたりする手間を大幅に削減できます。
ツールはPythonで書かれており、PyPIで公開されています。PIPで簡単にインストールできます。
$ pip install wi-analyzerGKE Workload Identity Analyzerの実行方法
実行にあたっての 前提条件は次のとおりです。
- gcloudcliがインストール・設定済みであること
- gcloud経由でApplication Default Credentialsが生成済みであること
- kubectlがインストールされ、クラスタにアクセスできるよう設定済みであること
このツールは 現在のkubeconfigコンテキストから一部の情報を取得します。また、認証情報を取得する際は、GKEクラスタのデフォルト命名(gke_<GCP_PROJECT_ID>__<CLUSTER_NAME>の形式)を前提としています。
異なる場合は、引数でGCPプロジェクトID、クラスタのロケーション、クラスタ名を指定することもできます。
準備が整ったら、ターミナルからツールを実行します。
$ wi-analyzer --helpusage: wi-analyzer [-h] [-n NAMESPACE] [-d] pod
GKE Workload Identity Analyzer
positional arguments: pod Kubernetes Pod name to check
options: -h, --help show this help message and exit -n NAMESPACE, --namespace NAMESPACE Kubernetes Namespace to run in -p PROJECT, --project PROJECT GCP Project holding the cluster -l LOCATION, --location LOCATION The GCP location of the cluster -c CLUSTER, --cluster CLUSTER The name of the cluster
-d, --debug Enable debug loggingたとえば、workloadでWIを利用するための設定ドキュメントに沿って作業した際に、ささいな手順をうっかり飛ばしてしまったとしましょう。そんなときに、このツールの出力が役立ちます。
$ wi-analyzer demo-podCheck results---------------------------V=Passed, X=Failed, -=Skipped
[V] GCP project and GKE info determined from current context[V] Namespace passed as argument,or determined from current context[V] Workload Identity enabled on GKE Cluster[V] Pod found in current context[V] GKE Node found in the cluster[V] Workload Identity enabled on Node Pool[V] KSA found in the cluster[X] KSA Workload Identity annotation set correctly[-] GSA found in GCP project[-] GSA is enabled[-] GSA has Workload Identity users configured[-] GSA does not have KSA as a Workload Identity user
GKE cluster info---------------------------Cluster: "projects/test-eyal/locations/europe-west1-b/clusters/playground"Workload: "demo/demo-pod" running on Node: "gke-playground-nodepool-1f1ace09-96kr"KSA name: "demo-ksa"
Google Service Account info---------------------------Google Service Account information could not be determined, fix previous issues出力からわかるとおり、KSAにWIアノテーションが付いていませんでした。修正後にもう一度実行すれば、すべてのチェックが成功し、全体像が表示されるはずです。
$ wi-analyzer demo-podCheck results---------------------------V=Passed, X=Failed, -=Skipped
[V] GCP project and GKE info determined from current context[V] Namespace passed as argument,or determined from current context[V] Workload Identity enabled on GKE Cluster[V] Pod found in current context[V] GKE Node found in the cluster[V] Workload Identity enabled on Node Pool[V] KSA found in the cluster[V] KSA Workload Identity annotation set correctly[V] GSA found in GCP project[V] GSA is enabled[V] GSA has Workload Identity users configured[V] GSA does not have KSA as a Workload Identity user
GKE cluster info---------------------------Cluster: "projects/test-eyal/locations/europe-west1-b/clusters/playground"Workload: "demo/demo-pod" running on Node: "gke-playground-nodepool-1f1ace09-96kr"KSA name: "demo-ksa"
Google Service Account info---------------------------Google Service Account: "projects/test-eyal/serviceAccounts/[email protected]"Has the following Workload Identity Users:serviceAccount:test-eyal.svc.id.goog[demo/demo-ksa]
GSA: "[email protected]" has the following roles in project "test-eyal":roles/cloudsql.clientWorkload Identity configured properly - check if any IAM roles are missing from the list above本ツールは現時点ではGKE Standardのみに対応していますが、Fleet Workload Identity(Anthos向けGKE WI)への対応もロードマップに入っています。マルチクラウドAnthosクラスタでの検証もすでに進行中ですが、こちらはツール自体に大幅な変更が必要となる見込みです。続報をお待ちください。
不具合を見つけた方、追加してほしい機能のアイデアをお持ちの方はいらっしゃいますか?
こちらのコメント欄、または GitHubリポジトリでのissue作成から、お気軽にお寄せください。