[OneLogin] 複数 AWS アカウントへの Assume Role で AWS CLI を利用する
こんにちは、菊池です。
先日、OneLoginを利用した複数AWSアカウント/IAMロールへのシングルサインオン(SSO)環境の構築を紹介しました。
この時は、許可されたアカウント/IAMロールへのマネジメントコンソールへのログインを試しました。今回は、OneLoginを使って、AWS CLI や アプリケーションからのAPIの利用を複数AWSアカウントで実現したいと思います。
AWS CLI Assume Role
OneLoginを利用した、複数アカウントを切り替えたAWS CLI、APIアクセスの実現方法については、以下に紹介されています。
また、利用するアプリケーションについては、GitHubで公開されています。
このアプリケーションを利用してAWS CLIを複数アカウントで利用可能にします。
onelogin-aws-cli-assume-role を使ってみる
onelogin-aws-cli-assume-roleを試すため、設定していきます。
前提
前提として、以前紹介した複数AWSアカウントへのSSOが可能になっている必要があります。
また、利用する作業環境に、以下をダウンロード/インストールしておきます。今回は macOS High Sierra(10.13.4)で検証しています。
-
- AWS CLI
- JDK
- GitHubリポジトリの
onelogin-aws-assume-role-cli/dist/
にある以下をダウンロードonelogin-aws-cli.jar
onelogin.sdk.properties
クレデンシャルの作成
OneLoginをAPIから利用するために、アカウントのクレデンシャルを作成します。OneLoginにログインし、[DEVELOPERS]の[API Credentioals]を選択します。
クレデンシャルを新規作成します。
アカウント名を確認し、利用可能な権限を選択します。今回は、APIを経由したOneLoginの設定は行いませんので、[Authentication Only]で十分です。
発行されたクレデンシャルの[Client Secret]と[Client ID]を保存しておきます。
GitHubからダウンロードしたonelogin.sdk.properties
に、取得したクレデンシャルを記載し、保存します。
onelogin.sdk.client_id=831e449525f416ff9b79xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx onelogin.sdk.client_secret=1de2dd7a9ff27adeaexxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx onelogin.sdk.instance=
APIアクセスの有効化
OneLoginのAWS SSOアプリケーションで、APIによるアクセスが有効になっていることを確認します。[Configuration]の[API Connection]の項目が、EnabledになっていればOKです。
アプリケーションIDの確認
続いて、アプリケーションIDを確認します。[SSO]のページの各URLの末尾の数字がアプリケーションIDです。後ほど利用するため控えておきます。
動作確認
以上で準備ができましたので、onelogin-aws-cli.jarを実行してみます。
$ ls onelogin-aws-cli.jar onelogin.sdk.properties $ $ java -jar onelogin-aws-cli.jar OneLogin AWS Assume Role Tool 22:39:45.909 [main] DEBUG com.onelogin.sdk.util.Settings - properties file onelogin.sdk.propertiesloaded succesfully OneLogin Username:
OneLoginのユーザ名、パスワード、アプリケーションID、OneLoginアカウントのサブドメインが対話で聞かれますので、それぞれ入力していきます。
OneLogin Username: <username> OneLogin Password: <password> AWS App ID: <AppID> Onelogin Instance Sub Domain: <SubDomain>
OneLoginへの認証が正常に行われると、利用可能なIAMロール名・AWSアカウントIDが表示されます。ここも対話IFで利用したいロールとリージョンを選択します。
22:48:55.117 [main] DEBUG com.onelogin.saml2.authn.SamlResponse - SAMLResponse has attributes: {https://aws.amazon.com/SAML/Attributes/RoleSessionName=[username], https://aws.amazon.com/SAML/Attributes/Role=[arn:aws:iam::xxxxxxxxxxxx:role/onelogin-pu,arn:aws:iam::xxxxxxxxxxxx:saml-provider/OneLogin, arn:aws:iam::yyyyyyyyyyyy:role/onelogin-pu,arn:aws:iam::yyyyyyyyyyyy:saml-provider/OneLogin]} Available AWS Roles ----------------------------------------------------------------------- 0 | onelogin-pu,arn (Account xxxxxxxxxxxx) 1 | onelogin-pu,arn (Account yyyyyyyyyyyy) ----------------------------------------------------------------------- Select the desired Role [0-1]: 1 AWS Region (us-west-2):ap-northeast-1
成功すると以下のように表示され、一時認証情報であるトークン/アクセスキー/シークレットアクセスキーが取得できます。
----------------------------------------------------------------------- Success! Assumed Role User: arn:aws:sts::yyyyyyyyyyyy:assumed-role/onelogin-pu/username Temporary AWS Credentials Granted via OneLogin Copy/Paste to set these as environment variables ----------------------------------------------------------------------- export AWS_SESSION_TOKEN=FQoDYXdzENf//////////xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx== export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxx export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
取得できた一時認証情報を環境変数に設定し、指定したIAMロールが利用できるか、AWS CLIのget-caller-identity
コマンドで現在のID情報を確認してみます。
$ export AWS_SESSION_TOKEN=FQoDYXdzENf//////////xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx== $ export AWS_ACCESS_KEY_ID=xxxxxxxxxxxxxxxxxxxx $ export AWS_SECRET_ACCESS_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx $ $ aws sts get-caller-identity { "Account": "yyyyyyyyyyyy", "UserId": "xxxxxxxxxxxxxxxxxxxxx:username", "Arn": "arn:aws:sts::yyyyyyyyyyyy:assumed-role/onelogin-pu/username" }
指定したAWSアカウントのID、IAMロールとなっていればOKです。これで指定のIAMロールを使って、AWS CLI/APIが利用可能です。
まとめ
OneLoginを使った複数AWSアカウント/IAMロールの利用について、マネジメントコンソールに加えてAWS CLI、アプリケーションによるAPIアクセスもできることがわかりました。
OneLoginはSSO基盤として多彩な機能を備えてますので、まだまだ応用ができそうです。今後も色々と試して紹介していきたいと思います。