[OneLogin] 複数 AWS アカウントへの Assume Role で AWS CLI を利用する

先日、OneLoginを利用した複数AWSアカウント/IAMロールへのシングルサインオン(SSO)環境の構築を紹介しました。AWS CLI やアプリケーションからのAPI利用を複数AWSアカウントで実現したいと思います。
2018.04.10

こんにちは、菊池です。

先日、OneLoginを利用した複数AWSアカウント/IAMロールへのシングルサインオン(SSO)環境の構築を紹介しました。

OneLogin で複数 AWS アカウントへのシングルサインオン環境をつくる

この時は、許可されたアカウント/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基盤として多彩な機能を備えてますので、まだまだ応用ができそうです。今後も色々と試して紹介していきたいと思います。