SAMLってなに？シングルサインオンってなに？

## SAMLとは

SAMLは「シングルサインオン」の実現方法の一つである。

## シングルサインオンとは

シングルサインオンとは1度ログイン操作を行うと、連携している複数のサービスに自動でログインできる仕組みのこと。
以下に、複数の社内サービス、社外クラウドサービスを利用する企業の利用者の例を示す。

■シングルサインオンを使わない場合
![saml-ページ3.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27358/bef48354-2f52-03e5-8484-0aba66c1c5e2.png)


■シングルサインオンを使う場合
![saml-ページ2.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27358/ae2e2d97-0b36-51a3-ebf0-f146923337f7.png)


シングルサインオンを使う場合の利用者、システム管理者のメリットは以下の通り。

利用者のメリット
- 一か所に一度ログインすればそこと連携したサービスに自動的にログインできる。
- あちこちのサービスのユーザ名/パスワードを覚えずに済む。(よって、パスワードの使いまわしのリスクが下がる。)

システム管理者のメリット
- ユーザにどのサービスを使うことを許可するかを一か所で集中管理できる。

## 再び、SAMLとは

SAMLとは、[wikipedia](https://ja.wikipedia.org/wiki/Security_Assertion_Markup_Language)よると、

> Security Assertion Markup Language (SAML、発音は SAM-el、/ˈsæməl/)は、特にアイデンティティプロバイダーとサービスプロバイダーの間で認証および認可データを交換するための公開標準である。
> SAMLは、セキュリティアサーション (サービスプロバイダーがアクセス制御の決定を行うために使用するステートメント)のための XML ベースのマークアップ言語である。

とある。
(公開標準 : 使用に当たっての各種権利を伴って公然と利用可能な標準([wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E6%A8%99%E6%BA%96)))

「アイデンティティプロバイダー」と「サービスプロバイダー」という言葉が出てきたが、前述の図に「アイデンティティプロバイダー(IDP)」と「サービスプロバイダー(SP)」を追記した図を以下に示す。

![saml-ページ4.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27358/ac915869-9621-0c2d-b8c3-1f9361ef1052.png)


アイデンティティプロバイダー(IDP)は、ユーザーを認証するサービスである。
サービスプロバイダー(SP)は、IDPで認証したユーザが利用するサービスである。

## SAMLの信頼関係構築

SAMLによるシングルサインオンは、ログイン操作を始める前にIDPとSPの間で「信頼関係」を構築する必要がある。

信頼関係を構築するために、IDPからSPへ、またSPからIDPへ「メタデータ」を渡す。(メタデータの詳細についてはここでは割愛)
IDPまたはSPのシステム管理者がメタデータの交換を行い、受け取ったメタデータをIDPまたはSPに設定する。

■IDPからSPにメタデータを渡す
![saml-ページ6.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27358/94baf751-e2e8-00af-5992-ff9b2373aff4.png)


■SPからIDPにメタデータを渡す
![saml-ページ5.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27358/65098125-73d6-da8b-44e7-c87408d51f5f.png)


信頼関係を結ぶことによって、
- SAMLの通信(SAMLリクエスト/レスポンスの送受信)
- 認証結果に改竄がないことの確認

ができるようになる。


## SAMLによるログイン

### i)SAMLログイン開始、SAMLリクエスト送信

利用者はSP上の指定のURLにブラウザでアクセスすることによってSAMLログインを開始する。(1)
 ※ここではSPInitiatedログインのみを扱う。

![saml-ページ7.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27358/23ce971e-a417-6be2-38f9-9e215767116e.png)


利用者が1を操作するとそれをトリガーとして、SPがIDPに向けてHTTPで「SAMLリクエスト」を自動的に送信(リダイレクト)する。(2,3)

### ii)SAML認証、ユーザ名とパスワードの入力

IDPはSAMLリクエストを受け取とったあと、利用者がIDPにログイン済みかどうかを確認する。
まだログインしていなければ、利用者のブラウザにログイン画面を表示し、ユーザ名、パスワードの入力を促す。(4)
利用者によるユーザ名、パスワードの入力が終わったら認証を行う。(5)

![saml-ページ8.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27358/fe47f67d-f4a2-72b6-86eb-1b42bdf8141a.png)


ログイン済みの場合は4,5は行わない。

### iii)SAMLレスポンス送信、認証完了

認証が終わると、認証結果(アサーション)を含んだ「SAMLレスポンス」を作成し、X.509証明書を使ってアサーションまたはSAMLレスポンスに署名する。(6)
IDPはSAMLレスポンスをSPに向けてHTTPでSAMLレスポンスを送信(POSTまたはリダイレクト)する。(7,8)
SPはSAMLレスポンスを受け取ると、署名が正しいかどうか(改竄がないかどうか)を信頼関係構築時にIDPから受け取ったX.509証明書を使って確認する。(9)

![saml-ページ9.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27358/436b5339-f2f8-4a52-ee58-681650fc2132.png)

以上で、SAML認証完了。


## IDP/SPの例

### IDPの例
- [Microsoft Entra (旧AzureActiveDirectory : Microsoft365の認証基盤)](https://learn.microsoft.com/ja-jp/entra/architecture/auth-saml)
- [Microsoft ActiveDirectory FederationService](https://accel-archives.intra-mart.jp/2016-spring/document/iap/public/im_saml/im_saml_setup_guide/texts/idps/adfs.html)
- [学術認証フェデレーション](https://www.gakunin.jp/)
- [google workspace](https://support.google.com/a/topic/7556794?hl=ja&ref_topic=7556686&sjid=8599211090320510664-AP)
- [octa](https://www.okta.com/jp/)
- [trustlogin](https://support.trustlogin.com/hc/ja/categories/19796441894041)
- [onelogin](https://www.onelogin.com/jp-ja/learn/saml)

### SPの例
- [salesforce](https://help.salesforce.com/s/articleView?id=sf.sso_saml_setting_up.htm&type=5) 
- [Zendesk](https://support.zendesk.com/hc/ja/articles/4408887505690-SAML%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%AA%E3%83%B3%E3%81%AE%E6%9C%89%E5%8A%B9%E5%8C%96)
- [box](https://support.box.com/hc/ja/articles/360043696514-Enterprise%E3%81%A7%E3%81%AE%E3%82%B7%E3%83%B3%E3%82%B0%E3%83%AB%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%AA%E3%83%B3-SSO-%E3%81%AE%E8%A8%AD%E5%AE%9A)
- [Dropbox](https://help.dropbox.com/ja-jp/security/sso-admin)
- [GitHub](https://docs.github.com/ja/enterprise-cloud@latest/organizations/managing-saml-single-sign-on-for-your-organization/about-identity-and-access-management-with-saml-single-sign-on)
- [GitLab](https://gitlab-docs.creationline.com/ee/user/group/saml_sso/example_saml_config.html)
- [学術認証フェデレーション](https://www.gakunin.jp/)
- [google workspace](https://support.google.com/a/topic/7579248?hl=ja&ref_topic=7556686&sjid=16595186989071419753-AP)

### SAML IDP/SPのオープンソース実装例
- [shibboleth](https://www.shibboleth.net/)
- [keycloak](https://github.com/keycloak/keycloak)
- [SimpleSAMLphp](https://simplesamlphp.org/)