Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

パブリッククラウドと ID 連携を構成する

パブリッククラウドのリソースへのアクセスに使う鍵は強力な認証情報であり、外部への持ち出しはセキュリティリスクがあります。 鍵を持ち出さずにパブリッククラウドのリソースを利用するために、PFCP ではパブリッククラウドとの ID 連携をサポートします。 ID 連携を使用すると、Kubernetes クラスタの ServiceAccount に対してパブリッククラウドの権限が付与され、アクセスが可能になります。

ここでは、Amazon Web Service(以下、AWS)と Google Cloud の 2 種類のパブリッククラウドについて、ID 連携を組む方法について紹介します。

AWSとの連携

AWS 側の設定

  1. 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
    • 許可するオーディエンス: sts.amazonaws.com
  2. AWS へのアクセスに使用する IAM ロールを作成します。この IAM ロールは、ID 連携により Kubernetes ServiceAccount に紐づけて使用します。

  3. 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>"
                }
            }
        }]
    }
    
    Warning

    Conditionの設定を必ず記述してください。忘れると、他の組織を含むすべての ServiceAccount に対して権限が付与されてしまいます。

  4. AWS では、Cloud Trail による ID 連携の監査ログがデフォルトで有効になっており、90 日間保存されます。90 日を超えて監査ログを保存しておきたい場合は、AWS アカウント の証跡の作成 - AWS CloudTrail を参照し設定を変更します。

Kubernetesクラスタ側の設定

  1. 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}"
    
  2. Pod を作成する際に、 .spec.serviceAccountName にこの ServiceAccount を指定します。 Pod 内で AWS SDK を使用すると、ServiceAccount に紐づいた AWS IAM Role を用いて AWS にアクセスします。 セッショントークンの有効期限は 1 時間です。AWS SDK を使い続ける限り自動で更新されます。

  3. 動作確認をします。まず、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 を参照し、以下の設定をおこないます。

  1. アクセスしたい Google Cloud プロジェクト内に Workload Identity のプールとプロバイダを作成します。

    • 発行元 URL
      • SR1-01 クラスタ: https://token.sr1-01.kubernetes.pfcomputing.com
      • IK1-01 クラスタ: https://token.ik1-01.kubernetes.pfcomputing.com
  2. Google Cloud へのアクセスに使用する Google IAM サービスアカウントを作成し、許可するリソースに対するアクセス権を付与します。このサービスアカウントは、ID 連携により Kubernetes ServiceAccount に紐づけて使用します。

  3. 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 クラスタ側の設定

  1. 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>
    
  2. Pod を作成する際に、 .spec.serviceAccountName にこの ServiceAccount を指定します。 Pod 内で Google Cloud SDK を使うと、指定した ServiceAccount に紐づいた Google IAM サービスアカウントを借用して Google Cloud にアクセスします。 認証情報の有効期限はデフォルトで 24 時間です。Google Cloud SDK を使い続ける限り、自動で更新されます。

より詳細については gcp-workload-identity-federation-webhook の README をご覧ください。


  1. PFCP の複数クラスタをご利用の場合、クラスタごとに設定が必要です。