用 Kerberos 为 AIX 实现双因素身份验证

通过使用 Kerberos GSS-API 作为底层安全机制,实现双因素身份验证

随着对更安全系统的需求日益增加,多因素身份验证已经成为网络安全的首选方法。Kerberos 是最流行的网络身份验证机制之一,所以有必要学习如何用 Kerberos 协议设计多因素身份验证,以及了解如何使用 One-Time Password (OTP) 和 GSS-API 实现这个目标。

Sandeep Ramesh Patil , 高级软件工程师, EMC

Sandeep Ramesh Patil 是 IBM India Software Labs 的高级软件工程师。在过去七年里,他一直为 IBM 工作,主要研究包括 DCE、SARPC 在内的分布式技术,以及安全产品,例如 IBM Network Authentication Services (IBM Kerberos)。目前,他正在为 IBM Network Authentication Service 开发新的特性并实现安全相关的 RFC 及其产品支持。Sandeep 拥有印度 Pune 大学的计算机科学与工程学学士学位。



2009 年 1 月 08 日

简介

在任何系统中,身份验证都是最重要的组成部分之一。Kerberos 是用于网络身份验证和保护数据传输的最流行的安全机制。几乎所有基于 UNIX® 的操作系统都支持可插入的身份验证模块,因此都可以实现基于 Kerberos 的身份验证。IBM® AIX® V5.3 提供一个与 Kerberos 集成的登录模块,并且还在 SSH、rlogin、telnet 等实用程序中使用 Kerberos。IBM AIX 附带一个称为 IBM Network Authentication Service 的 Kerberos 实现,它可以在 AIX 的 Expansion Pack CD 上找到(参见 参考资料)。

随着对环境安全性的需求日益增加,系统(包括操作系统)的身份验证模块正在从传统的单因素身份验证(通常基于静态密码)向多因素身份验证发展。双因素身份验证是增强安全性的流行方法。本文描述如何在双因素身份验证系统中使用 Kerberos,讲解如何按照多因素身份验证方式使用 Kerberos 和 One Time Password (OTP),从而实现更安全的系统。最后,本文引导您用 Kerberos 和 Generic Security Service API (GSS-API) 实现一个双因素身份验证系统。

使用 Kerberos 和 OTP 的双因素身份验证

身份验证是出于安全目的检查人员身份的过程,而身份验证因素是用来实现身份验证的信息。在双因素身份验证中,使用两个不同的身份验证因素,因此能够增强安全性。通常,在双因素身份验证系统中,使用的第一个身份验证因素是用户知道的某种信息,比如静态密码或个人身份码(pin);第二个因素是用户拥有的某种东西,比如信用卡、手机或硬件安全令牌(它生成一个 One-Time Password (OTP) 令牌)。OTP 系统通常采用客户机-服务器模型,在给定的时刻对于给定的用户,在客户端生成相同的一次性密码。客户机可以是手持的硬件设备、通过 USB 等电子接口连接个人计算机的硬件设备或驻留在个人计算机上的软件模块,由服务器端进行检验。在这些系统中,密码是不断变化的,这会大大降低未授权访问的风险。因此,在双因素身份验证中使用 OTP 会提高安全性,适合许多需要高安全性身份验证模块的系统。关于 OTP 的更多信息,请参见 IETF RFC 2289(参见 参考资料)。

Kerberos 是用于网络身份验证的常用安全机制。大多数操作系统(比如 AIX、Linux® 和 Windows®)的登录模块都支持基于 Kerberos 的身份验证。另外,UNIX 系统上的许多远程登录应用程序(比如 Open SSH、telnet、rlogin 等)也有支持 Kerberos 的版本。基于 Kerberos 的身份验证模块可以用 Kerberos API 直接实现,也可以使用 GSS-API 接口实现。随着 Kerberos 的使用越来越广泛,组织很可能需要在使用 OTP 的双因素身份验证系统中使用 Kerberos 机制。

按照推荐的双因素身份验证系统设计,本文使用 Kerberos 实现第一因素身份验证,然后使用 Kerberos 基础架构(通过 GSS-API 接口)实现使用 OTP 令牌的第二因素身份验证。在按照这种方式实现的双因素身份验证系统中,Kerberos 协议扮演双重角色:

  • 在第一因素身份验证中,Kerberos 作为身份验证协议。
  • 在第二因素身份验证中,使用 Kerberos(通过 GSS-API 接口)作为与 OTP 通信的安全通道,并在客户机和服务器之间安全地传输 OTP 的检验结果。

除了支持 Kerberos 的现有应用程序(采用单因素身份验证)之外,还可以按照这种设计在基于网络的解决方案中应用 Kerberos 协议,从而实现双因素身份验证。

GSS-API

IETF RFC 2078 对 GSS-API 的定义如下(参见 参考资料):

Generic Security Service Application Program Interface (GSS-API) 按照一种通用方式向调用者提供安全服务,可以支持各种底层机制和技术,因此支持在源代码级把应用程序迁移到不同的环境。

Kerberos 是通过 GSS-API 使用的最流行的底层安全机制。IBM Network Authentication Service V1.4 for AIX 实现了 GSS-API 标准并使用 GSS-API 库导出它的接口,这些接口支持 Kerberos 机制。通过使用这些 GSS-API 接口,可以实现使用 Kerberos 机制的安全应用程序和系统。在 GSS-API 中,两个相互通信的应用程序之间的安全连接通常由一个称为安全上下文的数据结构表示。建立安全连接的应用程序称为上下文发起者。接受安全连接的应用程序称为上下文接受者。在发起者和接受者之间建立上下文实际上是一个握手过程,此过程需要对双方进行身份验证。成功地建立 GSS-API 上下文之后,就可以认为已经成功地检验了用户身份。

重要的 GSS-API 接口

可以使用 Kerberos GSS-API 实现的两个重要功能是身份验证和消息加密。下面是有助于实现这两个功能的重要接口:

gss_init_sec_context(...)
在上下文发起者和上下文接受者之间建立安全上下文。
gss_accept_sec_context(...)
接受由上下文发起者创建的安全上下文。
gss_wrap(...)
执行加密签名,还可以执行消息加密。
gss_unwrap (...)
对用 gss_wrap 子例程加密的消息进行解密并检查嵌入的签名。

关于 GSS-API 的更多信息,请参见产品附带的 IBM Network Authentication Service Version 1.4 Application Development Reference。

使用 GSS-API 和 OTP 设计双因素身份验证系统

图 1 给出一个为 Kerberos 服务器系统配置的使用 Kerberos 的客户机。客户机和服务器都是 AIX 计算机,都安装和配置了 IBM Network Authentication Service。

图 1. 使用 GSS-API 和 OTP 实现双因素身份验证系统的设计步骤
使用 GSS-API 和 OTP 实现双因素身份验证系统的设计

下面解释使用标准 Kerberos GSS-API 实现使用 OTP 的双因素身份验证登录模块的步骤。

步骤 1 —— 提示用户输入 Kerberos 用户名和 Kerberos 密码。

步骤 2、3、4、5、6、7 —— 使用 Kerberos 用户名和对应的 Kerberos 密码(用户在脑子里记住的信息)获得 Kerberos 凭证 (TGT-Ticket Granting Ticket)。如果输入的密码不正确,那么身份验证失败,不允许用户进行任何访问。如果成功地获得了 Kerberos 票据 (TGT),第一因素身份验证就完成了。这与基于 Kerberos 身份验证的常规登录模块相似。

步骤 9、10、11 —— 使用前面获得的 Kerberos 凭证和驻留在系统上的基于 GSS-API 的 OTP 应用服务器建立一个 GSS-API 安全上下文(假设这个 OTP 服务器已经通过 GSS-API 启用了 Kerberos)。这涉及客户机登录模块和基于 GSS-API 的一次性密码应用服务器的握手过程。注意,这里的登录模块和 OTP 应用服务器都是使用 Kerberos 机制的基于 GSS-API 的应用程序。此握手过程在客户端执行 gss_init_sec_context() 和相关的 API,在服务器端执行 gss_accept_sec_context() 和相关的 API。成功地完成握手,就会通过底层的 Kerberos 安全机制建立一个已经经过身份验证的 GSS-API 安全上下文。这个上下文帮助客户机登录模块和基于 GSS-API 的服务器安全地相互通信。如果握手失败,登录程序就会终止。

步骤 12 —— 输入一次性密码。OTP 是用户拥有的身份验证信息(这与前面的 Kerberos 密码不同,用户需要记住 Kerberos 密码)。

步骤 13、14 —— 使用前面建立的 GSS-API 上下文对用户名和一次性密码进行加密,并把加密的信息发送给服务器。gss_wrap() 等 GSS-API 接口有助于信息加密,加密的信息只能由基于 GSS-API 的 OTP 服务器应用程序解密。

步骤 15、16 —— 基于 GSS-API 的 OTP 服务器应用程序解密信息,并向实际的 OTP 服务器提供用户名和一次性密码(使用前面建立的 GSS-API 安全上下文,gss_unwrap() 等接口有助于信息解密)。根据服务器数据库检查用户名和一次性密码,把检查结果(成功或失败)传递回基于 GSS-API 的 OTP 服务器应用程序。

步骤 17、18 —— 基于 GSS-API 的 OTP 服务器应用程序加密身份验证结果,把它发送回客户机登录模块/应用程序。

步骤 19 —— 客户机登录模块/应用程序解密并解释此结果。(使用前面建立的 GSS-API 安全上下文,gss_unwrap() 等接口有助于信息解密)。如果结果是成功,第二因素身份验证就完成了,允许用户登录进系统。否则,客户机登录程序终止,清除客户端和服务器端的 GSS-API 上下文。

注意:这些步骤并没有完全在 Kerberos 协议中引入双因素身份验证。如果需要双因素身份验证,第一因素需要采用常规的 Kerberos 身份验证,第二因素需要采用 OTP,那么可以实现这些步骤;或者在应用程序或安全系统的登录模块中实现它们。

结束语

本文主要讨论 GSS-API 和 Kerberos 的使用。此外,还强调了多因素身份验证系统的需求不断增长,以及如何在这种系统中使用 OTP。最后,解释了使用 Kerberos 和 OTP 实现双因素身份验证的步骤。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX
ArticleID=362593
ArticleTitle=用 Kerberos 为 AIX 实现双因素身份验证
publish-date=01082009