サーバレスに OpenID Connect で AWS にサインイン

準備

$ git clone https://github.com/asannou/aws-signin-with-oidc
  • 適当な S3 バケット名を決め terraform.tfvars に書き込みます
  • Google Cloud Platform から、適当なプロジェクトを作り "OAuth クライアント ID" の API 認証情報を作成します
    • "OAuth 同意画面" でサービス名の設定が必要な場合がありますが、適当に入力します
    • "クライアント ID の作成" でアプリケーションの種類から "ウェブアプリケーション" を選択します
    • 適当に名前を決めて作成します
    • "クライアント ID" が表示されるので terraform.tfvars に書き込みます
  • Dev と Admin という IAM ロールがあるので、それぞれサインインを許可するユーザのメールアドレスを terraform.tfvars に書き込みます
    • Dev は ReadOnlyAccess ポリシー、Admin は AdministratorAccess ポリシーがアタッチされます
    • ここは適宜 カスタマイズ してください
  • 最終的にこのような感じになります
$ git diff
diff --git a/terraform.tfvars b/terraform.tfvars
index 2d3d635..ec5d990 100644
--- a/terraform.tfvars
+++ b/terraform.tfvars
@@ -1,17 +1,17 @@
 aws_region = "us-east-1"

-s3_bucket = "bucketname"
+s3_bucket = "aws-signin-with-oidc"

 client_id = {
-  google = "000000000000-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com"
+  google = "689439588880-vmco4me6g34au0h43ao9tbkb3slgffht.apps.googleusercontent.com"
 }

 email = {
   dev = [
-    "dev@example.com",
+    "asannou@gmail.com",
   ]
   admin = [
-    "admin@example.com",
+    "asannou@gmail.com",
   ]
 }
  • terraform を適用します
$ terraform apply
...
google = {
  admin = https://aws-signin-with-oidc.s3.amazonaws.com/google?role=arn:aws:iam::123456789012:role/Admin
  dev = https://aws-signin-with-oidc.s3.amazonaws.com/google?role=arn:aws:iam::123456789012:role/Dev
}
origin = https://aws-signin-with-oidc.s3.amazonaws.com

利用

    • できない場合は、反映が遅れている可能性があるため、少し待って再度試してください
  • AWS CLI を使用する際は、URL の末尾に &export=1 をつけて認証をおこなうと、ブラウザに環境変数が表示されます
    • 環境変数を設定すると、同等の権限で AWS CLI を実行することが可能です
$ export AWS_ACCESS_KEY_ID=ASIAIOSFODNN7EXAMPLE; export AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY; export AWS_SESSION_TOKEN=AQoDYXdzEJr...
$ aws sts get-caller-identity
{
    "Account": "123456789012",
    "UserId": "AROAIOSFODNN7EXAMPLEU:asannou@gmail.com",
    "Arn": "arn:aws:sts::123456789012:assumed-role/Dev/asannou@gmail.com"
}

雑感

  • SAML であれば、ネイティブで AWS コンソールへのサインインが提供されているが…
    • SAML ID プロバイダの少なさ(Google でいいのだが G Suite でのみ利用可)
    • ロールの指定はプロバイダ側の属性付与が必要(AWS のみで完結しない)
    • CLI で使うときは スクレイピング ってまじか
  • そういった事情により OpenID Connect 採用
    • Implicit Grant Flow なんて、バックエンドで検証しなきゃいけないし一生使わねえと思ってたけど、まるでサーバレスのために用意されていたかのよう
    • G Suite 環境では OAuth の濫用が懸念だったが、昨日解決した