Solaris 开发者安全性指南

SASL 库基础

SASL 库称为 libsasllibsasl 是一个框架,允许正确编写的 SASL 消费方应用程序使用系统中可用的所有 SASL 插件。术语插件是指为 SASL 提供服务的对象。插件位于 libsasl 的外部。SASL 插件可用于验证和安全性、名称标准化以及辅助属性(如口令)的查找。加密算法存储在插件中,而不是 libsasl 中。

libsasl 为消费方应用程序和库提供应用编程接口 (application programming interface, API)。服务提供者接口 (service provider interface, SPI) 是为插件提供的,用于为 libsasl 提供服务。libsasl 不能识别网络或协议。相应地,应用程序必须负责在客户机与服务器之间发送和接收数据。

SASL 对用户使用两个重要的标识符。验证 ID (authid) 是用于验证用户的用户 ID。验证 ID 授予用户系统访问权限。授权 ID (userid) 用于检查是否允许用户使用特定选项。

SASL 客户机应用程序和 SASL 服务器应用程序将协商公用的 SASL 机制和安全级别。通常,SASL 服务器应用程序会将其可接受的验证机制的列表发送给客户机。随后 SASL 客户机应用程序便可决定哪种验证机制最能满足其要求。此后,客户机与服务器使用双方同意的验证机制,对它们之间交换的由 SASL 提供的验证数据进行验证。此交换将持续下去,直到验证成功完成、失败或被客户机或服务器中止。

在验证过程中,SASL 验证机制可以协商安全层。如果已选择安全层,则必须在 SASL 会话期间使用该层。

SASL 体系结构

下图显示了基本的 SASL 体系结构。

图 7–1 SASL 体系结构

图中显示了主要的 SASL 元素如何采用客户机/服务器关系一同工作。

客户机和服务器应用程序通过 SASL API 调用其 libsasl 的本地副本。libsasl 通过 SASL 服务提供者接口 (service provider interface, SPI) 与 SASL 机制进行通信。

安全机制

安全机制插件为 libsasl 提供安全服务。以下是安全机制提供的一些典型功能:

SASL 安全强度因子

SSF(即安全强度因子)指示 SASL 保护的强度。如果该机制支持安全层,则客户机与服务器会协商 SSF。SSF 的值基于执行 SASL 协商之前指定的安全属性。如果协商结果是非零 SSF,则验证完成后,客户机和服务器都需要使用该机制的安全层。SSF 由具有以下值之一的整数表示:

保密性和完整性操作是通过安全机制执行的。libsasl 可以协调这些请求。


注 –

在协商过程中,SASL 客户机会选择具有最大 SSF 的机制。但是,实际所选的 SASL 机制可能随后会协商较小的 SSF。


SASL 中的通信

应用程序通过 libsasl API 与 libsasl 进行通信。libsasl 可通过应用程序注册的回调方式请求其他信息。应用程序不会直接调用插件,而只是通过 libsasl 进行调用。一般情况下,插件会调用 libsasl 框架的插件,随后这些插件调用应用程序的回调。SASL 插件还可以直接调用应用程序,不过应用程序不知道调用来自插件还是来自 libsasl

回调在以下几个方面非常有用。

应用程序可以注册两种回调:全局回调和会话回调。此外,libsasl 定义了大量用于为不同种类的回调注册的回调标识符。如果未注册给定类型的回调,则 libsasl 将执行缺省操作。

会话回调将覆盖全局回调。如果为给定 ID 指定了会话回调,则不会为该会话调用全局回调。某些回调必须是全局的,因为这些回调发生在会话之外。以下实例要求使用全局回调:

可以使用给定 SASL 回调 ID 的 NULL 回调函数来注册 SASL 回调。NULL 回调函数指示装配客户机的目的是为了提供所需的数据。所有的 SASL 回调 ID 都以前缀 SASL_CB_ 开头。

SASL 提供以下可供客户机或服务器使用的回调:

SASL_CB_GETOPT

获取 SASL 选项。选项用于修改 libsasl(3LIB) 和相关插件的行为。可由客户机或服务器使用。

SASL_CB_LOG

设置 libsasl 及其插件的日志记录函数。缺省行为是使用 syslog

SASL_CB_GETPATH

获取以冒号分隔的 SASL 插件搜索路径列表。缺省路径取决于以下体系结构:

  • 32 位 SPARC 体系结构: /usr/lib/sasl

  • 32 位 x86 体系结构: /usr/lib/sasl

  • 64 位 SPARC 体系结构: /usr/lib/sasl/sparcv9

  • x64 体系结构: /usr/lib/sasl/amd64

SASL_CB_GETCONF

获取 SASL 服务器的配置目录的路径。缺省设置为 /etc/sasl

SASL_CB_LANGUAGE

为客户机和服务器错误消息和客户机提示指定以逗号分隔的 RFC 1766 语言代码列表(按优先级顺序)。缺省设置为 i-default

SASL_CB_VERIFYFILE

验证配置文件和插件文件。

SASL 提供以下仅限客户机使用的回调:

SASL_CB_USER

获取客户机用户名。用户名与授权 ID 相同。LOGNAME 环境变量为缺省设置。

SASL_CB_AUTHNAME

获取客户机验证名称。

SASL_CB_PASS

获取基于客户机口令短语的机密。

SASL_CB_ECHOPROMPT

获取给定质询提示的结果。可以回显来自客户机的输入。

SASL_CB_NOECHOPROMPT

获取给定质询提示的结果。不应回显来自客户机的输入。

SASL_CB_GETREALM

设置用于验证的领域。

SASL 提供以下仅限服务器使用的回调:

SASL_CB_PROXY_POLICY

检查是否授权经过验证的用户代表指定用户执行操作。如果未注册此回调,则经过验证的用户与要授权的用户必须是同一用户。如果这些 ID 不同,则验证将失败。请使用服务器应用程序来维护非标准授权策略。

SASL_CB_SERVER_USERDB_CHECKPASS

针对调用方提供的用户数据库验证纯文本口令。

SASL_CB_SERVER_USERDB_SETPASS

在用户数据库中存储纯文本口令

SASL_CB_CANON_USER

调用应用程序提供的用户标准化函数。

首次初始化 SASL 库时,服务器和客户机会声明所有必要的全局回调。执行 SASL 会话之前或期间可以使用全局回调。初始化之前,回调将执行诸如装入插件、记录数据和读取配置文件之类的任务。SASL 会话开始时,可以声明其他回调。这类回调可以覆盖全局回调(如果必要)。

SASL 连接上下文

libsasl 使用 SASL 连接上下文维护 SASL 客户机和 SASL 服务器的每个 SASL 会话的状态。每个上下文一次只能用于一个验证和安全会话。维护的状态包括以下信息: