👷

IAM Identity Center ユーザーで Terraform を使う

2023/09/05に公開

この記事はIAM Identity Centerへのざっくりとした理解がある方を対象にして書かれています。Identity Centerの基本概念を理解されたい方は公式ドキュメントを参照してください。
https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html

はじめに

IAM Identity Center (旧称AWS SSO)の導入事例が増えている。筆者の職場でも、2022年12月から半年間の試験運用を経て、本年(2023)5月頃からdevユーザーに対してAWS CLIや各種AWS SDKを利用する際にSSOでのサインインを求めることを強制する運用に入った。具体的には、基幹MS365のMicrosoft Entra (旧称: Azure AD) での認証を、AWS CLI/SDK によるプログラマティックなアクセスの際に義務付けている。
運用目線では、CLIの認証に「人の手」が介在することや一元的にMFAが適用できること、IdP経由で監査情報を集約できることなどが大きな利点と言えると思う。

(所属人員が多い現場では、IAMアカウント管理負荷の低減につながることも大きなメリットと言える。)

Identity Center ユーザーでも Terraform を使えるか

結論から言えば、使える。
ただし、適切な許可セットを事前に作成しておく必要があり、terraformに対してはAWS_PROFILE環境変数を引き渡す必要がある。

Terraform ユーザー目線でみた Identity Center の一般的な利用フロー

典型的なクラウド開発者Aのterraform業務フローを想定する。

$ git pull
# or `git clone https://git.example.com some-aws-infra-project && cd some-aws-infra-project`

$ terraform init  # 1
$ terraform plan  # 2

# edit some files

$ terraform apply # 3

番号をつけた。このうち(1)については、認証不要の手順であり、ここでは考慮しない。

問題は 2 および 3 だ。普通はVaultなどのシークレットストアからクレデンシャルを取り出して用いるなどする(ないしは復号した平文のデフォルト認証情報をホームディレクトリから読む)が、Identity Center ユーザーの認証情報は別ファイルとして生成されるため、そのままではTerraformが読み込むことができない。

開発者Aが Identity Center へのサインインをする場合の流れを確認してみよう,

$ aws configure sso
SSO session name (Recommended): devsso
Attempting to automatically open the SSO authorization page in your default browser.
If the browser does not open or you wish to use a different device to authorize this request, open the following URL:

https://device.sso.ap-northeast-1.amazonaws.com/

Then enter the code:
H0G8-H4CK
# ブラウザがある場合は上記URLをブラウザが開くので、表示された認証コードを入力する...

The only AWS account available to you is: YYYYYYYYYYYYYYY
Using the account ID YYYYYYYYYYYYYYY
The only role available to you is: xxxxx-role
CLI default client Region [None]: ap-northeast-1
CLI default output format [None]: json
CLI profile name [xxxxx-role-YYYYYYYYYYYYYYY]:

To use this profile, specify the profile name using --profile, as shown:

aws s3 ls --profile xxxxx-role-YYYYYYYYYYYYYYY 

最後の数行に注目してほしい。AWS CLI (v2) は、AWSプロフィールに認可情報を設定してくれているわけだ。したがってこのプロフィールを参照しさえすれば、terraformは認証情報を利用できる。

AWS_PROFILE=xxxxx-role-YYYYYYYYYYYYYYY 
export AWS_PROFILE
terraform plan

#... many output here

許可セットについて

読者は IAM Identity Center ないしはIAM基盤の管理運用経験があることを想定しているため、詳細については述べない。許可セットは基本的にはIdentity Centerユーザーに対するIAMロールのようなものだが、Identity Center Userに対するアクセス権限として、IAMポリシの束を割り当てるものだ。
すでにIAMユーザーに対する体系的な権限管理の仕組みを実現している現場では、IAM Identity Center ユーザーの許可セットも同様の手法で構築・管理できるだろう。
(もちろんIAMユーザー管理用のツールをそのまま流用できる訳ではないが...)

スタッフに最小特権でのアクセスのみを与えるためには、対象ユーザーの職権に応じて、事前に適切な許可セットを作成しておくなどの措置が必要だ。
なお、SCIMを有効化したADをIdPとするユーザーには、ユーザーの属性情報に応じたアクセス制御を行える仕組みが設けられている。

https://docs.aws.amazon.com/singlesignon/latest/userguide/configure-abac-policies.html

許可セットのポリシやパーミッション境界として、aws:PrincipalTagを用いてユーザー属性を参照する条件指定をしておけば、基幹(AD)で設定済みの職位や権限(グループへの所属等)属性と一貫性ある形で、ユーザー属性に応じてリソースアクセスの範囲を制限できる。Identity Center における権限管理の効率化・明確化を実現するうえで力を発揮する仕組みと言えるだろう。

Ref

https://docs.aws.amazon.com/singlesignon/latest/userguide/permissionsetsconcept.html
https://docs.aws.amazon.com/singlesignon/latest/userguide/attributemappingsconcept.html
https://repost.aws/questions/QUgd8bMJKIRRqgSof0ksVKbA/using-terraform-with-aws-sso-accounts

Discussion