Auth0をAWSのIDプロバイダーとして利用しつつアクセスキーを取得する(binxio / auth0-login)

2021.01.12

以前ブログで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 を試す

前提条件

なお、クライアントは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レスポンスを調べて保存する工程が省かれたのでかなり実用的ではないかと思います。

他にも便利そうなツールがあったら教えてください