を使用して、GSSAPI 経由で LDAP SASL バインドを実行することができましたldap_sasl_bind_s
。興味のある方のために、ここにいくつかの指針があります。
クライアントとサーバーが GSSAPI SASL 認証中に実行する必要があるアクションの抽象的な説明については、「The Kerberos V5 ("GSSAPI") Simple Authentication and Security Layer (SASL) Mechanism」 RFC を読む必要があります。特に、「認証プロトコル交換のクライアント側」セクションは興味深いものです。これは、Kerberos を介して LDAP サーバーに正常にバインドするために実行する必要があるアクションのシーケンスを示しているためです。
クレデンシャルldap_sasl_bind_s
に必要な形式と意味は、使用されている実際の認証メカニズム (この場合は Kerberos) によって異なります。
Microsoft SDK では、SSPI を介して Kerberos を使用できます。これは、おおよそ GSSAPI の Microsoft 実装です。特定のケースに関連するメソッドは次のとおりAcquireCredentialsHandle
です。InitializeSecurityContext
DecryptMessage
EncryptMessage
Kerberos を介した LDAP SASL バインドには 3 つのフェーズがあります。
フェーズ 1
AcquireCredentialsHandle
と を呼び出しInitializeSecurityContext
ます。
ここでの重要な注意事項:
- 実際の資格情報 (レルム、ユーザー名、パスワード) を含む構造体へ
AcquireCredentialsHandle
のポインターに渡すか、現在のスレッドの資格情報を使用する場合SEC_WINNT_AUTH_IDENTITY
NULL
- ターゲット名は、LDAP サーバーが実行されているアカウントにマップされた SPN である必要があります
- を呼び出すときは
InitializeSecurityContext
、相互認証を要求する必要があります。
すべての重要な引数 (有効な資格情報、有効な SPN、NULL
入力トークン) が正しい場合、InitializeSecurityContext
呼び出しは返さSEC_I_CONTINUE_NEEDED
れ、出力トークンを適切に埋める必要があります。この出力トークンの内容は、クライアント資格情報として期待されるBERVAL
構造に入る必要があります。ldap_sasl_bind_s
ldap_sasl_bind_s
からの出力トークンInitializeSecurityContext
をクライアント資格情報として呼び出します。すべての引数が正しい場合 (空の DN、メカニズム名として GSSAPI)、実際の呼び出しが返さLDAP_SUCCESS
れ、LDAP セッションの最新の LDAP エラーは になりますLDAP_SASL_BIND_IN_PROGRESS
。
補足として、LDAP セッションの最新の LDAP エラーは、オプションとしてldap_get_option
セッションを呼び出すことで検出できLDAP_OPT_ERROR_NUMBER
ます。
フェーズ2
への呼び出しが成功した後、その最後の引数は、サーバー資格情報を含む構造体をldap_sasl_bind_s
指します。BERVAL
このBERVAL
構造体のコンテンツは、 への 2 回目の呼び出しの入力トークンとして使用する必要がありますInitializeSecurityContext
。
この 2 番目の呼び出しは、空の出力トークンInitializeSecurityContext
を返す必要があります。SEC_OK
この空の出力トークンは、 への別の呼び出しのクライアント資格情報として使用する必要がありますldap_sasl_bind_s
。へのこの 2 番目の呼び出しは、LDAP セッションの最新の LDAP エラーとともにldap_sasl_bind_s
を返します。LDAP_SUCCESS
LDAP_SASL_BIND_IN_PROGRESS
フェーズ 3
への 2 回目の呼び出しが成功した後、最後の引数はサーバー データを含む構造体をldap_sasl_bind_s
指します。BERVAL
このサーバー データは、 への入力として指定する必要がありますDecryptMessage
。前述の RFC で指定されているように、復号化されたデータの長さは 4 バイトである必要があります。
クライアントは、同じ RFC の情報に従って応答を作成する必要があります。
注: 私の場合、RFC に記載されている認証 ID を省略しました。私の理解では、承認IDが空の場合、認証IDも承認に使用されます。
クライアントが作成した応答は、入力として に渡されますEncryptMessage
。次に、呼び出しの出力を、EncryptMessage
への 3 回目と最後の呼び出しのクライアント資格情報として渡す必要がありますldap_sasl_bind_s
。
注: Kerberos で使用するための MSDN ドキュメントはEncryptMessage
不完全なようです。Google の Code Search は、実用的な例を支援する必要があります。また、上記のフローの実際の例については、Samba のソース コードを参照できます。