Blog
2022.11.07
GCP外のKubernetesクラスタでWorkload Identity Federationを使えるWebhookを公開しました
Area
Tag
Shingo Omura
Engineer
English article is available here.
機械学習プラットフォームエンジニアの大村です。
TL;DR
GCP(Google Cloud Platform)外のKubernetesクラスタからGoogle Cloud APIの安全な利用を可能とするAdmission Webhookの実装を公開しました!Workload Identity Federationの機能を利用することにより外部KubernetesクラスタのServiceAccountに紐付くトークンで認証しています。
https://github.com/pfnet-research/gcp-workload-identity-federation-webhook
このWebhookを使うことで、下記のように以前と比べて外部のKubernetesクラスタからよりセキュアにGoogle Cloud APIを利用できます。
これまで | これから |
|
|
Workload Identity Federationとは
Workload Identity Federation(以下WIF)は一言で言うと、「GCP以外のサービスが提供する外部IDを用いて、Google Cloud APIにアクセスできる」機能です。この仕組が提供される以前は前節でも紹介したとおり、無期限のサービスアカウントキーを管理しなくてはならず(もしくはユーザ側でローテーションの仕組みを構築する必要があり)、漏洩時のリスクが大きい状態でした。この機能が提供されたことで、WIFが対応している外部IDプロバイダ(AWS, Azure Active Directory, Okta, OIDC, SAML 2.0等)を提供すれば、外部IDプロバイダの発行した認証情報を使って、GCPサービスアカウントの権限を一時的に借用させることができます。技術的にはOAuth 2.0 Token Exchangeの仕様に従うセキュリティトークンサービス(STS)を介して、外部IDプロバイダの発行した認証情報をGoogle Cloud APIの認証情報と交換します。
最近だと、GitHub Actions からのキーなしの認証の有効化で紹介されて注目を集めたのが記憶に新しい方もいると思います。Workload Identity Federationの仕組みについては詳しく説明している記事が公開されていますのでそちらもあわせて参照ください。
- Workload Identity Federationを図で理解する – Carpe Diem
- Workload Identity Federationとは / 社内IDaaS勉強会資料共有
- Workload Identity FederationをGitHub Actionsで利用する
Kubernetesクラスタを外部IDプロバイダにする
Kubernetes ServiceAccount Token(Bound Service Account Token)は、実はOIDC ID TokenとしてControl Planeが発行しており、Kubernetes API ServerはOIDC Providerに関する情報をexposeする機能(Service Account Issuer Discoveryと呼ばれます)を持っているので、STSがServiceAccount Tokenを検証できる範囲で、限定的なOIDC Providerとして振る舞う事ができます。Kubernetesクラスタがオンプレミスなどのプライベートネットワークにデプロイされている場合は、STSでKubernetes ServiceAccount Tokenを交換する際にTokenの検証を行うために必要な2つのエンドポイント(OIDC Dicovery, OIDC JWKs)をSTSからアクセス可能な状態で公開する事ができます。
あとは、GCP側でもKubernetesクラスタ(外部IDプロバイダ)に対応する、 Workload IdentityプールとWorkload Identityプールプロバイダを構成し、外部ID(Kubernetes ServiceAccount)にGCPサービスアカウントの借用権限を付与すれば、WIFを利用できます。
詳細はCloud Native Security Conference 2022 で発表した“Kubernetes Service Account As Multi-Cloud Identity”(video)で解説しています。
GCP Workload Identity Federation Webhook
Kubernetesクラスタを外部IDプロバイダとして設定できればWIFが利用できますが、クライアント(Pod側)でもいくつか設定が必要になります。具体的には、Kubernetes ServiceAccount TokenをFederated Identityとして利用する(STSでServiceAccount Tokenを交換してからAPIアクセスする)ようにGoogle Cloud SDKの設定を行う必要があります。それを自動化してくれるのがこのWebhookです。コンセプトはAmazon EKS Pod Identity Webhook(IRSAで使われているWebhook)やAzure AD Workload Identityとほぼ同じです。
下記のようにServiceAccountに、対応するWorkload Identityプロバイダ、借用したいGCPサービスアカウントをannotationしておいて、そのServiceAccountでPodを作成するだけで、Pod内のContainerは自動的にGCPサービスアカウント権限を借用することができます。
具体的にどういう情報が注入されるかはREADMEを御覧ください。
公開した背景
メジャーなPublic Cloud(AWS, GCP, Azure)ではIdentity Federationの機能が提供されています。また、それぞれのManaged Kubernetesでは、Kubernetes ServiceAccountをそのCloud APIのIdentityとして利用できる機能が提供されています。
Identity Federation機能名 | Managed Kubernetesでの対応 | |
AWS | ID プロバイダーとフェデレーション | IAM roles for service accounts – Amazon EKS |
GCP | Workload Identity 連携 | Use Workload Identity – GKE |
Azure | Azure AD Workload Identity | Use an Azure AD workload identities (preview) on Azure Kubernetes Service (AKS) |
ですが、他のクラウドやオンプレミスのKubernetesクラスタでは、Kubernetes ServiceAccountをFederated Identityとして利用する際に設定を注入してくれるWebhookが必要です。AWS、Azureについては公開されていますが、GCPについては公開されていません(Anthosは製品レベルで対応しているため自前でWebhookデプロイ不要)。そのため、PFNではWebhookを内製していましたが、公共性が高いと考え、今回公開しました。
ククラウド外のKubernetes ServiceAccountを Federated Identityとして利用するためのWebhook(OSS) |
公開元 | |
AWS | Amazon EKS Pod Identity Webhook ※EKS Anywhereは製品レベルで対応しているため自前でWebhookデプロイ不要 |
AWS(公式) |
GCP | GCP Workload Identity Federation Webhook(今回公開) ※Anthosは製品レベルで対応しているため自前でWebhookデプロイ不要 |
PFN |
Azure | Azure AD Workload Identity | Azure(公式) |
さいごに
PFNのオンプレミスの機械学習プラットフォームでは、Kubernetes ServiceAccountを各種Public Cloud(AWS, GCP, Azure)のFederated Identityとして利用できる環境を構築しており、Cloud Native Security Conference 2022 にて“Kubernetes Service Account As Multi-Cloud Identity”として成果を発表しています。今回、その際に、PFNで内製していたGCP Workload Identity Federation向けのWebhook実装として
https://github.com/pfnet-research/gcp-workload-identity-federation-webhook
を公開しました。是非使ってみていただいてフィードバックをいただけると嬉しいです。
We’re Hiring!!
PFNの機械学習プラットフォームチームではエンジニアを募集しています。こうしたクラウド連携や、オンプレミスの機械学習クラスタの構築&運用に興味のある方、ご応募お待ちしています!
Machine Learning Platform Engineer/機械学習プラットフォームエンジニア (Infrastructure)
Area
Tag