LDAP認証

LDAPを使用する利点は、すべてのユーザーとグループの情報を、集中管理された1つのサーバーに置くことができることです。

まず最初にすることは、Linuxシステムにphp ldap extensionをインストールすることです。

apt install php7.4-ldap

そして、LDAPサポートをLizmapで有効にするためには、設定で認証方法を以下のように変更する必要があります。

LDAPを有効にする

You have to enable the module ldapdao with this command

php lizmap/install/configurator.php ldapdao

それから、 profiles.ini.phpにセクション [ldap:lizmapldap] を追加して、ldapサーバーに接続し、ldapでユーザーを検索できるようにする設定をしなければなりません。このセクションは、profiles.ini.php.distからprofiles.ini.phpをコピーした場合、すでに存在しているかもしれません。

[ldap:lizmapldap]
hostname=localhost
port=389
adminUserDn="cn=admin,ou=lizmap,dc=com"
adminPassword=""
searchUserBaseDN="dc=XY,dc=fr"
searchUserFilter="(&(objectClass=posixAccount)(uid=%%LOGIN%%))"
bindUserDN="uid=%?%,ou=users,dc=XY,dc=fr"
searchAttributes="uid:login,givenName:firstname,sn:lastname,mail:email,organization:organization,street:street,postcode:postcode,city:city"
searchGroupFilter=
searchGroupProperty="cn"
searchGroupBaseDN=""

これらのパラメータの設定方法については、以下のセクションで詳しく説明しています。

モジュールを有効にするには、 php lizmap/install/installer.php を実行します。

ldapの設定

ユーザーデータの設定プロパティ

パスワードを確認したり、ユーザーが初めて認証したときにLizmapに登録するために、プラグインはユーザーに関するいくつかのデータを必要とします。

どのldap属性を取得できるのか、どのデータベースフィールドがldap属性の値を受け取るのかを指示する必要があります。

このような情報は、 searchAttributes プロパティに記述します。 <ldap attribute>:<table field> は間まで区切られた名前のペアです。

例えば searchAttributes="uid:login,firstname,sn:lastname,mail:email,dn:" ような設定の場合

  • uid というLDAP 属性の値が login フィールドに格納されます。

  • sn というLDAP 属性の値が lastname フィールドに格納されます。

  • firstname というldap属性の値は、フィールド名や : がないため、同じ名前のフィールドに格納されます。

  • dn プロパティのマッピングはありません。フィールド名のない : があります。これはldapから読み込まれ、bindUserDN のDNテンプレートに使用することができます。(下記参照).

Lizmapで使用可能なフィールドのリストは以下の通りです。login, email, firstname, lastname, organization, phonenumber, street, postcode, city, countryloginemail のみ必須です。その他はオプションです。

認証のための設定プロパティ

このプラグインはユーザをldapで認証する前に,ユーザのプロパティを取得します.このプラグインは,searchUserFiltersearchAttributes という2つの設定パラメータを利用します.

searchUserFilter には,ldap クエリと,ユーザが指定したログイン名で置き換えられる %%LOGIN%% プレースホルダを指定します.

例えば、 searchUserFilter="(&(objectClass=posixAccount)(uid=%%LOGIN%%))"

また、searchUserBaseDN には、検索のベースとなるDNを指定することもできます。例えば、 searchUserBaseDN="ou=ADAM users,o=Microsoft,c=US"

複雑なLDAPの構造を持っている場合には、複数の検索フィルターを指定することができることに注意してください。アイテムリストを示すには [] を使います.

searchUserFilter[]="(&(objectClass=posixAccount)(uid=%%LOGIN%%))"
searchUserFilter[]="(&(objectClass=posixAccount)(cn=%%LOGIN%%))"

パスワードを確認するために、プラグインはユーザに対応するDN(Distinguished Name)を必要とします。プラグインは、bindUserDN プロパティで指定された「テンプレート」と、さまざまなデータから DN を構築します。これらのデータは、与えられたログイン名や、ユーザのldap属性の一つです。

  • ユーザーが指定したログイン名からDNを構築する: bindUserDNには、ログインで置き換えられる %%LOGIN%% プレースホルダーを含むDNを指定してください。

    例えば、以下の bindUserDN="uid=%%LOGIN%%,ou=users,dc=XY,dc=fr" の場合、ユーザーがログイン名として john.smith を指定した場合は、 bindUserDN="uid=john.smith,ou=users,dc=XY,dc=fr" のDNで認証が行われます。

    一部のLDAPでは、DNは電子メールなどの単純な文字列になることがあります。 bindUserDN="%%LOGIN%%@company.local" を設定することができます。 bindUserDN="%%LOGIN%%" としてもいいでしょう。ログイン時にDNの完全な値を入力できるか、電子メールを入力できるか、などなど(大抵の場合ユーザーがDNの完全な値を自分で入力できるようにすることは推奨されません。)

  • ユーザーのldap属性の一つからDNを構築する 。この場合,プラグインはまず searchUserFilter フィルタを使って ldap ディレクトリに問い合わせを行い,ユーザの ldap 属性を取得します.次に bindUserDN で、いくつかの値が属性値に置き換えられる DN を指定するか、あるいはユーザの完全な DN を含む属性に対応する単一の属性名を指定することができます。

    最初のケースでは、bindUserDnはDNを含み、いくつかの %?% プレースホルダーは対応する属性値で置き換えられます。例: bindUserDN="uid=%?%,ou=users,dc=XY,dc=fr" 。 ここでは、 %?% の部分を、ユーザーの属性から読み取った uid 属性の値に置き換えています。この属性名は、フィールドマッピングが行われていなくても、searchAttributes`設定プロパティに含まれていなければなりません。例: `...,uid:,...``。 上記を参照してください。

    2つ目のケースでは、属性名の前に`$`を付けて表示します。例: bindUserDN="$dn". ここでは、検索結果から読み取った dn という属性を受け取り、その完全な値をLDAPサーバーにログインするためのDNとして使用します。これは、Active DirectoryのようなLDAPサーバーで、各ユーザーに固有の完全なDNを必要とする場合に有効です。属性名は、フィールドマッピングがされていなくても、 searchAttributes 設定プロパティに含まれていなければなりません。例: ...,dn:,....上記を参照してください。

複雑なLDAPの構造を持っている場合には、複数のdnテンプレートを指定することができることに注意してください。アイテムリストを示すには [] を使います.

bindUserDN[]="uid=%?%,ou=users,dc=XY,dc=fr"
bindUserDN[]="cn=%?%,ou=users,dc=XY,dc=fr"

ユーザー権限の設定プロパティ

Lizmapにグループ権限を設定しており、これらのグループがldapグループと一致する場合、ユーザーのldapグループに応じて、ユーザーを自動的にアプリケーショングループに入れるようにプラグインに指示することができます。

そして、 searchGroupFilter に、ユーザーのグループを取得するためのldapクエリを指定します。

例えば、 searchGroupFilter="(&(objectClass=posixGroup)(member=%%USERDN%%))"

%%USERDN%% がユーザーdnに置き換えられます。%%LOGIN%% は、ログインに置き換えられます。また、 %% の間で searchAttributes に指定したldapの属性を使用することもできます。例えば、 searchGroupFilter="(&(objectClass=posixGroup)(member=%%givenName%%))"

警告: searchGroupFilter を設定すると、ldap グループにマッチしない他のアプリケーショングループからユーザーが削除されます。グループを同期させたくない場合は、 searchGroupFilter を空にしてください。

searchGroupProperty では、グループ名を含むldap属性を指定する必要があります。例:searchGroupProperty="cn"

また、検索のベースとなるDNを`searchGroupBaseDN`に指定することもできます。例: searchGroupBaseDN="ou=Groups,dc=Acme,dc=pt"

デバッグ

認証がうまくいかない場合には、何が問題なのかを詳しく知ることができます。これらの詳細を見るには、ldapdao のトレースを有効にする必要があります。

var/config/localconfig.ini.phpで、以下のパラメータを設定します。

[logger]
auth=file

[fileLogger]
auth=auth.log

そうすると、var/log/auth.logにはldapコネクタからのメッセージがいくつか残ります。auth.logファイルが肥大化しないように、必要のないときはこれらの設定を削除してください。