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, country。login と email のみ必須です。その他はオプションです。
認証のための設定プロパティ
このプラグインはユーザをldapで認証する前に,ユーザのプロパティを取得します.このプラグインは,searchUserFilter と searchAttributes という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ファイルが肥大化しないように、必要のないときはこれらの設定を削除してください。