Edited at

Azure AD連携したAWSアカウントでaws-cliを使う

Azure AD連携をしてAWSを利用している会社もあるかと思います。

そのときにaws-cli使うのが面倒すぎたので自動化するツールを作りました。

適当なIAM User作ればよいという話もありますが、個別に全員分発行するのは面倒だし全員で同じアカウント使い回すのも微妙だし、退職者管理とかも考えるとAzure AD連携を活かせるほうが良いかなと思います。

※2019/01/08 追記: tokenの有効期限が固定になっていたので設定で渡せるようにしました


概要

あまり詳しくないですが、Azure AD連携の場合はSAMLを利用しているかと思います。

なのでSAMLのXMLを持ってきてassume-role-with-samlをすれば一時的セキュリティ認証情報が取得できます。

やり方は以下に書いてあるとおりです。

https://aws.amazon.com/jp/premiumsupport/knowledge-center/aws-cli-call-store-saml-credentials/

ただaws-cliはほぼ毎日使うものなのに毎回SAMLレスポンスを手動で持って来るのはしんどすぎたので自動化しました。

ツールを実行するとChromeが起動し、そこでOffice365などにログインすると勝手にSAMLレスポンスを拾ってきてassume-role-with-samlしてくれます。

Chrome経由なのでMFAなどでも問題なくログインできます。

やってるのはそれだけです。


詳細

リポジトリは以下です。

https://github.com/knqyf263/azaws


Installation

バイナリもReleaseに上げてあるので該当するアーキテクチャのバイナリを適当に落としてきて /usr/local/bin とかに置けば動くと思います。

goがインストールされている場合は

$ go get -u github.com/knqyf263/azaws

で良いです。


使い方


設定

まず最初にAzureでログインするための設定をする必要があります。

具体的にはTenant IDとApp ID URIが必要です。

これは管理者の人であれば画面ポチポチしていれば手に入ると思います。

https://www.syuheiuda.com/?p=3586

自分は管理者じゃなかったので困ったのですが、SAMLレスポンスの中に入っているのでデコードすれば手に入ります。

Chromeでデベロッパーツールを開いてNetworkタブでSAMLレスポンスを探します。

別タブで開かれて瞬時にredirectされるのでNetworkタブで見るの難しかったのですが、以下の記事の方法で別タブでもデベロッパーツールが自動で開かれるようにできます。

https://qiita.com/takenobi/items/50cb459db1abc75f8092

あとは開いたら「Preserve log」にチェックを入れれば記録できるかと思います。

https://developers.google.com/web/tools/chrome-devtools/console/?hl=ja#preserve-log

DevTools_-_signin_aws_amazon_com_saml_と_Amazon_Web_Services_Sign-In.png

SAMLレスポンスを見つけたらあとはBase64デコードすれば良いです。

デコードされたXMLの中の tenantid のところに書いてあるのがTenant IDで、 Audience のところに書いてあるのがApp ID URIです。

Tenant ID等が手に入ったらコマンドで設定しておきます。

$ azaws --configure

Azure Tenant ID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Azure App ID URI: https://signin.aws.amazon.com/saml?XXXXXXXXXXXX
Session Duration Hours (up to 12): 6


ログイン

上でconfigureが終わっていればコマンドを実行するとChromeが起動します。

そこで普段どおりログインすれば ~/.aws/credentials に一時的セキュリティ認証情報が保存されます。

そのときに使うprofile名はコマンドラインオプションで指定可能です。

また、assumeするroleも指定しておく必要があります。

$ azaws --role admin --profile test


aws-cli

上のコマンドが正常に実行されれば ~/.aws/credentials に[test]のセクションが作られているはずです。

あとは通常通りawsコマンドが実行可能です。

$ aws sts get-caller-identity --profile test


オプション

他にも -user-data-dir のオプションもあります。

これはChromeのprofileを保存しておくpathになります。

2回目以降はAzure ADのセッションが切れていなければChromeが勝手にログインしてくれるのでパスワード等を打つ必要がなくなります。

初回ログイン時に「パスワードを保存」などにチェックを入れておけば次以降の起動はパスワードが埋まった状態になるのでログインボタンだけ押せばよいです。

ただデフォルトでは /tmp/azaws に作るようにしているためPCを再起動すると消えます。

PC再起動しても残しておきたい場合は$HOMEの下とかApplicationsの下とか適当な場所を指定しておくと良いです。

Usage of azaws:

-configure
Configure options
-profile string
AWS profile name (default "azaws")
-role string
AWS role name (required)
-user-data-dir string
Chrome option (default "/tmp/azaws")


まとめ

CLIにID/PW渡すの嫌がる人いるかもな、と思ってChrome DevTools Protocolを使ってGUIで実現しているところがアピールポイントです。

ただいちいちGUI立ち上がるのうざいので --no-gui 的なやつ作っても良いなと思ってます。

AWSをAzure ADと連携してる人たちが世の中にどのぐらいいるか分からないのですが、自分は捗りまくるようになったので満足です。