【问题标题】:ldap_sasl_bind_s(GSSAPI) - What should be provided in the credentials BERVAL structureldap_sasl_bind_s(GSSAPI) - 应该在凭证 BERVAL 结构中提供什么
【发布时间】:2011-03-09 20:44:09
【问题描述】:

我正在尝试使用 Microsoft LDAP C SDK 中的 ldap_sasl_bind_s 方法,并使用 GSSAPI 作为身份验证机制。 ldap_sasl_bind_s 期望凭据为不透明的 BERVAL 结构。

给定用户名(或 DN)和密码,我如何访问应该传递给 ldap_sasl_bind_sBERVAL 结构

到目前为止我发现的例子

  • 来自其他 LDAP C SDK - 不是来自 Microsoft 的 SDK
  • 需要简单身份验证时使用ldap_sasl_bind_s - 但我需要使用 GSSAPI
  • 在需要其他 SASL 身份验证机制时使用 ldap_sasl_interactive_bind_s。但是,Microsoft SDK 中没有 ldap_sasl_interactive_bind_s

附带说明,目标是能够通过 SASL 绑定到各种 LDAP 服务器;目前:ActiveDirectory 和 OpenLDAP。

任何指针将不胜感激。

【问题讨论】:

    标签: ldap sasl gssapi


    【解决方案1】:

    我设法使用ldap_sasl_bind_s 在 GSSAPI 上执行 LDAP SASL 绑定。有兴趣的可以参考一下。

    对于客户端和服务器在 GSSAPI SASL 身份验证期间需要执行的操作的抽象描述,“Kerberos V5 (“GSSAPI”) 简单身份验证和安全层 (SASL) 机制” RFC应该阅读;具体来说,“身份验证协议交换的客户端”部分很有趣,因为它指示了我们需要执行的操作序列,以通过 Kerberos 成功绑定到 LDAP 服务器。

    ldap_sasl_bind_s 期望的凭据 - 它们的形式和含义 - 取决于所使用的实际身份验证机制,在我们的例子中是 Kerberos。

    在微软 SDK 中,Kerberos 是通过 SSPI 提供的——大致是微软对 GSSAPI 的实现;与我们的特定情况相关的方法是:AcquireCredentialsHandleInitializeSecurityContextDecryptMessageEncryptMessage

    基于 Kerberos 的 LDAP SASL 绑定有 3 个阶段。

    第一阶段

    致电AcquireCredentialsHandleInitializeSecurityContext
    重要说明:

    • AcquireCredentialsHandle 传递一个指向包含实际凭据(领域、用户名、密码)的SEC_WINNT_AUTH_IDENTITY 结构的指针,如果要使用当前线程的凭据,则传递给NULL
    • 目标名称应该是映射到运行 LDAP 服务器的帐户的 SPN
    • 调用InitializeSecurityContext时,必须请求相互认证。

    如果所有重要参数均正确 - 有效凭据、有效 SPN、NULL 输入令牌 - InitializeSecurityContext 调用应返回 SEC_I_CONTINUE_NEEDED 并正确填充输出令牌。此输出令牌的内容应放入 BERVAL 结构中,ldap_sasl_bind_s 期望作为客户端凭据。

    使用来自InitializeSecurityContext 的输出令牌作为客户端凭据调用ldap_sasl_bind_s。如果所有参数都正确 - 空 DN,GSSAPI 作为机制名称 - 实际调用应该返回 LDAP_SUCCESS 并且 LDAP 会话的最新 LDAP 错误应该是 LDAP_SASL_BIND_IN_PROGRESS

    附带说明一下,可以通过在会话上调用 ldap_get_option 来发现 LDAP 会话的最新 LDAP 错误,并使用 LDAP_OPT_ERROR_NUMBER 作为选项。

    第二阶段

    在成功调用ldap_sasl_bind_s 后,它的最后一个参数指向一个包含服务器凭据的BERVAL 结构。这个BERVAL 结构的内容现在应该用作第二次调用InitializeSecurityContext 的输入标记。

    InitializeSecurityContext 的第二次调用应该返回SEC_OK 和一个空的输出令牌。

    此空输出令牌应用作对ldap_sasl_bind_s 的另一次调用的客户端凭据。对ldap_sasl_bind_s 的第二次调用应返回LDAP_SUCCESS,LDAP 会话的最新LDAP 错误为LDAP_SASL_BIND_IN_PROGRESS

    第三阶段

    在第二次成功调用ldap_sasl_bind_s 之后,它的最后一个参数指向一个包含服务器数据的BERVAL 结构。此服务器数据应作为输入提供给DecryptMessage。正如前面提到的 RFC 中规定的,解密后的数据必须是 4 个字节长。

    客户端应根据同一 RFC 中的信息构建其回复。
    注意:在我的例子中,我省略了 RFC 中提到的授权 ID。据我了解,空的授权 id 会导致身份验证 id 也用于授权。

    然后客户端构建的回复应作为输入传递给EncryptMessage。然后应将EncryptMessage 调用的输出作为客户端凭据传递给ldap_sasl_bind_s 的第三次也是最后一次调用。

    注意:在 Kerberos 下使用 EncryptMessage 的 MSDN 文档似乎不完整。谷歌的代码搜索应该有助于提供一个工作示例。此外,对于上述流程的工作示例,可以参考 Samba 的源代码。

    【讨论】:

    • 嗨卡塔琳娜!我已按照您描述的步骤进行操作,但我遇到了一个问题,希望您能帮助我。第 1 阶段的 ldap_sasl_bind_s 调用返回成功,ldap_get_option 返回 LDAP_SASL_BIND_IN_PROGRESS,但最后一个参数指向一个空的 BERVAL 结构(大小为零)。如果我使用该数据为第 2 阶段构建 SecBufferDesc 结构,则以下对 InitializeSecurityContext 的调用将返回 SEC_E_INVALID_TOKEN。 ldap_sasl_bind_s 应该返回一个空的 BERVAL 还是我做错了什么?提前致谢!胡安
    • 唯一想到的是在第一次调用 InitializeSecurityContext 之前缺少 ISC_REQ_MUTUAL_AUTH 标志。
    • +1 好东西。很遗憾,StackOverflow 中没有太多人欣赏你的工作。
    • 嗨卡塔琳娜!也许你能帮我解决我的问题stackoverflow.com/q/14394642/475821谢谢!
    • @esmirnov:不幸的是,我无法弄清楚如何成功保护 ldap_sasl_bind_s(GSSAPI) 之后的 LDAP 通信,最终我放弃了。很抱歉,我无法提供更多帮助。
    【解决方案2】:

    我发现了问题。

    根据此线程 (https://groups.google.com/group/microsoft.public.active.directory.interfaces/browse_thread/thread/9c13fe85e520f0b4/820a136e032946e9?pli=1),在 Windows XP 中存在 ldap_sasl_bind_s 返回空服务器凭据的错误。我已经在 Windows 2008 Server 下测试了我的应用程序,并且正确返回了凭据。

    【讨论】:

    • 刚刚遇到同样的错误并花了一天时间试图确定它。感谢分享,胡安!
    【解决方案3】:

    来自SunMSDN 的文章。如果您可以尝试创建一个示例程序,您可能会得到答案

    Another One

    伪代码

    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 );
    

    【讨论】:

      猜你喜欢
      • 2015-12-09
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-15
      • 2021-02-13
      • 1970-01-01
      相关资源
      最近更新 更多