0. はじめに
SAP Cloud Connector をいじっている中で、認証をLDAPで行うことができると判明。
やってみようということで設定してみたが、SAPのドキュメントには純粋LDAPサーバの例しかなく、
Active Directory(以下、AD)の例がなかったので記事を書いてみることにしました。
題名にSAP~とかいてありますが、要はJNDIRealmの話です。
1. そもそも
以下のヘルプを読むと、LDAPの場合こうしなさい的に書いてあるが、具体的にどうすればいいのか全く分からない。。。
SAP Cloud Platform Connectivity - 認証での LDAP の使用
ヘルプを読み解いていくと、設定画面の内、一番大切なのはConfiguration
の部分です。
設定例を見てみると、明らかにJNDIRealmの書き方です。
よって、Avtive Directoryで認証する為にはADに対応したJNDIRealmを書くことがゴールになります。
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
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
を利用しているようです。
# 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
結論は以下のようになります。
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
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 | ロール名(※) |
※ロールはADのグループとするため、↑の設定だとADグループ「sg-sccadmins」に所属しているADユーザがSAP Cloud Connectorの管理画面にログインできるようになる。
※ブランクの場合、「admin」もしくは「sccadmin」というグループ名がハードコーディングされている為利用される。
3. まとめ
以上の設定をまとめると、以下のような形になる。
Saveボタンを押下すると自動的に再起動が実行される。
4. テスト
再起動完了後、管理画面にアクセスし、ADユーザのアカウント名/パスワードを入力する。
ログインできることを確認する。(右上のメニューボタンにユーザ名が表示されている)
以上です!
あくまで設定例なので、参考まで。