サーバレスに OpenID Connect で AWS にサインイン
- サーバレスの言葉の意味を理解していませんが、「サーバインスンタンスを使わない」程度に思っておきましょう
- サーバインスタンスを使わずに、Google の OpenID Connect による認証で AWS マネジメントコンソール | AWS へのサインインおよび AWS コマンドラインインターフェイス(CLI - AWS サービスの制御・管理)|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
- 出力された origin を、先ほどの Google Cloud Platform のウェブアプリケーションを開き "承認済みの JavaScript 生成元" に追加して、準備は完了です
利用
- 出力された https://aws-signin-with-oidc.s3.amazonaws.com/google?role=arn:aws:iam::123456789012:role/Dev をブラウザでアクセスすると、OAuth 同意画面を経由して、AWS コンソールに Dev ロールでサインインできるはずです
-
- できない場合は、反映が遅れている可能性があるため、少し待って再度試してください
- AWS CLI を使用する際は、URL の末尾に &export=1 をつけて認証をおこなうと、ブラウザに環境変数が表示されます
$ 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 コンソールへのサインインが提供されているが…
- そういった事情により OpenID Connect 採用
- Implicit Grant Flow なんて、バックエンドで検証しなきゃいけないし一生使わねえと思ってたけど、まるでサーバレスのために用意されていたかのよう
- G Suite 環境では OAuth の濫用が懸念だったが、昨日解決した
社員がG Suiteと併用してもよいサードパーティアプリケーションをアドミンが管理できるようになる | TechCrunch Japan @asannou https://t.co/u0VDvceeg5
— nov matake (@nov) 2017年8月2日
- フェデレーションユーザーに対して AWS マネジメントコンソール へのアクセスを許可する URL の作成(カスタムフェデレーションブローカー) - AWS Identity and Access Management が CORS に対応していないせいで、API Gateway まで使う羽目になった