Terraform CloudとAWSのOIDC連携
なぜOIDC連携が必要なのか
AWSリソースを操作するために「AWSアクセスキー と シークレットキー」を利用することもできます。しかし、アクセスキーとシークレットキーが長期間有効で使い回せるため、漏えいリスクが高く非推奨です。
この問題を解決するために、AWSとTerraform CloudがOIDCを使って認証を行う方法が提供されています。OIDC連携によって、一時的で使い捨てのトークンを用いるため、長期の資格情報を必要としません。
OIDC連携のフロー全体像
大まかな認証のシーケンスは以下のとおりです。
-
Terraform CloudでOIDCトークンを発行
Terraform CloudはJWT形式のOIDCトークンを生成し、AWSに送信します。 -
AWSがOIDCトークンを検証
AWSは、「Terraform Cloud (app.terraform.io)」をOIDC IDプロバイダーとして登録しており、トークン内の署名やクレーム情報を事前に取得した公開鍵 (JWKS) で検証します。 -
AWSがSTSトークンを発行
トークンが正しいと判断されると、AWSは一時的なSTS認証情報をTerraform Cloudに返却します。 -
Terraform CloudがAWSリソースを操作
Terraform Cloudは、取得したSTS認証情報を用いて必要なAWSリソースを操作します。
OIDC連携のフローを構築するための前提設定
細かい設定周りは割愛します。
- AWSでOIDCプロバイダーを作成
- AWSでIAMロールを作成(Trust Policy 設定)
- 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トークンを検証しているのか?
- JWT署名の確認
Terraform Cloudはプライベートキーでトークンを署名。
AWSは、Terraform Cloudが公開している公開鍵 (JWKS) を使って署名を検証します。
- クレーム情報の確認
sub (Subject) や aud (Audience)、exp (有効期限) が正しいかチェックします。
例えば、AWS側で「sub = organization_name/workspace_name」の場合のみ認める、といったポリシーを設定できます。
- IDプロバイダーの設定
AWS IAMに「OIDCプロバイダー」として app.terraform.io を登録し、証明書のフィンガープリントを設定します。
AWSはここで登録された情報を元にトークンを検証するので、Terraform Cloudにリアルタイムで問い合わせる必要はありません。
Discussion