Solaris 开发者安全性指南

服务提供者的 SASL

本节介绍如何创建用于为 SASL 应用程序提供机制和其他服务的插件。


注 –

由于导出规程,对于非 Solaris 客户机/服务器机制插件,Solaris SASL SPI 不支持安全层。 因此,非 Solaris 客户机/服务器机制插件不能提供完整性和保密性服务。Solaris 客户机/服务器机制插件没有此限制。


SASL 插件概述

SASL 服务提供者接口 (service provider interface, SPI) 可实现插件与 libsasl 库之间的通信。 SASL 插件通常作为共享库来实现。单个共享库可以具有一个或多个不同类型的 SASL 插件。位于共享库中的插件是由 libsasl 通过 dlopen(3C) 函数动态打开的。

还可以将插件静态绑定至调用 libsasl 的应用程序。使用 sasl_client_add_plugin() 函数或 sasl_server_add_plugin() 函数装入这些种类的插件,具体视应用程序是客户机还是服务器而定。

Solaris 操作系统中的 SASL 插件具有以下要求:

SASL 插件分为四种类别:

sasl_client_init() 函数导致 SASL 客户机装入所有可用的客户机插件。sasl_server_init() 函数导致 SASL 服务器装入服务器插件、标准化插件和 auxprop 插件。调用 sasl_done() 时将卸载所有插件。

为查找插件,libsasl 使用 SASL_CB_GETPATH 回调函数或缺省路径。SASL_CB_GETPATH 返回以冒号分隔的目录列表,以供在其中查找插件。如果 SASL 消费方指定了 SASL_CB_GETPATH 回调,则 libsasl 将使用返回的搜索路径。否则,SASL 消费方可以使用与二进制类型对应的缺省路径:

在装入过程中,libsasl 将调用最新支持的插件版本。插件将返回该版本以及描述该插件的结构。如果该版本合格,则 libsasl 即可装入该插件。当前版本号 SASL_UTILS_VERSION 为 4。

初始化插件后,插件与 libsasl 之间的后续通信通过必须建立的结构执行。插件使用 sasl_utils_t 结构来调用 libsasllibsasl 使用以下结构中的入口点与插件进行通信:

可以在 SASL 头文件中找到这些结构的源代码。这些结构将在下一节中进行介绍。

SASL 插件的重要结构

libsasl 与插件之间的通信是通过以下结构完成的:

客户机插件

客户机插件用于管理 SASL 协商的客户端。客户机插件通常随对应的服务器插件一同打包。客户机插件包含一种或多种客户端 SASL 机制。每种 SASL 客户机机制都支持验证、完整性和保密性(后两者是可选的)。每种机制都提供有关该机制的功能的信息:

客户机插件必须导出 sasl_client_plug_init()libsasl 将调用 sasl_client_plug_init() 来初始化客户机的插件。插件将返回 sasl_client_plug_t 结构。sasl_client_plug_t 将为 libsasl 提供以下用于调用机制的入口点:

服务器插件

服务器插件用于管理 SASL 协商的服务器端。服务器插件通常随对应的客户机插件一同打包。服务器插件包含一种或多种服务器端 SASL 机制。每种 SASL 服务器机制都支持验证、完整性和保密性(后两者是可选的)。每种机制都提供有关该机制的功能的信息:

服务器插件必须导出 sasl_server_plug_init()libsasl 将调用 sasl_server_plug_init() 来初始化服务器的插件。插件将返回 sasl_server_plug_t 结构。sasl_server_plug_t 将为 libsasl 提供以下用于调用机制的入口点:

用户标准化插件

标准化插件为客户端和服务器端的验证和授权名称的备用标准化提供支持。sasl_canonuser_plug_init() 用于装入标准化插件。标准化插件具有以下要求:

用户标准化插件必须导出 sasl_canonuser_init() 函数。sasl_canonuser_init() 函数必须返回 sasl_canonuser_plug_t 以建立必要的入口点。用户标准化插件必须至少实现 sasl_canonuser_plug_t 结构的一个 canon_user_client() 成员或 canon_user_server() 成员。

辅助属性 (auxprop) 插件

Auxprop 插件为查找 SASL 服务器的 authidauthzid 的辅助属提供支持。例如,应用程序可能需要查找内部验证的用户口令。sasl_auxprop_plug_init() 函数用于初始化 auxprop 插件并返回 sasl_auxpropr_plug_t 结构。

要成功实现 auxprop 插件,必须实现 sasl_auxprop_plug_t 结构的 auxprop_lookup 成员。标准化用户名后,应使用标准化的用户名来调用 auxprop_lookup() 函数。随后,插件即可执行请求的辅助属性所需的所有查询。


注 –

Sun Microsystems, Inc. 当前不支持 auxprop 插件。


SASL 插件开发指南

本节提供一些用于开发 SASL 插件的其他建议。

SASL 插件中的错误报告

适当的错误报告可以帮助跟踪验证问题和其他调试问题。建议插件开发者使用 sasl_utils_t 结构中的 sasl_seterror() 回调为给定连接提供详细的错误信息。

SASL 插件中的内存分配

在 SASL 中分配内存的一般规则是在不再需要已分配的任何内存时将其释放。遵循此规则可以提高性能和可移植性,而且可以避免内存泄漏。

设置 SASL 协商顺序

插件机制可以设置客户机和服务器通过以下标志执行 SASL 会话的顺序:

如果未设置任何标志,则机制插件将在内部设置顺序。在这种情况下,机制必须同时检查客户机和服务器中需要发送的数据。请注意,只有在协议允许初始响应时,才有可能出现客户机首先发送的情况。

服务器最后发送的情况要求在步骤函数返回 SASL_OK 时插件可设置 *serverout。永远不让服务器最后发送的那些机制必须将 *serverout 设置为 NULL。始终让服务器最后发送的那些机制需要将 *serverout 指向成功数据。