LDAP settings/ja

=概要=

この機能を利用するには、config.phpでLDAPサポートを有効にし、config/ldap.phpでLDAPパラメータを設定する必要があります.

config.phpでLDAPを有効にする

 * $enableLdap: LimeSurveyでLDAP機能を使用する場合は、このパラメータをtrueに設定する必要があります（既定ではfalseに設定されています）.

'config'=>array(		'debug'=>0,		'debugsql'=>0,		'enableLdap'=>true,	)

LDAPサーバーを定義する
まず、 "application/config/ldap.php"にLDAPサーバー接続オプションを定義します. 各サーバーには、次のオプションがあります.
 * $serverId: このLDAPサーバーを識別する整数. クエリ定義でサーバーを特定のクエリにバインドするために使用されます.
 * $ldap_server [ $serverId] [ 'server']: LDAPサーバーのIPアドレスまたはDNS名. SSLで保護された接続（LDAPsまたはLDAP+Start-TLS）を使用する場合、この名前はサーバーのCertificate CN（またはSubjectAlternativeName）に対応する必要があります.
 * $ldap_server [ $serverId] [ 'protoversion']: あなたのサーバーでサポートされているプロトコルに応じて、 'ldapv2'または 'ldapv3'にします. 'ldapv3'が推奨プロトコルです. ただし、暗号化された接続を使用する場合、LDAPsは'ldapv2'モードでサポートされ、Start-TLSは'ldapv3'の暗号化方式であることに注意してください.
 * $ldap_server [ $serverId] [ 'encrypt']: 使用される暗号化方法を定義します. 'ldaps'は 'ldav2'サーバーでサポートされ、'start-tls'は'ldapv3'サーバーでサポートされます. 'none'キーワードは、クリアテキストでLDAP通信するときに使用されます.
 * 'ldaps'または'start-tls'による暗号化においては、ウェブサーバーはLDAPサーバーの証明書を確認できなければならないことを忘れないでください. したがって、openldapライブラリーに認証局を定義する必要があります（通常、これはlinuxの/etc/openldap/ldap.confファイルで行います）.
 * $ldap_server [ $serverId] [ 'referrals']: 紹介（referral）に従うかどうかを定義するブール型パラメータです（ActiveDirectoryではfalseを使用します）.
 * $ldap_server [ $serverId] [ 'encoding']: これは、LDAPディレクトリーが文字列を格納するために使用するエンコーディングを指定するオプションのパラメータです. 通常、このパラメータを設定する必要はありません. 既定のエンコーディングである'utf-8'は、LDAPディレクトリーの標準エンコーディングです. ただし、Active Directoryを使用していて特殊な文字を含む文字列をインポートできない場合は、このパラメータをあなたの地域で使用されているエンコーディングに設定してください（たとえば、西ヨーロッパの場合は'cp850'）. CSVファイルからのトークンインポートのGUIにある"ファイルの文字セット"のドロップダウンリストには、サポートされるエンコーディングがすべて掲載されており、それを参照できます.

次に、ディレクトリーへのアクセスに必要な認証を定義する必要があります. '匿名'アクセスが許可されている場合は、次の2つのパラメータを設定しないでください. そうでない場合は、次の通り設定してください.
 * $ldap_server [ $serverId] [ 'binddn']: ディレクトリーを読み取ることができる 'LDAP'ユーザーのDN.
 * $ldap_server [ $serverId] [ 'bindpw']: 上記のLDAPユーザーのパスワード.

他のLDAPサーバーを定義する必要がある場合は、次の行を追加してserverIDを増やし、新しいパラメーターを定義します.
 * $serverId++

config/ldap.phpでクエリーを定義する
注意: これらのパラメーターのいずれかでLDAP属性名が必要な場合は、小文字のみの名称を使用してください（例えば、displaynameとし、displayNameとはしない）.

設定のサンプルが記載されているconfig/ldap.phpファイルを参照してください.

シンプルなクエリー
シンプルなクエリーから始めましょう. これらのクエリーは、属性と場所に基づいてLDAPエントリーフィルタリングするだけです. ActiveDirectoryを照会するなら、通常はこれで十分です.
 * $query_id: LDAPクエリーのIDです.
 * $ldap_queries [ $query_id] [ 'ldapServerId']: クエリーを特定のサーバーにバインドします.
 * $ldap_queries [ $query_id] [ 'name']: クエリを説明する文字列. GUIに表示されます.
 * $ldap_queries [ $query_id] [ 'userbase']: ユーザーの検索に使用するルートDN.
 * $ldap_queries [ $query_id] [ 'userfilter']: 検索対象となるユーザーのエントリーを選択するためのフィルタです. かっこで囲む必要があります.
 * $ldap_queries [ $query_id] [ 'userscope']: ユーザのLDAP検索のスコープです（'base'、'one'、'sub'）.
 * $ldap_queries [ $query_id] [ 'firstname_attr']: トークンエントリーの名（Firstname）フィールドにマップされるLDAP属性.
 * $ldap_queries [ $query_id] [ 'lastname_attr']: トークンエントリの姓（Lastname）フィールドにマップされるLDAP属性.
 * $ldap_queries [ $query_id] [ 'email_attr']: トークンエントリの電子メールアドレスフィールドにマップされるLDAP属性.

必要に応じて、ディレクトリーからさらに情報を取得できます.
 * $ldap_queries [ $query_id] [ 'token_attr']: トークンコードにマップされるLDAP属性.
 * $ldap_queries [ $query_id] [ 'language']: ユーザー言語コードにマップされるLDAP属性.
 * $ldap_queries [ $query_id] [ 'attr1']: attribute_1フィールドにマップされるLDAP属性.
 * $ldap_queries [ $query_id] [ 'attr2']: attribute_2フィールドにマップされるLDAP属性.

DNメンバーとグループクエリーの結合
より複雑なクエリーを定義する方法を見てみましょう.

次のクエリは、LDAPグループを探す最初のLDAP検索を使用しています. LDAPグループとは、以下の形式でユーザーのエントリーへの参照を含むLDAPエントリです.
 * ユーザーID（例: posixGroups） ==> 次のセクションを参照
 * ユーザーDN（例: groupofnames、groupofuniquenames） ==> 下記参照

ここでは、ユーザーDNを含むグループを扱います.
 * 上記で説明した$query_id、$ldap_queries [ $query_id] [ 'ldapServerId']、$ldap_queries [ $query_id] [ 'name']を定義します.

次に、グループフィルターパラメーターを定義します.
 * $ldap_queries [ $query_id] [ 'groupbase']: グループエントリーの検索を開始するルートDN.
 * $ldap_queries [ $query_id] [ 'groupfilter']: 検索対象となるグループエントリーを選択するLDAPフィルタ.
 * $ldap_queries [ $query_id] [ 'groupscope']: グループのLDAP検索のスコープです（'base'、'one'、'sub'）.
 * $ldap_queries [ $query_id] [ 'groupmemberattr']: ユーザーのエントリーへの参照を含むグループエントリー内のLDAP属性の名前.
 * $ldap_queries [ $query_id] [ 'groupmemberisdn']: TRUE

この時点で、最初のLDAP検索で選択したグループに対応するユーザーが検索されるよう設定されています. ただし、これらの"ユーザー候補"のどれを選択するかは、別のフィルターを適用することで制限できます. これはもちろんオプションです.
 * $ldap_queries [ $query_id] [ 'userbase']: ユーザーのLDAP検索のベースDNが選択されます（このベースに一致するユーザーのみとなる）.
 * $ldap_queries [ $query_id] [ 'userscope']: ユーザーLDAP検索のスコープが選択されます（ユーザベース+スコープに一致するユーザのみとなる）.
 * $ldap_queries [ $query_id] [ 'userfilter']: さらに選択するため、各ユーザ候補エントリーに適用されるフィルタです（その属性によって選択される）.

UIDメンバーとグループクエリーの結合
グループメンバーがユーザーのUIDで、ユーザーのDNではない場合、結合されたグループクエリーを定義する方法を見てみましょう.

DNメンバーを持つグループクエリーの場合、まずLDAPグループエントリーを探し、メンバーを取得します. 得られたメンバーは、ユーザー検索フィルターで使用され、対応するエントリーを検索します. したがって、グループ内のメンバーUIDと一致するユーザーエントリーのユーザー属性を定義する別のパラメーターを設定する必要があります.

必要なパラメータを確認しましょう.
 * 上記のように$query_id、$ldap_queries [ $query_id] [ 'ldapServerId']、$ldap_queries [ $query_id] [ 'name']を定義します.

次に、グループフィルターパラメーターを定義します.
 * $ldap_queries [ $query_id] [ 'groupbase']: グループエントリーの検索を開始するルートDN.
 * $ldap_queries [ $query_id] [ 'groupfilter']: 検索対象となるグループエントリーを選択するLDAPフィルタ.
 * $ldap_queries [ $query_id] [ 'groupscope']: グループのLDAP検索のスコープです（'base'、'one'、'sub'）.
 * $ldap_queries [ $query_id] [ 'groupmemberattr']: ユーザーのエントリーへの参照を含むグループエントリー内のLDAP属性の名前.
 * $ldap_queries [ $query_id] [ 'groupmemberisdn']: FALSE;
 * $ldap_queries [ $query_id] [ 'useridattr']: グループメンバーにあるUIDと一致しなければならないユーザー属性の名前.

この時点で、最初のLDAP検索で選択されたグループに対応するユーザーUIDを検索できるようにすべてが設定され、ユーザー検索フィルターに自動的にセットされます.

ただし、これらの「ユーザー候補」のどれを選択するかは、メンバーUIDから計算される自動ユーザーフィルターを適用することによって制限することができます. これはもちろん、オプションです.
 * $ldap_queries [ $query_id] [ 'userbase']: ユーザーのLDAP検索のベースDNが選択されます（このベースに一致するユーザーのみとなる）.
 * $ldap_queries [ $query_id] [ 'userscope']: ユーザーLDAP検索のスコープが選択されます（ユーザベース+スコープに一致するユーザのみとなる）.
 * $ldap_queries [ $query_id] [ 'userfilter']: さらに選択するため、各ユーザ候補エントリーに適用されるフィルタです（その属性によって選択される）.

Active Directoryではどうなるか？
Active Directory（AD）は、LDAPプロトコルを使用して照会できるMicrosoftのレジストリーです.

LimeSurveyトークンクエリにそのコンテンツを使用することは可能ですが、これにはADの構成方法に関する知識が必要です.
 * LDAPルートベースは、dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1です.

==> たとえば、あなたの会社が、DNSドメイン'my-company.com'を所有し、Windowsドメインが'employees'である場合、ルートベースは、dc=employees,dc=my-company,dc=com となります.
 * ユーザーおよびユーザーグループは、cn=Users,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1 の下に格納されます（ou=usersではありません）
 * Active Directoryグループ:
 * グループオブジェクトには、'member'属性にメンバーのDNが含まれています.
 * グループメンバーシップは、各ユーザーエントリーのmemberOf属性にも格納されます. この属性には、ユーザーが所属するグループのDNが含まれます.
 * いくつかのグループでは、CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1 にあります.
 * 例: cn=Administrator,CN=Builtin,dc=my_windows_domain_name,dc=dns_suffix2,dc=dns_suffix1

場合によっては、Active Directoryを照会するのは簡単ではないので、Active Directoryの情報を得るための設定例を以下に示します.

ユーザークエリーのもう1つの例:
 * 設定ファイルで示唆されているように、電子メールアドレスのないユーザを無視するよう、ユーザフィルタに (!(email=*)) を追加することを検討してください.

グループクエリーの例:

Active Directory LDAP構造の詳細については、Active DirectoryのアーキテクチャーとActive Directoryの技術仕様を参照してください.