Okta→AWSコンソールのSSO（SAML）とプロビジョニング

# AWSのSSOとプロビジョニングについて
OktaでAWSコンソールにSSOとプロビジョニングする方法を記述します。
ユーザープロビジョニングというとIDPでアカウントを作成するとSP（service provider）側にもアカウントが作成され同期されるという認識でしたが、AWSにおいてはSSOするときにそのセッションにロールを付与し、仮想のIAMユーザーを作成し、接続させることをプロビジョニングとしています（と私は思っています）。SSOするIAMユーザーは実際に作成されることはありませんので、セッションが切れればIAMも情報も消えます。当然、IDPでアカウント削除した後、IAMユーザーの削除し忘れも発生しません。

:::note info
因みにAWS CloudTrailに証跡は残ります。
:::

## 前提
- AWSアカウント作成済み（IAM ユーザー、ロール、ポリシー、IDプロバイダーの作成権限が必要です。）
- Oktaアカウント作成済み

## Oktaにアプリケーションを追加
Oktaの管理画面から「Applications」>「Applications」>「Browse App Catalog」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/0dc16e69-150d-64cc-229a-1b926e1318df.png)
検索ボックスに「aws」などと入力し「AWS Account Federation」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/06212db3-2e7c-f1d5-b245-8925206ccb02.png)
「Add」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/dc27a63d-91e8-408c-9a33-c32e032e1857.png)
そのまま「Next」をクリックします。「Application Label」や「Login URL」はあとで変更可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/37cc24f9-1c5e-283b-34b9-64757594285d.png)
「SAML 2.0」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/53e57e43-3db7-ade5-f2ac-a124d6104755.png)
その他はとりあえずそのままで「Done」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/5e05901f-b02c-5020-2e28-ec8bf36cf564.png)
これでOktaにアプリケーションが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/e7b4215b-aaa8-501e-f627-c99229b32a80.png)
AWSのIDプロバイダ登録に使用するためリンク先をxmlでダウンロードしておきます。
「Sign On」タブ > 「Identity Provider metadata」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/d2aab04e-0c7e-a030-7a3f-ada285926037.png)

## AWS IAMリソース作成
### IDプロバイダ作成
「IAM」 > 「アクセス管理」 > 「IDプロバイダ」 > 「プロバイダを追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/2b4fb748-273e-ce39-f78e-a0337117f3aa.png)
「SAML」を選択
「プロバイダ名」に任意の名前（e.g. Okta）
「メタデータドキュメント」にOktaで先ほどダウンロードしたXMLメタデータをアップロードします。
「プロバイダを追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/aa9b0c7b-bc5b-23f1-93a0-5fe00b9cc9f0.png)
IDプロバイダにOktaが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/776633b8-544d-9e20-077a-dbd322821369.png)

## IAMロール作成
SSOした時の権限付与するロールを作成します。
「IAM」 > 「アクセス管理」 > 「ロール」 > 「ロールを作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/d1aa5f86-2e10-40e2-7b40-c641d3ea82ac.png)
「SAML 2.0 フェデレーション」を選択
「SAMLプロバイダー」に先ほど作成した__Okta__を選択
「プログラムによるアクセスと AWS マネジメントコンソールによるアクセスを許可する」を選択
「次のステップ：アクセス権限」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/8897013f-10eb-9ab9-99f2-267c8e8e8a6a.png)
「次のステップ：タグ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/b02145ae-7806-475f-37d4-ce16b59698b2.png)
「次のステップ：確認」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/b6d74111-f6f0-2313-de80-3c374e8db24f.png)
任意の名前（e.g. OktaFederatedRole）を設定し、「ロールの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/f87b80aa-b6dd-bad4-28a2-c65a98273643.png)

## IAMユーザー作成
OktaがAWSのロールをAPI参照するためのIAMユーザーを作成します。
「IAM」 > 「アクセス管理」 > 「ユーザー」 > 「ユーザーを追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/88bad510-4aa6-9a6c-1a6e-0ef8955fdeca.png)
「ユーザー名」に任意の名前（e.g. OktaSSOuser）を設定
「アクセスキー - プログラムによるアクセス」にチェック
「次のステップ：アクセス権限」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/82bdf5f8-9240-c99f-1b98-11ef721583b2.png)
「既存のポリシーを直接アタッチ」を選択し、「ポリシーの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/19cc069a-cbb8-b32d-177e-56509fd8c64a.png)
ポリシー作成タブが開くので、JSONを以下のJSONで上書きします。「次のステップ：タグ」をクリックします。

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "iam:ListRoles",
        "iam:ListAccountAliases"
      ],
      "Resource": "*"
    }
  ]
}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/7a7f42a3-4caa-9840-1f34-9aa4451f0557.png)
「次のステップ：確認」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/abb0d64d-5084-ac65-e990-36b08d49185f.png)
「名前」に任意の名前（e.g. OktaSSOCommandPolicy）を設定し、「ポリシーの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/bd126611-971b-44b5-ffa7-f6d69e0e9051.png)
ユーザー作成画面に戻り、作成したポリシーにチェックし「次のステップ：タグ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/3958f170-5bbf-39d9-ef62-f21531ca7ab1.png)
「次のステップ：確認」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/8ad3a80f-ba54-1bea-2a4b-cf7315feb7f5.png)
「ユーザーの作成」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/ac63b2e1-172b-314c-70c9-383a14ec5a6b.png)
「.csvのダウンロード」をクリックし、アクセスキーIDとシークレットアクセスキーをダウンロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/7fe527f0-32b2-569b-a411-199a405e2cb5.png)

## Okta SSO/プロビジョニング設定
### SSO設定
AWSで先ほど作成したIDプロバイダのOktaのARNをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/9ec043e8-0b1f-3599-e971-8fa98ba22720.png)
Oktaのアプリ詳細画面で「Sign On」タブを開き、「Edit」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/e81872f3-7b70-02ff-034e-251669b4f47e.png)
「Advanced Sign-on Settings」の「Identity Provider ARN (Required only for SAML SSO)」に先ほどのARNを設定し、「Save」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/8357b76e-3f7c-ea95-8543-617bf0ed719a.png)

### プロビジョニング設定
Oktaのアプリ詳細画面で「Provisioning」タブを開き、「Configure API Integration」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/98e48af0-6b42-6215-7985-dcdc7e067ee0.png)
「Enable API integration」にチェックを入れ、「Access Key」「Secret Key」は先ほど作成したAWSユーザーのキーを設定します。「Save」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/4bc0b985-1c00-1147-c8ad-9514caf140de.png)
「Save」後、接続テストのようなものが行われ、問題なければ以下のような画面になります。「Edit」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/aeb9692f-8a8b-9bf2-8824-999a12d0dbdf.png)
「Create Users」と「Update User Attributes」にチェックをし「Save」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/2ef5bcca-88fa-50b4-60de-b4bdaa0ab212.png)

## ユーザーのアサイン
Oktaのアプリ詳細画面で「Assignments」タブを開き、「Assign」 > 「Assign to People」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/b95ecfa6-10d6-aa61-4aeb-ffbfbd83abe7.png)
モーダルウィンドウが開くので、アサインしたいユーザーの「Assing」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/c34a754a-75db-6780-d5ec-e5252cd0b581.png)
「SAML User Roles」で先ほど作成したロール（e.g. OktaFederatedRole）にチェックを付け、「Save and Go Back」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/eff2935a-0877-ba3b-a3b1-d34a0f2a8678.png)
「Done」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/76929fea-3b3b-82e2-8fd8-83b97357e520.png)
これでAWSコンソールにSSOできるようになります。
ログインするユーザーはIAMユーザーとしては追加されません。ログイン名はOktaFederatedRole/Oktaのname属性となります。AWSへのセッションにロールを紐付けてアクセスするイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/bec9260c-34b6-7e2d-2682-784f18930eb0.png)

# Oktaの公式手順書
今回のSSOの設定手順はアプリの詳細画面から表示できます。「View Setup Instructions」をクリックすると、英語ですが、AWS側の設定も記述された丁寧な手順書が確認できます。この記事はこの手順書に沿っています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29324/eebc5f31-896b-c17c-d40b-fbd743a1a877.png)