【仕事メモ】OpenAM (ver13) とOffice365のSAML連携（３） Office365とのSAML連携

# 概要
以前も実施した手順ですが、IdPの証明書をOpenAMに登録して、トラストサークルの設定追加(COT設定追加)、Office３６５側ではIdPの情報を登録する必要があります。

## IdPの設定（証明書登録）
ではまず、IdPの証明書を作成するためにJavaのkeytoolコマンドを利用して、keystoreファイルを作成します。
これはSAML認証で使用するための署名用の証明書およびそれに紐づく秘密鍵を作成するために必要となるものです。

OpenAMサーバにて以下のコマンドを実行します。

```bash:キーストア作成
keytool -genkeypair \
-keyalg rsa \
-alias openam-idp \
-dname "CN定義" \
-keypass R8g%kWg3 \        # 署名鍵のパスワードを指定
-keystore mykeystore.jks \ # キーストアファイル名を指定
-storepass changeit \      # キーストアのパスワードを指定
-validity 3650 \           # 鍵の有効期限を指定(例：10 年)
-keysize 2048              # 鍵の長さを指定
```

下記の警告メッセージが表示されるかと思いますが今回は無視します。
※本番に導入する際には十分に留意された方が良い内容だと思います。

```:警告メッセージ
Warning:
JKSキーストアは独自の形式を使用しています。"keytool -importkeystore -srckeystore mykeystore.jks -destkeystore mykeystore.jks -deststoretype pkcs12"を使用する業界標準の形式であるPKCS12に移行することをお薦めします。
```

上記まででオリジナルのkeystoreファイルの作成と配置が完了しましたので、次にパスワードの符号化を実施します。下記のURLにアクセスすることでパスワードの符号化を行えます。

```:パスワード符号化用URL
http://<OpenAMホスト名>:8080/openam/encode.jsp
```

そしてアクセスした先のページでkeystoreファイル作成時に指定したパスワード「changeit」を指定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/79ebf0a0-f033-0a4e-b848-b4ce79530633.png)

すると符号化されたパスワードが表示されるのでテキストファイルに控えておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/34440851-3601-a98a-5cb9-bd2cfe606913.png)

そして、符号化したパスワードは以下のファイルとしてOpenAMサーバ上に保存します。

```bash:符号化パスワードの保存先
vi /usr/share/tomcat/openam/openam/private/.storepass
vi /usr/share/tomcat/openam/openam/private/.keypass
```
作成したファイルのパーミッションも変更します。

```bash:パーミッションの変更
chown root:tomcat /usr/share/tomcat/openam/openam/private/.storepass
chown root:tomcat /usr/share/tomcat/openam/openam/private/.keypass
chmod 640 /usr/share/tomcat/openam/openam/private/.storepass
chmod 640 /usr/share/tomcat/openam/openam/private/.keypass
```
ここまでが完了したら、今度はOpenAM管理コンソールからの操作となります。
OpenAM管理コンソールトップページの「CONFIGURATION」‐「サーバーおよびサイト」‐「デフォルトのサーバー設定値」‐「セキュリティ」を表示します。

表示された設定項目にキーストアの項目があるので、それぞれ以下の通り設定を変更します。

```:キーストア設定
キーストアファイル：
　　/usr/share/tomcat/openam/openam/private/mykeystore.jks
キーストアパスワードファイル：
　　/usr/share/tomcat/openam/openam/private/.storepass
非公開鍵パスワードファイル：
　/usr/share/tomcat/openam/openam/private/.keypass
証明書エイリアス：
　openam-idp
```

設定し終わると↓のような感じになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/390be426-c301-8c10-8d7a-0f613faa1b8f.png)

管理コンソールの設定が完了したらTomcatのサービスを再起動します。

```bash:Tomcat再起動
systemctl restart tomcat
```
再起動が完了したら再度、OpenAM管理コンソールに接続します。

## トラストサークルの登録
まずはOffice365のSAML認証用メタデータをダウンロードしてきます。
メタデータとは以下の意味を持つファイルです。

```:メタデータの意味
メタデータファイルとは、COT 内の特定のエンティティー (SP/IDP) のプロトコル設定と
信頼情報を含む (SAMLv2 仕様に従った) XML ファイルです。
メタデータファイルはパートナーから受信しているか、または自分で作成している可能性があります。
```
Office365のSAML認証用メタデータをダウンロードする先のURLは以下になります。

```:Office365用メタデータダウンロードURL
https://nexus.microsoftonline-p.com/federationmetadata/saml20/federationmetadata.xml
```

上記のURLにアクセスしてメタデータをダウンロードした上で下記タグの箇所を削除します。
※これを行っておかないとメタデータをインポートする際にエラーが発生します。

```xml:メタデータのタグを削除する箇所
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><Reference URI="#_0c0d1ca7-7292-4bc6-801c-f880f6098f4e"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><DigestValue>7XES82rGE5v/Hdsytuvg9wp8iBE=</DigestValue></Reference></SignedInfo><SignatureValue>OOSrXuQqx/V/XjkOnEMuSVaGsb5a25e5kT5ntSDn6TwVjQR35l1o918OoEzF0+KNe+MZhfGdzzntFsG96Ifq8lM8hcVzwG6/xH9Ar+jdwSe7cemd3j7d48H1WIIx6M60rzHlkHnegbrXbUwWZLGAGyQu/P2z9Z8lIjzzjbZi0THFx5aZR5goI91N6eLYBP3ms75QDTb3749InVb+Yc//klycFkFfa5kViDqkNJULw8d+S6BGPsfzd+V72ih16YLegHLZAOhv0Te07QiVgFvNbArcJcyUbXZf+VHW4XyG2YYCL1F1cwT5GFDdemq7Fc+TacEPqq5SxsAq7Nu9pM78Sg==</SignatureValue><KeyInfo><X509Data><X509Certificate>MIIDYDCCAkigAwIBAgIJALLJPAyvf2sjMA0GCSqGSIb3DQEBBQUAMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleTAeFw0xNDA3MTgxOTUzNDBaFw0xOTA3MTcxOTUzNDBaMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANYDKgByFZdqtTnnpF4IfIp4i2XLg2rLIo+mu4DmW9gRLlBJCNc7YESUxpKzuFYaANd8fWsDigJZTXbhOQApSpw4xXFnor2vJ1zm94LtqjcVEXTjUml5gAIS4pwuOU3ZfO/0eTG0gDYp4a0L/mzzTRsnwe/8WMPIE75Bq2zAyAZ9aePvl3QX7cXYLPfeK4QTgK3B5lwe1wWu3y5oQidjcSok8Frf80xzuCYuOa+ZUK3JibpLLCrT4uwiqf+KREDSdc4bPPlq0PWI4sQr1tha8yypRSvOH+/MxcfSRSnl6Uc+gm8nVEEWWIu4hhu6NIfG91mMUqJuzkgLCi6Gov6JS8UCAwEAAaOBijCBhzAdBgNVHQ4EFgQUnQoq7sI3R8rde4sQs6nGEbJm3LcwWQYDVR0jBFIwUIAUnQoq7sI3R8rde4sQs6nGEbJm3LehLaQrMCkxJzAlBgNVBAMTHkxpdmUgSUQgU1RTIFNpZ25pbmcgUHVibGljIEtleYIJALLJPAyvf2sjMAsGA1UdDwQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEAf4jaNhKzRG3k+52WoM9nnISP7rlWIeWwH6EQGUlF6ozSP/03gYMAdqpdhww5zNwKzi7TQVbDC0pgq/tqzHv6JEI0R4B6h7/TJ1pYPxdvIFQrE27RHESltH/m+5UkVnayLqRD3/fi4zf4aEpxSDZ73MCR5LanPGqvlAMz29AL3g1ynj+eu7xMfFsM/8+qJaCXuxT5/30eeLEe+PYikA/PhEwp+qkDQWPvdAwEghuUaFvtKAgDZierjpGzHZnYkXTTDTHVe1iP7tsAJH5qK3qdcv3UGPyZrjC/lietJcAcnwVoZQ93v2ieGfcKKN+PFN9M59/BkPo62HPoGNNx2ZDQaQ==</X509Certificate></X509Data></KeyInfo></Signature>
```

メタデータのタグ削除を終えたら適当なフォルダに保存しておいてください。

ここからはOpenAM管理コンソールでの操作です。
トップ画面から「REALMS」-「Realm Overview」を表示します。
そして、画面から「Create SAMLv2 Providers 」を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/077e5561-3017-121d-9531-77b6a902b9dd.png)

次に「Register Remote Service Provider」を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/c231a405-a40b-f2c4-6355-434b7ac4752c.png)

「メタデータファイルはどこに存在しますか？」欄で「ファイル」にチェックを入れ、メタデータが配置されているURLに「アップロード」ボタンが表示されるので、クリックすると↓の画面が表示されます。
先ほど加工したメタデータをアップロードします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/926e3dad-38b9-b8b0-53ab-b03c5ecfd0e8.png)

トラストサークルには下記のように任意の名称を入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/5faac741-fb8a-5aca-3f6b-94208ba41f69.png)

ここまでが終わったら「設定」をクリックします。
↓の画面が表示されれば、トラストサークルの設定登録は完了です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/55b554ba-bf44-264a-0ade-c4793ec397ed.png)

## IdPの登録
またトップ画面からトップ画面から「REALMS」-「Realm Overview」を表示します。
そして、「Create SAMLv2 Providers 」を選択します。
次に「Create Hosted Identity Provider」を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/8f86c099-63e5-79bb-b543-94ed3cd7998e.png)

そうすると↓の画面が表示されるので、それぞれ下記の通り入力してください。
入力が完了したら「設定」をクリックします。

　・このプロバイダのメタデータがありますか？：いいえ(デフォルト)
　・名前：そのまま(デフォルト)
　・署名鍵：openam-idp
　・新しいトラストサークル：登録したトラストサークルの名称

<img width="1348" alt="スクリーンショット 2018-08-26 19.29.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/138274/506f0f71-b1f6-72db-c3ce-9254b237d559.png">

↓のように表示されればIdPの登録までが完了です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/bebf2420-99bd-f766-02ba-2f82908ec155.png)

ここまででOpenAM側の操作は完了なので、今度はOffice365からの設定を行います。

## Office365の設定
すみません、ここの更新が遅くなってしまいましたが、無事にフェデレーションする動作を確認するに至りましたので、気力を振り絞って記事にします…

__で結論からお伝えしますとここから先の作業、とても重要です！！__

というわけで、重要であることをご認識いただいた上で手順を記載していきます。

まずはPowerShellを使用して、Office365へ接続…ではないです。
最初にADユーザーの属性値を追加してやる必要があります。

追加対象となる属性値は以下、2つになります。

```:追加対象の属性値名
sun-fm-saml2-nameid-info
sun-fm-saml2-nameid-infokey
```
ではどうやって上記の2属性を追加するのかというと。
構築したADDSサーバでスキーマを拡張してやる必要があります。

その手順は以下の通りです。

```:ADスキーマ追加手順
1.MMCに「ActiveDirectoryスキーマ」の機能を追加する
2.あるオブジェクトクラスに追加対象の属性値を所有するオブジェクトクラスを紐付ける
3.対象ユーザーの属性値に追加対象の属性を設定する
```

上記の要領で設定を行います。
ではまず、MMCに「ActiveDirectoryスキーマ」の機能を追加しましょう！

###ADスキーマの拡張
ADDSサーバにログインしていることを前提として手順を記載していきます。
まずはWindows PowerShell for ActiveDirectory Moduleを起動（管理者権限で起動）してください。
そこで以下のコマンドを実行します。

```PowerShell:ActiveDirectoryスキーマ機能追加コマンド
regsvr32 schmmgmt.dll
```
そして、何も起きずにプロンプトが戻って来れば、コマンドに成功したことを示します。
次にMMCを起動してください。

MMCを起動したら、今度は「ファイル」−「スナップインの追加と削除」を起動します。
追加の方法として、「コンピュータアカウント」−「ローカルコンピュータ」を選択してください。

無事にMMCに「ActiveDirectoryスキーマ」の機能を追加できていれば、MMCにて↓のような画面が表示されるはずです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/010088cf-fc97-2aac-196e-a09fabac7d4c.png)

###オブジェクトクラスの追加
では次にオブジェクトクラスの追加を行なっていきます。
スキーマの画面で「クラス」の中に以下のオブジェクトクラスが存在しています。

```:追加対象のオブジェクトクラス名
sunFMSAML2NameIdentifier
```
ちょうど↓のように画面に表示されているはずです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/050805dc-8b53-d8be-e262-3ba547797c4f.png)

上記、オブジェクトクラス内の属性値を確認してみますと…

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/4a8862ef-ca11-56a5-b36b-90163a8bc716.png)

今回、追加する対象の属性値が含まれていることを確認できます。
なので、このオブジェクトクラスをあるオブジェクトクラスに紐付けることでユーザーの属性値に「sun-fm-saml2-nameid-info」および「sun-fm-saml2-nameid-infokey」の属性値が追加されます。

そのオブジェクトクラスは「user」になります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/a04baca8-c2bc-7b0a-2993-11e7ff6bd384.png)

このオブジェクトクラスに先ほどのオブジェクトクラスを紐付けます。
手順としては「user」オブジェクトクラスの補助型クラスに先ほどの「sunFMSAML2NameIdentifier」のオブジェクトクラスを追加するだけです。※ちょうど↓のような形です。

「プロパティ」−「関係」タブ−「補助型クラス」−「クラスの追加」を選択して、追加対象のオブジェクトクラスを選択し、適用→OKをクリックするのみです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/85a38aac-0df0-c46c-fbef-36c6819ee6f3.png)

これで対象ユーザーの属性値にSAML通信で必須となる属性が追加されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/138274/3eb0dbf4-d990-2758-8b6b-41340b7de139.png)