GluuServerを使ってOffice365とSAML連携(1)

#概要
この記事には2つの目的がありまして、１つはGluuというよく分からないOSS製品を利用して、
Office365とのSSO連携が可能であるかを確認すること。そして、もう一つなのですが、
僕は普段、Mac端末を利用しているのですが、Mac端末からOffice365のSSO連携を
実現できるのかという疑問にもチャレンジしていきたいと考えています。

## Mac端末へのPowershell配備
以下、公式にMAC OSへのPowerShell配備方法が記載されていました。
正直、PowerShellがインストールできてしまえば、なんでもは言い過ぎかもしれないけど、
結構、ほとんどのことが出来ますよね（汗

<引用元>
https://docs.microsoft.com/ja-jp/powershell/scripting/install/installing-powershell-core-on-macos?view=powershell-6

前提として、Homebrewが導入されていることになりますけど、以下のコマンドを実行することで、
自分のMAC端末にPowerShellを導入することが出来ます。

```bash:PowerShell導入コマンド
brew cask install powershell
```

```🍺  powershell was successfully installed!```が表示されれば導入完了です。
以下のコマンドを実行して、MACのターミナルがPowerShellのコマンド画面に切り替われば、動作しています。

```bash:PowerShell起動コマンド
wsh
```

```powershell:起動画面
PowerShell 6.2.0
Copyright (c) Microsoft Corporation. All rights reserved.

https://aka.ms/pscore6-docs
Type 'help' to get help.

PS /Users/User01>
```

ここにOffice365への接続用モジュールを追加してみます。

```powershell:モジュールの追加
Install-Module MSOnline
```

とりあえず、ここまで出来ましたが、```Connect-MsolOnline```が実行出来ません…
どうやら、SSOの設定をMAC端末で完結させるのは難しそうですね。

## Gluuの設定
1.OpenDJのスキーマ拡張
昨日、これがよく分からなくて、結局、1日格闘する羽目になってました…
Gluuの公式ページにO365の連携を行うための設定手順が記載されたページがあるのですが、
このページ、残念なことに手順を記載していると思われる部分のキャプチャがきちんとアップロード出来ていなくて、
肝心な設定が記載されている箇所を確認することが出来ないです…

そのため、四苦八苦したのですが、結果としてスキーマ拡張は出来て、
目的としていたO365とのSAML連携に必要な属性値の追加に成功したので、
解決に至ったプロセスまで忘れたくないので、こちらに記録しておくことにします。

[1]きっと、OpenDJの公式サイトにスキーマ拡張手順が掲載されているだろう
[2]OpenDJの設定を変更したら、OpenDJのサービス再起動が必要になると思われる

まず、↑の[2]はOpenDJのフォーラムに答えがありました。
次に[1]なのですが、確かに答えっぽいものはいくつか上がってはいたのですが、
肝心要のO365連携に必要となる属性をどのように設定(定義)すれば良いのかを
記載しているサイトはありませんでした…
そのため、結局、原点回帰ということでGluuのサイトに戻ってきて、手順を確認しました。

前提部分にはなるのですが、OpenDJの設定を変更するためにはまず、
Jettyを起動し、Gluuサーバーにログインしておく必要があります。
※この部分についてはインストール手順に説明を補記します。

```bash:Jetty起動/ログイン
/sbin/gluu-serverd-3.1.6 start
/sbin/gluu-serverd-3.1.6 login
```

ログインしたら、OpenDJのスキーマファイルを編集します。

```bash:OpenDJスキーマファイル編集
cp -p /opt/opendj/config/schema/77-customAttributes.ldif /opt/opendj/config/schema/77-customAttributes.ldif.org
vi /opt/opendj/config/schema/77-customAttributes.ldif
```

```vim:/opt/opendj/config/schema/77-customAttributes.ldifファイルの編集
dn: cn=schema
objectClass: top
objectClass: ldapSubentry
objectClass: subschema
cn: schema
attributeTypes: ( 1.3.6.1.4.1.48710.1.3.1001 NAME 'objectguid'
  DESC 'Custom Attribute Office 365'
  EQUALITY caseIgnoreMatch
  SUBSTR caseIgnoreSubstringsMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
  X-ORIGIN 'Gluu custom attribute' )
attributeTypes: ( 1.3.6.1.4.1.48710.1.3.1002 NAME 'ImmutableID'
  DESC 'Custom Attribute Office 365'
  EQUALITY caseIgnoreMatch
  SUBSTR caseIgnoreSubstringsMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
  X-ORIGIN 'Gluu custom attribute' )
attributeTypes: ( 1.3.6.1.4.1.48710.1.3.1003 NAME 'IDPEmail'
  DESC 'Custom Attribute Office 365'
  EQUALITY caseIgnoreMatch
  SUBSTR caseIgnoreSubstringsMatch
  SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
  X-ORIGIN 'Gluu custom attribute' )
objectClasses: ( 1.3.6.1.4.1.48710.1.4.101 NAME 'gluuCustomPerson'
  SUP ( top )
  AUXILIARY
  MAY ( telephoneNumber $ mobile $ carLicense $ facsimileTelephoneNumber $ departmentNumber $ employeeType $ cn $ st $ manager $ street $ postOfficeBox $ employeeNumber $ preferredDeliveryMethod $ roomNumber $ secretary $ homePostalAddress $ l $ postalCode $ description $ title $ objectguid $ ImmutableID $ IDPEmail )
  X-ORIGIN 'Gluu - Custom persom objectclass' )
```

ここで情報を補足します。
まず、/opt/opendj/config/schema/ディレクトリ配下にOpenDJ自体のスキーマファイルが保存されています。
そして、```77-customAttributes.ldif```ファイルというのはGluuサーバー上で
```CustomPerson```というオブジェクトクラスを定義しているスキーマファイルになります。
こちらのスキーマにオブジェクトクラスの定義を追加することでGluuサーバー上でカスタム属性を利用できるようになります。

定義はGluuのフォーラムから引っ張ってきたものなので、そのまま引用します。
これも何回か書き直してスキーマを認識するようになったのですが、
重要なのは書式チェックが厳しく行われるようなので、書き写す際に要注意です。
不要な改行やスペースが含まれていると正常に認識されません。

上記のスキーマ定義を設定ファイルに追加したら、OpenDJのサービスを再起動します。

```bash:OpenDJの再起動
/opt/opendj/bin/stop-ds --restart
```
```The Directory Server has started successfully```と表示されれば再起動に成功してます。

2.カスタム属性の追加
ここからはGluuサーバー上の設定操作になります。
左側のメニューから、[Configuration]-[Attribute]をクリックします。
次に画面上部に表示されている[Register Attribute]をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138274/274dbfb3-9920-6451-707f-80ded4048b26.png)


すると属性を登録する画面が表示されるので、Office365とのSAML連携に必要な以下の2属性を登録します。
```objectguid```と```IDPEMail```の2属性です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138274/767a9d85-1e98-04e6-b1af-e686b1b561f1.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138274/b5d92112-627f-8222-a970-8da54cc39e99.png)

それぞれ以下のような設定内容で登録しています。

＜objectguid＞
　Name:* objectguid ←これはオブジェクトクラスを指定します
　SAML1 URI: urn:gluu:dir:attribute-def:objectguid
　SAML2 URI: urn:oid:1.3.6.1.4.1.48710.1.3.1001
　Display Name:* objectguid
　Type:* Text
　Edit Type: admin
　View Type: admin,user
　Usage Type: Not defined
　Multivalued:* False
　oxAuth claim name:
　SCIM Attribute: False
　Description:* Office365
　Enable custom validation for this attribute: チェックあり
　Validation RegExp:
　Enable tooltip for this attribute:
　Minimum Length:
　Maximum Length:
　Regex Pattern:
　Status:*

＜IDPEmail＞
　Name:*  IDPEmail 
　SAML1 URI: urn:gluu:dir:attribute-def:IDPEmail
　SAML2 URI: urn:oid:1.3.6.1.4.1.48710.1.3.1003
　Display Name:* IDPEmail
　Type:* Text
　Edit Type: admin
　View Type: admin,user
　Usage Type: Not defined
　Multivalued:* False
　oxAuth claim name:
　SCIM Attribute: False
　Description:* Office365
　Enable custom validation for this attribute: チェックあり
　Validation RegExp:
　Enable tooltip for this attribute:
　Minimum Length:
　Maximum Length:
　Regex Pattern:
　Status:*

登録されると属性値の一覧画面に2属性が表示されるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138274/d11bc968-6cdd-03c8-2642-380bfb0e863a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138274/9b882b9e-424e-830f-b163-bf66961ab136.png)

ちょっと記事が長くなりそうなので、何回かに分けて連載したいと思います。