AWSマネコンへのSSOとかSTSの一時認証とかまとめ

# 社内リソースのSSO

AWS云々の前にそもそも社内のリソースへのアクセスを一元化するにはどうするのか。

## Active Directory

システム管理者が組織のリソースを管理するマイクロソフト製のサービス。
社内にはファイルサーバやプリンタなど様々なサーバやデバイスがあり、それぞれがユーザ認証を必要としている。各デバイスを利用する度にユーザ名とパスワードを求められ、各デバイスでそれらの認証情報を保持するのは効率がいいとは言えない。また管理者側からするとそれらの権限管理をバラバラに設定していくことは煩雑でオペミスを誘発する原因にもなりうる。
そこで、それら認証や権限管理を一箇所に集約することで、ユーザへはシングルサインオン(SSO)を提供し、管理者へは管理の一元化を提供する方法が出てきた。`Active Directory`はその一つである。

### ディレクトリ

`Active Directory`は組織のリソース(人や物、データなど）をオブジェクトとしてツリー構造で表現したディレクトリを用いて管理している。各オブジェクトの情報(ユーザ名や所属などの付帯情報)はプロパティ(属性)として紐づけられている。このディレクトリの情報の保管と検索を行うプロトコルとしてLDAPを用いる。

なお、これはファイルを束ねるフォルダをディレクトリと呼ぶのと同じである。ファイルという個々のリソースをディレクトリがツリー状に管理している。

ディレクトリによって各ユーザの所属や利用できる権限が一括で管理でき、これはディレクトリデータベースとしてドメインコントローラがその役割を担っている。

### ドメインとドメインコントローラ

ディレクトリによって管理されるリソースの範囲をドメインと呼び、ドメインを管理するサーバのことをドメインコントローラと呼ぶ。ドメインコントローラはディレクトリの情報に基づき認証・認可を行うサーバともなる。

社内のサーバやデバイスはこのドメインコントローラを信頼することでドメインに参加できる。これはドメインコントローラが代わりに認証・認可したユーザのアクセスを受け入れることになるため。

ドメインコントローラの役割として以下の役割を有する。
- ディレクトリデータベース
- 認証と認可
- グループポリシー

### 信頼関係

ドメインは、ディレクトリによって管理されるリソースの範囲であるが、組織構造(親会社子会社の関係)や企業合併によって複数のドメインに分かれることが想定される。
ドメインは別のドメインに対して信頼関係を構築することでによってドメイン間で連携することができる。
上位組織と下位組織(サブドメイン)の間で信頼関係を結び構築された構成をドメインツリーと呼び、別のドメイン間の信頼関係をフォレストと呼ぶ。

## ユーザからの社内リソースへのアクセスの流れ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/4e5a224a-08eb-29d9-3f70-48f61b4b6e89.png)

1. ユーザから認証サーバ(ドメインコントローラ)にアクセスし、認証される。
    → 「この人は誰か」を証明できた状態。
1. 認証サーバから`TGT(Ticket Granting Ticket)`というチケットが返却される。
1. ユーザはそれを持って認可サーバ(ドメインコントローラ)にアクセスし、認可される。
    → 「この人がどの権限を持っている」が証明された状態。
1. 認可サーバは`ST(Service Ticket)`というチケットを返却する。
1. STによって権限が保証されているサーバやデバイスにそれを提示することでアクセスできるようになる。

この認証の流れをKerberos認証というプロトコルと呼ぶ。

# AWSへのSSO

## SAML2.0

社内のリソースへの認証が一元管理され、SSOすることができるようになったが、外部のサービス(AWSのマネジメントコンソールなど)に対するアクセスも一元管理したくなる。
ここで利用されるのが`SAML2.0`などのプロトコルを用いるSSOである。

`SAML2.0`ではIDプロバイダ(IdP)を間に立てることでSaaSへのアクセスを橋渡ししている。
ドメインコントローラから受け取る`ST`をIdPが受け取り、トークンを発行する。
このトークンをSaaSに提示することで既に認証されたユーザと認識できる。さらに事前にIdP側のユーザ/グループとSaaS側の権限と紐づけておくことでSaaS上での権限も制御できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/4d86545f-1df7-3b79-f0dd-4262845dac5d.png)

### Service Provider(SP)

SAML認証でユーザがログインするアプリケーションのこと。IdPからユーザの認証情報を受け取りユーザをアプリケーションにログインさせる。

### ID Provider(IdP)

SAMLにおいてIdPはユーザ情報を管理し認証を行うサーバ。IdPでログインしたユーザ情報をSPへ提供する。

### SAML認証の流れ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/d2d488bf-fbea-6937-9ea3-1f082e9cf38a.png)

### マネジメントコンソールへのアクセスフロー (SP initiated SSO)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/857eab70-9d26-4c54-b515-ca41c8da815f.png)

1. IdPの提供するポータルURLへアクセスする。
1. IdPはIDストアに対してユーザ認証を実施する。
1. IdPがSAMLアサーションを発行する。
1. ユーザのブラウザからAWS(ServiceProvider)のSSOエンドポイントにリダイレクトされアサーションを送る。
1. エンドポイントは`AssumeRoleWithSAML`APIをコールしてSTSから一時的な認証情報を取得しサインインURLを生成する。
1. サインインURLへリダイレクトする。

※ IdP initiated SSO と SP initiated SSOは以下。ユーザアクセスがどっちが先かの話。

https://manual.iij.jp/iid/faq/19644038.html

### IdPとIDストアの選択

この流れにおいてIDストア側とIdP側に何を選択するかにはいろいろな種類がある。
すでに組織が利用しているIDストアがあるなどで制約が変わってくるが、`AWS SSO(現AWS IAMアイデンティティセンター)`で一元的に管理できる。(以前はAWS SSOはOrganizationsのマスタアカウントでしか設定でいなかったが今ではできるらしい)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/51b5eada-a5b9-0bdf-7ab6-b29e4a5efd81.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/03303f7c-aecd-a755-f329-6ba874581c12.png)

IDストア、IdPの選択のフローチャート

https://aws.amazon.com/jp/blogs/startup/techblog-iam-sso-practice/

### AWS SSO (現AWS IAM アイデンティティセンター)

オンプレミスとのSAML認証認証連携によるSSOとMFA認証が可能となる。
オンプレや外部IDストアと連携するしてAWSマネコンやAWSサービス(QuickSightやWorkSpaces)へのシングルサインオンを実現する。
CognitoのユーザプールでAWS SSOをIdPに指定することも可能。

まとまった絵があるので以下を参考に。

https://dev.classmethod.jp/articles/aws-sso-wakewakame/

## AWS Directory Service

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/1ec459f9-b655-8982-5282-489e6308b8f5.png)

### AWS Managed Microsoft AD

Microsoft Active Directoryをマネージドに提供しているサービスであり、裏側では実際にWindows Serverが起動しActive Directoryが動いている。2AZにまたがって構成され、管理を行うには別途EC2インスタンスに管理ツールを導入して管理を行う(?)。

既存のオンプレミスADと連携させたい場合(既存のADに登録しているユーザでAWSマネコンやQuickSight、WorkSpacesなどへログインしたい場合)、信頼関係を構築することで可能となる。

#### マネコンへのSSOの流れ

1. AWS Managed Microsoft ADリソースを作成時に発行する`アプリケーションアクセスURL`にアクセスするとサインイン画面にアクセスできる。
1. AWS Managed Microsoft AD上のユーザもしくは信頼関係を結んだオンプレADのユーザでログインする。
1. ログインに成功すると、あらかじめ紐づけたIAMロールで有効にしたAWSアプリケーション(マネコンなど）にアクセスできる。

### Simple AD

Microsoft ADと互換性のあるSambaを使ったスタンドアロンのマネージド型ディレクトリサービス。
Managed Microsoft ADと同様2つのサブネットが必要。

### AD Connector

オンプレミスAD等既存のActive Directoryへの接続を仲介するサービス。一部のAWSサービスはAWS Directory Serviceとのみ連携可能であるためオンプレADとの連携にAD Connectorを利用する。

## STS(AWS IAM)

上記のSSOとはまた別で、アプリケーションからAWSリソースにアクセスする際の一時停な認証を与える方法。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/6ee1c647-e2a7-ad50-14be-b881aadf92fd.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406130/3cb612f8-6a28-642b-078a-955ca631bece.png)

基本的に多くのケースでCognitoの利用が推奨される。
結局は`AssumeRoleWithWebIdentity API`がコールされているので自前実装することで1から構築することは可能。

`GetxxxToken`系はIAMユーザをベースとしているのに対し、`AssumexxxRole`はIAMロールベース。

### GetFederationToken

組織でSAML2.0非互換のIDストアを利用している場合、SAML2.0の動作を模倣したカスタムIDブローカーを噛ます構成をとる。IDブローカーからSTSに対してGetFederationToken APIコールすることで一時的な認証情報が返却される。

### AssumeRoleWithSAML

SAML2.0互換のIdPを有している場合に利用できる。

### AssumeRoleWithWebIdentity

OIDC互換のパブリックなWebベースのIdP(GoogleやFacebookなど)を使用する場合、およびCognitoにプールされたユーザを使用する場合に利用できる。

### GetSessionToken

信頼されない環境からIAMユーザでアクセスする時に利用。
MFAを利用して一時的な認証情報(アクセスキー、シークレットキー、セキュリティトークン)を取得する際に利用。

### AssumeRole

IAMユーザで付与されてないポリシー権限でAWSリソースにアクセスさせる時に利用。
なお、`GetFederationToken`や`GetSessionToken`はいずれも`AssumeRole`で代用可能らしい(?未理解)

# 参考

Microsoft AD
- https://www.sbbit.jp/article/cont1/37798
- https://atmarkit.itmedia.co.jp/ait/articles/1405/26/news024.html
- https://atmarkit.itmedia.co.jp/ait/articles/1405/07/news010.html
- https://www.rworks.jp/system/system-column/sys-entry/21659/
- https://www.aibsc.jp/joho/otasuke_m/clientserver/03/01.html
- https://blogs.manageengine.jp/what_is_group_policy/
- https://blog.serverworks.co.jp/tech/2016/06/07/activedirectory-authenticationandauthorization/
- https://milestone-of-se.nesuke.com/sv-advanced/server-software/sso/

AWSへのSSO
- https://dev.classmethod.jp/articles/adfs-aws-sso/
- https://atmarkit.itmedia.co.jp/ait/articles/1712/13/news002.html

AWS Directory Service
- https://dev.classmethod.jp/articles/re-introduction-2022-directory-service/

AWS Managed Microsoft AD
- https://d1.awsstatic.com/webinars/jp/pdf/services/202108_AWS_Black_Belt_Microsoft_AD.pdf
- https://docs.aws.amazon.com/ja_jp/directoryservice/latest/admin-guide/edit_trust.html
- https://qiita.com/mksamba/items/a6e93bbd2e0bd80c9393

STS、IDフェデレーション
- https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_common-scenarios_federated-users.html
- https://blog.serverworks.co.jp/summary-of-getting-security-credentials-from-sts
- https://dev.classmethod.jp/articles/getfederetiontoken-assumerole-getsessiontoken/
- https://qiita.com/fkooo/items/a6d71407b2bed42332cc