AWS SSOを使いマネジメントコンソールや外部Webサービスをシングルサインオン化する（構築〜AWSマネジメントコンソール接続まで）

# はじめに

2017/12にマネージドシングルサインオンサービス、AWS SSOが発表されました。
このAWS SSOはSAML 2.0に対応しているので
AWSのマネジメントコンソールだけでなく、
JenkinsやWordpressなど外部アプリケーションもシングルサインオンにできます。

ユーザ管理の運用や使い勝手がぐっと上がります。

* 完成形
![aws_sso_0618_5.PNG](https://qiita-image-store.s3.amazonaws.com/0/146781/1e0b20ac-9646-8c72-64ae-f9dfddd03443.png)


## 前提

* AWS Directory ServiceのMicrosoft ADでユーザ管理する必要がある。
* オーガニゼーションのルートアカウントでAWS SSOインスタンスを立ち上げる必要がある。
* オーガニゼーションのALL Feature機能を有効にする必要がある。
* 北バージニアリージョンで運用する必要がある。

### 補足

この前提を見るとかなり厳しそうに見えるのですが
構築や運用は結構なんとかなります。

北バージニアリージョンの障害耐性については
要件にあうか確認しておいた方が良いでしょう。


# 手順

## AWS SSO構築

### オーガニゼーションでALL Feature機能を有効にする

AWS OrganizationsでALL Feature機能を有効にします。
ルートアカウント上でオーガニゼーション機能に入り、
設定を有効にして、子アカウントに認証要求を送ります。

以下の記事が丁寧にまとまっています。
http://tech.unifa-e.com/entry/2017/04/03/153535

### サブネット作成

ルートアカウント上の北バージニア（us-east-1）リージョンでVPCとサブネットを切ります。
私は東京リージョンからInter-Region VPC Peeringでピアを張り
Ansibleで構築しました。

* インターリージョンの記事
https://qiita.com/morin_river/items/90ba59072aac59c3d622

もちろん、手で作成してもよいでしょう。

### AWS Microsoft ADを作りユーザ管理できるようにする

AWS Microsoft ADインスタンスを構築します。
そのあと、挙動などを確認するため利用するユーザもいれておきます。

* AWS Microsoft ADの記事

https://qiita.com/morin_river/items/62330d02df92f2492860

### AWS SSOインスタンスとAWS Microsoft ADを接続する

![aws_sso_0618.PNG](https://qiita-image-store.s3.amazonaws.com/0/146781/49d48bf4-f20b-805d-96b4-bfc836f46751.png)

「Connect your directory」を選択し、先ほど作成したMicrosoft ADを選択します。

紐付けが終わると、以下のようにユーザポータルサイトが表示されます。

詳細画面
![aws_sso_0618_2.PNG](https://qiita-image-store.s3.amazonaws.com/0/146781/f083877a-1727-8b31-2c3e-cebdf8b47ddc.png)

ポータルサイトトップ
![aws_sso_0618_3.PNG](https://qiita-image-store.s3.amazonaws.com/0/146781/208c38a9-e2c5-633f-f5f3-a2cd35012545.png)



ここで、ADに登録したユーザのupnとパスワードでログインすることができるようになります。

## AWSコンソール接続

### Permission set作成

AWSコンソールでログインした後に適用される権限セット（Permission set）を作成します。
なぜか、このPermission setはAWS IAMとは別物になっています。
（記法などの互換性はあります）

なんとも言えない気持ちにはなるのですが、Permission setを作りましょう。

* AWS SSOのマネジメントコンソールから、「Configure SSO access to your AWS accounts」を選択

![aws_sso_0618_4.PNG](https://qiita-image-store.s3.amazonaws.com/0/146781/45bde275-6604-42b4-fab1-655c025a6d35.png)

* 「Permission sets」を選択

![aws_sso_0618_6.PNG](https://qiita-image-store.s3.amazonaws.com/0/146781/75d8116c-84f9-0edf-9082-5ea7970e379a.png)


* 「Create new permission set」を選択

![aws_sso_0618_7.PNG](https://qiita-image-store.s3.amazonaws.com/0/146781/97d7094f-97b5-d251-cb8f-850c377828c0.png)

* 作るPermission setの種類を選択

| 項目 | 説明 |
| --- | --- |
| Use an existing job function policy | 既存の関数ポリシーから選択   |
| Create a custom permission set      | カスタムpermission setを作成 |

「Create a custom permission set」では、IAMポリシーと同じようにjsonで権限を定義します。
「Create」を押してPermission setを完成させます。

![aws_sso_0618_8.PNG](https://qiita-image-store.s3.amazonaws.com/0/146781/415ead13-ad4b-68d3-706e-a75ea3d874d9.png)


### AWSアカウントへの割り当て

上で作成したPermission setをAWSアカウントに割り当てます。

* AWS organization

「AWS Accounts」から「AWS organization」を選択します。
その画面で、割り当てるAWSアカウントを選択し、「Assign users」を押します。

![aws_sso_0618_9.PNG](https://qiita-image-store.s3.amazonaws.com/0/146781/ae8d307d-9550-7a48-1041-8a01c695f5dd.png)

* Select users or groups

次の画面で、割り当て設定を行います。
この時、group単位で割り当てるかuser単位で割り当てるか決めることができます。
（groupやuserは接続したADのものとなります）。
group単位で割り当てておくと、ADの追加のみでAWSアカウントへのユーザ追加が出来ますね。

登録する名前を入力し「Search connected directory」を押すとADから選択候補が出てきます。
該当するものをチェックし、「Next:Permission sets」をおします。

![aws_sso_0618_10.PNG](https://qiita-image-store.s3.amazonaws.com/0/146781/daa7a719-fbf7-2a69-2c52-df212c9efc32.png)

* Select permission sets

この画面で、permission setを紐付けます。
上記手順でpermission setを作成していれば、こちらの画面に表示されます。

適用させるpermission setを選択して、「Finish」ボタンで完了してください。

* 確認してみる

AWS SSOのユーザプラットフォームに、登録したupnとパスワードを使いログインして下さい。
AWSのアカウントが表示され、webコンソールにログインできれば完了です。

![aws_sso_0618_12.PNG](https://qiita-image-store.s3.amazonaws.com/0/146781/65daafca-d36a-216a-7bf7-f08db7bad378.png)


# 最後に

最初は少し手間が多いですが、SSO自体はとても優れたプロダクトだと思います！
特にアカウントを横断して管理している時などは今後必須になるのではないでしょうか。
このあたりも効率よく運用していきたいですね。