(GKE 関係なく、) GCP リソースを操作するライブラリ がよしなにやってくれる! ※ Application Default Credentials(ADC) という認証情報取得の仕組みを用いて ① 特定の場所に配置された認証情報を使う ② GCE(実行環境)に紐付いた IAM Service Account を使う 参考:アプリケーションのデフォルト認証情報の仕組み
(GKE 関係なく、) GCP リソースを操作するライブラリ がよしなにやってくれる! ※ Application Default Credentials(ADC) という認証情報取得の仕組みを用いて ② GCE に紐付いた IAM Service Account を使う 実行環境 IAM SA メタデータサーバー Datastore ① 認証情報をリクエスト ② アクセス元に紐づく IAM SA応じた認証情報 ③ datastore アクセス ・Datastore 読取権限 ロール アプリ ✔ アクセス可
Secret IAM SA リクエスト Datastore 1. IAM SA キーの 手動でローテションが必要 2. エクスポートした IAM SA キーの流出のリスク ※ この方法は推奨されていない Pod にマウント ✔ アクセス可 ① 特定の場所に配置された認証情報を使う => IAM SA のキーを Secret リソースとしてデプロイして、Pod にマウントする
IAM Service Account がアタッチされ(※ 指定も可能)、 そのノード上のワークロード(Pod) は、この IAM Service Account を使って認証される。 - 2023/07/04 Kubernetes Novice Tokyo #26 - できることはできるけど課題が・・・ 同じ IAM SA の認証情報 GKE ノードA ノードB IAM SA メタデータサーバー Pod A Pod B Datastore ✔ アクセス可
SA の認証情報 GKE ノードA ノードB IAM SA メタデータサーバー Pod A Pod B Datastore 1. 同一ノードの上のワークロード は同じ権限を持つことになる 2. 最小権限の原則に反する ※ デフォルト IAM SA の場合、 K8sクラスタ実行に過剰権限になる ✔ アクセス可 ② GCE に紐付いた IAM Service Account を使う => GKE ノード作成時にデフォルトの IAM Service Account がアタッチされ(※ 指定も可能)、 そのノード上のワークロード(Pod) は、この IAM Service Account を使って認証される。
=> IAM SA キーのエクスポートは推奨されていない ② GKE ノードの IAM SA を使って、メタデータサーバー から認証情報取得 => GKE ノード上のワークロードが同じ権限を持ってしまう ③ Workload Identity を使う ← オススメ - 2023/07/04 Kubernetes Novice Tokyo #26 - Workload Identity を使おうぜ 😎(やっとメイン)
何? これにより、実現したかったことができるようになります! 同一ノード上の、 - Pod A には “Datastore 編集権限” を持たせる - Pod B には “Datastore 編集権限” を持たせない × Pod B Pod A K8s SA: sa-k8snovice K8s SA: default Datastore ✔ アクセス可 アクセス不可 IAM SA ・Datastore 読取権限 ロール 連携
としてデプロイ(勝手に) • 関連付けたい K8s SA と IAM SA の間に IAM Policy Binding を追加 $ gcloud iam service-accounts add-iam-policy-binding <IAM SA>@<PJID>.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:<PJID>.svc.id.goog[NAMESPACE/<K8s SA>]" • K8s SA の annotation に関連付けたい IAM SA 以下を追加 iam.gke.io/gcp-service-account:<IAM SA>@<PJID>.iam.gserviceaccount.com - 2023/07/04 Kubernetes Novice Tokyo #26 - Workload Identity is 何? IAM 内の 関連付け K8s 内の 関連付け