IAMのWeb Identity Federationの理解にPlaygroundを試したら捗った

IAMのWeb Identity Federationが便利そうだけどどういう仕組みかがよくわからないってなりませんか。
用語がたくさんあったり若干入り組んでいるので私は苦しみました。苦しみながら ドキュメント を読んでいたらWeb Identity Federation Playgroundが理解に役立つと書いてありました。
なので実際に試してみました。

Web Identity Federationとは

AWSリソースにアクセスするにはアクセスキーが必要になりますよね。
AWS CLIとかでアクセスキーを使用するのであればIAM ユーザーを作成して設定すれば問題ないですが、モバイルアプリやWebアプリに対して直接アクセスキーを埋め込むことは推奨できる行為ではありません。
また独自のIDをAWS側で管理したりカスタムサインインコードを書くのも非常に手間です。

これらの問題をさけつつAWSリソースに対するアクセスを許可させる方法がWeb Identity Federationで、 OpenID Connect(OIDC)互換のId Provider(IdP)で認証した後にIdPが発行するトークンを元にAWSリソースへの一時的なアクセス権限を発行することで実現します。

Web Identity Federation Playgroundを試してみた

ざっくりと理解したところで実際にどのように動くかを確認してみましょう。
標題の通りなのですがWeb Identity Federation Playgroundで簡単に確認できます。

IdPで認証を行う

サイト上だとAmazon、Google、Facebookアカウントでのみ認証ができるようになっているのでいずれかを選択して認証を行います。
左側のログインボタンを押して今回はAmazonアカウントで認証を行ってみました。

認証が完了してアクセストークンが返ってきたらこのフェーズは完了です。灰色で隠している部分に実際はアクセストークンが書いています。

一時的なセキュリティ認証情報の取得

先ほどIdPから受け取ったアクセストークンを元にAWSアカウントから一時的なセキュリティ認証情報を取得します。
言い換えるとアクセストークンを使用して対象AWSアカウントに対してSTSのAssumeRoleWithWebIdentityをコールしています。
ここについてよくわからない場合は こちらの記事 をご参照ください。
STSを使用していることから、一時的なセキュリティ認証情報として期限付きのアクセスキー、シークレットアクセスキー、セッショントークンが返ってくることがレスポンスでも確認できますね。

今回の場合はAmazonアカウントで認証を行っているので信頼関係は下記のドキュメントで作成されています。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Federated": "www.amazon.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "www.amazon.com:appId": "amzn1.application.AmazonAccountIdHere"
       }
      }
    }
  ]
}

また今回は既に設定済みのものを使用しているので設定はしていませんが実際はIAM側での設定が必要になります。
IdPの設定や必要権限を保持したIAM Roleの作成、信頼関係を結ぶためのポリシー作成など様々ありますので詳しくは ドキュメント をご参照ください。

AWSリソースへのアクセス

AWSリソースへのアクセスができるようになったところで実際にアクセスしてみましょう。
今回は下記のポリシーがIAM ロールに付与されており実際にWeb上でもListBucketというボタンがあるので押してリクエストを投げてみます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "s3:GetObject"
      ],
      "Sid": "Stmt1374684569000",
      "Resource": [
        "arn:aws:s3:::web-identity-federation-playground/*"
      ],
      "Effect": "Allow"
    },
    {
      "Action": [
        "s3:ListBucket"
      ],
      "Sid": "Stmt1374684915000",
      "Resource": [
        "arn:aws:s3:::web-identity-federation-playground"
      ],
      "Effect": "Allow"
    }
  ]
}

問題なくレスポンスが返ってきてますね。

さいごに

Amazon S3 Transfer Acceleration Speed Comparison のような実際に試して確認できる非常にわかりやすいツールでした。
みなさんもぜひ試してみてください。

参考資料