2017年1月31日火曜日

JOC Cockpit のLDAP認証を試す

下記ページを参考に、JOC Cockpit のLDAP認証を試してみます。
https://kb.sos-berlin.com/display/PKB/Authentication+and+Authorization+-+Configuration
JOC Cockpit の認証は、shiro.ini で設定します。
shiro.ini には、デフォルトで複数の Role が定義されており、ユーザによって使用できる機能を制限できます。
詳細は下記ページを参照
https://kb.sos-berlin.com/display/PKB/Authentication+and+Authorization+-+Permissions+for+the+JOC+Cockpit+Web+Service
テスト環境は以下のとおり。dockerコンテナ4台で試します。
  • Dockerホスト(CentOS7.3)
    • docker1.10.3
    • docker-compose1.10.0
  • Dockerコンテナ(Debian8)
    • JobSchedulerMaster1.11.0-R3
    • JOC Cockpit1.11.0-R3 
    • MariaDB10.1
    • OpenLDAP2.4.40


LDAPのユーザ登録


DockerHUBのイメージを使用して OpenLDAPサーバを起動しました。
ドメインは "dc=example, dc=local" とします。
[root@centos0702 ldap]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
45be5aba3636        dinkel/openldap     "/entrypoint.sh slapd"   22 hours ago        Up 30 minutes       0.0.0.0:389->389/tcp   ldap_server_1

下記のユニットを登録します。
[root@centos0702 ldap]# cat unit.ldif
dn: ou=Users,dc=example,dc=local
objectclass: organizationalUnit
ou: Users

dn: ou=Groups,dc=example,dc=local
objectclass: organizationalUnit
ou: Groups

dn: ou=Computers,dc=example,dc=local
objectclass: organizationalUnit
ou: Computers
[root@centos0702 ldap]# ldapadd -x -w p@ssw0rd -D "cn=admin,dc=example,dc=local" -f unit.ldif
adding new entry "ou=Users,dc=example,dc=local"

adding new entry "ou=Groups,dc=example,dc=local"

adding new entry "ou=Computers,dc=example,dc=local"


上記で登録した Users にテスト用のユーザを1人登録します。
後述のJOC Cockpit の設定で、「LDAPのgidNumber」 と 「JOC Cockpit の Role」 を紐つけるように設定します。
[root@centos0702 ldap]# ldapadd -x -w p@ssw0rd -D "cn=admin,dc=example,dc=local" -f user.ldif
adding new entry "uid=dev01,ou=Users,dc=example,dc=local"


登録した dev01 ユーザを検索してみます。
[root@centos0702 ldap]# ldapsearch -x -D "uid=dev01,ou=Users,dc=example,dc=local" -w p@ssw0rd -b "ou=Users,dc=example,dc=local" "(&(objectClass=posixAccount)(uid=dev01))"
# extended LDIF
#
# LDAPv3
# base <ou=Users,dc=example,dc=local> with scope subtree
# filter: (&(objectClass=posixAccount)(uid=dev01))
# requesting: ALL
#

# dev01, Users, example.local
dn: uid=dev01,ou=Users,dc=example,dc=local
objectClass: posixAccount
objectClass: inetOrgPerson
sn: dev01-sn
cn: dev01-cn
displayName: develop01
uid: dev01
uidNumber: 1000
gidNumber: 1000
homeDirectory: /home/dev01
loginShell: /bin/bash
userPassword:: e0NSWVBUfU9Kd0FkMkJjdGo1aXc=
mail: dev01@example.local

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1

JOC Cockpit のLDAP認証設定


JOC Cockpit の認証設定は、shiro.ini に記載されています。
設定ファイルのデフォルトの格納場所は、以下のとおり。
/home/[install user]/sos-berlin.com/joc/resources/joc/shiro.ini
今回は、以下の PATH に格納しています。
/root/sos-berlin.com/joc/resources/joc/shiro.ini 
デフォルトのshiro.ini では、[user] に root ユーザが定義されています。
LDAP認証に変更すると、この root ユーザは使用不可になります。
[user]は、変更せずに残します。

[Role]には、"administrator"や"application_manager" などが、あらかじめ定義されているので、ユーザごとに割り当てる Role を変更して使用可能なJOCの機能を制限することにします。
[Role]も変更せずに残します。

[main]は、[user]で定義したユーザでログインできるような設定になっているので、以下のようにしてLDAP認証に変更します。
[main]

ldapRealm = com.sos.auth.shiro.SOSLdapAuthorizingRealm

ldapRealm.userDnTemplate = uid={0},ou=Users,dc=example,dc=local
ldapRealm.searchBase = ou=Users,dc=example,dc=local
ldapRealm.contextFactory.url = ldap://ldap_server_1:389

ldapRealm.groupNameAttribute = gidNumber
#ldapRealm.userNameAttribute = uid
ldapRealm.userSearchFilter = (&(objectClass=posixAccount)(uid=%s))

# Mapping of a LDAP group to roles. You can assign more than one role with separator sign |
ldapRealm.groupRolesMap = \
"1000":"administrator|application_manager", \
"1001":"application_manager", \
"1002":"it_operator"

rolePermissionResolver = com.sos.auth.shiro.SOSPermissionResolverAdapter
rolePermissionResolver.ini = $iniRealm
ldapRealm.rolePermissionResolver = $rolePermissionResolver

securityManager.realms = $ldapRealm
cacheManager = org.apache.shiro.cache.MemoryConstrainedCacheManager
securityManager.cacheManager = $cacheManager

#Session timeout in milliseconds
securityManager.sessionManager.globalSessionTimeout = 1800000

ldapRealm.userDnTemplate は、LDAP サーバーからユーザーを取得する DN テンプレートです。{0}は、JOC Cockpitログイン画面で入力したユーザIDが入ります。
ldapRealm.searchBaseは、ユーザーを検索するLDAP ディレクトリーのルートを設定します。
ldapRealm.contextFactory.urlは、LDAPサーバのURLを設定します。
ldapRealm.groupNameAttributeは、ldapRealm.groupRolesMapで紐つけるLDAP属性(gidNumber)を指定 ldapRealm.groupRolesMapは、LDAP属性の gidNumber と JOCのRole を紐つけます。複数のロールを紐つける場合は "|" で区切ります。

このLDAP用の shiro.ini をコンテナにコピーして JocCockpit を再起動します。
[root@centos0702 sosjs11]# docker cp ./shiro.ini.ldap sosjs11_joc_cockpit_1:/root/sos-berlin.com/joc/resources/joc/shiro.ini
[root@centos0702 sosjs11]# docker exec sosjs11_joc_cockpit_1 /etc/init.d/joc restart                                      Stopping Jetty: OK
Starting Jetty: . . . . . OK Sun Jan 29 02:57:32 UTC 2017

ログイン確認


コンテナの状態を確認します。
[root@centos0702 sosjs11]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                         NAMES
fd455e36a585        js_master           "bash /opt/startup_sc"   16 hours ago        Up 3 minutes        0.0.0.0:4444->4444/tcp, 0.0.0.0:40444->40444/tcp, 48444/tcp   sosjs11_master_1
b51cc531a282        joc_cockpit         "bash /opt/startup_jo"   16 hours ago        Up 3 minutes        0.0.0.0:4446->4446/tcp, 0.0.0.0:40446->40446/tcp              sosjs11_joc_cockpit_1
7c09a173ee7a        mariadb             "docker-entrypoint.sh"   16 hours ago        Up 3 minutes        3306/tcp                                                      sosjs11_db_1
45be5aba3636        dinkel/openldap     "/entrypoint.sh slapd"   23 hours ago        Up About an hour    0.0.0.0:389->389/tcp                                          ldap_server_1

下記URLでログインします。
http://<DockerホストのIPアドレス>:4446/
ログイン画面で、上記で登録したLDAPユーザの dev01/p@ssw0rd を入力してログインします。


ログインに成功して、右上の[dev01] > [プロファイル] を選択すると、下図のように使用可能な機能を確認できます。