パブリッククラウドと ID 連携を構成する
パブリッククラウドのリソースへのアクセスに使う鍵は強力な認証情報であり、外部への持ち出しはセキュリティリスクがあります。 鍵を持ち出さずにパブリッククラウドのリソースを利用するために、PFCP ではパブリッククラウドとの ID 連携をサポートします。 ID 連携を使用すると、Kubernetes クラスタの ServiceAccount に対してパブリッククラウドの権限が付与され、アクセスが可能になります。
ここでは、Amazon Web Service(以下、AWS)と Google Cloud の 2 種類のパブリッククラウドについて、ID 連携を組む方法について紹介します。
AWSとの連携
AWS 側の設定
- 
AWS ドキュメント IAM で OpenID Connect (OIDC) ID プロバイダーを作成する - AWS Identity and Access Management を参照して、アクセスしたい AWS アカウント内に OIDC プロバイダを作成します。
- プロバイダー URL1
- SR1-01 クラスタ: 
https://token.sr1-01.kubernetes.pfcomputing.com - IK1-01 クラスタ: 
https://token.ik1-01.kubernetes.pfcomputing.com 
 - SR1-01 クラスタ: 
 - 許可するオーディエンス: 
sts.amazonaws.com 
 - プロバイダー URL1
 - 
AWS へのアクセスに使用する IAM ロールを作成します。この IAM ロールは、ID 連携により Kubernetes ServiceAccount に紐づけて使用します。
 - 
ID 連携による紐づけを許可するために、IAM ロールを引き受けさせる Kubernetes ServiceAccount を指定して、以下のような信頼ポリシを構成します(ドキュメント)。
{ "Version": "2012-10-17", "Statement": [{ "Sid": "", "Effect": "Allow", "Principal": { // 前のステップで作成した oidc provider の ARNを指定します。 "Federated": "arn:aws:iam::XXXXXXXXXXX:oidc-provider/token.sr1-01.kubernetes.pfcomputing.com" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { // このIAMロールを引き受けさせる Kubernetes ServiceAccount 名を指定します。 "token.sr1-01.kubernetes.pfcomputing.com:sub": "system:serviceaccount:<namespace>:<serviceaccount>" } } }] }WarningConditionの設定を必ず記述してください。忘れると、他の組織を含むすべての ServiceAccount に対して権限が付与されてしまいます。
 - 
AWS では、Cloud Trail による ID 連携の監査ログがデフォルトで有効になっており、90 日間保存されます。90 日を超えて監査ログを保存しておきたい場合は、AWS アカウント の証跡の作成 - AWS CloudTrail を参照し設定を変更します。
 
Kubernetesクラスタ側の設定
- 
ServiceAccount の annotations に、ServiceAccount に付与する AWS IAM ロールを指定します。
apiVersion: v1 kind: ServiceAccount metadata: name: foo annotations: aws.id-federation.preferred.jp/role-arn: "arn:aws:iam::{aws_account_id}:role/{role}" - 
Pod を作成する際に、
.spec.serviceAccountNameにこの ServiceAccount を指定します。 Pod 内で AWS SDK を使用すると、ServiceAccount に紐づいた AWS IAM Role を用いて AWS にアクセスします。 セッショントークンの有効期限は 1 時間です。AWS SDK を使い続ける限り自動で更新されます。 - 
動作確認をします。まず、Pod が使用している IAM ロールを確認します。
$ kubectl get po <pod> -o yaml | grep AWS_ROLE_ARN: AWS_ROLE_ARN: arn:aws:iam::861856390547:role/id-federation-test-sr1-01次に、Pod に Web ID token ファイルのマウントがあることを確認します。
$ kubectl get po <pod> -o yaml | grep AWS_WEB_IDENTITY_TOKEN_FILE: AWS_WEB_IDENTITY_TOKEN_FILE: /var/run/secrets/sts.amazonaws.com/serviceaccount/token 
Google Cloud との連携
PFCP には gcp-workload-identity-federation-webhook がデプロイされており、これを使い Google Cloud との ID 連携を構成できます。
Google Cloud 側の設定
Kubernetes との Workload Identity 連携を構成する | IAM のドキュメント | Google Cloud を参照し、以下の設定をおこないます。
- 
アクセスしたい Google Cloud プロジェクト内に Workload Identity のプールとプロバイダを作成します。
- 発行元 URL
- SR1-01 クラスタ: 
https://token.sr1-01.kubernetes.pfcomputing.com - IK1-01 クラスタ: 
https://token.ik1-01.kubernetes.pfcomputing.com 
 - SR1-01 クラスタ: 
 
 - 発行元 URL
 - 
Google Cloud へのアクセスに使用する Google IAM サービスアカウントを作成し、許可するリソースに対するアクセス権を付与します。このサービスアカウントは、ID 連携により Kubernetes ServiceAccount に紐づけて使用します。
 - 
ID 連携による紐づけを許可するために、Workload Identity ユーザロール(
roles/iam.workloadIdentityUser)を上記の Google IAM サービスアカウントに付与します。このとき、Kubernetes ServiceAccount に限定して権限の借用を許可するために、以下をメンバーとして指定します。principal://iam.googleapis.com/projects/<Google CloudのプロジェクトID> \ /locations/global/workloadIdentityPools/<作成したWorkload IdentityプールのID> \ /subject/<クラスタの発行元URL>::system:serviceaccount:<Kubernetes ServiceAccountのNamespace>:<Kubernetes ServiceAccountのName> 
Kubernetes クラスタ側の設定
- 
ServiceAccount の annotations に、Workload Identity プロバイダ、借用させる IAM サービスアカウント、Workload Identity プロバイダが期待するオーディエンスの値をアノテーションとして設定します。
apiVersion: v1 kind: ServiceAccount metadata: annotations: googlecloud.id-federation.preferred.jp/workload-identity-provider: |- projects/<Google CloudのプロジェクトID>/locations/global/workloadIdentityPools/<作成したWorkload IdentityプールのID>/providers/<作成したWorkload IdentityプールプロバイダのID> googlecloud.id-federation.preferred.jp/service-account-email: |- <Google IAM サービスアカウント名>@<Google Cloudのプロジェクト名>.iam.gserviceaccount.com googlecloud.id-federation.preferred.jp/audience: <Workload Identity プロバイダが期待するオーディエンス> - 
Pod を作成する際に、
.spec.serviceAccountNameにこの ServiceAccount を指定します。 Pod 内で Google Cloud SDK を使うと、指定した ServiceAccount に紐づいた Google IAM サービスアカウントを借用して Google Cloud にアクセスします。 認証情報の有効期限はデフォルトで 24 時間です。Google Cloud SDK を使い続ける限り、自動で更新されます。 
より詳細については gcp-workload-identity-federation-webhook の README をご覧ください。
- 
PFCP の複数クラスタをご利用の場合、クラスタごとに設定が必要です。 ↩