Auth0をAWSのIDプロバイダーとして利用しつつアクセスキーを取得する(binxio / auth0-login)
以前ブログでAuth0をSAML-ID-ProviderとしてAWSに登録してマネージメントコンソールにログインする方法を書きました。
この構成を採用しつつ、ログインしたRoleの権限でAWS Cliを実行するにはどうするんだろう?と疑問に思ったので調べてみました。
AWS公式のドキュメントによると、AWS CLI を使用して AssumeRole 呼び出しを行い、一時的なユーザー認証情報を保存する方法が記載されています。
実際この方法で可能なのですが、AWSのマネージメントコンソールにログインするときのSAMLレスポンス取得が結構面倒でした。
※ SAMLレスポンスの例
ブラウザの開発ツールを使ってリクエストを調べる、SAML-Tracerなどのブラウザ拡張機能を使って取得する方法が取れます。
もっと楽したいなと思い、いろいろ調べているうちに、githubに binxio/auth0-login
というCliツールがあったので、これも試してみます。
※ Auth0、OAuth、SAMLを使用してJWT、SAMLトークン、AWS認証情報を取得するCLI
binxio / auth0-login を試す
前提条件
- Auth0をAWSと統合してSAMLでログインできる状態
なお、クライアントはMacOSのターミナルツールで行いました。
Auth0にアプリケーションを登録する
auth0-loginを使用するため、Auth0にアプリケーションを登録します。
- シングルページアプリケーション
- SAML2 Web Appアドオンを有効
- Allowed Callback URLsに
http://localhost:12200/saml
を設定
が必要となります。
SAML2 Web Appは,アプリケーション詳細画面のAddonsタブをクリックして有効にできます。
SAML2 Web Appをクリックし、SettingsタブにあるSAML構成コードをSettings
欄に貼り付けます。
※ 貼り付ける構成コード
{ "recipient": "https://signin.aws.amazon.com/saml", "audience": "https://signin.aws.amazon.com/saml", "mappings": { "email": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress", "name": "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name" }, "createUpnClaim": false, "passthroughClaimsWithNoMapping": false, "mapUnknownClaimsAsIs": false, "mapIdentities": false, "nameIdentifierFormat": "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent", "nameIdentifierProbes": [ "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress" ] }
Auth0のRulesを修正
Auth0第一歩 ~複数のAWSアカウントにSAML認証でシングルサインオン~ の記事の中で作成したRulesを編集します。
2行目から4行目で行っているclientIDのチェックに、先ほど作成したAuth0にアプリケーションのクライアントIDも追加しておくだけです。
※ 例
if(context.clientID !== '[YOUR_CLIENT_ID_HERE]' || context.clientID !== '[NEW_YOUR_CLIENT_ID_HERE]'){ return callback(null, user, context); }
auth0-loginの構成設定
~/.saml-login
ファイルを以下の内容で作成します。
[DEFAULT] idp_url = https://<auth0-tenant>.auth0.com client_id = <作成したAuth0アプリケーションのClientID>
~/.aws-accounts
を以下の内容で作成します。
エイリアスを設定してAWSアカウントをわかりやすくする目的で行いますが、設定をしなくても動作はします。
[DEFAULT] <aws-account-alias> = <aws-account-number>
複数のアカウントを使用する場合はその分だけ追記します。
auth0-loginをインストール
ターミナルで以下のコマンドを実行してインストールします
pip install auth0-login
※ インストールされたか確認
$ saml-login --help Usage: saml-login [OPTIONS] COMMAND [ARGS]... A command line utility to obtain SAML tokens and AWS credentials. Options: --verbose for tracing purposes -c, --configuration TEXT configured in .saml-login to use --help Show this message and exit. Commands: aws-assume-role get AWS credentials using the obtained SAML token and... get-token gets a SAML response token from the SAML Provider and...
利用可能なすべてのAWSロールを表示してみる
設定とツールのインストールが完了したので、動作チェックしてみます。
saml-login aws-assume-role --show
上記コマンドを実行すると、
このようにブラウザが立ち上がって認証されます。
URLはAllowed Callback URLsに指定した http://localhost:12200/saml
になっていますね。
認証が完了すると、ターミナルには上記のように使用可能なすべてのAWSロールが表示されるので、これを ~/.saml-login
ファイルに追記します。
AWSアクセスキーの取得
利用可能なすべてのAWSロールを~/.saml-login
に追加したので、これでAWSアクセスキーを取得できるようになります。
saml-login -c <ロール名>@<AWSアカウントのエイリアス> aws-assume-role
認証が成功すると、アクセスキーの情報が ~/.aws/credentials
にプロファイルが追記されますので、ファイルを開いて確認してみましょう.
aws cliでコマンド実行
追記されたプロファイル名を使ってコマンドを実行できるようになりますので色々試してみてください。
aws <command> --profile <追記されたプロファイル名>
最後に
auth0-loginというコマンドラインツールを使ってSAMLログインし、AWS認証情報を取得してみました。
SAMLレスポンスを調べて保存する工程が省かれたのでかなり実用的ではないかと思います。
他にも便利そうなツールがあったら教えてください