10. SASL の使用法
OpenLDAP のクライアントとサーバは
SASL では、いくつもの業界標準の認証機構を利用できます。その中には
この章は、Cyrus SASL パッケージに付属の文書 Cyrus SASL for System Administrators (doc/sysadmin.html) を既に読んでいて、Cyrus SASL のインストール作業を行ったことがあることを前提に説明します。OpenLDAP で SASL を利用できるようにする前には、 Cyrus SASL の sample_client と sample_server を使って、 SASL が適切にインストールされているかをテストするべきです。
以降の文においてユーザという用語は、 ldapsearch(1) などの LDAP クライアントで LDAP サーバに接続する人あるいはアプリケーション実体を指します。つまり、 ユーザという用語は LDAP クライアントを利用する個人だけでなく、人が直接扱うことなしに LDAP クライアント操作を発行するアプリケーション実体にも適用されます。たとえば、LDAP サーバに保持されている情報にアクセスするために LDAP 操作を利用する e-mail サーバはアプリケーション実体です。
10.1. SASL によるセキュリティ上の考慮事項
SASL は多くの認証機構を提供します。この節では、セキュリティ上の考慮事項について概説します。
PLAIN や LOGIN といった機構は、LDAP の「簡易」認証より優れたセキュリティを提供しません。「簡易」認証と同様、そのような機構は適切な所に十分なセキュリティ保護をすることなしに使うべきでありません。これらの機構は
DIGEST-MD5 機構は、LDAPv3 において実現が必須の認証機構です。 DIGEST-MD5 は信頼できるサードパーティ認証システム(Kerberos や公開鍵システムなど)に比べて強力な認証機構とは言えませんが、多くの攻撃に対抗するのに効果的な保護を提供します。CRAM-MD5 機構と違って、DIGEST-MD5 機構は選択平文攻撃(chosen plaintext attack)を防ぎます。DIGEST-MD5 は、それよりも弱い機構や、さらに危険な平文パスワード機構を利用するよりも勧められます。 CRAM-MD5 機構は、より優れた DIGEST-MD5 があるので勧めません。 DIGEST-MD5 の利用法については後述します。
KERBEROS_V4 機構は安全な認証サービスを提供するために Kerberos IV を利用します。一般的に Kerberos V と組み合わせて利用する GSSAPI ベースの機構もあります。Kerberos は安全で、小規模と大規模の両方の企業システムに適した分散認証システムとみなされていています。 KERBEROS_V4 と GSSAPI の利用法については後述します。
EXTERNAL 機構は
他にも OTP (one time passwords) や SRP (secure remote passwords) といった保護された認証機構を選べます。そのような機構についてはこの文書で扱いません。
10.2. SASL 認証
基本的な SASL による認証ができるようにするには、いくつかの段階をふみます。第一段階では、セキュリティシステムを使ってクライアントプログラムと通信できるように slapd サーバ環境を設定します。これには普通、サービス鍵、公開鍵、その他の秘密の形式の設定が関わります。第二段階では、認証アイデンティテイを LDAP の DN にマッピングします。これはエントリがディレクトリ内にどのように配置されているかによります。第一段階については、次の節で例として Kerberos V4 機構を用いて説明します。認証機構により必要となる設定はどれも似ていますが、 SASL で利用できる機構すべてについて説明することは、この節の範囲外です。第二段階については、 認証アイデンティティと LDAP エントリのマッピング の節で説明します。
10.2.1. KERBEROS_V4
この節では OpenLDAP での SASL KERBEROS_V4 機構の利用法について説明します。この節の説明は、Kerberos IV セキュリティシステムの動作についてよく知っていて、利用するサイトに Kerberos IV がインストールされていることを前提にしています。利用者は、認証ポリシー、Kerberos チケットキャッシュにある証明書を受け取る方法、期限切れの証明書をリフレッシュする方法についてよく知っているべきです。
クライアントプログラムは、LDAP サーバへの接続に使うためのセッション鍵を得られる必要があります。これにより LDAP サーバはユーザのアイデンティティを知ることができ、クライアントは接続する適正なサーバを知ることができます。暗合化層を使うようにしているのであれば、そのオプションの協定を助けるためにセッション鍵を使うこともできます。
slapd サーバは "ldap" というサービスを動かし、サーバはサービス鍵を持つ srvtab ファイルを要求します。 SASL 対応のクライアントプログラムはユーザの TGT (Ticket Granting Ticket) を持つ "ldap" サービスチケッットを得ます。このチケットには OpenLDAP サーバのホスト名に一致するインスタンスが付きます。たとえばレルムが EXAMPLE.COM という名前であり、 slapd サーバが directory.example.com という名前のホストで動作しているならば、そのサーバの /etc/srvtab ファイルは次のサービス鍵を持ちます。
ldap.directory@EXAMPLE.COM
LDAP クライアントが KERBEROS_IV 機構を利用してディレクトリにユーザの認証をするときには、同じプリンシパルのセッション鍵を要求します。これはチケットキャッシュからか、kerberos サーバから新しいものを得ることにより達成されます。これは TGT が利用可能であり、キャッシュ中で有効であることを要求します。セッション鍵が得られないか期限切れの場合、SASL は次のメッセージを出力します。
ldap_sasl_interactive_bind_s: Local error
サービスチケットを得ると、ユーザの身元の証明として LDAP サーバに渡されます。サーバは SASL ライブラリ関数を用いてサービスチケットから身元とレルムを抽出して、それらを次の形式の認証要求 DN に変換します。
uid=<username>,cn=<realm>,cn=<mechanism>,cn=auth
先の例のレルムで、ユーザ名が "adamson" であるとすれば認証要求 DN は次のようになります。
uid=adamsom,cn=example.com,cn=kerberos_v4,cn=auth
この認証要求 DN は適正な LDAP DN フォーマットにしたがっているので、このまま ACL や groupOfNames の "member" 属性に指定できます。しかしながら、この DN を LDAP ユーザエントリの DN にマッピングさせて使いたい場合には、認証アイデンティティと LDAP エントリのマッピング を参照してください。
この Kerberos の例では DN の <realm> 部分に団体の Kerberos レルムが入っていあmすが、他の認証機構ではレルムの概念を使用しないことがあるので、認証要求 DN の ",cn=<realm>" 部分は存在しないことがあります。
10.2.2. GSSAPI
この節では OpenLDAP での SASL GSSAPI 機構と Kerberos V の利用法について説明します。この節では Kerberos V を扱うので、説明の内容は前節とかなり似ています。この節の説明は、利用するサイトに Kerberos V がインストールされていて、管理者が Kerberos V システムの操作についてよく知っていて、ユーザが Kerberos V の利用法について教育されていることを前提にしています。この節はまた、管理者が Configuring GSSAPI and Cyrus SASL (Cyrus SASL の配布ソースに含まれているファイル doc/gssapi) を読んでいて、GSSAPI 機構の利用法についてよく知っていて、 Cyrus SASL の提供する sample_server と sample_client を使った動作検証に成功していることを前提にしています。 Kerberos についての一般的な情報は http://web.mit.edu/kerberos/www/ から入手できます。
slapd(8) で GSSAPI 機構を使うには、まず ldap サービスが動作するホストのレルムにおいて ldap サービスのためのプリンシパルを持ったサービス鍵を作成しなければなりません。たとえばホスト directory.example.com で slapd を動かしていてレルムが EXAMPLE.COM であるとすれば、次のプリンシパルを持ったサービス鍵を作成する必要があります。
ldap/directory.example.com@EXAMPLE.COM
slapd(8) が動作するには、このサービス鍵にアクセスできなければなりません。そのようにするには一般にサービス鍵を /etc/krb5.keytab などの keytab に置きます。
ディレクトリの認証に GSSAPI 機構を使う場合、利用者は LDAP クライアントを起動する前に TGT (Ticket Granting Ticket)を取得しておきます。 OpenLDAP クライアントツールを使う場合、利用者はコマンドオプションとして -Y GSSAPI を指定することにより GSSAPI 機構の利用を指示します。
認証と認可の目的のために slapd(8) は次の形式の認証要求 DN を生成します。
uid=<principal>,cn=<realm>,cn=gssapi,cn=auth
たとえば Kerberos プリンシパル kurt@EXAMPLE.COM を持つ利用者は次の DN を持つことになります。
uid=kurt,cn=example.com,cn=gssapi,cn=auth
プリンシパルが ursula/admin@FOREIGN.REALM であれば DN は次のようになります。
uid=ursula,cn=foreign.realm,cn=gssapi,cn=auth
10.2.3. DIGEST-MD5
この節では SASL DIGEST-MD5 機構の利用法について説明します。この認証方式ではディレクトリ内あるいは Cyrus SASL 用のデータベースに格納されたシークレットを使います。 DIGEST-MD5 はシークレット(普通はパスワード)を共有するクライアントとサーバに依存します。サーバはチャレンジを作成し、クライアントは共有されたシークレットを知っていることを証明する応答を返します。これでシークレットを単純にネットワーク上に送るよりも安全性がかなり増します。
Cyrus SASL は共有シークレット機構をいくつかサポートしています。この機構では平文パスワードにアクセスする必要があります (この点はネットワーク上に平文パスワードを渡し、サーバがハッシュ化したパスワードを格納できる機構と違っています)。
シークレットパスワードは普通 Cyrus SASL 用の sasldb データベースに格納されますが、OpenLDAP ソフトウェアが Cyrus SASL 2.1 とコンパイルされているなら、シークレットを LDAP データベースに格納することも可能です。 Cyrus SASL 1.5 を使っているならシークレットは sasldb にだけ格納できます。どちらを利用するにしてもファイルアクセス制御や LDAP アクセス制御を用いてパスワード情報が洩れないようにすることが非常に重要です。
この節で説明する設定とコマンドは Cyrus SASL 2.1 の利用を前提にします。バージョン 1.5 を使っている場合、特定の機能は利用できませんし、コマンド名の終端に "2" は付きません。
シークレットを sasldb に格納するには、単純に saslpasswd2 コマンドでユーザを追加します。
saslpasswd2 -c <username>
このようなユーザのパスワードは saslpasswd2 で管理しなければなりません。
シークレットを LDAP ディレクトリに格納するには userPassword 属性に平文パスワードを置きます。また LDAP によるパスワード更新でも平文で格納されるよう slapd.conf に次のオプションを追加しておく必要があります。
password-hash {CLEARTEXT}
この手段で格納したパスワードはを管理するには ldappasswd を使うか、単純に userPassword 属性を変更します。
どこにパスワードを格納するにしても SASL 認証 ID から通常の DN へのマッピングが必要となります。DIGEST-MD5 機構は認証 ID から次の形式の DN を生成します。
uid=<username>,cn=<realm>,cn=digest-md5,cn=auth
デフォルトのレルムが使われるなら、次のように DN からレルムが省略されることに注意してください。
uid=<username>,cn=digest-md5,cn=auth
このような認証 ID から DN へのマッピングの情報については後述の 認証アイデンティティと LDAP エントリのマッピング を参照してください。
適切にマッピングを行っておけば、ユーザは LDAP 操作の実行時に SASL ID を指定でき、sasldb あるいはディレクトリ内に格納されたパスワードが認証を確認するために使われます。たとえばディレクトリエントリによって識別されるユーザが次のものであるとします。
dn: cn=Andrew Findlay+uid=u000997,dc=example,dc=com objectclass: inetOrgPerson objectclass: person sn: Findlay uid: u000997 userPassword: secret
この場合、次のような形式でコマンドを実行できます。
ldapsearch -U u000997 -b dc=example,dc=com 'cn=andrew*'
次のようにレルムを明示することもできます。
ldapsearch -U u000997@myrealm -b dc=example,dc=com 'cn=andrew*'
複数の SASL 機構がサポートされているサイトであれば、どの機構を使うかの指定が必要になります。たとえば次のように指定します。
ldapsearch -Y DIGEST-MD5 -U u000997 -b dc=example,dc=com 'cn=andrew*'
注記:上の例においては(-X で指定するなどした)認可 ID を与えていません。 SASL 代理認可を行うつもりが無いのであれば認可 ID は指定しません。サーバは(後述するように)認証 ID から認可 ID を推定します。
10.2.4. 認証アイデンティティと LDAP エントリのマッピング
slapd サーバの認証機構は認証するユーザの「ユーザ名」を獲得するのに SASL ライブラリ関数を利用します。ユーザ名は基盤の認証機構が利用しているものを基にします。このユーザ名は認証機構の名前空間にあり、LDAP の名前空間にはありません。上の節で説明したように、ユーザ名は次の形式の認証要求 DN に再構成されます。
uid=<username>,cn=<realm>,cn=<mechanism>,cn=auth
認証機構 <mechanism> がレルム(realm)の概念を利用しない場合には次の形式になります。認証でデフォルトのレルムを使うと、レルム部分は除かれます。
uid=<username>,cn=<mechanism>,cn=auth
これは、上の形式の LDAP エントリを LDAP データベースに入れておくということではありません。LDAP で認証しようとする人それぞれについて LDAP エントリはあって、ディレクトリツリーに配置されているでしょうが、ツリーは cn=auth から始まっていないでしょう。しかし「ユーザ名」とその人の LDAP エントリの間に明確な対応関係があれば、認証要求 DN をユーザの認証 DNに自動的にマッピングするように LDAP サーバを設定できます。
注記:認証要求 DN もマッピングの結果から得られるユーザの認証 DN も、対応するエントリがディレクトリ中に存在することを要求されません。しかし、ディレクトリ中に存在していれば追加の機能を利用できます(後述)。
LDAP 管理者は、認証要求 DN をユーザの認証 DN にどうマッピングするかを slapd サーバに伝える必要があります。これを行うには、一つ以上の sasl-regexp ディレクティブを slapd.conf(5) ファイルに加えます。このディレクティブは次のように二つの引数をとります。
sasl-regexp <search pattern> <replacement pattern>
認証要求 DN は、正規表現関数 regcomp() と regexec() を使って検索パターン <search pattern> と比較され、一致したら置換パターン <replacement pattern> で書き換えられます。複数の sasl-regexp ディレクティブがあった場合には、認証アイデンティティに一致する最初の検索パターンが使われる。置換パターンから出力された文字列がユーザの認証 DN であり、適切な LDAP DN 形式になります。これは後述するように LDAP URL にすることもできます。
検索パターンには regexec(3C) で利用できる正規表現文字を含めることができます。中でもよく使う文字にはドット "."、アスタリスク "*"、左括弧 "(" と右括弧 ")" があります。基本的にドットは任意の1文字に一致し、アスタリスクは直前の文字あるいはパターンの0回以上の繰り返しに一致し、括弧で囲まれた語は置換パターンのために記憶されます。
置換パターンはユーザの最終的な認証 DN を作り出します。認証要求 DN の中で検索パターン中の括弧で囲まれた文字列に一致する部分は変数 "$1" に格納されます。変数 "$1" は置換パターン中に置くことができるので、認証要求 DN の部分文字列を使って置換することができるわけです。検索パターン中に括弧で囲まれたものが複数ある場合には、変数 $2, $3 と使われていきます。
たとえばユーザの認証 ID から次の DN 文字列が作られたとします。
uid=adamson,cn=example.com,cn=kerberos_v4,cn=auth
そしてユーザの実際の LDAP エントリが次のものであるとします。
uid=adamson,ou=person,dc=example,dc=com
この場合 slapd.conf(5) の sasl-regexp ディレクティブを使って次のように書けます。
sasl-regexp uid=(.*),cn=example.com,cn=kerberos_v4,cn=auth uid=$1,ou=person,dc=example,dc=com
より緩やかな規則を使って次のようにも書けます。
sasl-regexp uid=(.*),cn=.*,cn=auth uid=$1,ou=person,dc=example,dc=com
しかし検索パターンの設定を緩やかにしすぎないよう注意してください。緩くしすぎると、誤ってアクセス件を持つべきでない人の DN を認証してしまうかもしれないからです。1つの緩いディレクティブでセキュリティホールを作ってしまうよりは、複数の厳しいディレクティブを書いたほうがよいです。利用するサイトに1つの認証機構しか無く、レルムも無いか使うとしても1つだけの場合、認証識別子と LDAP DN を1つの sasl-regexp ディレクティブでマップできるかもしれません。
レルムを明示的に指定することもあれば省略することもあることを忘れないでください。このためには、それぞれの場合のために個別の sasl-regexp ディレクティブを用意し、明示的なレルムを持つエントリ用を先に指定しておくことが求められるでしょう。
サイトによっては、ou=accounting ツリーもあれば ou=engineering ツリーもあるなど、LDAP ツリーが複数の領域に分かれていて、人々がそれらのツリーに散らばっているかもしれません。あるいは先の例にあげた人の LDAP エントリが次のようになっていて、認証 ID から DN を解決するのに十分な情報が無い場合があるかもしれません。
dn: cn=mark adamson,ou=person,dc=example,dc=com objectclass: Person cn: mark adamson uid: adamson
このような場合、認証 ID の情報はユーザの DN を検索するのに使えるだけで、ユーザの DN を直接に導き出せません。このような状況に対処するために sasl-regexp ディレクティブの置換パターンに次の節で説明する LDAP URL を指定する必要があります。
10.2.5. 人の DN を求めるための検索の実行
人々の認証 DN を直接に導き出すのに認証 ID が十分な情報を持っていない場合、 slapd.conf(5) ファイルの sasl-regexp ディレクテイブには LDAP URL を指定する必要があります。指定した URL は、人々の認証 DN を発見するために LDAP データベースを内部検索するのに利用されます。
LDAP URL は他の URL と同様に次の形式を持ちます。
ldap://<host>/<base>?<attrs>?<scope>?<filter>
これは LDAP 検索を行うのに必要な要素をすべて含んでいます。<host> はサーバの名前、<base> は検索ベースの LDAP DN、<attrs> は取得する LDAP 属性、<scope> は3つの選択肢 "base", "one", "sub" のいずれか、<filter> は LDAP 検索フィルタです。検索は当該サーバ内の LDAP DN が対象なので <host> 部分は空にすべきです。 DN だけが目的であるので <attrs> 部分も無視します。これら2つの要素は空ながらも、文字列中のどこに何の情報があるのかが明らかになるように、URL のフォーマットに残ります。
先の例にある人は実際に認証ユーザ名 "adamson" を持っていて、その情報は LDAP エントリの属性 "uid" に保持していたとします。この場合 sasl-regexp ディレクティブは次のように記述できます。
sasl-regexp uid=(.*),cn=example.com,cn=kerberos_v4,cn=auth ldap:///ou=person,dc=example,dc=com??sub?(uid=$1)
これではまず slapd サーバ内で LDAP データベースの内部検索を行います。検索が1エントリだけを返す場合、それがユーザ の DN となるよう受け付けられます。検索が複数のエントリを返す場合、もしくは該当するエントリが無い場合、認証は失敗して、ユーザの接続は認証要求 DN としての束縛が残ります。
URL 中の検索スコープ <scope> が "base" であるならば、返される唯一のエントリは検索ベースの DN <base> であるので、実際にはデータベースの検索を行いません。これは先の節で説明したディレクテイブの置換パターンに直接 DN を設定するのと同等です。
URL の検索フィルタ <filter> で使う属性には、検索が速くなるように索引を付けておくべきです。もし索引が付いていなければ、認証ステップだけでかなり時間がかかってしまい、ユーザはサーバがダウンしていると思うかもしれません。
より込み入ったサイトでは利用形態の中に複数のレルムがあって、ディレクトリの異なるサブツリーにマッピングしているかもしれません。このような状況は、次の形式の文で処理できます。
# Match Engineering realm sasl-regexp uid=(.*),cn=engineering.example.com,cn=digest-md5,cn=auth ldap:///dc=eng,dc=example,dc=com??sub?(&(uid=$1)(objectClass=person)) # Match Accounting realm sasl-regexp uid=(.*),cn=accounting.example.com,cn=digest-md5,cn=auth ldap:///dc=accounting,dc=example,dc=com??sub?(&(uid=$1)(objectClass=person)) # Default realm is customers.example.com sasl-regexp uid=(.*),cn=digest-md5,cn=auth ldap:///dc=customers,dc=example,dc=com??sub?(&(uid=$1)(objectClass=person))
ここでは、レルム名が UID の一部になっている可能性を考慮して、明示的に名前の付いたレルムを優先して処理するようにしています。また、(objectClass=person) では無いエントリの UID に一致してしまうのを避けるために、(objectClass=person) を検索フィルタに含めています。
より詳しくは slapd.conf(5) を参照してください。
10.3. SASL 代理認可
SASL は代理認可 (proxy authorization)として知られる機能を提供します。これは、認証ユーザが他のユーザに代わって要求を行えるものです。このステップはユーザが認証 DN を得た後に起き、サーバへの認可 ID 送信を伴います。そしてサーバが認可するかしないかを決定します認可されれば、ユーザの LDAP 接続が認可 ID から生成されるバインド DN に切り替わり、LDAP セッションは新しい認可 DN のアクセスで先に進みます。
認可するかの決定は、LDAP が動作しているサイトの規則とポリシに依存するので、 SASL 単独ではこれを行えません。 SASL ライブラリは認可の決定をサーバに任せます。 LDAP 管理者は、LDAP データベースにあるエントリに情報を追加することにより誰がどの ID を認可するのかのガイドラインを設定します。デフォルトで認可機能は無効になっているので、これを利用する前に LDAP 管理者は明示的に設定しなければなりません。
10.3.1. 代理認可の用途
この種のサービスは、ある実態が多くの他のユーザに代わって何かを行うときに有用です。たとえば、ユーザが LDAP エントリにある個人情報を変更するための web ページに行くとします。ユーザは身分を証明するために web サーバに対して認証を行いますが、 web サーバ CGI は、目的の情報を変更するユーザとして LDAP サーバに対して認証できません。代わりに web サーバはそれ自体をサービス ID として LDAP サーバに認証します。たとえば次のような DN で認証します。
cn=WebUpdate,dc=example,dc=com
そして、ユーザの DN に SASL 認可します。このように認可された後、CGI はユーザの LDAP エントリの変更ができるとともに、slapd サーバが ACL を扱う限りにおいて、クライアントにユーザ自身がいるのと変わらなくなります。ユーザは直接に LDAP サーバに接続して認証することもできますが、 LDAP クライアントである Web ページが内部で何をしていたかについての情報を調べなければならないでしょう。
代理認可はまた、データベースへのアクセス権限のより大きなアカウントへのアクセスを制限するためにも使える。そのようなアカウントは(slapd.conf(5) に指定した root DN であっても) 自分の DN に認可できる人を格納した正格リストを持てる。 LDAP データベースの変更は、その DN によってのみ許可されるようにし、その DN になるために利用者はまずリストにある人のいずれかとして認証しなければなりません。これにより LDAP データベースを変更した人をよりよく検査できます。利用者が直接に権限のあるアカウントへの認証できるようであると、検査が難しくなります。
代理認可に成功すると、LDAP 接続に利用した元の DN は、認可要求に指定した新しい DN で置き換えられます。サービスプログラムが自分の認証 DN で認証を行った後に他の DN へ認可を行い、1 LDAPセッションの間に異なる複数の ID に切替えると、別の DN への認可(または別の代理認可機構の利用)の前にそれぞれ自分の DN で認証する必要があります。 slapd サーバは、他の DN への切替えにあたってサービスプログラムの能力を記録を保持しません。 Kerberos のような認証機構においては、チケットの有効期間である数時間の間、利用者の TGT と "ldap" セッションキーが正当であるので、認証のやり直しは Kerberos サーバへの複数接続を必要としないでしょう。
10.3.2. SASL 認可 ID
SASL 認可 ID は ldapsearch(1) その他のツールの -X スィッチ、あるいは lutil_sasl_defaults() 関数のパラーメータ *authzid に指定することにより LDAP サーバに送られます。この ID は次の2つの形式のいずれかになります。
u:<username>
あるいは
dn:<dn>
1番目の形式の <username> は先の認証 ID と同じ名前空間のものになります。これは基盤の認証機構が参照するユーザ名です。この形式の認可 ID は、認証処理で使われていたのと同じ機能によって DN フォーマットに変換され、次の形式の認可要求 DNを作成します。
uid=<username>,cn=<realm>,cn=<mechanism>,cn=auth
次にこの認可要求 DN は、データベースにある正当な認可 DN に変換するために、認証と同様に sasl-regexp の処理を行います。 LDAP URLの検索の失敗によって変換できなければ、認可要求は "inappropriate access" で失敗します。さもなければ、変換後の DN が承認を受けるための正当な認可 DN となります。
認可 ID に "dn:" を接頭辞に持つ2番目の形式を与えたならば、接頭辞の後の文字列が承認を受けるための認可 DN となります。
10.3.3. 代理認可規則
slapd が認可 DN を得ると実際の承認手続きが始まります。認可を可能にするために LDAP 管理者が LDAP エントリに置くことのできる次の2つの属性があります。
saslAuthzTo saslAuthzFrom
この両方とも複数値をとることができます。属性 saslAuthzTo は認可元の規則です。認証 DN が許可する認可 DN が何であるかを、認証 DN のエントリの saslAuthzTo に設定します。属性 saslAuthzFrom は認可先の規則です。認可 DN がその認証 DN から許可されているかを認可 DN のエントリの saslAuthzFrom に設定します。
どちらの認可ポリシ属性を利用するかは管理者に委ねられています。認可元の規則が人の認証 DN エントリで最初に検査され、どの saslAuthzTo 規則も認可が許されるよう指定されていなければ、認可 DN エントリの saslAuthzFrom 規則が検査されます。要求を履行するためのどちらの指定もなければ、要求は拒否されます。デフォルトの振舞は認可要求を拒否するので、規則は要求を許可する指定となります。認可を取り消す指定はありません。
この2つの属性の値は sasl-regexp ディレクティブの置換パターンと同じ形式で、 DN か LDAP URL のどれかになります。たとえば saslAuthzTo の値が DN であれば、その DN は認証する利用者が認可される先のものになります。saslAuthzTo の値が LDAP URL であれば URL を使って LDAP データベースの内部検索を行い、その検索の結果が 認証する利用者が認可される先の DN になります。次に示す LDAP エントリがあったとすると、 cn=WebUpdate,dc=example,dc=com として認証される利用者は dc=example,dc=com を検索ベースとして、オブジェクトクラスが Person である任意の LDAP エントリに認可可能です。
dn: cn=WebUpdate,dc=example,dc=com saslAuthzTo: ldap:///dc=example,dc=com??sub?(objectclass=Person)
10.3.3.1. 代理認可規則についての注記
saslAuthzTo と saslAuthzFrom 属性に指定した LDAP URL は DN の集合を返します。返された各 DN が検査されます。検索結果が大きな集合となる場合、認可処理は待ちきれないほど長時間になる可能性があります。また、検索は slapd により索引付けられている属性について行うべきです。
saslAuthzFrom と saslAuthzTo のためのより高速な規則を作成するために、属性の値に正規表現文字を入れた DN を指定できます。つまり次に示すような規則を指定できます。
saslAuthzTo: uid=.*,dc=example,dc=com
この指定は、認証利用者が与えた正規表現パターンに一致する任意の DN に認可可能であることを意味します。この正規表現による比較は、 (uid=*) で検索するよりも高速に評価できます。
さらには認可規則の値は2つの形式のいずれかでなければなりません。つまり LDAP URL か DN (正規表現あり/なし)かです。 "ldap://" で始まらないものは DN として扱われます。認可規則として "u:<username>" 形式の認証 ID を入れることは許されていません。
10.3.3.2. ポリシの構築
saslAuthzFrom と saslAuthzTo のどの種の規則を使うかの決定は、利用するサイトのソリューションに依存します。たとえば与えた ID になる人の重合が検索フィルタで容易に書けるようであれば単一の認可先の規則を書けるでしょう。人の集合が検索フィルタで容易に書けず、人の集合が小さいなら、代理認可の実行が許される人のそれぞれのエントリに認可元の規則を書いたほうがよいでしょう。
デフォルトで代理認可規則の処理が無効になっています。認可を有効にするためには slapd.conf(5) ファイルに sasl-authz-policy ディレクティブを設定しなければなりません。このディレクティブには規則が無いことを意味する none (デフォルト)、認可元の規則を用いることを意味する from、認可先の規則を用いることを意味する to、認可元と認可先の両方の規則を用いることを意味する both を指定できます。
認証先の規則は非常に強力です。通常の利用者が自分のエントリの saslAuthzTo 属性を書くアクセス権を持っていれば、他のどんな人にも認可が許されるように規則を書けてしまいます。したがって、認可先の規則を用いる場合には、特権を持った利用者にのみ saslAuthzTo 属性の設定を許すよう ACL で保護すべきです。