【AWS】LDAP認証とIAMとの間でIDフェデレーションを行うには？

# はじめに
本記事はAWS SAA（ソリューションアーキテクト）の学習過程で自身で調べまとめた内容を備忘録として投稿したものです。

今回は、「LDAP認証とIAMとの間でIDフェデレーションを行う方法」というテーマに焦点を当て、LDAPの基礎から始め、IAMを介したIDフェデレーションの基本概念について説明しています。

LDAP認証についてはセキュリティなどの実践でもよく使われるもののため、内容理解の一助になれば幸いです。

# TL;DR
LDAP認証とIAMの間でIDフェデレーションを実現するには、SAML2.0をサポートし、IdP（Identity Provider）として機能するソフトウェアを使用します。

# LDAPとは?
LDAPとはディレクトリサービスへアクセスするためのプロトコルです。
そのためまずは、ディレクトリサービスについて説明していきたいと思います。

### ディレクトリサービスとは？
ディレクトリ（directory）は「登録簿」や「住所録」といった意味です。
ディレクトリサービスは、管理したい情報をまとめた登録簿（ディレクトリ）を作り、それに対する問い合わせ（検索）、変更、削除を可能にしているサービスを指します。
具体的にはネットワークを利用するファイル、プリンタ、ユーザー、デバイス、およびサーバーなど、様々なコンピュータ内の情報を統合的に管理してくれます。

代表的なディレクトリサービスの1つとしてMicrosoft社のActive Directoryがあります。Windows Serverというサーバー向けOSに搭載されている機能で、Windowsパソコンの機能やユーザー情報を管理することが出来ます。

### LDAPとは？
LDAPはLightweight Directory Access Protocolの略称で、ディレクトリサービスへアクセスするためのプロトコル、つまり約束事です。
LDAPはネットワークを利用するユーザー名やマシン名、パスワード、IPアドレスなどの様々な静的データを保有したディレクトリサービスから情報を取り出したり、更新したりするために利用されます。
また、LDAPはデータの冗長性を排除し、情報を一元化するという特徴があります。

# LDAP認証とは？
LDAP認証とは、OpenLDAPやMicrosoft Active Directoryなどのディレクトリサービスに保存されたユーザ名およびパスワードを検証するプロセスです。管理者はディレクトリ内でユーザアカウントを作成し、権限を付与することができます。

ユーザがリソースにアクセスを試みると、リクエストがLDAP認証サーバに送信されます。LDAPサーバは入力されたユーザ名とパスワードを、ディレクトリ内のデータと照合します。一致した場合、サーバはリクエストしたリソースにアクセスするための承認をユーザが受けているかどうかを確認します。

# IDフェデレーションとは？
IDフェデレーションとは、外部の認証サーバーを利用して、サインインする技術のことです。
よくログインで見かける以下のようなボタンは、IDフェデレーションを利用しています。
TwitterやGoogleなどの認証サーバーを利用して、アプリケーションへのサインインを行っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743174/fb540488-b35c-3427-e9ee-0ff6dbaee14c.png)

### IDフェデレーションとSSO(シングルサインオン)の違い
SSO(シングルサインオン)とは、一度のサインインで、複数のアプリが利用可能になる仕組みのことです。
IDフェデレーションはSSOを実現する方式の1つで、全部で4つの方式が存在します。

| SSOの方式 | 説明 |
|:-----------|:-----------|
| フェデレーション方式 | 外部の認証サーバー（IdP*）で認証しクライアントに認証結果を返す方式。クライアントがアプリ（SP*）に認証結果を返し、アプリを利用する。 |
| リバースプロキシ方式 | リバースプロキシサーバーで認証する方式。アプリ認証は無し。 |
| エージェント方式 | 認証済か否かについて、アプリに組み込んだエージェントが認証サーバーに問い合わせる方式。 |
| 代理認証方式 | 代理認証サーバーがユーザーの代わりに自動サインインを行う方式。ユーザーは事前に代理認証サーバーにサインインする必要有。 |

:::note info
*IdP:
Identity Providerの略称。ID（ユーザー名やパスワード等）を管理する認証サーバー。認証に成功すると、クライアントに認証結果を返す。
:::

:::note info
*SP:
Service Providerの略称IdPの認証結果を元にサービスを提供するアプリケーション。
:::

### IDフェデレーションの仕組み
IDフェデレーションでは、以下のいずれかのプロトコルを利用して認証結果を伝送することでSSOを実現しています。

| プロトコル | 説明 |
|:-----------|:-----------|
| SAML（Security Assertion Markup Language） | XML形式の認証結果を送受信する仕様 |
| OpenID Connect（OIDC） | JSON形式の認証結果を送受信する仕様 |

<br>

つまり今回の記事の内容を簡単に言うと、今回はLDAPで管理されたIDを使って認証を行い、AWSサービスの使用許可を制御（認可）しようということです。

# AWSからIDフェデレーションへのアクセス許可
IAMロールを使用してIDが組織または第三者のプロバイダー（IdP）からフェデレーションされたユーザーのアクセス許可を指定できます。
ここではそれぞれの概要について簡単に紹介します。

### Amazon Cognitoを使用したフェデレーション
AWSリソースにアクセスするモバイルまたはWebベースのアプリを作成する場合、アプリがAWSにプログラムによるリクエストを送るには認証情報が必要になります。ほとんどのモバイルアプリケーションではこのAmazon Cognitoを使った方法を利用します。

### パブリックIDサービスプロバイダーまたはOpenID Connectを使用したフェデレーション
上記の通り基本モバイルおよびWebベースのアプリケーションではAmazon Cognitoを使用します。しかし、より高度な設定の場合OpenID Connectと互換性があるLogin with Amazon、Fecebook、Google、その他IdPでのログインなどサードパーティのサービスを直接使用します。

### SAML 2.0を使用したフェデレーション
組織が既にSAML 2.0（Security Assertion Markup Language 2.0）をサポートするIDプロバイダーソフトウェアパッケージを使用している場合、IDプロバイダー（IdP）としての組織とサービスプロバイダー（SP）としてのAWSとの間に信頼を作成できます。

### カスタムIDブローカーアプリケーションのフェデレーション
IDストアにSAML 2.0と互換性がない場合、カスタムIDブローカーアプリケーションを作成して同じような機能を実行できます。

<br>

4種類のフェデレーションがありますが、実現は以下の2つで行います。
- Amazon Cognito
- IAM（の中のAWS STS）

# AWS STSとは？
AWS STSとはAWS Security Token Serviceの略でAWSリソースへアクセスするための一時的なセキュリティ認証情報を提供するためのサービスです。
一時的なセキュリティキーを作成することで、信頼するユーザーへAWSリソースへのアクセスを許可することができます。

# LDAP認証とIDフェデレーションを行う場合
LDAP認証とAWSとでIDフェデレーションを行う場合、認証情報を交換するための標準プロトコルとしてAWSがサポートしているSAML2.0を使うことができます。
この際SAML2.0をサポートしていてIdPとして機能するソフトウェア（Microsoft Active Directory フェデレーションサービス（AD FS、Windows Server の一部）、Shibboleth、OpenAMなど）を用意して、SP（今回はAWS）とAWS STSを使ってIDフェデレーションを行います。

SAML2.0ベースのフェデレーションをAWS STSを使って実現するイメージは以下の通りです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743174/693427bc-5b59-0e63-4dca-f2abf6ae16d1.png)
*参照: [SAML 2.0 ベースのフェデレーションについて](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_saml.html)

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

# まとめ
今回はLDAPの基礎からIAMを介したIDフィデレーションの基本概念を紹介してきました。

LDAP認証とIAMとの間でIDフェデレーションを実施することで、セキュリティとコンプライアンスの強化、リソース管理の効率化、アイデンティティ管理の自動化とスケールなど様々なメリットに繋げることができます。

実際の導入事例等など、AWSのより実践的な内容は社内ブログなどに上げていく予定ですので併せて確認いただけたら嬉しいです。

https://goodlocal.jp/blog

<br>

## 参考文献
- https://blog.trustlogin.com/2022/20221027
- https://xtech.nikkei.com/atcl/nxt/mag/nnw/18/041800010/091800020/
- https://www.onelogin.com/jp-ja/learn/what-is-ldap 
- https://hogetech.info/security/sso/federation 
- https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_common-scenarios_federated-users.html