AWS 認定ソリューションアーキテクト – プロフェッショナル資格試験に向けた知識の整理 IDフェデレーションとDDoS対策

# 概要
AWS 認定ソリューションアーキテクト – プロフェッショナル資格試験に向けた小ネタ集。
今回は全然関連性がないですが、IDフェデレーションとDDoS対策に関する整理です。

[2020年10月追記]
2回目の受験でついにプロフェッショナル試験に合格しました！
合格体験記／勉強法を以下で投稿しているので良かったら読んでください。
試験受ける予定がある方の少しでも役に立てればと思います(^^)

[AWS初心者がAWS 認定ソリューションアーキテクト – プロフェッショナル資格試験に合格した時の勉強法](https://qiita.com/fkooo/items/17fa401f4e46ecd00675 "AWS初心者がAWS 認定ソリューションアーキテクト – プロフェッショナル資格試験に合格した時の勉強法")

## IAM

* いきなりIDフェデレーションにいく前にまずは仕組みの基礎となるIAMです
* IAM　＞　IAMロール　＞　IDフェデレーション　といった体系的な理解が必要です
* そもそもIAMには聞きなれない言葉がいくつかでてくるのでそれらは以下を参照
    * https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/intro-structure.html
* 例えば、エンティティ

```
AWS によって認証に使用される IAM リソースオブジェクト。例えば、IAM ユーザー、フェデレーションユーザー、引き受ける IAM ロールです。
```

 * プリンシパル

```
AWS にサインインし、リクエストを作成するために AWS アカウントのルートユーザー、IAM ユーザー、または IAM ロールを使用する人またはアプリケーション。
日本語訳は「主要な」、、、具体的に例えば、

"Principal": {"AWS": "123456789012"} // ← AWSアカウントを信頼
と、いった表現をして別のAWSアカウントからスイッチロールできるクロスアカウントロールを作成する
```

具体的な使い方として、IAMポリシーの書き方を見た方がわかりやすいので、
[IAMポリシーサンプル](https://qiita.com/fkooo/items/ae934fe9b1eb2a77f65d "IAMポリシーサンプル") 投稿しました。
「AssumeRoleを利用した様々な外部アクセスの許可」部を見るとイメージが湧くと思います。


## IAMロール

* IAMロールの一般的なシナリオの説明が以下にあります。
    * https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_common-scenarios.html
* この中の１つに「外部で認証された（ID フェデレーション）ユーザーにアクセスを許可する」があり、この部分が今回の本題の**ID フェデレーション**です。

## IDフェデレーション

* 一言で言うと外部で管理されたIDを使って**認証**して、AWSのサービスの使用許可を制御（**認可**）しよう。ということです。
* まず概念的に以下の三つがあることを頭に入れる必要があります。
    * **パブリック ID サービスプロバイダーまたは OpenID Connect を使用したユーザーのフェデレーション**
    * **SAML 2.0 を使用したユーザーのフェデレーション**
    * カスタム ID ブローカーアプリケーションを作成するユーザーのフェデレーション
        * OpenID/SAML以外がこのカスタムIDブローカーに分類されます
* この3種類のフェデレーションの実現のために、AWSでは、
    * Amazon Cognito
    * IAM（の中のAWS STS）

の2つがあるということを上記URLの「外部で認証された（ID フェデレーション）ユーザーにアクセスを許可する」で言っています。（Cognitoの説明が最初に出てくるのが非常に混乱する^^;）
ちなみにAWSとしては他のマネジメントサービス同様、基本的にはCognitoを使うことを推奨しています。より高度なシナリオの場合にAWS STSを使用する。
Cognitoを使う場合のわかりやすい解説があったのでこちらも参考に。
　https://qiita.com/YamaguchiKenya/items/a8bb71c94dca49f1802b

## AWS STS
* Cognito推奨ではあるものの、AWS STS の API 試験的に頻出な気がします。
    * https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_temp_request.html
* 良く出てくるのは以下のAPIです。
    * AssumeRoleWithWebIdentity — ウェブベースの ID プロバイダーを（**OpenID Connect (OIDC) 互換**の IdP）経由したフェデレーション
    * AssumeRoleWithSAML — **SAML 2.0** と互換性のあるエンタープライズ ID プロバイダーを経由するフェデレーション
    * AssumeRole — クロスアカウントの委任とカスタム ID ブローカーを経由したフェデレーション
    * GetFederationToken — カスタム ID ブローカーを経由したフェデレーション
    * GetSessionToken — 信頼されていない環境にあるユーザー向けの一時的認証情報

## IDプロバイダーとフェデレーション

* ここからは、**OpenID Connectベース**、**SAML2.0ベース**のフェデレーションに焦点をあてていきます。なぜならカスタム ID ブローカーは基本的にAWS STS APIで頑張るから^^;
* このあたりの説明があるのが以下です。
 * [ID プロバイダーとフェデレーション](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers.html "ID プロバイダーとフェデレーション") 
* IAMは、OpenID Connectベースの**ウェブIDフェデレーション**と**SAML2.0ベースのフェデレーション**の２パターンをサポート
* ユーザー ID を AWS の外で管理している場合、AWS アカウントに IAM ユーザーを作成する代わりに、IAM ID プロバイダー(IdP)を利用
* IdP を使用するには、IAM ID プロバイダーエンティティを作成して、AWS アカウントと IdP の間に信頼関係を確立します。IAM は、OpenID Connect または SAML 2.0 (Security Assertion Markup Language 2.0) と互換性のある IdP をサポート



### ウェブIDフェデレーション

 * [ウェブIDフェデレーション](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_oidc.html "ウェブIDフェデレーション")：モバイルデバイスでAWSの外の認証情報を使って認証しAWSサービスを使うタイプ
 * ウィブIDフェデレーションをAWS STSを使って実現するイメージは以下の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/eb110117-e65c-6b9b-9674-8f9986bdc5c0.png)

### Amazon Cognitoを使用する場合
 * https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_oidc_cognito.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/48c8a86f-a32c-d08f-afa1-7b3a8c43a610.png)

1. 顧客はモバイルデバイスでアプリを起動します。アプリはユーザーにサインインするように求めます。
1. アプリは Login with Amazon を使用して、ユーザーの認証情報を承認します。
1. アプリは Cognito API オペレーションを使用して、Login with Amazon ID トークンを Cognito トークンに置き換えます。
1. アプリは AWS STS に一時的なセキュリティ証明書をリクエストして、Cognito トークンを渡します。
1. アプリは一時的なセキュリティ証明書を使用して、アプリの動作に必要ないずれの AWS リソースにもアクセスできます。一時的なセキュリティ証明書に関連付けられたロールとその割り当てられたポリシーによって、アクセス可能なリソースが決まります。

APIベースだと以下が参考になりそう。

* https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/authentication-flow.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/12fec378-caf0-e1d5-b1ae-1d2df751517a.png)

 * GetId：Cognito で新しいIDを確立するために必要な最初の呼び出し
 * GetOpenIdToken:アイデンティティIDを確立した後での呼び出し

### SAML2.0ベースのフェデレーション

  * [SAML2.0ベースのフェデレーション](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_saml.html "SAML2.0ベースのフェデレーション")：外部のLDAP等のIDプロバイダーを利用するタイプ
  * SAML2.0ベースのフェデレーションをAWS STSを使って実現するイメージは以下の通り。
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/238997b1-924f-ea36-921c-02a73b7aa174.png)

1. 組織のユーザーが、クライアントアプリを使用して、組織の IdP に認証を要求します。
1. IdP がユーザーを組織の ID ストアに対して認証します。
1. IdP はユーザーに関する情報を使用して SAML アサーションを構築し、クライアントアプリにアサーションを送信します。
1. クライアントアプリが、AWS STS **AssumeRoleWithSAML** API を呼び出して、SAML プロバイダーの ARN、引き受けるロールの ARN、および IdP からの SAML アサーションを渡します。
1. API は一時的なセキュリティ認証情報を含むレスポンスをクライアントアプリに返します。
1. クライアントアプリでは、一時的なセキュリティ証明書を使用して Amazon S3 API オペレーションを呼び出します。

### SAML 2.0 フェデレーティッドユーザーが AWS マネジメントコンソール にアクセス可能にする
* コンソールへのSSOとなるとまたちょっと違います。
* https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_enable-console-saml.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/ad23fbfe-e933-5f48-e885-e2b12e746688.png)

1. ユーザーは組織のポータルにアクセスして、AWS マネジメントコンソール に移動するオプションを選択します。一般的に、組織のポータルは、組織と AWS 間の信頼の交換を処理する IdP の機能です。たとえば、Active Directory フェデレーションサービスでは、ポータル URL は次のようになります。
```
https://{ADFSServiceName}/adfs/ls/IdpInitiatedSignOn.aspx
```
2. ポータルが組織内のユーザーの ID を確認します。
3. ポータルは、ユーザーを識別するアサーションを含む SAML アサーションレスポンスを生成し、ユーザーの属性を含めます。コンソールセッションが有効な期間を指定する SessionDuration という SAML アサーションの属性を含むよう IdP を設定できます。セッションタグとして属性を渡すように IdP を設定することもできます。ポータルはこのレスポンスをクライアントブラウザに送信します。
4. クライアントブラウザは AWS のシングルサインオンエンドポイントにリダイレクトされ、SAML アサーションを投稿します。
5. エンドポイントは、ユーザーの代わりに一時的なセキュリティ認証情報をリクエストし、コンソールのサインイン URL を作成します。
6. AWS は、サインイン URL をクライアントにリダイレクトとして送信します。
7. クライアントのブラウザは AWS マネジメントコンソールにリダイレクトされます。複数の IAM ロールに対応付けられた属性を SAML 認証レスポンスが含む場合は、最初にコンソールへのアクセスするためのロールを選択する画面が表示されます。

## AWS Single Sign-On (AWS SSO)

* ちょっと飛躍しますが、SSOがでてきたので、AWS SSOのサービスも載せておきます。
    * https://aws.amazon.com/jp/blogs/news/introducing-aws-single-sign-on/
* オンプレとのSAML認証連携によるシングルサインオンとMFA認証が可能になります。
* AWS Organizations サービスを設定し、[すべての機能] を有効化する必要があります。
* SSOとオンプレのActiveDirectoryとの連携に AD Connector（またはAWSDirectoryService for Microsoft ActiveDirectory）が必要です。
* イメージ図は以下の通り。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/ed5836c0-b8d6-e6d3-0e06-71d129b7d609.png)

長くなりましたが、IDフェデレーションについては以上です。
IDフェデレーションは広く深い知識の分野になり、今回の投稿がきれいにまとまっているとは言い難いですが、誰かの役に立てば幸いです(^^)

## DDoS対策

[DDoS対策（英語）](https://aws.amazon.com/jp/answers/networking/aws-ddos-attack-mitigation/ "DDoS対策（英語）")
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188544/4fda6afa-e80b-4bea-cfe0-2e9d85723397.png)

* 基本的にはAWS Shield Standard/AWS Shied Advanced/AWS WAFの３対策
 * AWS Shield Standard：Route 53またはCloudFrontで使用する。無料。L3/L4の防御。
 * AWS Shield Advanced：Route 53、CloudFront、ELB、EC2、AWS Global Acceleratorで使用する。有料。L7、ネットワークACLを使った防御。
 * AWS WAF：CloudFront、ALB、APIGatewayで使用。有料。IPアドレス、HTTP、クエリ文字列でのアクセス制限に加え、SQLインジェクション、クロスサイトスクリプティングにも有効。

AWS Shield：https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/ddos-overview.html
AWS WAF：https://docs.aws.amazon.com/ja_jp/waf/latest/developerguide/waf-chapter.html

## その他参考

アソシエイト資格の勉強法は以下を参照

[AWS初心者がAWS 認定ソリューションアーキテクト – アソシエイト資格試験に合格した時の勉強法](https://qiita.com/fkooo/items/e5284a4ed3c3466ffd41 "AWS初心者がAWS 認定ソリューションアーキテクト – アソシエイト資格試験に合格した時の勉強法")

プロフェッショナル資格の勉強法は以下を参照

[AWS初心者がAWS 認定ソリューションアーキテクト – プロフェッショナル資格試験に合格した時の勉強法](https://qiita.com/fkooo/items/17fa401f4e46ecd00675 "AWS初心者がAWS 認定ソリューションアーキテクト – プロフェッショナル資格試験に合格した時の勉強法")

その他の小ネタは以下を参照

[プロレベルのTips](https://qiita.com/fkooo/items/e3c0c9a11d078619cbe0 "プロレベルのTips")
[フェデレーションとDDoS対策](https://qiita.com/fkooo/items/a6d71407b2bed42332cc "フェデレーションとDDoS対策")（本記事）
[IAMポリシー](https://qiita.com/fkooo/items/45cd86fa6e71d51f12e2 "IAMポリシー")
[DR対策](https://qiita.com/fkooo/items/cbeb13fea8b99e4b7964 "DR対策")
[IAMポリシーサンプル](https://qiita.com/fkooo/items/ae934fe9b1eb2a77f65d "IAMポリシーサンプル")