Actions

LDAP設定

From LimeSurvey Manual

This page is a translated version of the page LDAP settings and the translation is 100% complete.
  注意 : この機能により、LimeSurveyのアンケート管理者はLDAP経由でトークンをインポートできます。LDAP認証が必要な場合は、AuthLDAPプラグインを参照してください。


概要

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

  LDAPを使用できるようにするには、PHPモジュールに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の情報を得るための設定例を以下に示します。

//Active Directoryサーバーへの接続
$serverId=0;
$ldap_server[$serverId]['server'] = "10.10.10.10";
$ldap_server[$serverId]['port'] = "389";
$ldap_server[$serverId]['protoversion'] = "ldapv2";
$ldap_server[$serverId]['encrypt'] = "none"; // ほとんどのAD LDAPサーバーでは、デフォルトで暗号化が設定されていません
$ldap_server[$serverId]['referrals'] = false;
$ldap_server[$serverId]['binddn'] = "domain\\user";
$ldap_server[$serverId]['bindpw'] = "userpassword";
//$ldap_server[$serverId]['binddn'] = "CN=user,OU=user_group,DC=xxx,DC=yyy"; これはActive Directoryでは動作しません。そのため、"domain\\user"を使用する必要があります
//次に、Active Directoryのすべてのアクティブなユーザを取得するためのサンプルクエリを示します。
$query_id=0;
$ldap_queries[$query_id]['ldapServerId'] = 0;
$ldap_queries[$query_id]['name'] = 'Staff with an enabled account';
$ldap_queries[$query_id]['userbase'] = 'OU=USER_GROUP,DC=xxx,DC=yyy';
$ldap_queries[$query_id]['userfilter'] = '(&(objectClass=user)(!(userAccountControl=514)))';
//(!(userAccountControl=514)) Active Directoryにアクティブユーザーを照会することはできませんが、アクティブでないユーザーを照会することはできます
$ldap_queries[$query_id]['userscope'] = 'sub';
$ldap_queries[$query_id]['firstname_attr'] = 'givenname';
$ldap_queries[$query_id]['lastname_attr'] = 'sn';
$ldap_queries[$query_id]['email_attr'] = 'mail';
$ldap_queries[$query_id]['token_attr'] = ''; // phpsvによる自動トークン生成のために空のままにする
$ldap_queries[$query_id]['language'] = '';
$ldap_queries[$query_id]['attr1'] = '';
$ldap_queries[$query_id]['attr2'] = '';
//Active Directoryではグループフィルタリングができないので、ユーザーのmemberOf属性を追加する必要があります。Active Directory内のグループ"samplegroup"のメンバーであるすべてのアクティブユーザーを取得するサンプルクエリを次に示します。
$query_id++;
$ldap_queries[$query_id]['ldapServerId'] = 0;
$ldap_queries[$query_id]['name'] = 'All members of samplegroup';
$ldap_queries[$query_id]['userbase'] = 'OU=USER_GROUP,DC=xxx,DC=yyy';
$ldap_queries[$query_id]['userfilter'] = '(&(objectClass=user)(memberOf=CN=samplegroup,OU=Group Global,OU=USER_GROUP,DC=xxx,DC=yyy)(!(userAccountControl=514)))';
$ldap_queries[$query_id]['userscope'] = 'sub';
$ldap_queries[$query_id]['firstname_attr'] = 'givenname';
$ldap_queries[$query_id]['lastname_attr'] = 'sn';
$ldap_queries[$query_id]['email_attr'] = 'mail';
$ldap_queries[$query_id]['token_attr'] = ''; // phpsvによる自動トークン生成のために空のままにする
$ldap_queries[$query_id]['language'] = '';
$ldap_queries[$query_id]['attr1'] = '';
$ldap_queries[$query_id]['attr2'] = '';

ユーザークエリーのもう1つの例:

$ldap_queries[$query_id]['userfilter'] = '(&('''objectCategory=Person''')(objectClass='''user''')(!('''userAccountControl=514''')))'; // ADは通常の方法では有効なアカウントを認識できないため、代わりにユーザーが無効になっていないことを確認します
  • 設定ファイルで示唆されているように、電子メールアドレスのないユーザを無視するよう、ユーザフィルタに (!(email=*)) を追加することを検討してください。

グループクエリーの例:

$ldap_queries[$query_id]['groupfilter'] = '(&(objectClass='''group''')(cn=Domain Admins))'; // ADはグループに標準の属性名を使用しないので、代わりにこの例を使用してください。

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