パブリッククラウドと 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: <下記のオーディエンス>
オーディエンスの値はデフォルトで以下の形式になります。
//iam.googleapis.com/projects/<Google CloudのプロジェクトID> \ /locations/global/workloadIdentityPools/<作成したWorkload IdentityプールのID> \ /providers/<作成したWorkload IdentityプールプロバイダのID>
-
Pod を作成する際に、
.spec.serviceAccountName
にこの ServiceAccount を指定します。 Pod 内で Google Cloud SDK を使うと、指定した ServiceAccount に紐づいた Google IAM サービスアカウントを借用して Google Cloud にアクセスします。 認証情報の有効期限はデフォルトで 24 時間です。Google Cloud SDK を使い続ける限り、自動で更新されます。
より詳細については gcp-workload-identity-federation-webhook の README をご覧ください。
-
PFCP の複数クラスタをご利用の場合、クラスタごとに設定が必要です。 ↩