11

認証メカニズムとしてGSSAPIldap_sasl_bind_sを使用して、Microsoft LDAP C SDKのメソッドを使用しようとしています。クレデンシャルは不透明な構造として期待されます。ldap_sasl_bind_sBERVAL

ユーザー名 (または DN) とパスワードが与えられた場合、渡すことになっている構造体に到達するにはどうすればよいBERVALldap_sasl_bind_sですか?

これまでに見つけた例

  • Microsoft のものではなく、他の LDAP C SDK のものです。
  • ldap_sasl_bind_sSIMPLE 認証が必要な場合に使用 - ただし、GSSAPI を使用する必要がある
  • ldap_sasl_interactive_bind_s他の SASL 認証メカニズムが必要な場合に使用します。ただし、ldap_sasl_interactive_bind_sMicrosoft SDK にはありません。

補足として、目標は SASL を介してさまざまな LDAP サーバーにバインドできるようにすることです。今のところ: ActiveDirectory と OpenLDAP。

どんなポインタでも大歓迎です。

4

3 に答える 3

16

を使用して、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です。InitializeSecurityContextDecryptMessageEncryptMessage

Kerberos を介した LDAP SASL バインドには 3 つのフェーズがあります。

フェーズ 1

AcquireCredentialsHandleと を呼び出しInitializeSecurityContextます。
ここでの重要な注意事項:

  • 実際の資格情報 (レルム、ユーザー名、パスワード) を含む構造体へAcquireCredentialsHandleのポインターに渡すか、現在のスレッドの資格情報を使用する場合SEC_WINNT_AUTH_IDENTITYNULL
  • ターゲット名は、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_SUCCESSLDAP_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 のソース コードを参照できます。

于 2010-08-08T08:05:38.707 に答える
2

問題が見つかりました。

このスレッド ( https://groups.google.com/group/microsoft.public.active.directory.interfaces/browse_thread/thread/9c13fe85e520f0b4/820a136e032946e9?pli=1 ) によると、ldap_sasl_bind_s が空のサーバー資格情報を返すバグがありますWindowsXP. Windows 2008 Server でアプリケーションをテストしたところ、資格情報が正しく返されました。

于 2011-01-31T13:33:32.207 に答える
0

SunおよびMSDNの記事。おそらくサンプルプログラムを作成してみると答えが得られるかもしれません

もうひとつ

疑似コード

struct berval   cred;
char mechanism[BUFSIZ];
getline( mechanism, sizeof(mechanism), stdin, "mechanism? " );
getline( passwd, sizeof(passwd), stdin,"credentials? " );
cred.bv_val = passwd;
cred.bv_len = strlen( passwd );
rc = ldap_sasl_bind_s( ld, dn, mechanism, &cred, NULL, NULL, NULL );
于 2010-08-07T21:29:55.987 に答える