LDAP のインクリメンタル同期によってユーザーが削除される
問題
手動同期後の任意の時点でアプリケーションでユーザーが不足している。
診断
「LDAP クエリの詳細を追加でログ出力する」の手順に従い、追加のロギングを有効化します。
なお、可能な限りの情報を得られるよう、com.atlassian.crowd.directory.SpringLDAPConnector ではなく com.atlassian.crowd にログオンするようにします。これが有効化されたら、ユーザーが削除されるのを待ちます。日次ログに次のようなエントリが記録されます。
2016-05-18 08:54:07,921 INFO [clusterScheduler_Worker-3] c.a.c.d.DbCachingRemoteDirectory INCREMENTAL synchronisation for directory [ 229377 ] starting
2016-05-18 08:54:07,935 DEBUG [clusterScheduler_Worker-3] c.a.c.d.MicrosoftActiveDirectory Performing polling search: baseDN = DC=com - filter = (&(&(objectCategory=Person)(sAMAccountName=*)(memberOf=CN=Users,OU=Groups)(uSNChanged>=678449785))2016-05-18 08:54:07,939 INFO [clusterScheduler_Worker-3] c.a.c.d.l.c.UsnChangedCacheRefresher scanned and compared [ 397 ] users to delete, [ 0 ] users to add, [ 0 ] users to update in DB cache in [ 14ms ]
原因
原因 #1: インクリメンタル同期中にコネクタが AD にバインドする際に、権限のない資格情報を使っている。
- CWD-3093Getting issue details... STATUS
原因 #2: LDAP サーバーで返せる結果の数にハード制限があり、対象のディレクトリについて Bitbucket Server で Paged Results が有効化されていない。たとえば、atlassian-bitbucket.log
からの次のログでは、LDAP サーバーによって最初の 15,000 ユーザーのみが返されています。
2016-10-05 10:17:20,400 INFO [Caesium-1-2] c.a.c.d.l.SpringLdapTemplateWrapper Timed call for search with dircontext on ou=People,ou=Corporate,o=abc took 14560ms
2016-10-05 10:17:20,401 INFO [Caesium-1-2] c.a.c.d.l.c.RemoteDirectoryCacheRefresher found [ 15000 ] remote users in [ 14562 ms ]
...
2016-10-05 10:17:25,718 DEBUG [Caesium-1-2] c.a.c.d.DbCachingRemoteChangeOperations user [ username ] not found, deleting
原因 #3: "ポートをグローバル カタログ (3268) に変更する" Global Catalog ではデフォルトで accountExpires 属性が保管されないため、失効したユーザーを除外すると、Jira で使用されるフィルターに一致するユーザーが存在しません。Jira は完全同期を行いますが、次のインクリメンタル同期で即座に削除されます。
- これは、通常のポート (389) から取得されたユーザーの LDIF を生成し、Global Catalog ポート (3268) を使用した別の LDIF を生成して、それぞれで取得できる属性の一覧を比較することで確認できます。Global Catalog にこの属性が保管されていない場合、これが原因です。
- JRASERVER-64099Getting issue details... STATUS
回避策
原因 #1
- インクリメンタル同期を無効化します。
または - 同じ設定を持つ、新しい委任 LDAP ユーザー ディレクトリを使用するように切り替えます。
原因 #2
LDAP サーバーを調整し、検索で返される結果の数がセットアップ済みのユーザー フィルターよりも多くなるようにします。
原因 #3
- 現在のユーザー ディレクトリ構成を編集し、インクリメンタル同期を利用しないようにします。
- これは、ユーザー ディレクトリ構成の [高度な設定] セクションにある [インクリメンタル同期を有効化] オプションの選択を解除することで行なえます。
- [失効したユーザーの除外] を無効化します。
- AD サーバーで Global Catalog に "accountExpires" 属性を追加します。これは AD サーバーの管理者が行う必要があります。詳細については以降をご確認ください。
ソリューション
原因 #1: LDAP ユーザーの管理者ユーザーであることを確認します。
原因 2: ユーザー ディレクトリの高度な設定にある [ページ化された結果を使用] オプションを有効化します。これにより、すべてのエントリを一度に読み込もうとするのではなく、結果がページごとに表示されるようになります。