#author("2017-01-20T12:54:08+09:00","","") **[[質問箱5/248]] [#d22321a1] #author("2018-03-11T22:12:39+09:00;2017-01-20T12:54:08+09:00","","") **[[質問箱/5248]] [#d22321a1] |RIGHT:70|LEFT:410|c |~カテゴリ|エラー・トラブル| |~サマリ|LDAP認証利用時のアクセス制御不具合| |~バージョン|1.5.1| |~投稿者|[[Laud]]| |~状態|完了| |~投稿日|&new{2016-12-14 (水) 14:03:34};| ***質問 [#g74e3f36] -PukiWikiのバージョン:~ 1.5.1~ -PukiWikiが稼働しているOS種類、バージョン:~ CentOS7.2.1511~ -PukiWikiを稼働させているWEBサーバー種類、バージョン:~ Apache 2.4.6-45~ -PukiWikiが使用するPHPバージョン:~ 7.0.14~ -LDAPサーバ:~ Samba4.2.3(ActiveDirectory(機能レベル2008 R2)として構築)~ -不具合内容~ AD上の「Wiki」グループに所属している「test」ユーザでログイン後、閲覧許可されたユーザであるのに「閲覧できません」と表示される。~ -設定内容~ [[https:// pukiwiki.osdn.jp/?PukiWiki/Authentication/LDAP>PukiWiki/Authentication/LDAP]]~ 上記ページを参考に設定を行いました。 $auth_type = AUTH_TYPE_FORM; $ldap_use_account = 1; $ldap_server = 'ldap:// 192.168.0.1:389'; $ldap_base_dn = 'ou=Users,dc=example,dc=local'; $ldap_bind_dn = 'example\ldap'; $ldap_bind_password = '12345678'; $auth_provider_user_prefix_ldap = 'ldap:'; $read_auth = 1; $read_auth_pages = array( '##' => 'ldap:Wiki', ); -ディレクトリ構成~ example.local Users ldap test Groups Wiki -切り分け内容~ 下記のとおり設定を変更したところ、「test」ユーザでの閲覧は可能になりました。~ また、「test」ユーザ以外のユーザは閲覧不可となることは確認しています。~ $read_auth_pages = array( '##' => 'test', ); ***回答 [#aaa7925b] - PukiWiki1.5.1のリリース時、Samba4では動作確認していませんでした。&br;ActiveDirectory由来のLDAPの場合、LDAP_MATCHING_RULE_IN_CHAINを使ってグループのネストに対応しています。 msdn.microsoft.com/en-us/library/aa746475(v=vs.85).aspx &br;調べたところ、Samba 4.2 ではこのLDAP_MATCHING_RULE_IN_CHAINは動作しないようでした。bugzilla.samba.org/show_bug.cgi?id=10493 Samba 4.4以降でのサポートになっています。&br;お使いのSambaは4.2ということなので、動作しません。検索時のActiveDirectoryモードをOFFにすれば、通常のmemberOf属性での検索になります。lib/plugin.phpを以下のように変更してみてください ('is_ad' => false) 。&br;1階層のグループ(ユーザーのmemberOf属性に該当グループが入っている状態)であれば動作すると思います。 %%(こちらでは試せていません)%% -- [[umorigu]] &new{2016-12-14 (水) 19:23:09}; -- 試しました。12/14(Wed) 19:23 のコードでは動きませんでした -- [[umorigu]] &new{2016-12-15 (木) 01:55:04}; - Samba 4.4.1は Microsoft Active Directoryと同じように動作しました。以下のように変更すると、LDAP_MATCHING_RULE_IN_CHAINを使わなくなるので Samba 4.2でも動くはずです ($fmtを上書き) -- [[umorigu]] &new{2016-12-15 (木) 01:57:00}; diff --git a/lib/auth.php b/lib/auth.php index 271da4c..1c6811c 100644 --- a/lib/auth.php +++ b/lib/auth.php @@ -673,6 +673,7 @@ function get_ldap_groups_with_user($ldapconn, $user, $is_ad) { if ($is_ad) { // LDAP_MATCHING_RULE_IN_CHAIN: Active Directory specific rule $fmt = '(&(sAMAccountName=%s)(memberOf:1.2.840.113556.1.4.1941:=%s))'; + $fmt = '(&(sAMAccountName=%s)(memberOf=%s))'; } $user_gfilter = sprintf($fmt, pkwk_ldap_escape_filter($user), - [[dev:BugTrack/2409]]にも登録しました -- [[umorigu]] &new{2016-12-15 (木) 09:18:32}; - 早速のご回答ありがとうございます。~ ご教示いただいた方法にて意図したとおりのアクセス制御が実現出来ました。~ ただ、下記の値を変更する必要がありました。~ 変更前の設定では、「Groups」OU配下が検索範囲外であったため、合致するエントリが見つからなかったものと思われます。 -- [[Laud]] &new{2016-12-15 (木) 18:51:38}; 変更前 $ldap_base_dn = 'ou=Users,dc=example,dc=local'; 変更後 $ldap_base_dn = 'dc=example,dc=local'; - 解決してよかったです。$ldap_base_dn は調整する必要がありますね -- [[umorigu]] &new{2016-12-20 (火) 19:58:15}; #comment