🐈

Terraform CloudとAWSのOIDC連携

に公開

なぜOIDC連携が必要なのか

AWSリソースを操作するために「AWSアクセスキー と シークレットキー」を利用することもできます。しかし、アクセスキーとシークレットキーが長期間有効で使い回せるため、漏えいリスクが高く非推奨です。

この問題を解決するために、AWSとTerraform CloudがOIDCを使って認証を行う方法が提供されています。OIDC連携によって、一時的で使い捨てのトークンを用いるため、長期の資格情報を必要としません。

OIDC連携のフロー全体像

大まかな認証のシーケンスは以下のとおりです。

  1. Terraform CloudでOIDCトークンを発行
    Terraform CloudはJWT形式のOIDCトークンを生成し、AWSに送信します。

  2. AWSがOIDCトークンを検証
    AWSは、「Terraform Cloud (app.terraform.io)」をOIDC IDプロバイダーとして登録しており、トークン内の署名やクレーム情報を事前に取得した公開鍵 (JWKS) で検証します。

  3. AWSがSTSトークンを発行
    トークンが正しいと判断されると、AWSは一時的なSTS認証情報をTerraform Cloudに返却します。

  4. Terraform CloudがAWSリソースを操作
    Terraform Cloudは、取得したSTS認証情報を用いて必要なAWSリソースを操作します。

OIDC連携のフローを構築するための前提設定

細かい設定周りは割愛します。

  1. AWSでOIDCプロバイダーを作成
  2. AWSでIAMロールを作成(Trust Policy 設定)
  3. AWSで設定したIAMロールをTerraform Cloudの実行ロールに指定

1.AWSでOIDCプロバイダーを作成

Terraform Cloud (app.terraform.io) をOIDCプロバイダーとして登録

2.AWSでIAMロールを作成(Trust Policy 設定)

Terraformからの処理を実行するIAMロールを作成します。
信頼関係に下記のような設定をします。こうすることで、OIDCトークンの検証を可能にします。

例:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::<AWSアカウントID>:oidc-provider/app.terraform.io"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "app.terraform.io:sub": "organization_name/workspace_name",
          "app.terraform.io:aud": "https://app.terraform.io"
        }
      }
    }
  ]
}

3.AWSで設定したIAMロールをTerraform Cloudの実行ロールに指定

2で作成したIAMロールを利用してTerraformから実行する

app.terraform.io のIDプロバイダーって何?

Terraform Cloudが提供しているIDプロバイダーです。はOIDCの認可サーバーの役割を果たし、OIDCトークンを発行します。
AWS側では、そのトークンを 「このプロバイダーが発行した正当なもの」 と認識するために、OIDCプロバイダーを登録する必要があります。
これにより、AWSが「Terraform Cloudで発行されたトークンなら信頼してよい」と判断できるようになります。

AWSはどうやってOIDCトークンを検証しているのか?

  1. JWT署名の確認

Terraform Cloudはプライベートキーでトークンを署名。
AWSは、Terraform Cloudが公開している公開鍵 (JWKS) を使って署名を検証します。

  1. クレーム情報の確認

sub (Subject) や aud (Audience)、exp (有効期限) が正しいかチェックします。
例えば、AWS側で「sub = organization_name/workspace_name」の場合のみ認める、といったポリシーを設定できます。

  1. IDプロバイダーの設定

AWS IAMに「OIDCプロバイダー」として app.terraform.io を登録し、証明書のフィンガープリントを設定します。
AWSはここで登録された情報を元にトークンを検証するので、Terraform Cloudにリアルタイムで問い合わせる必要はありません。

Discussion