Ubuntu 14.04 Trusty TahrでOpenLDAP slapd
を設定しています。ユーザーではない特定のインスタンス(レプリケーションなど)が、DIGEST-MD5
メカニズムを使用してSASL
経由でログインできるようにしたい。
ユーザーとは異なり、それらはないディレクトリツリーに対応するDN(およびパスワード)があるはずです。代わりに、資格情報は外部に保存されることになっているため、SASL
になります。
私は現在saslauthd
を使用しています(たとえば、sasldbへの直接アクセスで動作させることができる場合、これは難しい要件ではありません)。メカニズムDIGEST-MD5
を使用すると失敗しますが、メカニズムPLAIN
およびLOGIN
を使用すると正常に動作します。およびCRAM-MD5
。
何が欠けているか、間違っていますか? DIGEST-MD5
を使用するにはどうすればよいですか?
OpenLDAPは、/etc/ldap/sasl2/slapd.conf
のSASL
に対して次のように構成されています。
mech_list: EXTERNAL DIGEST-MD5 CRAM-MD5 PLAIN LOGIN
pwcheck_method: saslauthd
saslauthd_path: /var/run/saslauthd/mux
/etc/default/saslauthd
の興味深い(変更された)オプションは次のとおりです。
START=yes
MECHANISMS="sasldb"
その結果、saslauthd
は次のように開始されます。
/usr/sbin/saslauthd -a sasldb -c -m /var/run/saslauthd -n 5
失敗したケースをDIGEST-MD5
で次のように再現します。
# ldapsearch -U replication -ZZ -Y DIGEST-MD5 -H ldap://ldap-master.example.com/ -b "dc=example,dc=com" "(objectClass=*)"
SASL/DIGEST-MD5 authentication started
Please enter your password:
ldap_sasl_interactive_bind_s: Invalid credentials (49)
additional info: SASL(-13): user not found: no secret in database
Slapdログで失敗したように見える部分(ロギングはany
にあります)は次のようになります。
slapd[23330]: [rw] authid: "uid=replication,cn=digest-md5,cn=auth" -> "uid=replication,cn=digest-md5,cn=auth"
slapd[23330]: slap_parseURI: parsing uid=replication,cn=digest-md5,cn=auth
slapd[23330]: >>> dnNormalize: <uid=replication,cn=digest-md5,cn=auth>
slapd[23330]: <<< dnNormalize: <uid=replication,cn=digest-md5,cn=auth>
slapd[23330]: <==slap_sasl2dn: Converted SASL name to uid=replication,cn=digest-md5,cn=auth
slapd[23330]: slap_sasl_getdn: dn:id converted to uid=replication,cn=digest-md5,cn=auth
slapd[23330]: SASL Canonicalize [conn=1002]: slapAuthcDN="uid=replication,cn=digest-md5,cn=auth"
slapd[23330]: SASL [conn=1002] Failure: no secret in database
slapd[23330]: SASL [conn=1002] Debug: DIGEST-MD5 common mech dispose
slapd[23330]: send_ldap_result: conn=1002 op=2 p=3
slapd[23330]: send_ldap_result: err=49 matched="" text="SASL(-13): user not found: no secret in database"
slapd[23330]: send_ldap_response: msgid=3 tag=97 err=49
/var/log/auth.log
にも、saslauthd
のデバッグ出力にも手動で実行しても何もありません。これは、slapd
がsaslauthd
に認証を渡さなかったことを示している可能性があります(実際のケースとは対照的に、以下を参照してください) )。
次のように、PLAIN
またはLOGIN
を使用して作業ケースを再現します。
# ldapsearch -U replication -ZZ -Y PLAIN -H ldap://ldap-master.example.com/ -b "dc=example,dc=com" "(objectClass=*)"
SASL/PLAIN authentication started
Please enter your password:
SASL username: replication
SASL SSF: 0
# extended LDIF
…
上記のケースの失敗を示したslapd
ログの対応する部分は、次のようになります。
slapd[23330]: [rw] authid: "uid=replication,cn=plain,cn=auth" -> "uid=replication,cn=plain,cn=auth"
slapd[23330]: slap_parseURI: parsing uid=replication,cn=plain,cn=auth
slapd[23330]: >>> dnNormalize: <uid=replication,cn=plain,cn=auth>
slapd[23330]: <<< dnNormalize: <uid=replication,cn=plain,cn=auth>
slapd[23330]: <==slap_sasl2dn: Converted SASL name to uid=replication,cn=plain,cn=auth
slapd[23330]: slap_sasl_getdn: dn:id converted to uid=replication,cn=plain,cn=auth
slapd[23330]: SASL Canonicalize [conn=1006]: slapAuthcDN="uid=replication,cn=plain,cn=auth"
slapd[23330]: daemon: activity on 1 descriptor
slapd[23330]: daemon: activity on:
slapd[23330]:
slapd[23330]: daemon: epoll: listen=8 active_threads=0 tvp=zero
slapd[23330]: daemon: epoll: listen=9 active_threads=0 tvp=zero
slapd[23330]: daemon: epoll: listen=10 active_threads=0 tvp=zero
slapd[23330]: SASL proxy authorize [conn=1006]: authcid="replication" authzid="replication"
slapd[23330]: conn=1006 op=1 BIND authcid="replication" authzid="replication"
slapd[23330]: SASL Authorize [conn=1006]: proxy authorization allowed authzDN=""
slapd[23330]: send_ldap_sasl: err=0 len=-1
slapd[23330]: conn=1006 op=1 BIND dn="uid=replication,cn=plain,cn=auth" mech=PLAIN sasl_ssf=0 ssf=128
slapd[23330]: do_bind: SASL/PLAIN bind: dn="uid=replication,cn=plain,cn=auth" sasl_ssf=0
slapd[23330]: send_ldap_response: msgid=2 tag=97 err=0
/var/log/auth.log
とsaslauthd
のデバッグ出力の両方に、次のものが含まれるようになりました。
saslauthd[23354]: rel_accept_lock : released accept lock
saslauthd[23358]: get_accept_lock : acquired accept lock
saslauthd[23354]: cache_get_rlock : attempting a read lock on slot: 458
saslauthd[23354]: cache_lookup : [login=replication] [service=] [realm=ldap]: not found, update pending
saslauthd[23354]: cache_un_lock : attempting to release lock on slot: 458
saslauthd[23354]: cache_get_wlock : attempting a write lock on slot: 458
saslauthd[23354]: cache_commit : lookup committed
saslauthd[23354]: cache_un_lock : attempting to release lock on slot: 458
saslauthd[23354]: do_auth : auth success: [user=replication] [service=ldap] [realm=] [mech=sasldb]
saslauthd[23354]: do_request : response: OK
どうやら、PLAIN
とLOGIN
とDIGEST-MD5
とCRAM-MD5
との動作には、いくつかの違いがあるはずです。
更新および説明:
ツリーへのアクセスを承認するために使用されるDNは、それぞれuid=replication,cn=digest-md5,cn=auth
およびuid=replication,cn=plain,cn=auth
であり、 http://www.openldap.org/doc/admin24/sasl。 html これらのDNは、ツリーに実際に存在する必要はありません(少なくともPLAIN
とLOGIN
は、そこで正常に機能しているため、真である必要があります)。
現在、テスト目的でolcAccess: to * by dn.regex="replication" read by * break
を使用して、レプリケーションログインが少なくともすべてへの読み取りアクセス権を取得していることを確認しています(そうです、これは安全ではなく、本番環境に適切な権限を付与します)。マスターLDAPツリー。
資格情報は/etc/sasldb2
にあり、PLAIN
またはLOGIN
(上記を参照)を使用すると、資格情報が正常にチェックされます。参考までに、次のようになります。
# sasldblistusers2
replication@ldap-master: userPassword
…
# db_dump -p /etc/sasldb2
VERSION=3
format=print
type=hash
h_nelem=4
db_pagesize=4096
HEADER=END
replication\00ldap-master\00userPassword
PasswordCensored
…
ただし、DIGEST-MD5
とCRAM-MD5
の場合は、saslauthd
にまったく連絡していないようです(おそらく何か不足している、または何か間違っているため)。そのため、データベースも参照されない可能性があります。 。
私のレシピはOpenLDAPが直接チェックすることです/etc/sasldb2
。
最初のステップ:/etc/sasldb2
はslapdユーザーが所有しています。
次のステップ:ディレクトリツリーで認証情報を検索しないようにslapd
を設定します。これは次のように行われます。
dn: cn=config
changetype: modify
replace: olcSaslAuxprops
olcSaslAuxprops: sasldb
後で、olcAuthzRegexp
ルールも必要になりますが、認証が機能するかどうかをテストするために、これは必要ありません。
これらの設定は、ソースからビルドされたDebian GNU/Linux Jessie OpenLDAP-2.4.40で機能しています。
CRAM-MD5およびDIGEST-MD5メソッドは、「pwcheck_method:saslauthd」では不可能です。 LDAPディレクトリ自体に、暗号化されていないプレーンなパスワードが必要です。
sasldb
のさまざまな資格情報を使用して、さまざまな構成に対していくつかの広範なテストを実行しました。
結論として、ここで私が最も悩まされている問題は、どの認証方法(saslauthd
とauxprop
)のどちらが使用されているかによって決まります(これは、要求された認証メカニズムに依存します-_DIGEST-MD5
_/_CRAM-MD5
_とPLAIN
/LOGIN
の比較)、別のdomain
を探していました。私はそれを期待していなかったし、sasldb
にユーザーとドメインのペアが1つしかなかったので、もう1つは見つかりませんでした。
他の人が問題を理解して回避するのに役立つことを期待して、私の結論と観察の一部をリストします。
PLAIN
またはLOGIN
メカニズムをリクエストする場合、slapd
は_pwcheck_method
_の_/etc/ldap/sasl2/slapd.conf
_で設定された認証方法を使用します。DIGEST-MD5
_または_CRAM-MD5
_メカニズムを要求した場合、_pwcheck_method
_の構成に関係なく、slapd
は常にauxprop
メソッドを使用します。pwcheck_method: auxprop
_を設定すると、slapd
で4つのメカニズムすべてに同じメソッドを使用できるようになります。または、_pwcheck_method
_に対して何か他のものを構成する場合、2つの異なる方法を使用することを決定できます。auxprop_plugin
_内の_/etc/ldap/sasl2/slapd.conf
_は無視されます。代わりに、slapd
は、独自の構成データベースでolcSaslAuxprops
に構成されているものを使用します。これは、_DIGEST-MD5
_または_CRAM-MD5
_メカニズムを要求するときの暗黙のauxprop
メソッドと、他の2つのメカニズムの1つを要求するときの明示的に構成された_pwcheck_method: auxprop
_の両方に当てはまることに注意してください。saslauthd
は、修飾されていないホスト名(つまり、_ldap-master
_のみ)を使用して、domain
コンポーネントとして認証情報を検索します。経験に基づいた推測をするなら、それはgethostname()
のようなものを使用してそれを考え出すと言うので、これは何とか構成可能かもしれません。auxprop
を何らかの方法で通過するとき、slapd
はdomain
コンポーネントとして完全修飾ドメイン名(つまり、_ldap-master.example.com
_)を使用します。元のリクエストURLからそれを取得する可能性があります(STARTTLSを使用して、一致するドメイン名を要求するサーバー証明書を正しく検証できるようにしたい場合、リクエストを生成するための代替手段は限られています)。 olcSaslHost
の構成データベースでslapd
を設定して構成されます。まだ設定していないことに注意してください。したがって、実際の構成を考え出すには、いくつかのオプションがあります。
PLAIN
とLOGIN
のメカニズムだけで問題ない場合は、必要に応じて_pwcheck_method
_で_/etc/ldap/sasl2/slapd.conf
_を構成します。 auxprop
にする場合は、olcSaslAuxprops
の構成データベースでslapd
も構成します(たとえば、資格情報ストアとして_/etc/sasldb2
_を使用する場合は、sasldb
に設定します)。DIGEST-MD5
_だけで問題ない場合(セキュリティが低いため、通常は_CRAM-MD5
_が推奨されないので避けてください)、olcSaslAuxprops
の構成データベースでslapd
メソッドを使用するため、auxprop
を設定します、_pwcheck_method
_の構成に関係なく。DIGEST-MD5
_、_CRAM-MD5
_(ただし、_CRAM-MD5
_)とセットPLAIN
、LOGIN
の両方のメカニズムを使用できるようにしたい場合は、 STARTTLS-oneなどの暗号化された接続を介して使用され、それらすべてに対して同じ認証方法を使用し、同じ資格情報のセットに対してチェックすることを好む場合、auxprop
に制限されます。 _pwcheck_method: auxprop
_で_/etc/ldap/sasl2/slapd.conf
_を構成し、必要に応じてolcSaslAuxprops
の構成データベースでslapd
を設定します。異なる認証方法を使用しながら両方のセットのメカニズムを使用できるようにしたい場合(管理の悪夢のように聞こえますが、これで終わりです)PLAIN
に応じて_pwcheck_method
_に_/etc/ldap/sasl2/slapd.conf
_を構成します。 LOGIN
およびauxprop
を_DIGEST-MD5
_(および主張する場合は_CRAM-MD5
_)に強制的に使用し、必要に応じてolcSaslAuxprops
の構成データベースでslapd
を設定する必要があることを覚えておいてください。
ハッシュされていないメカニズムに対してsaslauthd
を構成し、saslauthdがslapd
を介してauxprop
を介してアクセスするデータベースとは異なるデータベースにアクセスするか、sasldb
以外の何かをolcSaslAuxprops
に使用する場合、それらはうまく分離されており、心配する必要はありません。
ハッシュされていないメカニズムに対してsaslauthd
を構成し、ハッシュされたメカニズムに対してsasldb
に対してauxprop
を構成して、それらに同じ資格情報データベースにアクセスさせる場合、優先順位の高い3つのオプションがあります。
saslauthd
と、slapd
を介して直接sasldbにアクセスするauxprop
の両方が、同じdomain
を使用して資格情報をクエリすることを確認します(olcSaslHost
を設定するか、saslauthd
を強制して、エンティティごとに1つのエンティティのみに資格情報を指定します。認証する。userid
のハッシュ化されていないメカニズムにはhostname
-saslauthd
ペアを使用し、userid
を介してハッシュされたメカニズムにはauxprop
-_hostname.domain.name
_ペアを使用します。