[AWS SSO] SAML認証で追加したアカウントへのsts一時認証キーの取得方法

[AWS SSO] SAML認証で追加したアカウントへのsts一時認証キーの取得方法


# AWS SSO SAML認証で追加したアカウントへのsts一時キーの取得方法

`AWS SSOってとにかく便利！　そう思っている今日このごろです`


今回はAWS SSOを使って２種類のアカウントへのアクセスkeyの取得を試しました


 - AWS organizations配下のアカウントをSSO配下に参加させるパターン
 - 別組織のアカウントをSAML認証によりSSO配下に参加させるパターン

![スクリーンショット 2019-11-29 9.01.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344266/102b1d74-2fd4-852b-4e40-571d71af5068.png)

## AWS organizations配下のアクセスkeyの取得

まず、こちらはすごく便利ですね。
コンソールからボタンポチポチで追加できますし、一時keyの発行もブラウザベースで簡単に可能です。

対象のアカウントを選択して
![スクリーンショット 2019-11-29 9.12.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344266/ec8f79b6-1e06-c5c1-d2ba-5d9d4b83539f.png)

`command line or programmatic access` をポチると

![スクリーンショット 2019-11-29 9.12.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344266/dc8d7e89-582f-4020-80c7-19ae43cba958.png)

これだけで一時アクセスkeyが取得できます。
ひじょーに簡単ですね。

`AWS CLI v2 がつい先日リリースされましたがSSOに対応しているのでもっと楽にできるかもしれませんね。`


## SAML認証により追加したアカウントのkeyの取得

今回の主題はこっちです。
SAML認証で別アカウントを追加した場合 この画面がありません。
その場合のアクセスkeyの取得方法です。
(※前提としてすでにSSO配下にアカウントが追加されいてるとします。[追加方法はこちら](https://docs.aws.amazon.com/ja_jp/singlesignon/latest/userguide/samlapps.html))

[そして今回解説する元記事はこちら (AWS CLI を使用して SAML 認証情報を呼び出し、保存する方法を教えてください。)](https://aws.amazon.com/jp/premiumsupport/knowledge-center/aws-cli-call-store-saml-credentials/)


### 簡単に書くと、以下の3つを準備します。

 1. IAM のプロバイダの ARN [※一度取得したら変わらない]
 1. ロール ARN [※一度取得したら変わらない]
 1. assume-role-with-samlを使用しますが、そこで使うSAML認証の情報の取得 [※都度取得必要]


#### 1. IAM のプロバイダの ARN
keyを取得したいアカウントのIAMから↓を取得

<img width="1061" alt="スクリーンショット 2019-11-29 9.38.23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344266/8fd9a789-4741-67c6-6680-0f35b3e299c6.png">

#### 2. ロール ARN
keyを取得したいアカウントのIAMから↓を取得
(注： 最大セッション期間は任意に設定してください)

<img width="1176" alt="スクリーンショット 2019-11-29 9.45.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344266/77b92f42-f27f-72dc-8366-ee6e00bee520.png">

#### 3. SAMLの認証情報の取得

問題はこれです。
SAMLの認証情報ってどうやって取るんや。。。って話ですね。

google chromeなら↓で取れます。 NetworkのPreseverlogをOnにした状態で、
SSOからアカウントを選択し、その瞬間に検証を有効にするとsamlという　名前の行があります。


[他ブラウザはこれを参照](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/troubleshoot_saml_view-saml-response.html)

<img width="1073" alt="スクリーンショット 2019-11-29 9.49.52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344266/8a270508-b89c-aa67-ce5e-89b4388167ed.png">

ただこれを表示させるには、スピードとタイミングが命です！　遅いとでてきませんw
↑を選択して下の方に、SAMLResponse:があります。超長いですが全部コピります。

<img width="1192" alt="スクリーンショット 2019-11-29 9.54.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344266/4f88e2cc-75e5-3bf7-218d-ca89fbd4e802.png">

手順的にかなり大変なので、google 拡張の [SAML-Trancer](https://chrome.google.com/webstore/detail/saml-tracer/mpdajninpobndbfcldcmbpnnbhibjmch) というのを使わせていただくと割と
簡単に取得できます。

<img width="792" alt="スクリーンショット 2019-11-29 9.57.51.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344266/b038b3a8-b342-8189-5243-a22defa16ef2.png">



#### 1〜3の情報を元にcliを使い一時認証keyを発行します。

aws cliがインストールされている環境で以下bashを実行します

(多分awkの中のRSが参考にしたサイトは間違っている？　ので自分で実装しました)
注：SAML取得後 5分以内に取得しないと、タイムオーバでkeyの取得に失敗します

```bash

#!/bin/bash

prvider_arn="arn:aws:iam::xxxxxxx:saml-provider/xxxx" # 1.の値
role_arn="arn:aws:iam::xxxx:role/xxxxx"  # 2.の値

saml_response=$(cat ./saml_data) # 3.の値をsaml_dataというファイルに貼り付けています
seconds="43200"  # 認証keyの有効時間です。 ロールの最大時間をオーバするとエラーになります

aws sts assume-role-with-saml --role-arn ${role_arn} --principal-arn ${prvider_arn} --saml-assertion ${saml_response} --duration-seconds ${seconds} |
awk -F':'  '
　　　　　　　　　BEGIN { print "[account]"}
　　　　　　　　　/:/{ gsub(/"/, "", $2) }
　　　　　　　　　{ gsub(/,/, "", $2) }
　　　　　　　　　/AccessKeyId/{ print "aws_access_key_id = " $2 }
　　　　　　　　　/SecretAccessKey/{ print "aws_secret_access_key = " $2 }
　　　　　　　　　/SessionToken/{ print "aws_session_token = " $2 }
'

exit
```

実行結果

```
$ ./sample.sh
[account]
aws_access_key_id =  ASIAXXXXXXXXXXXXXXXX
aws_secret_access_key =  NjXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
aws_session_token =  
FwoGZXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX=
$
```

これを~/.aws/credentialsにはりcliを発行すると接続ができるようになります！

```
試しにs3をlsしてみます。 　問題なくバケットの一覧が返ってきました ！
$ aws --profile account s3 ls
2019-08-09 13:42:23 xxxxxxxx
2019-09-24 17:00:25 xxxxxxxx
(略)
]$
```

以上がkeyの発行手順になります。

`SAML認証で追加したアカウントのkeyの発行は結構めんどくさいですね。`
慣れると結構時間をかけずにできるようになりますw  (いいのか...？)


できれば、AWS organizations配下にアカウントを作るほうがメンテが楽なのでおすすめします。
やむを得ずの方はこの方法をお試しください。

今回はAWS SSOに関する記事が少なかったので記載しました
よかったら いいね お願いします。

では、よいAWSライフを！