AWS Security Token Service (AWS STS)

#AWS Security Token Service (AWS STS) とは
STSはAWS Security Token Serviceの略である。
> AWS リソースへのアクセスをコントロールできる一時的セキュリティ認証情報を持つ、信頼されたユーザーを作成および提供することができます。

つまり以下ができるようになる。

* ユーザーに対して AWS ID を定義せずに AWS リソースへのアクセスを許可できる

これによりIDフェデレーションが可能となる。
> **※IDフェデレーションの概要**
> IDフェデレーションは、それぞれ独自のID管理システムを持つ複数のセキュリティドメイン間で、それぞれのユーザーIDをリンクさせる。2つのドメインでIDフェデレーションを実現すると、一方のドメインで認証を受けたエンドユーザーは、他方のドメインでもログインしないでそのリソースにアクセスできる。

## 一時的な認証情報の一般的なシナリオ
シナリオとしては以下がある。

* 所有している別の AWS アカウントへのアクセスを IAM ユーザーに許可

* 第三者が所有する AWS アカウントへのアクセス権を付与する
* AWS サービスへのアクセスの提供
* 外部で認証されたユーザー（ID フェデレーション）へのアクセスの許可

試験範囲的にはクロスアカウントかフェデレーションかのどちらかがポイントとなる。

### AWS サービスへのアクセスの提供
サービスロールを設定してアクセス権限を付与する

### 第三者が所有する AWS アカウントへのアクセス権を付与する 
クロスアカウントアクセス設定を行う。

### 所有している別の AWS アカウントへのアクセスを IAM ユーザーに許可
こちらもクロスアカウントアクセス設定を行う。

### 外部で認証されたユーザー（ID フェデレーション）へのアクセスの許可
> 社内のディレクトリなど、AWS 以外の ID をユーザーがすでに持っているとします。それらのユーザーが AWS リソースを使用する (または、それらのリソースにアクセスするアプリケーションを使用する) 必要がある場合、それらのユーザーには AWS セキュリティ認証情報も必要です。IAM ロールを使用して、ID が組織または第三者のプロバイダー (IdP) からフェデレーションされたユーザーのアクセス許可を指定できます。

これには以下の ID フェデレーションがある。

* Amazon Cognito を使用したモバイルまたはウェブベースのアプリのユーザーのフェデレーション
    * ウェブ ID フェデレーション
* パブリック ID サービスプロバイダーまたは OpenID Connect を使用したユーザーのフェデレーション
    * ウェブ ID フェデレーション
* SAML 2.0 を使用したユーザーのフェデレーション
    * エンタープライズIDフェデレーション
* カスタム ID ブローカーアプリケーションを作成するユーザーのフェデレーション
* SAML 2.0 フェデレーティッドユーザーが AWS マネジメントコンソールにアクセス可能にする


#### Amazon Cognito を使用したモバイルまたはウェブベースのアプリのユーザーのフェデレーション
<img width="861" alt="スクリーンショット 2020-05-17 13.02.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/f8ecfa16-8533-13d4-ff14-9ea4a357c4bc.png">

不特定多数に長期的な AWS セキュリティ認証情報を配布しないユースケースに適用する。
IdpとAWSで信頼関係を結ぶこと

#### パブリック ID サービスプロバイダーまたは OpenID Connect を使用したユーザーのフェデレーション
AssumeRoleWithWebIdentity　オペレーション
<img width="678" alt="スクリーンショット 2020-05-17 13.29.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/bde82f76-d59b-1623-66c9-0a6fc9086f2f.png">

#### SAML 2.0 ベースのフェデレーション
AssumeRoleWithSAML　オペレーション
<img width="735" alt="スクリーンショット 2020-05-17 12.19.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/fe701c57-b0e4-3cc3-5751-f0ef7410da44.png">

このSAML 2.0 ベースのフェデレーションを使用するには、事前に組織の IdP と AWS アカウントを設定して相互に信頼する必要があることだけ注意

#### カスタム ID ブローカーを使用したフェデレーション
GetFederationToken API オペレーション
<img width="784" alt="スクリーンショット 2020-05-17 14.01.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/10a90ee2-c7cd-4ef2-9d8a-c41a57051cd1.png">

#### SAML 2.0 フェデレーティッドユーザーが AWS マネジメントコンソールにアクセス可能にする
<img width="721" alt="スクリーンショット 2020-05-17 13.45.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321923/b3bc2354-1951-e64c-657a-c48c35ed86a0.png">
> ユーザーは組織の内部ポータルから AWS マネジメントコンソールに移動するだけで、AWS 認証情報を指定する必要はありません。


* ユーザーは組織のポータルにアクセスして、AWS マネジメントコンソール に移動するオプションを選択
* ポータルが組織内のユーザーの ID を確認
* ポータルは、ユーザーを識別するアサーションを含む SAML アサーションレスポンスを生成し、ユーザーの属性を含めます。コンソールセッションが有効な期間を指定する SessionDuration という SAML アサーションの属性を含むよう IdP を設定できます。セッションタグとして属性を渡すように IdP を設定することもできます。ポータルはこのレスポンスをクライアントブラウザに送信
* クライアントブラウザは AWS のシングルサインオンエンドポイントにリダイレクトされ、SAML アサーションを投稿
* エンドポイントは、ユーザーの代わりに一時的なセキュリティ認証情報をリクエストし、コンソールのサインイン URL を作成
    * エンドポイントが代わりにリクエストしている点がポイント
* AWS は、サインイン URL をクライアントにリダイレクトとして送信
* クライアントのブラウザは AWS マネジメントコンソールにリダイレクト

#試験に出るトラブルシューティング
## アクセスキーを紛失しました。
* マネコンから確認できます。
* シークレットキーを無くした場合は新しいキーを作り直してください。

##古いアカウントに入りたい
* ログイン画面からEmail回復手段があるはず
* 詰んだ場合はAWSサポートに連絡してください

##AWS サービスに要求を送信すると "アクセス拒否" が発生します

* リクエストしたアクションとリソースを呼び出すアイデンティティベースのポリシーのアクセス許可を持っていることを確認
* リソースベースのポリシーをサポートするサービスにアクセス
    * ポリシーでお客様がプリンシパルに指定されていて、アクセス権限を付与されていることを確認
* アカウント内のサービスにリクエストする
    * アイデンティティベースのポリシーまたはリソースベースのポリシーを使用して、アクセス許可を付与
* 別のアカウントのサービスにリクエスト
    * アイデンティティベースのポリシーとリソースベースのポリシーの両方でアクセス許可を付与
* キー – 値のペアを持つ条件がポリシーに含まれている場合
    * ポリシーを慎重に確認

## 一時的な認証情報を使用して要求を送信すると "アクセス拒否" が発生します
* サービスが一時的セキュリティ認証情報を受け入れることを確認
* 一時的な認証情報が失効していないことを確認
* IAM ユーザーまたはロールに正しいアクセス権限があるかどうかを確認
    * 一時的なセキュリティ認証情報のアクセス許可は IAM ユーザーまたはロールから取得されます。

## ポリシーの変数が機能していません
* 変数のあるすべてのポリシーで、バージョン番号: "Version": "2012-10-17" がポリシーに含まれていることを確認


#参考文献
* AWS Identity and Access Management
    * https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_temp.html
* 【そんなときどうする？】別のアカウントにセキュアにアクセスしたい！　いまさらきけないSTSとは？
    * http://blog.serverworks.co.jp/tech/2016/05/18/sts/

# 押さえておきたい機能
* IAM Access Analyzer とは
    * https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/what-is-access-analyzer.html
* IAM アクセスアドバイザー
    * https://aws.amazon.com/jp/about-aws/whats-new/2019/06/now-use-iam-access-advisor-with-aws-organizations-to-set-permission-guardrails-confidently/
* AWS STS インターフェイス VPC エンドポイントの使用
    * https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_sts_vpce.html
    * STSとS3のVPCエンドポイントを利用してプライベートに別アカウントのS3バケットを利用してみる
        * https://dev.classmethod.jp/articles/sts_s3_vpcendpoint_private/#toc-7

自分のリソースがどのように共有されているかを分析できるサービス