Alfrescoのユーザー管理をDBからSamba-ad-dcに移行

Kopano のユーザー管理を1ヶ月以上掛けて Samba ad dc に移行した。次は Alfresco だなぁと考えながら、お絵描きツールを整備したりして充電。さぁ、Samba ad dc によるユーザー管理を始めよう。



結果から整理すると、ざっくり以下を実施している。

 

現行システムのバックアップを取る

今回やってみて感じたのは、ユーザーやグループの情報を「同期」するためには、事前準備が重要ということ。一度「同期」された状態になると、その後は「同期されたもの」として扱われるので、狙い通りの動きにならない。

手間を惜しまずにバックアップする。

やり方は5.2でも6でも変わらないと思う。

Samba ad dcによるユーザー管理の確立

他のシステム同様、最初に Samba ad dc によるユーザー管理が「ちゃんとできる」状態を最初に作る。

LDAP連携の整理

Alfresco の LDAP 連携には2つの設定がある。
1つは認証(ldap.authentication.~)で、Alfrescoにログインできる人なのかどうかを判断するもの。
もう1つは同期(ldap.synchronization.~)で、ユーザーの情報を持ってくる。起動時に持ってきた後は、定期的に同期。

認証だけを行って同期をしない場合、ユーザーがログインした段階で内部データベースにユーザー情報が作られる。つまり…ユーザーがログインするまで管理者はグループのそのユーザーを追加できなかったりする。

同期だけを行って認証をしない場合、最初に Samba ad dc から持ってきた情報で内部データベースに全員のユーザー情報が作られる。しかし、これらのユーザーは無効になっており、ログインできない。この設定はシングルサインオン(SSO)で利用するそうなので、今回は使わない。

認証と同期をすると、最初に内部データにユーザー情報が作られ、Samba ad dc による LDAP 認証でログインができるようになる。今回はこの設定を行う。

ユーザーに必要な属性の設定

まず、移行元にいるユーザーを全て Samba ad dc に再現する。

Alfresco の同期は、ユーザーの姓(givenName)・名(sn)が設定されていればユーザーとして認識し、Alfresco に登録されているユーザー名とSamba ad dc のユーザー名が一致すればバインドしてくれる。

姓・名の設定

設定されていなくてもログインはできるが、管理者によるユーザー検索でひっかからないので、例えばグループにユーザーを追加することができなかったりする。

もちろん、属性を設定するのにコマンドを利用しても問題はない

ユーザー名の設定

ユーザー名、ユーザー ログオン名、ユーザー ログオン名(Windows 2000 より前)を一致させておくのが一番安全なんだろうと思われる。
また、ユーザーとのバインドにはユーザー ログオン名(Windows 2000 より前)が利用される模様。

Alfresco Documentation には画面上4センチくらいの距離で
 UPN と sAMAccountName
という記載がなされている。

User Principal Name (UPN)
These are generally in the format of <sAMAccountName>@<UPN Suffix>. If you are unsure of the correct suffix to use, use an LDAP browser, such as Softerra, to browse to a user account and find its userPrincipalName attribute. For example:
%s@domain

この2つは全然違う値。

項目名 属性名 LDAPで見たサンプル設定値
ユーザー ログオン名 userPrincipalName rohhiePrinc@hogeserver.hogeddns.jp
ユーザー ログオン名(Windows 2000 より前) sAMAccountName rohhieSamac

このような値が設定されているときには、プロパティ画面は以下の通りに見える。

この状態でログインしてみた。

ログイン名 属性名 結果
rohhie cn ? name ? 認証エラーになった。
rohhiePrinc userPrincipalName 全く新しいユーザーになった。
rohhieSamac sAMAccountName Samba ad dc のユーザー rohhie の情報を引き継ぎつつ新しいユーザーができた。

この結果から、最初に書いた全部一致が安全、と考えた。

どうしても Samba ad dc と違う名前で使いたいなら、sAMAccountName を使いたい名前に変えておく。UPNでもログインできちゃうけれども、全く別ユーザーとして扱われるのできっと気付くはず。

 

Alfrescoの認証をSamba ad dcにする

LDAP 認証の接続を設定していく。
Alfresco Documentation / LDAP configuration properties

デフォルトの設定値はここに書かれている。
GitHub / Acosix/alfresco-mt-support ldap.~のデフォルト値
GitHub / Alfresco/alfresco-repository synchronizationのデフォルト値

これを意識しつつ、以下の通り設定した。

alfresco-global.properties
#
# Configuring authentication subsystems (LDAP)
#
authentication.chain=ldap1:ldap-ad
#create.missing.people=false

ldap.authentication.active=true
ldap.authentication.allowGuestLogin=false
ldap.authentication.userNameFormat=%s@hogeserver.hogeddns.jp
ldap.authentication.java.naming.provider.url=ldaps://addc.hogeserver.hogeddns.jp:636
ldap.authentication.defaultAdministratorUserNames=Administrator

ldap.synchronization.active=true
ldap.synchronization.java.naming.security.authentication=simple
ldap.synchronization.java.naming.security.principal=administrator@hogeserver.hogeddns.jp
ldap.synchronization.java.naming.security.credentials=<admin君のパスワード>

ldap.synchronization.userSearchBase=cn=users,dc=hogeserver,dc=hogeddns,dc=jp
ldap.synchronization.personQuery=(&(objectclass\=user)(userAccountControl\:1.2.840.113556.1.4.803\:\=512))
ldap.synchronization.personDifferentialQuery=(&(objectclass\=user)(userAccountControl\:1.2.840.113556.1.4.803\:\=512)(!(whenChanged<\={0})))
ldap.synchronization.groupSearchBase=cn=users,dc=hogeserver,dc=hogeddns,dc=jp
ldap.synchronization.groupQuery=(&(objectclass\=group)(!(isCriticalSystemObject=true)))
ldap.synchronization.groupDifferentialQuery=(&(objectclass\=group)(!(isCriticalSystemObject=true))(!(whenChanged<\={0})))

ldap.synchronization.modifyTimestampAttributeName=whenChanged
ldap.synchronization.timestampFormat=yyyyMMddHHmmss'.0Z'

 

Alfrescoを再起動する。

ユーザーとグループが同期されたかどうか確認する

この設定をした状態で Alfresco を起動すると、ユーザーとグループをSamba ad dc から持ってくる。

認証の確認

ここで、管理者としてログインする。Samba ad dc にいる Administrator を使ってログインができれば、この段階で少なくとも Samba ad dc を利用した認証はできたことになる(だって、Administrator というユーザーは Alfresco にいないから)。

同期の確認

ユーザーとグループはどうか。これはすなわち同期設定の確認で、管理者(Samba ad dc の Administrator)でログインし、管理ツールからユーザーやグループを確認する。

まずはユーザー。ドメインに登録済みのユーザーのうち、姓・名が登録されているユーザーが全て取り込まれていることを確認する。

次にグループを確認する。必要なグループだけが同期されていればOK。

このキャプチャを取った段階では、使いそうもない余計なグループも同期しちゃっていた。後で修正している。

設定の見直し

正しく同期できなかった場合、データベースを削除して再度 Alfresco を起動しないと、テストにならない。一度行われた同期の状態を保持しているため。

$ sudo systemctl stop tomcat9 ← テスト環境なのでお手軽にtomcatを停止
$ sudo mysql
MariaDB [(none)]> drop database alfresco;
MariaDB [(none)]> create database alfresco default character set utf8;
MariaDB [(none)]> quit
Bye

 

こうして Alfresco を止めておいて、alfresco-global.properties を修正する。

$ sudo systemctl start tomcat9

個別の停止・開始はここにメモあり

起動後、正しく同期ができているか確認する。

設定をちょっと変えただけでも動作が確認できるまでにものすごく時間がかかるので、カットアンドトライをするならその覚悟で。

 

バックアップデータをリストアする

確実に動作するであろう設定ができあがったら、バックアップしておいたデータをリストアする。

Alfresco を起動してユーザーがちゃんとバインドされていれば Samba ad dc によるユーザー管理への移行完了!

 

やったこと

学習

当たりを付けようと検索したら見つかったページ。alfresco-global.properties に必要情報を書き込めば連携ができそうなことを教えてくれる。
aegif Labo Blog / AlfrescoをActive Directoryと連携させてみた

LDAPの認証と同期について教えてくれる。
Slide Share / Alfresco勉強会 #17 LDAP連携 入門

公式の LDAP 設定を説明するページ。
Alfresco Documentation / Configuring LDAP

どうやら sAMAccountName だけで機能するようなので、移行は比較的簡単化もと思わせてくれるコミュニティの情報。
Alfresco Community / Moving Alfresco to new AD Domain after AD Migration

認証タイプの種類を説明。Samba ad dc ならば ldap-ad を利用するのだろう。
Alfresco Documentation / Authentication subsystem types

ユーザーレジストリのエクスポートサービスはオプションサービスで、自動的にユーザーの電子メールアドレス、組織、およびグループなどの属性を取得する模様。
Alfresco Documentation / Authentication subsystem components

Alfresco は認証チェーンという考え方を持っていて、まずは ldap-ad、その後、Alfresco の認証システム(alfrescoNtlm)で確認、という風に複数の認証システムを動かすことができる模様。

LDAP サーバーが単一であれば、alfresco-global.properties に設定を書き込む。複数あるときには、ディレクトリに書き込む模様。
Alfresco Documentation / Configuring the authentication chain

ユーザー同期に関するログレベルの変更

ユーザー同期がどうにもうまくいかないので、ログレベルを変えようと思ったが、どれだかさっぱり分からない。
Alfresco & Share Blog / How to debug the User and Group synchro from LDAP ?

これによると、以下を書き換えれば良さそう。

/usr/share/alfresco/tomcat/webapps/alfresco/WEB-INF/classes/log4j.properties
#log4j.logger.org.alfresco.repo.importer.ImporterBootstrap=error
log4j.logger.org.alfresco.repo.importer.ImporterBootstrap=info

 

思い通りにはログが出ない…そうか、ログを見て、そのクラスのログレベルを変えればいいのかな。

alfresco.log
2019-08-15 23:22:12,551 INFO  [org.alfresco.repo.security.sync.ChainingUserRegistrySynchronizer] [main] Synchronization,Category=directory,id1=ldap1,id2=6 User Creation and Association: Commencing batch of 5 entries
2019-08-15 23:22:13,613 INFO [org.alfresco.repo.security.sync.ChainingUserRegistrySynchronizer] [main] Synchronization,Category=directory,id1=ldap1,id2=6 User Creation and Association: Processed 5 entries out of 5. 100% complete. Rate: 4 per second. 0 failures detected.

 

/usr/share/alfresco/tomcat/webapps/alfresco/WEB-INF/classes/log4j.properties
#log4j.logger.org.alfresco.repo.security.sync=info
#log4j.logger.org.alfresco.repo.security.person=info
log4j.logger.org.alfresco.repo.security.sync=debug
log4j.logger.org.alfresco.repo.security.person=debug

 

欲しいところのログが出た。たまたまこの時には問題の解決策を思いついたので、成功ログになっている。

alfresco.log
2019-08-15 23:57:16,166 DEBUG [org.alfresco.repo.security.sync.ldap.LDAPUserRegistry] [main] Processing query
2019-08-15 23:57:16,168 DEBUG [org.alfresco.repo.security.sync.ldap.LDAPUserRegistry] [main] Search base: cn=users,dc=hogeserver,dc=hogeddns,dc=jp
2019-08-15 23:57:16,168 DEBUG [org.alfresco.repo.security.sync.ldap.LDAPUserRegistry] [main] Return result limit: 0
2019-08-15 23:57:16,169 DEBUG [org.alfresco.repo.security.sync.ldap.LDAPUserRegistry] [main] DerefLink: false
2019-08-15 23:57:16,170 DEBUG [org.alfresco.repo.security.sync.ldap.LDAPUserRegistry] [main] Return named object: false
2019-08-15 23:57:16,171 DEBUG [org.alfresco.repo.security.sync.ldap.LDAPUserRegistry] [main] Time limit for search: 0
2019-08-15 23:57:16,171 DEBUG [org.alfresco.repo.security.sync.ldap.LDAPUserRegistry] [main] Attributes to return: 0 items.
2019-08-15 23:57:16,286 DEBUG [org.alfresco.repo.security.sync.ldap.LDAPUserRegistry] [main] Processing person: CN=hogewife,CN=Users,DC=hogeserver,DC=hogeddns,DC=jp
2019-08-15 23:57:16,287 DEBUG [org.alfresco.repo.security.sync.ldap.LDAPUserRegistry] [main] Processing person: CN=hogedaugter,CN=Users,DC=hogeserver,DC=hogeddns,DC=jp
2019-08-15 23:57:16,296 INFO [org.alfresco.repo.security.sync.ChainingUserRegistrySynchronizer] [main] Synchronization,Category=directory,id1=ldap1,id2=6 User Creation and Association: Commencing batch of 2 entries
2019-08-15 23:57:16,415 DEBUG [org.alfresco.repo.security.sync.ldap.LDAPUserRegistry] [main] Adding user for hogewife
2019-08-15 23:57:16,418 DEBUG [org.alfresco.repo.security.sync.ldap.LDAPUserRegistry] [main] Adding user for hogedaugter
2019-08-15 23:57:16,429 DEBUG [org.alfresco.repo.security.sync.ChainingUserRegistrySynchronizer] [main] RETRY TXNS: []2019-08-15 23:57:16,430 DEBUG [org.alfresco.repo.security.sync.ChainingUserRegistrySynchronizer] [main] main ready to execute
2019-08-15 23:57:16,492 DEBUG [org.alfresco.repo.security.sync.ChainingUserRegistrySynchronizer] [main] Updating user 'hogewife'
2019-08-15 23:57:16,574 DEBUG [org.alfresco.repo.security.sync.ChainingUserRegistrySynchronizer] [main] Updating user 'hogedaugter'
2019-08-15 23:57:16,614 INFO [org.alfresco.repo.security.sync.ChainingUserRegistrySynchronizer] [main] Synchronization,Category=directory,id1=ldap1,id2=6 User Creation and Association: Processed 2 entries out of 2. 100% complete. Rate: 6 per second. 0 failures detected.
2019-08-15 23:57:16,614 INFO [org.alfresco.repo.security.sync.ChainingUserRegistrySynchronizer] [main] Synchronization,Category=directory,id1=ldap1,id2=6 User Creation and Association: Completed batch of 2 entries
2019-08-15 23:57:16,639 INFO [org.alfresco.repo.security.sync.ChainingUserRegistrySynchronizer] [main] Finished synchronizing users and groups with user registry 'ldap1'
2019-08-15 23:57:16,640 INFO [org.alfresco.repo.security.sync.ChainingUserRegistrySynchronizer] [main] 2 user(s) and 0 group(s) processed
2019-08-15 23:57:16,694 INFO [org.alfresco.repo.management.subsystems.ChildApplicationContextFactory] [main] Startup of 'Synchronization' subsystem, ID: [Synchronization, default] complete

 

利用ユーザーの絞り込み ※失敗

このシステムは家族だけでなく、親・兄弟が利用している。親・兄弟は Line で写真を交換し、Dropbox でファイルのやりとりをしているようで、特に何かに困っていることはなさそうだ。よって、利用したいと言うまではログインできなくてもいいかな。

ということで、ユーザーの同期範囲をグループ「Alfresco」に含まれているものに限定しようとした。Admin 君と家族、Family グループを Alfresco グループに含めた。

その上で、以下を設定。
起動時にユーザー情報を同期し、LDAP による認証をせず、内部の認証に任せてみようという設定。

alfresco-global.properties
authentication.chain=ldap1:ldap-ad,alfrescoNtlm1:alfrescoNtlm
ldap.authentication.active=false

ldap.synchronization.userSearchBase=cn=users,dc=hogeserver,dc=hogedns,dc=jp
ldap.synchronization.personQuery=(&(objectClass=user)(memberOf=cn=alfresco,cn=users,dc=hogeserver,dc=hogeddns,dc=jp))
ldap.synchronization.personDifferentialQuery=(&(objectClass=user)(memberOf=CN=Alfresco,CN=Users,DC=hogeserver,DC=hogeddns,DC=jp)(!(whenChanged<={0})))
ldap.synchronization.groupSearchBase=cn=users,dc=hogeserver,dc=hogedns,dc=jp
ldap.synchronization.groupQuery=(&(objectClass=group)(memberOf=CN=Alfresco,CN=Users,DC=hogeserver,DC=hogeddns,DC=jp))
ldap.synchronization.groupDifferentialQuery=(&(objectClass=group)(memberOf=CN=Alfresco,CN=Users,DC=hogeserver,DC=hogeddns,DC=jp)(!(whenChanged<={0})))

 

結果としてはこうなる。
まず、Samba ad dc の Administrator ではログインできず、Alfresco の初期ユーザ admin でログインすることになる。

LDAP で同期しているユーザーは全て「無効」アカウントになり、admin でも有効化できない。ユーザーの有効・無効は LDAP の属性値(例えばロック中?とか)で設定ができるみたいだけれども、グループに含まれているかどうかを条件に設定することはできそうもない。

これでは、本来使いたい家族メンバーさえログインできないので使い物にならない。

同期だけを有効にした場合、passthru か kerberos を認証チェーンに追加する必要があるらしい。
Alfresco Community / LDAP users disabled

さらに、passthru は 6.1 で削除されている。
Alfresco Documentation / What’s new in Alfresco Content Services
だけど、ここには NTLM v1 も削除されたと書かれているけれども、ntlm は使えているような…なんだかよく分からないなぁ。

kerberos による SSO を実現するときまでお預け。

動作確認について

alfresco-global.properties を変更したら、Alfresco を再起動すれば良さそうなものだが、今回対象となる LDAP との同期処理が正しく動いているのかどうかよく分からず、tomcat9 ごと再起動していた。

結論からすると、動作をきちっと確認するには、データベースの初期化が必要。

きっと同期は正しく動くが、一度同期をさせた後は、何らかの判断によってスキップ処理が行われるらしい。また、一度作られたユーザーやグループは同期によって削除されることはない模様。つまり、テストにならない状態。

例えば、personQuery や groupQuery を間違えて正しく同期ができなかった状態で、personQuery と groupQuery を修正して Alfresco を再起動してもユーザーは追加されることも削除されることもなかった。

 

さいごに

今回の作業は、結果からすると簡単。なのにえらく長い道のりになった。

何が長いって、設定を変えたらその動作を試すためにかかる時間が凄い…。Alfresco のデータを削除、Alfresco の起動(初期設定が走る)、とやってるだけで結構時間がかかる。

そこに同期…これ、動作を試すためにはデータベースを消さなきゃだめだってことに気付くのにもだいぶ時間がかかった。他システムとのコンセプトの違いに戸惑うのは経験の少なさが原因。

トラブル解消のために色々なサイトにお世話になったのだけれど、日本語のサイトがいくつか見つかった。だいぶ前から Alfresco を紹介しているひとがいっぱいいるな~と思い、ん…オレ遅いな、ADに今まで手を出さなかったのは失敗だったなぁと反省。

精進あるのみ。

なお、Alfresco のコミュニティもちょいちょい検索結果に出てきたので訪問してみたけれど、ログログログログ言ってる人がいなくてちょっと印象が変わった。とはいえ、まだクライアントアプリで自己署名のクライアント証明書が使えない問題が解消できていないから、もうちょっと様子見。

お気軽にどうぞ ~ 投稿に関するご意見・感想・他

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です