SAP Cloud Connectorの認証にActiveDirectoryを利用してみる

# 0. はじめに
SAP Cloud Connector をいじっている中で、認証をLDAPで行うことができると判明。

やってみようということで設定してみたが、SAPのドキュメントには純粋LDAPサーバの例しかなく、
Active Directory（以下、AD）の例がなかったので記事を書いてみることにしました。

題名にSAP～とかいてありますが、要はJNDIRealmの話です。

# １. そもそも
以下のヘルプを読むと、LDAPの場合こうしなさい的に書いてあるが、具体的にどうすればいいのか全く分からない。。。

[SAP Cloud Platform Connectivity - 認証での LDAP の使用](https://help.sap.com/viewer/cca91383641e40ffbe03bdc78f00f681/Cloud/ja-JP/120ceecfd84145a181ac160d588a7a3d.html)


ヘルプを読み解いていくと、設定画面の内、一番大切なのは`Configuration`の部分です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/208873/8baa3371-dc69-7415-cc2a-a606f0c9eeda.png)


設定例を見てみると、明らかにJNDIRealmの書き方です。
よって、Avtive Directoryで認証する為にはADに対応したJNDIRealmを書くことがゴールになります。

```:Configuration設定例
userPattern="uid={0},ou=people,dc=mycompany,dc=com"
roleBase="ou=groups,dc=mycompany,dc=com"
roleName="cn"
roleSearch="(uniqueMember={0})"
```
## 余談：JNDIRealmとは
JNDIRealmという言葉は二つの部分からなっています。
1つ目、JNDIとは「Java Naming and Directory Interface」の略です。
名前の通り、ネーミング/ディレクトリサービスからデータを参照する際に利用するAPIを指します。
ネーミング/ディレクトリサービスの実装は「DNS」や「LDAPデータベース」などが該当します。

2つ目、RealmとはTomcatの用語です。
公式ドキュメントを読むと「A Realm is a "database" of usernames and passwords」と明確に定義してあります。

[Apache Tomcat 8 - Realm Configuration HOW-TO](https://tomcat.apache.org/tomcat-8.0-doc/realm-howto.html)
> A Realm is a "database" of usernames and passwords that identify valid users of a web application (or set of web applications), plus an enumeration of the list of roles associated with each valid user.

よって、まとめると、Java Naming and Directory Interfaceを利用したユーザデータベースということになります。
具体的にはJNDIAPIでディレクトリサービス（ここではAD）にアクセスし、認証、認可を行う為の設定というところでしょうか。

## さらに余談：SAP Cloud Connector のサーブレットコンテナ
サーブレットコンテナにはGEMINIプロジェクトのGemini Web を利用しているようです。
当該PJのリリースノートを追っていくと、`Apache Tomcat 7.0.56`を利用しているようです。

```shell-session
# ls -l /opt/sap/scc/plugins/org.eclipse.gemini.web.tomcat_2.2.6.RELEASE.jar
-rw-r----- 1 sccadmin sccgroup 104537 May  3 21:28 /opt/sap/scc/plugins/org.eclipse.gemini.web.tomcat_2.2.6.RELEASE.jar
```

https://www.eclipse.org/gemini/web/download/release-notes/2.2.5.RELEASE.php
https://www.eclipse.org/gemini/web/download/release-notes/2.2.6.RELEASE.php



# 2. Active Directoryで認証する為の設定
JNDIRealmのうち、`connection*`は`Configuration`以外の項目から自動生成されそうなので、まずは`Configuration`に入力する内容を考えます。

## 2.1 Configuration
結論は以下のようになります。

```:Configuration
userBase="DC=example,DC=co,DC=jp" 
userRoleName="memberOf" 
userSearch="(sAMAccountName={0})" 
userSubtree="true"
roleBase="DC=example,DC=co,DC=jp" 
roleName="CN"
roleSearch="(member={0})" 
roleSubtree="true" 
```
一つ一つ解説していきます。

[Apache Tomcat 8 - Realm Configuration HOW-TO](https://tomcat.apache.org/tomcat-8.0-doc/realm-howto.html)
### userBase 
```
userBase="DC=example,DC=co,DC=jp" 
```
ユーザを検索する際の起点となるオブジェクトを指定。

### userRoleName
```
userRoleName="memberOf" 
```
ユーザオブジェクト内でロールとして扱う属性を指定。
今回はADのグループをロールとして扱うため、`memberOf`属性を利用する。

### userSearch
```
userSearch="(sAMAccountName={0})"
```
認証時のユーザIDをAD上のどの属性にマッピングするかを定義する。
ADは`sAMAcocountName`という属性がログイン名になっている為、この属性を指定する。
`{0}`にはWebアプリの認証画面で入力したユーザIDが動的に入る。

### userSubtree
```
userSubtree="true"
```
`userBase`で指定したオブジェクト配下のサブツリーを全て検索対象する場合に`true`を設定する。
※デフォルト値：false

### roleBase
```
roleBase="DC=example,DC=co,DC=jp" 
```
ロールを検索する際の起点となるオブジェクトを指定。

### roleName
```
roleName="CN"
```
ロールとして扱う属性を指定する。今回はCommonNameを利用する。

### roleSearch
```
roleSearch="(member={0})" 
```
ユーザ名とロールを紐づける属性を定義する。
`{0}`はDistinguished Nameが動的に入る。

### roleSubtree
```
roleSubtree="true"
```
`roleBase`で指定したオブジェクト配下のサブツリーを全て検索対象する場合に`true`を設定する。
※デフォルト値：false

## 2.2 その他の設定項目

| 設定項目 | 概要 | 設定例 |
|:----------------------|:------------------------|:--|
| Host                  | LDAPサーバのIP,PORT    | 192.168.10.5:398  |
| Secure Host           | SSL/TLSのON/OFF        | - |
| Alternate Host        | 代替LDAPサーバのIP,PORT | - |
| Secure Alternate Host | SSL/TLSのON/OFF        | - |
| User Name             | 接続ユーザ名(DN)       |  CN=sv-scc,OU=system,DC=example,DC=co,DC=jp |
| Password              | 接続ユーザのパスワード  | ****  |
| User Role             | ロール名（※）         | sg-sccadmins |
| Monitoring Role|      | ロール名（※）         | sg-sccmonitors  |

※ロールはADのグループとするため、↑の設定だとADグループ「sg-sccadmins」に所属しているADユーザがSAP Cloud Connectorの管理画面にログインできるようになる。
※ブランクの場合、「admin」もしくは「sccadmin」というグループ名がハードコーディングされている為利用される。

# 3. まとめ
以上の設定をまとめると、以下のような形になる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/208873/cf5186e7-53b5-9643-681b-a57de1cb31a8.png)

Saveボタンを押下すると自動的に再起動が実行される。

# 4. テスト
再起動完了後、管理画面にアクセスし、ADユーザのアカウント名/パスワードを入力する。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/208873/20a3e3dc-1298-9e88-6f20-9f839239c4e0.png)

ログインできることを確認する。（右上のメニューボタンにユーザ名が表示されている）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/208873/ff60c6a8-e2f9-1b57-fd0d-4e269ee19679.png)

以上です！
あくまで設定例なので、参考まで。