星期二, 二月 24, 2004

保护系统安全:一个识别用户的三向解决方案

保护系统安全:一个识别用户的三向解决方案
系统安全问题是由发现通讯连接另一端的用户身份开始的。在本文中, Joseph Sinclair 讨论了三种常见的识别用户的方法,突出了它们的长处和短处(各自的及合并的),并分别提供了一些示例。
砰,砰,砰,“谁在那儿?”

这是一个在所有安全行为中占核心地位的简单问题。对于要求访问您敏感而珍贵的数据的用户,不确定他们的身份就无法让您放心。系统的安全性是以建立那种信任的系统能力为依据的。

如何确定信任谁?由于世界上确有不道德的人存在,您又如何确定发出请求的人是否如他们自己所说的那样呢?

跟着我们来讨论三种确定用户身份的方法吧 -- 其中两种是老的(在计算机业术语中)、“可信赖的”朋友,另外一个则建立在新技术的基础上。

Java 身份认证与授权服务
Java 平台的以用户为中心的安全措施与 Java 身份认证与授权服务 API(JAAS) 是同时推出的。使用 Java 技术创建有效的身份认证系统是从这个重要的 API 开始的。

JAAS 提供了一个服务统一接口,其方式与 JMS 为消息传递服务提供统一 API 的方式或 JDBC 为各种数据库驱动器提供统一 API 的方式相同。由于 JAAS 是一个 API,各种服务供应商能自由地使用任何可用技术来执行那个 API。

JAAS 是一个可插入、可叠放的 API,这意味着在系统配置期间能够添加、组合和修改身份认证服务,而无须在系统执行期间实行硬件编码。这一方法允许系统的身份认证架构根据需要进行修改和完善,并不用对系统的身份认证架构进行内部重建或修改。因此,如果分析表明系统需要加强安全措施,那么知识性问题将被提升为所有权问题,而它还能进一步提升为特性问题。但这一切只在必要时,且必要性变得明显的时候才实施。

除了身份认证 API 以外, JAAS 还提供了一个授权 API。 JAAS 通过使用户(JAAS 说法称作为“主体”)保留一个或多个身份的方法提供授权支持,其中的每个身份都能列在资源的访问控制表 (ACL) 中。这样,系统就能检查主体的身份以及资源的 ACL 了。如果找到匹配信息,就允许指定的访问。如果未能找到匹配信息,就能拒绝访问。

JAAS 还通过证书接口提供了单独注册能力。证书可能含有多种附加信息对象,包括代表性的安全上下文信息或诸如 Kerberos 或 Public Key Infrastructures 等外部系统的访问证书。证书允许用户通过 JAAS 供应者得到身份认证,并同时得到访问多种企业资源的身份认证。

我强烈建议任何企业级的 Java 开发人员研究一下完整的 JAAS 规范(请参阅参考资料)并发掘那些已经在他们厂商的平台上的可用解决方案。对应用程序安全使用 JAAS 接口能显著减小实现有效安全层所需的努力,并同时增加系统的安全性。

建立身份
乍看起来,建立一个请求者的身份非常简单。它是建立在回答以下三个基本问题中的一个或几个的基础上的:

您知道些什么?知识是进入安全系统中的传统密匙。普遍存在的用户名和密码提示是最为普通的身份问题;即使是计算机间通讯时,通常也是从验证一些对以前达成共识信息的知识开始的。这个身份识别的 密码短语方法远比计算机历史久远 -- 它是身份识别的“社会”方法。


您有些什么?较低级的密匙,从古时候起就是安全措施的基础,是一种 所有权问题的形式。任何人拥有钥匙的人都能打开那个锁。现在, ATM 机和信用卡也实现了类似的目的。这是身份识别的“物质”方法。(这个问题从简单的身份识别扩展延伸到了几个其他的安全领域。)


您的特性是什么?一般来说,用相对不变的物理特性作为标识符( 生物测定学)是最古老的标识符形式;它来自于语言前的社会。举例说明:在新生儿学会说话以前(或甚至在学会集中视线或理解所有权的概念之前),它就能通过声音来认出母亲了 -- 这是个身份识别的“生物”方法。在技术方面,生物测定学是种相对新型的身份识别的方法。尽管,要使其便于运用需做大量工作,因为它可能是身份识别最可靠的途径了 -- 要改变或伪造物理特性异常困难。
在所有繁多的形式与格式中,这三个问题能协助您检验人们的身份是否达到了所期望的任何级别的可信度。特定的问题或者提出的问题和询问的方式决定了骗过系统的难度以及辨别身份的可靠性。

让我们来仔细研究每个问题。

密码是…
口令、暗示、暗号和密码。所有这些都用来回答:“您知道些什么?”由于这个问题必须公开,因此使得它最常与安全联系起来。

在共享知识的基础上用许多方式向用户询问:

最普通的方法就是让用户重复共享内容,无论是一个口令、一个秘密短语还是其他某些隐藏的信息。


接下来最常用的方法是不应答不含有秘密知识的任何请求。


另一个方法是让受保护的实体本身的存在成为共享的机密。
这些问题中的每一个都有自己的长处和缺点;在不同情况下,每个都可能是适用的。

简单询问
对用户的简单询问是知识性询问的最常用方法。它的简单和显而易见保证了没有人会试图访问受保护的实体,而不知道它确实是受限制的;它同时减轻了创建和维护系统的工作人员的负担。

这种方法并不能很好地抵御攻击。别有用心的用户能监视通讯过程,以期捕获输入应答信息的其他用户,尝试任意应答直到起作用,或者用其他各种技术来猜测或获取合法的应答。

因此,在一个敏感的系统中,这决不应该作为唯一的身份识别方法。其他的身份识别方法,包括其他的知识性询问方法,应该用作二级认证。虽然普遍存在的口令提示是这种知识性询问的最好示例,但还有其他选项,包括一些在安全系统之间的 Diffie-Hellman 密钥一致排序期间提出的问题。

拒绝应答
拒绝应答任何不包含共享机密的请求是建立知识性询问的另一种常用方法。这种办法牵涉到预先建立请求的格式、来源和/或目标,或一些其它的特性。

如果收到的请求不符合期望的特征,则可以忽略、拒绝,或重新发送要求。商家对商家的交易经常采用这种方法,因为他们各自都能建立稳定的源 IP,并商定固定的和模糊的格式(对人来说是模糊的)。

然而虽说这是个相当有效的知识性询问方式,它仍有一个致命弱点。一旦共享机密被攻击者推断出来,安全漏洞就格外地难以察觉。

秘密信号交换的使用 -- 秘密社团中常用的方式 -- 是此类询问中的一个示例。另一个示例是在许多 B2B 系统中使用受限制的源地址。

隐藏存在物
隐藏受保护实体的存在,通常称为模糊安全法,在物理领域十分常用。此方法建立在这样的基础上,即您若不知道有某样东西的存在就很难找到它。

这是一项有效的技术,然而单有此项技术几乎是不够的。谨慎的设计人员至少要在允许访问受保护的实体前添加一项身份检查,以防止有人无意地进入。在电子系统中,附加的身份识别更为重要,因为 使用自动搜索工具寻找以前的未知区域相对更为常用。

Java 平台上的知识性询问
Java 平台为知识性询问提供了一些有趣的支持,同时也提供了一些有趣的询问。

所提供的支持包括了各种各样的加密功能,这些功能既能产生高度复杂的共享机密,又能在传输中保护那些机密。通过 JNDI API 能获得附加的支持(请参阅参考资料)。该 API 提供了对目录服务的访问权,目录服务是为知识性询问存放共享机密的最有效的地方。

Java 平台也为依赖知识性询问的系统提供了一些问题: Jini 网络倡议(请参阅参考资料)为自动发现网络上的系统提供设备;可移动代码的出现为未遂的窃贼提供了更多的途径;并且大范围的 Java 平台为设备添加了 10 年前难以想象的智能。

所有的这些能力,在解决了以前无法处理的难题的同时也使得阻止攻击者获得共享机密变得更为困难了。

“社会”安全性的总结
知识性询问的每种方法都有长处和短处。而所有的都有着某种共同特性。

知识很难强制性获得,通常需要额外的时间和资源来获得不知道的东西。知识很容易共享 -- 及改变;如果秘密被泄漏了,就能很快加以改变以防止更严重的漏洞出现。

知识性询问的最大弱点是知识容易被复制。机密会在漏洞不为人知、且不损害任何人的情况下被攻击者获取。在这种情况下,攻击者可能在一段时期内访问系统而并不为人所察觉。知识性询问还特别容易受人为因素影响,这些人为因素会大大降低系统安全性。

由于以上原因,我建议对于任何有重要价值的系统都至少采取一个附加的身份识别方法。在这种情况下最简单、最常用的方法是向用户询问有关他所拥有的东西。

插入锁孔,转动
钥匙、身份证件、信用卡 -- 所有这些物体都能用来回答这样一个问题“您有些什么?”

知识性询问既巧妙又有效,但它们受到一些严重缺点的困扰。标记询问能有效地弥补这些问题。

标记询问的定义特征是拥有某些物理对象。最常用的标记是一个简单密匙。

密匙的构造设计使得任何特定的锁对于正确密匙以外的密匙几乎不可能作出应答。这是个要点 -- 标记询问是一项可能性练习。您必须在标记的成本和复杂性与标记被复制或与其他非法标记相匹配的复杂性中作出平衡。

现在有多种可用的标记,但其中的每一个标记都在一到二个规则上运行 -- 基本储存或活动应答.

基本标记
基本标记 -- 也叫做哑标记 -- 是最常用的标记类型之一。从门钥匙到信用卡的所有东西都被归入这个类别。它们的核心属性就是都简单地以某种形式编码数据。

密匙用脊或齿的模式编码数据;信用卡将它编码在磁条上。这种简易性非常有价值,因为它使得这些标记变得便宜(通常远低于 1 美元),这将它们稳固地安置在了大众市场领域。由于基本标记仅编码数据,所以另一方面,他们易受赝品和回避技术的影响。

对于一个技术熟练的专业人员来说,除了最复杂的锁,要避开其他锁都是件简单的事,而一旦知道了信用卡的帐号,要进入就更容易了。您若需要防止这类的滥用,就需要更为坚固的标记。

活动标记
活动标记 -- 又叫做智能标记 -- 比基本标记要复杂得多。活动标记集成了一些内嵌智能形式。它们更难仿造,并且比基本标记更难以避开。

智能标记能通过经常改变一些所提供的无用价值(通常称为nonce)来验证其合法性,这样虽然不易于复制,但便于检验。

密码智能卡,公共密匙基本设备中常用的东西,能通过对 nonce 作数字签名的方法来达到目的。这使得受保护的系统能验证该标记是否其声称的那个实体。由于活动标记常利用极其独特的内部特性来修改 nonce -- 且由于多数活动标记在其封装的完整性受损失会自毁 -- 因此活动标记很难伪造。

由于活动标记时常变换 nonce,所以也极难避开,特别是当 nonce 随着每个询问变化时。这个难以避开的特点也就是为什么如今的一些豪华型汽车把活动标记作为点火开关的内嵌程序以防车贼。如果点火开关无法得到发动机计算机的正确身份识别,发动机就不会运转。

活动标记的一个有趣的特性就是它们能永久性地安装在服务器中。只要这样的一个标记安装完毕,它就能利用其辨认人们身份的有用功能一样来在商家对商家的交易中区别此系统与其它系统。

Java 平台上的所有权询问
Java 平台或许比其他平台提供了更多对所有权询问的支持。这种支持的最重要部分体现在 JavaCard 的规范中。

JavaCard 规范描述了一个智能卡中的 Java 技术平台。这种对智能卡的完全支持使得 Java 开发者们能够将相同熟悉平台中大多数可用的有效标记作为其企业应用程序来使用。

从 Java 平台得到的更多支持是由 Java 加密系统扩展版 (JCE) 、开放卡结构中的 Java 技术以及 Jini 网络科技(请参阅参考资料)提供的,用来支持卡设备的自动发现。所有主要读卡机生产厂商,连同多数智能卡生产厂商都提供对 Java 平台和 JavaCard 技术(请参阅参考资料)的支持。提供如此广泛支持的原因是 JavaCard 技术的强大功能和多应用程序灵活性以及它在保护高危险性系统中的相应优点。

“物质”安全性的总结
所有的标记询问都有一个主要问题。它们只检验用户是否拥有相关的标记。因为一个别有用心的用户完全有可能获得另一个用户的标记,因此仍有可能认错用户。

这个问题由于活动标记防止伪造或复制的特性以及时常加入的知识性询问而得到一定的缓解,但是,问题还是存在的。

如能保证拥有标记的个人事实上就标记所分配的那个唯一的个体,那么这将是个不同凡响的安全措施。 ID 卡、美国驾驶执照和一部分信用卡用照片来实现这项功能。

尽管,计算机需要的不只是一张照片,新型的生物测定学还是提供了一个解决方案。

显示出来!
指纹、声纹、虹膜样式、脸部几何形状、视网膜扫描 -- 所有这些都是回答“您的特性是什么?”的方法。

生物测定学是测量个体独特的物理特性的科学。这些技术为实现梦寐以求的安全水平带来了希望 -- 一个比人们互相辨认更为准确的计算机系统。这个理想状态尚未实现,但如今可用的系统能利用物理特性询问戏剧性地增强安全性。

从生物到数字
进行物理特性询问有不同的方法,但所有这些询问的共同思路都是将原始的测量 -- 常为脸部图像、指纹的纹路、视网膜中的毛细血管向量 -- 简化为数字模板。然后系统就试图在储存着的模板中寻找与请求者相匹配的模板,直到找到匹配模板或者所有模板都检查完毕。

平衡行为
每个生物测量系统都具有两种有关无法拒绝冒名者及无法辨认用户的可能性概率。这些被称为 误接受率 (FAR) 和 误拒绝率 (FRR) 的特征必须得到平衡,以满足解决方案的可用性和安全性需要。

误接受率说明了系统错误认出某人并允许其以不同身份进行访问的发生频率。误拒绝率说明了系统无法辨认用户并拒绝有合法访问系统权利的用户进入的发生频率。

许多系统允许这两项值的平衡,两者相对。通过调整系统相对内部储存的模板进行检查的仔细程度, FAR 能有所减少,同时 FRR 会有相应的增加;或者 FAR 有所增加以减少 FRR 的发生。该调整系统灵敏度的能力非常重要,因为 FRR 比例高会降低系统的可用性;而 FAR 的比例高会降低安全性。如果 FRR 和 FAR 不够,那么唯一的选择通常是挑选一个其它特性。

正确的生物测定学
信不信由你,一度被认为独特的生物特性可能并不独特。每个特性都会在一定人数内发生一定程度的重现。

相对更为独特的生物测定学之一为脸部的几何形状。然而,大多数人曾经发现有两个人的脸部非常相似,以至于很难区分他们;能构成人脸的构造方式是有限的。

每个个体的特性对于一定数量的人来说可能是相同的。据了解,一个人的指纹在每 100,000 人里是独特的。虹膜的式样可能在每 1 千万人里是独特的。

在选择生物测定学作为系统安全标准时,必须把实际特性的独特性考虑在内。

特性询问中的 Java 技术
在特性询问中明显没有用到 Java 技术。生物测量技术相对新、并且未经试验的特性正是一部分原因所在。另一个原因是生物测量技术供应商尚需确定一个与生物测量技术硬件实现互动的标准方法,这在 Java 平台提供一个语言接口以前是十分必要的。

这种情况下有着一线亮光,这就是,许多供应商提供了一套以最小的困难实现与其设备交互的 Java 种类,那些设备允许创建用于 Java 应用程序的生物测定学身份认证服务。

“生物”安全性的总结
特性询问通常被视为三种主要身份识别的方法中最准确、最可靠的方法。但它们并不是完美的。如果您看到过这样的间谍片,片中的坏蛋(也有时是好人)为了骗过安全系统而砍下一只手或剜出一只眼睛的话,您就会同意生物测定学系统也会受骗。(事实上,有些指纹系统用一张高质量的照片就能骗过。)

所以,建议安全系统设计人员在使用任何安全措施时都能考虑在成本、人为因素和系统操作允许的情况下尽可能多地运用附加询问。

如果用户不是人
我曾关注过每个询问的类型,通常都假设需要身份识别的用户是人,而不是其它计算机系统。情况不总是这样的。

计算机同样可以通过不安全的链接同其他计算机进行通讯。当辨认其它计算机系统时,使用强大的安全措施的自由度相对较大,因为人的因素被排除了。

计算机系统能够:

记忆知识性询问的最复杂答案
具有永久安装的、格外复杂的活动标记
拥有能通过某种网络连接测试到的独特物理特性



这些独特特性可以包括网络收发器的相位频率特性或它们内部晶体振荡器的频率变化。(并且,尽管这些特性听起来非常严格,每个特性在用来对人们身份识别时都具有相同的优势和弱点。)

对计算机系统进行身份认证时的最大优势是,系统个数不多意味着您能使用更为复杂的技术而不必为单位成本作太多考虑。

另一个优势就是计算机永远都不会抱怨其可用性,因此能没有顾虑地提出多个问题,还能调整特征询问,将 FAR 最大化而不用害怕因此产生的高 FRR 会导致用户停止使用该系统。

三者一致
在处理高危险性系统时,单个身份询问或单个询问类型通常都不够安全。如果系统对安全性的需要超过了单个询问类型所能提供的安全性,就有必要使用多种询问。图 1 对各种安全措施进行了排列。

图 1. 所有方法由优到劣的排列


两个最常用的多询问双重保护都含有知识性询问 -- 使用了特性询问和标记询问。(为什么知识因素会成为普遍思路?很简单 -- 无论开展、执行还是使用都最为方便。)这两项结合确实改进了系统安全,然而它们仍不是最安全的。

最安全的结合是使用所有三种询问。其次的就是将标记和特性询问结合起来,它需将特性储存在活动标记中并使标记在进行进入安全系统的身份认证前先验证特性;在对身份认证询问的应答中加入内部生物测定学模板能使其更为安全。用一个标记来对生物测定学进行身份认证在如今的活动标记中仍未成为可能,但它在未来的 2 代产品中会逐渐成为可能。

最后的(关键)字
有些用户无法为所有的询问类型提供答案。如果让您的系统供尽可能多的合法用户访问很重要的话,那么使用多个询问而只需答对一个问题的方法也就很重要。

例如,有人因没有手指而无法回答指纹询问。对于这些人来说,明智的做法是允许进行标记询问,这样他们仍旧能够使用此系统。有些用户因为如受伤或年轻的原因无法记住太复杂的共享机密。对于这些用户来说,特性或标记询问就能使他们不用记忆复杂的共享机密而同样能使用该系统。

关键的概念是设计者必须考虑到那些无法使用经选择的系统的人,然后决定究竟是系统的安全重要还是那些人访问系统的需要重要,或者是否需要为他们建立另一种询问类型。

使用 Java 2 平台的身份认证
Java 2 平台为访问各种可用的身份识别的方法提供了最为全面一套 API。 Java 平台更为和各种身份认证系统的交互提供了一个服务 API,即 Java 身份认证和授权服务 (JAAS) API。用这个 API,您能作为服务供应商执行高安全性的身份认证,并允许 JAAS 为希望使用那种身份认证方法的应用程序提供通用接口。

Java 密码系统扩充版提供了许多方法以便使用知识性询问在产生共享机密的同时降低那些机密为攻击者所获取的机率。

JavaCard 标准版提供了 API 以及一个特别为在活动标记中运行所设计的环境,同时使设计人员能在一个活动标记中为多安全系统同时提供身份辨认、信息和其他各种服务。

它们还不是些支持特性询问的 API,但大多数生物测定学供应商提供 Java 语言接口。