AWS SSOを試してみた

# 背景・目的
最近、シングルサインオンを調べる機会があったので、AWS SSOについて触れてみたいと思います。

# まとめ
- AWS SSOは、ユーザを管理するIDプールの機能と、アクセス権限セットを管理する機能、アクセス権限セットを割り当てる機能、SaaSが提供しているを有している。
- IDプールには、AWS SSOがデフォルトで利用され、それ以外にMicrosoft Active Directoryや、外部IDプロバイダーなど指定ができる。
- SSOアプリケーションには、AWSサービスの他に、クラウドアプリケーションを指定し管理することができる。


# 概要
## AWS SSOとは？
- すべてのAWSアカウントとクラウドアプリケーションへのSSOアクセスを一元管理することを用意にするクラウドベースのシングルサインオンサービス。
- 具体的には、AWS組織内のすべてのAWSアカウントにわたるSSOアクセスとユーザ権限を管理するのに役立つ。
- 一般的に使用されるサードパーティーサービスとしてのSaaSアプリケーション、SSO統合アプリケーション、SAML2.0をサポートするカスタムアプリケーションへのアクセスとアクセス許可のための管理にも役立つ　
- SSOには、エンドユーザが割り当てられれたすべてのAWSアカウント、クラウドアプリケーション、カスタムアプリケーションを一箇所で見つけてアクセスできるユーザポータルが含まれている。

## SSOの機能
### AWS Organizationsとの統合
AWS Organization、AWS APIと緊密に統合されている。SSOはOrganizationとネイティブに統合され。すべてのAWSアカウントを列挙する。
アカウントをOU単位で整理している場合は、AWS SSOコンソール内にそのように表示される。

### AWSアカウントと、クラウドアプリケーションへのSSOアクセス
SSOを使用すると、カスタムスクリプト、サードパーティのSSOを使用せずに、すべてのAWSアカウント、クラウドアプリケーション、AWS SSO統合アプリケーション、カスタムSAML2.0ベースのアプリケーションでSSOを簡単に管理できる。
SSOコンソールを使用して、パーソナライズされたエンドユーザポータルに対して承認したアプリケーションのみにワンクリックでアクセスできるユーザを素早く割り当てる。

### AWS SSOユーザとグループを作成および管理する
初めてサービスを有効にすると、AWS SSOにデフォルトのストアが作成される。このストアを使用してコンソールで直接ユーザとグループを管理できる。
または、必要に応じ、既存のAWSマネージドMicrosoft ADディレクトリに接続し、Windows Serverで提供される標準のActiveDirectory管理ツールを使用して、ユーザを管理できる。
また、外部IDプロバイダーからAWS SSOにユーザを管理することを選択した場合は、ユーザを作成してからコンソール内でグループを簡単に整理できる。

### 既存の企業アイデンティティを活用する
AWS DirectoryServiceを介して、MicrosoftADと統合されている。従業員は、企業のActiveDirectory資格情報を使用してSSOユーザポータルにサインインできる。Active Directoryユーザにアカウントとアプリケーションへのアクセスを許可するには、それらを適切なActive Directoryグループに追加するだけ。
例
- DevOpsグループに追加されたユーザは、AWSアカウントへのSSOアクセスが自動的に許可される。

これにより、新しいユーザのオンボーディングが容易になり、既存のユーザがあらたらしいアカウントやアプリケーションに素早くアクセスできるようになる。

### 一般的に使用されるクラウドアプリケーションと互換性がある。
SalesforceやBoxなどの一般的なクラウドアプリケーションをサポートしている。これにより、アプリケーション統合手順が提供されるため、SSOようにこれらのアプリケーションをセットアップおよびトラブルシューティングするのに役立つガードレールとして機能する。
管理者は、微妙な違いを学ぶ必要はない。

### セットアップと使用状況の監視が簡単
管理にソフトウェアやハードウェアを必要としない、可用性が高く完全に安全なインフラストラクチャ。
すべてのサインインアクティビティをAWS CloudTrailに記録し、SSOアクティビティを一箇所で監視および監査するための可視性を提供する。

### 既存のIAMユーザ、役割、およびポリシーと共存する
SSO有効化しても、IAMですでに管理しているユーザ、ロール、ポリシーに影響しない。

### 無料のID管理
Organizationsを使用して管理されている任意のAWSアカウントをAWS SSOに追加できる。
SSOとOrganizationの両方が追加コスト無しで利用可能。

## 主要な概念
### ユーザ、グループ、及びプロビジョニング
#### ユーザ名とメールアドレスの一意性
SSOで作業する場合、ユーザは一意に識別可能である必要がある。SSOはユーザのプライマリ識別子であるユーザ名を実装する。
殆どの人は、ユーザ名をユーザの電子メールアドレスと同じ設定にするが、SSO、SAMLではこれは必要なし。
ただし、SAMLベースのアプリケーションの大部分は、ユーザの一意の識別子として電子メールアドレスを使用している。
これは、SAMLID プロバイダーが認証中に送信するアサーションから取得する。このようなアプリケーションは、各ユーザのメールアドレスの一意性に依存する。
SSOでは、ユーザのサインインに電子メールアドレス以外のものを指定できる。SSOでは、ユーザのすべてのユーザ名と電子メールアドレスがNULLではなく、一意である必要がある。

#### グループ
定義するユーザの論理的な組み合わせ。グループを作成し、ユーザを追加できるが、グループへのグループ追加をサポートしてない。
グループに対して権限を付与することで管理が楽になる。

#### ユーザとグループのプロビジョニング
SSOで直接ユーザとグループを作成することも、ActiveDirectoryまたは外部IDプロバイダーにあるユーザとグループを操作することもできる。

### SSO統合アプリケーションへの有効化
SSOは、他のAWSアプリ及びサービスによる統合をサポートしている。これらのアプリケーションは、SSOを使用して認証を実行し、ユーザ及びグループに関する情報にアクセスできる。

以下のいずれかにより、SSOは、サインイン資格情報を除くユーザ属性とグループ属性を含むIDストアを提供する。
SSO IDストアのユーザとグループを最新の状態に保つことができる。

- SSO IDストアをメインのIDソースとして使用する。この方法を選択した場合、SSOコンソール、CLIからユーザとグループを管理する。
- 次のIDソースのいずれかから、SSO IDストアへのユーザとグループのプロビジョニング（同期）を設定する。
    - Active Directory
    - 外部IDプロバイダー
プロビジョニングを選択した場合、IDソース内からユーザとグループを引き続き管理し、それらのSSO IDストアに同期される。

選択したIDソースに関係なく、SSOにはユーザとグループをSSO統合アプリケーションと共有する機能がある。
この機能により、IDソースをSSOに一度接続してから、クラウド内の複数アプリケーションとID情報を共有することができる。
これにより、各アプリケーションでフェデレーションとIDプロビジョニングを個別に設定する必要がなくなる。これにより、各従業員が様々なAWSアカウントの多くのアプリに簡単にアクセスできる。

#### AWSアカウントでID情報を共有する際の考慮事項
SSOに含まれる属性は、アプリケーション全体で一般的に使用される基本的な属性。これらの属性には以下などの情報が含まれる。この個人を特定できる情報を使用できるアプリケーションとアカウントの検討が必要。

- 姓名
- 電話番号
- メールアドレス
- 住所
- 優先言語

これらの情報へのアクセスを制御するには、2つのオプションが有る。
- AWS組織の管理アカウントのみ、またはすべてのAWS組織のアカウントでアクセスを有効にすることを選択できる。
- SCPを使用して、どのアプリケーションがどの組織アカウントの情報にアクセスできるかを制御する。

#### AWSアカウントでSSO統合アプリケーションを有効にする。
初めてSSOを有効にすると、AWSはすべての組織アカウントで統合アプリケーションの仕様を自動的に有効にする。アプリケーションを制約するには、SCPを実装する必要がある。
※2019/11/25 より前にSSOを有効化した場合、SSOはすべてのAWS Organizationアカウントで統合アプリケーションの使用を無効にする。
統合アプリケーションを使用するには、管理アカウントでそれらを有効化し、オプションでメンバアカウントで有効にする。


### SAMLフェデレーション
SSOは、SAML2.0を使用したIDフェデレーションをサポートしている。SMAL2.0は、SAMLオーソリティ（IdP）とSAMLコンシューマ（SP）
の間で、ユーザに関する情報を渡すSAMLアサーションを安全に交換するために使用される業界標準である。

SSOでは、この情報を使用して、SSOユーザポータル内でアプリケーションの仕様を許可されているユーザにフェデレーションシングルサインオンを提供している。

SSOは、マネージドMicrosoftAD、またはSSOストアのいずれにかにSAMLIｄP機能を追加する。その後、ユーザは、AWS Managed ConsoleやOffice365などのサードパーティアプリケーションなど、SAMLをサポートするサービスにSSOを実行できる。

### ユーザ認証
ユーザは、ユーザ名を使用してユーザポータルにサインインする。その場合、SSOはユーザのメールアドレスに関連付けられたディレクトリに基づいて、要求をSSO認証サービスにリダイレクトする。
認証されると、ユーザは追加のサインインプロンプトなしでSSOアクセスできる。

#### 認証セッション
SSOにより維持される認証セッションには2つのタイプが有る。
- SSOへのユーザのサインイン
- SageMakerStudioやGrafanaなどのSSO統合アプリケーションへのユーザアクセス

ユーザがSSOにサインインするたびに、8Hの有効期限でサインインセッションが生成される。
ユーザがSSO対応アプリケーションにアクセスするたびに,SSOサインインセッションを使用して、そのSSOアプリケーションセッションを取得する。
SSOアプリケーションのセッション有効期限は1H。SSOアプリケーションは、取得元のSSOサインインセッションが有効である限り、1Hごとに自動的に更新される。

ユーザがSSOを使用して、管理コンソール、またはCLIにアクセスすると対応するSSOアクセス許可セットで指定されているように
SSOサインインセッションを使用してIAMセッションを取得する。

SSOでユーザを無効化、削除すると、そのユーザはすぐにサインインして新しいSSOサインインセッションを生成できなくなる。
SSOサインインセッションは1Hキャッシュされる。
つまり、最大1Hは継続される。

セッションが切れると、ユーザはSSOアプリやIAMロールセッションを開始できなくなる。
ただし、SSOアプリセッションは、1Hキャッシュすることもできるので、+1Hはアクセスできる。

### 権限セット
#### 権限セット管理の委任
SSOを使用すると、SSOリソースのARNを参照するIAMポリシーを作成することにより、アカウントの権限セットと割当の管理を委任できる。

## IDソースの管理
以下のいずれかのIDソースを指定できる。

- SSO IDストア
    - デフォルトはこれ。
- Active Directory
- 外部IDプロバイダー

## AWSアカウントへのSSOアクセスを管理する
SSOは、Organizationと統合されているため、管理者は、ユーザがAWS管理コンソールへのSSOアクセスを必要とする複数のAWSアカウントを選択できる。
これらのアカウントは、Oraganization管理アカウント、またはメンバーアカウントのいずれかになる。
- 管理アカウントは、Oraganizationの作成に使用されるアカウント
- メンバーアカウントは、管理アカウント以外。

権限セットを使用して、ユーザがAWS管理コンソールで実行できることを更に絞り込むことができる。

権限セットとは、SSOで権限を一元的に定義して、すべてのAWSアカウントに適用する方法。権限セットにより、IAMロールとして各AWSアカウントにプロビジョニングされる。ユーザポータルを使用し、ユーザは特定のAWSアカウントのIAMロールの一時的なクレデンシャルを取得できるため、AWS CLIへの短期間のアクセスに使用できる。

SSOでカスタムSAMLアプリケーションとしてアカウントを設定することにより、Organizationの一部ではないAWSアカウントに接続することもできる。

# 実践
AWS SSOの[使用開始方法](https://docs.aws.amazon.com/ja_jp/singlesignon/latest/userguide/step1.html)を参考に試してみます。
## AWS SSOの有効化
1. AWS SSOのトップ画面で、「AWS SSOの有効化」をクリックすると、設定画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f7eb2f53-aee1-dab8-5473-b837675aa16e.png)

## ユーザの追加
1. ユーザを追加をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/1bfac08d-08cb-4ad0-f006-bd297eccdd27.png)

1. 以下を入力し次へをクリックします。
    1. ユーザ名
    1. メールアドレス
    1. 姓名
    1. 表示名
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/55cde260-2701-c12d-e807-7b9d660dc9c2.png)


1. 該当のグループにチェックを入れて、次へをクリックし、ユーザをグループに追加します。(まだグループがない場合、「グループを作成」をクリックします。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9e8ff062-05a6-7dfc-6148-38ce572e609b.png)

1. 最後に確認画面が表示されるので、「ユーザを追加」をクリックします。
1. できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0c44b4dd-54c0-90b9-792d-52a5b326d8e4.png)

### 初回ログイン
1. 追加されたユーザには、メールが届いてるので「Accept Invitation」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0217ac79-ece2-70ab-ce47-af860795c746.png)

1.パスワードを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/c68da3a4-eef6-60c4-2414-20dfacff0838.png)

1.ログインできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f2f8fd4c-f3f2-8faf-8aed-255ef6aea7ac.png)


## グループを作成
1. グループ名を入力し、グループを作成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8f04e662-5540-7410-ae65-3a3bfe4be2ba.png)

1. できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b190a2b7-4caf-cfc9-f9b5-f5e6515222bb.png)

## 権限セットを作成及び管理する
### 権限セットを作成する（事前定義された許可セットを作成する）

1. 許可セット（アクセス許可セット）をクリックします。
1. 許可セットを作成をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/bd34f4ca-8178-e76e-8717-719949102fbb.png)

1. タイプを 「事前定義された許可セット」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d1d47081-ab44-d7f7-15f5-11288f1faaac.png)

1. 事前定義された許可セットのポリシーで「ViewOnlyAccess」を選択し「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/ca55039f-438d-e663-7da6-0b8ae9aaaea7.png)
1. デフォルトのまま「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b12c6fd1-4a78-025c-7b66-2ce10440ca52.png)

1. 確認画面が表示されるので「作成」をクリックします。
1. 作成されました。この時点では、プロビジョンされたステータスは有効になっていません（プロビジョンされていません）。権限セットをグループやユーザに割り当ててから適用する必要があるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/b0b9014d-d95c-9e64-69c2-d02a0216dc92.png)

## 権限セットを割り当てる
1. 左のナビゲーションペインで、AWSアカウントをクリックします。
1. 対象のAWSアカウントを選択し、「ユーザまたはグループを割り当て」をクリックします。
1. グループをアカウントに割り当てます。グループをチェックし、Nextをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/941ea30c-a434-2ef2-fc09-1a78cb6a1887.png)
1. アクセス許可セットを選択して、Nextをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/8f767992-3e5b-f5f2-d07e-5b0938de72fa.png)
1. 送信をクリックします。
1. アクセス許可セットがプロビジョン済みになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/43eb503a-bdb7-3550-60a9-ba15d0a3a127.png)

1. SSOの画面でアクセス許可セットが表示されました。（**上記の操作に加えて、AdminisotratorAccessも作成し、割り当てています。**）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/f1445726-1372-fd3d-ddf2-dc6c2f8160af.png)
1. ViewOnlyAccessのアクセス権限セットのManagement Consoleをクリックします。画面右上を見ると、ViewOnlyAccess/ユーザ名（testuser）が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/0b49d548-5181-27ff-7f1c-fd33ce816702.png)

1.最後に、作成したアクセス権限セット、ユーザ、グループ等を削除します。

# 考察
今まで、なんとなく使用していたシングルサインオンを実際に手を動かして作ると、より理解が深まりました。
次回以降は、アプリケーションへのSSO、DirectoryServiceをIDソースに設定するなど試してみたいと思います。

# 参考
https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html