この認証方式はpassword
と似ていますが、パスワード確認にLDAPを使用する点が異なります。
LDAPはユーザの名前とパスワードの組み合わせの検証のみに使用されます。
そのため、LDAPを使用して認証を行うようにする前に、ユーザはデータベースに存在しなければなりません。
LDAP認証は2つのモードで動作します。1つ目のモードでは、それは単なるバインド・モードを呼び出すものですが、
サーバはprefix
username
suffix
として区別された名前にバインドします。
一般的に、prefix
パラメータはActive Directory環境でのcn=
やDOMAIN
\
を特定するために使用されます。
suffix
は、Active Directory環境ではない場合でのDNの残りの部分を特定するために使用されます。
2つ目のモードでは、それはsearch+bindモードを呼び出すもので、サーバは最初にldapbinddn
とldapbindpasswd
で指定された、
固定されたユーザ名とパスワードを使用してLDAPディレクトリにバインドします。
それからデータベースにログインしようとしているユーザを検索します。
もしユーザとパスワードが指定されていなかった場合は、ディレクトリに対して匿名でバインドします。
検索はldapbasedn
のサブツリーまで行われ、ldapsearchattribute
で指定された属性に正確に一致するかどうかまで行われます。
この検索において、一度ユーザが見つかるとサーバは切断して、クライアントで指定されたパスワードを使用してこのユーザとして再度ディレクトリにバインドします。これはそのログインが正しいかどうかを検証するためです。
このモードはApache mod_authnz_ldap
およびpam_ldap
などの他のソフトウェアと同じように、LDAP認証の仕組みで使用されるものと同じです。
この方法は、ユーザオブジェクトがディレクトリに配置されている場合に、かなりの柔軟性があります。
しかし、LDAPサーバへの2つの分離した接続が作成されます。
次の設定オプションは両方のモードで使用されます。
ldapserver
接続するLDAPサーバの名称もしくはIPアドレス。空白で区切ることで複数のサーバを指定できます。
ldapport
LDAPサーバに接続するためのポート番号。もしポートが指定されていない場合は LDAPライブラリ内のデフォルトポート設定が使用されます。
ldapscheme
ldaps
に設定するとLDAPSを使用します。
これはいくつかのLDAPサーバーの実装でサポートされている、SSL経由のLDAPを使用する非標準の方法です。
代替方法については、ldaptls
オプションを参照してください。
ldaptls
1に設定すると、PostgreSQLとLDAPサーバ間の接続にTLSによる暗号化を使用します。
これはRFC 4513のStartTLS
操作を使用します。
代替方法については、ldapscheme
オプションも参照してください。
ldapscheme
やldaptls
を使うときにはPostgreSQLサーバとLDAPサーバ間のトラフィックのみが暗号化されることに注意してください。
SSLがそこでも使用されていない限り、PostgreSQLサーバとPostgreSQLクライアントとの接続は、暗号化されません。
以下のオプションは単純バインド・モードのみで使用されます。
ldapprefix
単純なバインド認証を行う場合のDNを生成する際にユーザ名の前に追加する文字列
ldapsuffix
単純なバインド認証を行う場合のDNを生成する際にユーザ名の後に追加する文字列
以下のオプションはsearch+bindモードのみで使用されます。
ldapbasedn
検索とバインドの認証を行う場合のユーザ名がログインするための検索を始めるためのルートDN
ldapbinddn
検索とバインドの認証を行う場合のディレクトリと検索をバインドするためのユーザのDN
ldapbindpasswd
検索とバインドの認証を行う場合のディレクトリと検索をバインドするためのユーザのパスワード
ldapsearchattribute
検索とバインドの認証を行う場合の検索時のユーザ名に対して一致させる属性。
属性が指定されない場合、属性uid
が使用されます。
ldapsearchfilter
search+bind認証を行うときに使用する検索フィルタです。
$username
の出現はユーザ名に置き換えられます。
これによりldapsearchattribute
よりも柔軟な検索フィルタが可能になります。
ldapurl
RFC 4516LDAP URL。 これはその他いくつかのLDAPオプションをより簡潔、かつ一般的な形式で記述する別の方法です。 フォーマットは以下のようになっています。
ldap[s]://host
[:port
]/basedn
[?[attribute
][?[scope
][?[filter
]]]]
scope
はbase
、one
、sub
のいずれかでなくてはならず、一般的には最後のものです。
(デフォルトはbase
です。これは通常このアプリケーションでは役に立ちません。)
attribute
は単一の属性を指定できます。その場合、それはldapsearchattribute
の値として使用されます。
もしattribute
が空の場合は、ldapsearchfilter
の値としてfilter
を使用できます。
URLスキームldaps
は、ldapscheme=ldaps
を使用するのと同じ、SSL上のLDAP接続をするLDAPS方式を選択します。
StartTLS
操作による暗号化されたLDAP接続を使用するには、通常のURLスキームldap
を使用し、ldapurl
に加えldaptls
オプションを使用しなければなりません。
非匿名バインド(non-anonymous bind)に対し、ldapbinddn
およびldapbindpasswd
は個別のオプションとして指定されなければなりません。
LDAP URLは現在、OpenLDAPのみでサポートされており、Windowsではサポートされていません。
search+bindオプションと単純バインドに対するオプションの設定を混在させるのはエラーです。
search+bindモードを使用するときは、ldapsearchattribute
で指定される単一の属性を使って、あるいはldapsearchfilter
で指定されるカスタム検索フィルターを使って、検索を実行できます。
ldapsearchattribute=foo
の指定は、ldapsearchfilter="(foo=$username)"
と同等です。
どちらのオプションもない場合は、ldapsearchattribute=uid
がデフォルトです。
PostgreSQLが、LDAPクライアントライブラリとしてOpenLDAPを使用するようにコンパイルされていた場合、ldapserver
の設定は省略出来ます。
その場合、ホスト名とポート番号のリストは、RFC 2782 DNS SRVレコードを使用して検索されます。
_ldap._tcp.DOMAIN
という名前が検索され、ldapbasedn
からDOMAIN
が抽出されます。
以下に単純バインドLDAP設定の例を示します。
host ... ldap ldapserver=ldap.example.net ldapprefix="cn=" ldapsuffix=", dc=example, dc=net"
データベースのユーザ、someuser
からデータベースサーバに接続を要求された場合、PostgreSQLはDN cn=someuser, dc=example, dc=net
およびクライアントから提供されたパスワードを用いてLDAPサーバにバインドを試みます。
その接続が成功すればデータベースへのアクセスが認められます。
以下はsearch+bind設定の例です。
host ... ldap ldapserver=ldap.example.net ldapbasedn="dc=example, dc=net" ldapsearchattribute=uid
データベースユーザsomeuser
としてデータベースに接続するとき、PostgreSQLは(ldapbinddn
が指定されていないので)匿名的にバインドを試み、指定されたベースDNの基で(uid=someuser)
の検索を行います。あるエントリが見つかると、見つかった情報とクライアントから与えられたパスワードを用いて、その結果バインドを試みます。その二番目の接続が成功するとデータベースアクセスを認められます。
URLとして記述した同じsearch+bind設定の例です。
host ... ldap ldapurl="ldap://ldap.example.net/dc=example,dc=net?uid?sub"
LDAPに対し認証をサポートするいくつかの他のソフトウェアは同じURLフォーマットを使用します。 従って、設定をより簡易に共有できます。
ldapsearchattribute
の代わりにldapsearchfilter
を使用してユーザーIDまたは電子メールアドレスによる認証を可能にするsearch+bind設定の例です。
host ... ldap ldapserver=ldap.example.net ldapbasedn="dc=example, dc=net" ldapsearchfilter="(|(uid=$username)(mail=$username))"
DNS SRV検出を使用してドメイン名example.net
のLDAPサービスのホスト名とポート番号を検索する、search+bind設定の例です。
host ... ldap ldapbasedn="dc=example,dc=net"
LDAPはDNの異なる構成要素を区切るために往々にしてカンマとスペースを使用します。 例で示されたように、LDAPオプションを設定する場合、二重引用符で括られたパラメータ値を使用することがしばしば必須となります。