一、认证因素(Authentication factors)
一旦我们向一个系统表明了自己的身份,接下来就必须证明它。这就是认证发挥作用的地方。数字系统提供了许多不同的认证技术,使用户能够证明他们的身份。我们将看一下三种不同的认证因素:
- Something you know:第一个认证因素是”你知道的东西“,这最常见的认证因素。通常情况下,基于认知(Knowledge-based)的认证是以密码的形式出现的,用户在认证过程中记住并输入到系统中。用户应该选择由尽可能多的字符组成的强密码,他们应该结合多个类别的字符,如大写字母和小写字母、数字和符号。创建一个强密码的最好方法之一是实际使用口令来代替,例如:
这就给了我们一个强大的复杂密码,既容易记住又很难猜到。Password Keys是另一种基于认知的认证形式。Password Keys是秘密的加密钥匙,用于管理对系统的访问; - Something you are:第二个认证因素是“你是什么”。生物识别技术测量你的一个身体特征,如指纹、眼纹、面部或声音;
- Something you have,第三个认证因素,即“你拥有的东西”,要求用户实际拥有一个设备,如智能手机认证令牌。
除了这三个因素外,人们还使用其他认证技术。这些被称为认证属性的方法通常被认为是比三个主要认证因素更弱的认证形式,它们只应与至少一个主要认证因素结合使用。这些属性包括
- Somewhere you are:你所在的地方,如办公楼;
- Something you can do:你能做的事情;
- Something you exhibit:你表现出来的东西,如人格特质;
- Some one you know:你认识的人,如为你的身份作担保的同事。
一个重要的说明,如上提到的四个认证属性,即你所在的地方、你能做的事情、你表现出来的东西和你认识的人,通常不被认为是网络安全界知识体系的一部分。这些认证因素中的每一个所使用的技术的强度都可以通过它所产生的错误数量来衡量。在认证系统中,有两种基本类型的错误:
- 当系统错误地将一个人识别为授权用户,并授予应该被拒绝的访问权时,就会出现错误的接受错误(False Acceptance)。这是一个非常严重的错误,因为它允许对系统、设备、信息或设施进行未经授权的访问。这些错误的频率是由错误接受率(False acceptance rate),或FAR来衡量的。
- 当一个被授权的人试图进入一个被错误地拒绝访问的系统时,就会发生错误的拒绝错误(False Rejection)。这不像错误接受那样严重,因为它不会危及保密性或完整性,但它仍然是一个严重的错误,因为它危及资源的合法可用性。这些错误的频率是由错误拒绝率(False rejection rate)或FRR来衡量的。
错误接受率和错误拒绝率本身并不是衡量认证因素强度的好办法,因为它们可能很容易被操纵。在一个极端,管理员可能会把系统配置成根本不接受任何人,从而使其具有完美的错误接受率,但也具有非常高的错误拒绝率。同样,如果系统允许任何人进入,它就有一个完美的虚假拒绝率,但虚假接受率却高得令人难以接受。解决这个问题的方法是使用一种平衡的强度测量,称为交叉错误率(Crossover Error Rate)或CER。这是当管理员将系统调整为具有相等的错误接受率和错误拒绝率时出现的情况。
二、多因素认证(Multifactor authentication)
上述提到的三个主要的公认的认证因素是”你知道的东西“,如密码;”你是谁“,如指纹和”你拥有的东西“,如智能手机。当单独使用时,这些技术中的任何一个都能为系统提供一些安全性。然而,它们都有各自的缺点。例如,攻击者可能通过网络钓鱼攻击窃取用户的密码。
一旦他们得到密码,他们就可以用这个密码来冒充用户的身份。其他认证因素也不是万无一失的。如果我们使用智能卡认证来实现你拥有的东西,用户可能会丢失智能卡。碰到它的人就可能用它来冒充用户。
解决这个问题的方法是结合多种因素的认证技术,比如把”你知道的东西“和”你拥有的东西“结合起来。就拿我们刚才讨论的两种技术来说,密码和智能卡。当单独使用时,任何一个都会受到黑客的攻击,要么获得密码的知识,要么窃取智能卡。然而,如果一个认证系统同时需要密码(你知道的东西)和智能卡(你拥有的东西),它就会带来额外的安全性。
如果黑客偷了密码,他们就没有所需的智能卡,反之亦然。攻击者会变得更难获得账户的访问权,因为我们知道的东西和我们拥有的东西是不同的因素,这是一个多因素认证的例子。我们也可以结合其他因素。例如,一个指纹识别器,也就是“你的东西”,可能还需要输入一个“PIN码”,也就是你知道的东西。这也是多因素认证。
在评估多因素认证时,重要的是要记住,这些技术必须来自不同的因素。将密码和安全问题的答案结合起来的方法不是多因素认证,因为这里的两个因素都是“你知道的东西”。
三、你所拥有的东西(Something you have)
我们了解到组织如何通过结合两个不同类别的认证方法来实现多因素认证。最常见的方法是将”你知道的东西“,如密码或密码与”你拥有的东西(如物理令牌)"结合起来。让我们来谈谈如何在用户拥有的东西(Something you have) 的基础上实现认证。
-
传统的方式,企业使用像这样的物理令牌(Physical tokens) 来实现所拥有的认证。当需要认证时,用户首先提供一个用户名和密码,以满足 "你知道"的标准。
然后系统提示用户提供一个认证码。用户掏出他们的令牌并按下按钮。然后,令牌显示一个代码,用户将其输入系统,证明令牌的实际所有权,并完成认证程序。但是,为数以千计的用户提供物理令牌会让成本会迅速增加,而且用户根本不喜欢一直带着令牌的负担。 -
智能手机的迅速普及导致了软令牌(Soft tokens) 技术的采用,它已经迅速取代了许多组织对物理令牌的使用。软令牌只是在用户智能手机上运行的应用程序,它产生一系列不断变化的代码。当认证系统提示用户从令牌中输入代码时,用户只需打开应用程序并读出当前的代码。
硬件和软件令牌上提供的代码,被称为一次性密码或OTPs。有两种不同的协议用于生成这些代码:
- 基于HMAC的一次性密码算法(HOTP),使用一个共享秘密和一个递增的计数器来生成显示在令牌上的代码。每当按钮被按下时,代码就会改变,代码在被使用之前一直有效。
- 基于时间的一次性密码(TOTP),使用一天中的时间与一个共享的秘密相结合。这意味着密码不断变化,只在令牌生成下一个密码之前有效。令牌和认证系统必须有同步的时钟才能使TOTP正常运行。谷歌认证器的软令牌使用TOTP。
一些认证系统依靠使用短信和电话来实现你的因素。我们应该小心这些方法,因为安全专家通常认为它们并不安全。由于电话号码容易移动,特别是对于VoIP设备来说,这些技术容易受到攻击。用户认为方便的另一种方法是智能手机应用程序,它不生成密码,而是使用推送通知。当用户试图登录另一台设备时,智能手机应用程序会弹出一个通知,要求用户确认登录。这与使用基于密码的应用程序的安全性相同,但对用户来说要容易得多。最后,许多多因素认证系统,为用户提供了生成静态备份代码的机会,以便在他们失去对多因素设备或令牌的访问时使用。这种方法是危险的,因为它基本上把我们拥有的认证因素减少到"你知道的东西"。如果允许用户生成静态代码,就应该让他们意识到保护这些代码的重要性。另一种提供 "你有的东西 "认证的方法是通过使用智能卡,它包含嵌入式微芯片。将传统的基于知识的认证与“你所拥有的”因素相结合,会大大降低了账户被破坏的风险。
四、PAP与CHAP
许多访问控制系统依靠基于密码的机制来实现"你知道的东西(Something you know) ",即安全性。密码安全最常见的应用之一是保护虚拟专用网络(V-P-N)和其他远程访问技术。如下是我们用来实现远程访问密码安全性的协议。
1.PAP
密码认证协议或PAP是这些协议中最早的一种。在这个协议中,客户希望对服务器进行认证,客户和服务器都知道用户的密码。客户端只需将用户名和密码传送给服务器,服务器就会验证密码。这是最简单的方法,并且成功地实现了密码认证,但这种方法有一个重大缺陷。PAP不使用任何加密技术来保护通信。任何能够窃听连接的人都可以从网络上读取用户名和密码。由于这个原因,除非是在传输被其他方式加密的情况下,否则绝对不应该使用PAP。
2.CHAP
挑战握手认证协议(CHAP)是PAP的一个安全替代方案,它通过一个更安全的机制实现了同样的目标。在CHAP中,客户和服务器都事先知道一个共享秘密(Shared secret)。两者都不想在网络上传输该秘密,因为这将危及系统的安全。相反,他们通过一个过程,向对方证明他们都知道这个秘密,而没有在网络上实际交换秘密值。以下是其工作原理:
一旦他们建立了链接,服务器就向客户端发送一个随机值。这就是所谓的挑战值。当客户端收到挑战值时,它将挑战值与秘密值结合起来,并计算出这两个值的加密哈希值。
然后,客户端将哈希值传回给服务器,这被称为响应。服务器收到响应并将其存储在内存中,然后通过使用相同的哈希函数对发送给客户端的挑战和他们都知道的共享秘密计算自己的哈希值。然后,服务器将计算出的响应与它从客户端收到的响应进行比较。如果这两个值相符,服务器就知道客户的秘密与它的秘密相同,它就会验证客户,而不必在网络上发送真实的密码。
CHAP是一个比PAP更安全的选择。目前,微软创建了他们自己的CHAP协议版本,并将其称为MS-CHAP,即微软CHAP。他们后来又发布了该协议的第二个版本,称为MS-CHAPv2。值得注意的是,这两个版本的MS-CHAP都已经被破解,现在被认为是不安全的。
五、单点登录和联合(Single sign-on and federation)
身份识别和认证对终端用户来说是一个恼人的过程,对组织来说也很难管理。联合(federation)和单点登录(Single sign-on,或SSO) 的技术试图减少一些这种负担:
-
联合身份管理利用了这样一个事实,即一个人可能在各种各样的系统中拥有账户。当组织同意联合他们的身份管理系统时,他们就会在各系统中共享一些信息。这就减少了用户必须拥有的个人身份的数量,减轻了用户和组织的负担。我们可能已经熟悉一些联合身份管理系统了。当你使用你的谷歌账户、Wechat、或QQ账户登录网站时,就在使用联合身份管理。
-
单点登录则更进一步,在各系统间共享认证会话。许多组织在其组织内创建了单点登录解决方案,以帮助用户避免重复认证的负担。在单点登录方法中,用户登录到他们遇到的第一个支持单点登录的系统。然后,这个登录会话在其他系统中持续存在,直到它的有效期。如果组织将过期时间设置为一个工作日的长度,这意味着用户每天只需要登录一次,他们的单点登录将持续整整一天。
高等教育界对联合身份管理有很大的需求,因为教师和学生经常在不同机构之间流动和工作。不同认证领域之间的信任关系是以其方向(Drection) 和传递性(Transitivity) 来描述的。
-
信任可以是单向的也可以是双向的。如果存在从域一到域二的单向信任,域一将信任来自域二的认证会话,但域二不会信任来自域一的会话。如果信任关系是双向的,域一和域二将相互信任。域信任的第二个属性是它的传递性。
-
信任可以是传递性的,也可以是非传递性的。在传递性信任中,信任关系在域之间转移。例如,如果域一与域二有一个传递性信任,域二与域三有一个传递性信任,那么域一和域三也会有一个信任关系,而不需要管理员明确创建该信任。另一方面,在非传递性信任中,信任关系将不会被自动推断出来。域一不会信任域三,除非管理员明确地创建这种信任。
六、RADIUS 与 TACACS
一个组织要有一个集中的网络和应用认证、授权和计费方法,这也是最常见的访问控制需求之一。RADIUS和TACACS协议为企业提供这种服务。
1. RADIUS
RADIUS是一个缩写,代表远程访问拨入用户服务(Remote Access Dial-In User Service)。顾名思义,早在 1980 年代和 1990 年代,RADIUS 就首次用于对基于调制解调器的孤岛服务的用户进行身份验证。一个集中的RADIUS服务器可以支持分布在全国各地的调制解调器池,为密码和账户管理提供一个单一的管理点,并在一个集中的位置整合会计记录。尽管拨入式调制解调器池已成为过去,RADIUS今天仍在使用。今天,它们被用来允许许多不同的应用程序依赖同一个认证源。例如,我们它在无线网络中是如何工作的:首先,终端用户试图连接到一个无线接入点。接入点在RADIUS请求中充当客户端,将认证请求传递给RADIUS服务器。然后,RADIUS服务器与外部认证源(如活动目录或LDAP服务器)检查,以确定用户的密码是否正确。
如果密码正确,RADIUS服务器就会向无线接入点发送一个访问许可信息,允许用户进入网络。
如果密码不正确,RADIUS服务器就会向无线接入点发送一个访问拒绝消息,拒绝用户访问网络。
在这个例子中,我们谈到了密码,但RADIUS也可以支持其他认证因素。我们要确保理解RADIUS客户端和RADIUS服务器的概念。当从应用的角度来看,RADIUS客户端实际上可能是一个应用服务器。在我们的无线网络的例子中,终端用户是无线客户端,但无线网络本身是执行RADIUS认证的主体。所以接入点就是RADIUS客户端(Wireless Access Point)。RADIUS确实有几个缺点。首先,它使用UDP,这降低了其可靠性。第二,虽然它确实为密码提供了加密保护,但RADIUS连接中发送的大部分数据都是未加密的,需要使用额外的安全措施。
2.TACAS
TACAS,终端访问控制器访问控制系统(Terminal Access Controller Access Control System)是RADIUS的一个替代方案,执行类似的功能,最早开发于1980年代。有两个早期版本的TACACS今天很少使用。最初的TACACS协议也使用UDP,现在很少在系统中出现。思科后来发布了他们自己的TACACS专有版本,即扩展的TACACS或XTACACS协议,它今天也很少使用。目前的TACACS标准是由思科开发的TACACs+协议,是一个专有标准。TACACS+的功能与RADIUS类似,但有两个改进:
- 首先,它使用面向连接和可靠的传输控制协议TCP,而不是不太可靠的UDP;
- 第二,它对认证会话进行完全加密。
七、Kerberos 与 LDAP
1.Kerberos
Kerberos访问控制系统被广泛用于在Linux和Windows平台上实现认证和授权。它是微软活动目录的核心协议之一。Kerberos是一个基于票据(ticket-base)的认证系统,它允许用户对一个集中式服务进行认证,然后使用该认证过程中的票据来获得对支持Kerberos认证的分布式系统的访问。以下是Kerberos的工作方式:
- 一个终端用户想获得对支持 Kerberos 的服务的访问。我们有时将其称为 Kerberized 服务。首先,终端用户在他们的系统上使用一个 Kerberos 客户端来提供一个用户名和密码。然后客户端创建一个明确的文本认证请求,并将其发送给一个认证服务器。认证服务器在其数据库中查找用户并检索用户的密码。它向客户端发送两个信息。第一条是一个随机生成的会话密钥,用于客户端和票据授予服务器(Ticket-granting server或TGS)之间的未来通信。这个消息是用客户的密码加密的。第二条是一张赠票,包括客户的信息和客户端TGS会话密钥的副本。这条信息是用一个只有TGS知道的密钥来加密的。当客户端收到这些信息时,它首先使用用户的密码解密第一条信息。这使它能够获得客户端TGS会话密钥。如果用户没有输入正确的密码,这个步骤就不会成功。
- 接下来,当一个客户希望访问一项服务时,客户端与TGS联系并发送两件事。首先,客户端发送一份赠票的副本和所请求服务的身份。第二,客户端发送一个认证器,包含客户的ID和当前时间,使用客户从认证服务器获得的客户TGS会话密钥对该认证器进行加密。
- TGS在收到这些信息时,首先对赠票进行解密,以检索客户TGS会话密钥。然后,TGS可以使用客户端TGS密钥来解密认证器,并检索客户端ID和时间戳。接着,TGS随机生成一个客户服务器会话密钥,客户将使用该密钥与所需服务进行通信。下一步,TGS向客户发送两个消息。第一个是客户端服务器票据,它使用服务的密钥进行加密,并包含随机生成的客户服务器会话密钥。第二条是客户端服务器会话密钥的副本,用客户TGS会话密钥加密。一旦客户端收到这两个消息,它就可以完成服务认证过程了。
- 客户端向服务发送两个消息。第一条是客户端从赠票服务器上收到的客户端服务器票。第二条是用客户服务器会话密钥加密的新认证器。服务器收到这两条信息,并解密第一条信息以检索客户服务器会话密钥。然后,它使用这个密钥来解密认证器,并验证客户,授予对服务的访问。
2.LDAP
轻量级目录访问协议(The Lightweight Directory Access Protocol),即LDAP,是访问控制的一个重要协议。LDAP允许网络上的服务以标准化的开放格式共享有关用户及其授权的信息。活动目录将LDAP与Kerberos结合使用。当Kerberos处理认证时,LDAP提供了查询存储在目录服务中的信息的方法。Kerberos使用TCP端口88。LDAP使用TCP 389端口进行未加密的通信,它也可以以加密的形式运行,即通过636端口的安全LDAP。
NT LAN Manager或NTLM,被广泛使用Kerberos之前,NTLM认证是微软认证的标准。NTLM使用一种基于哈希的挑战-回应认证机制,但它有两个严重的安全问题。首先,旧版本的NTLM使用弱的加密,不符合现代标准。其次,即使是当前版本的NTLM,即NTLM v2,也容易受到一种被称为 "哈希传递(Pass the hash) "的攻击,即攻击者使用一台机器的哈希凭证来获得对另一台机器的访问。今天,NTLM仍然被安装在许多系统上,以提供向后的兼容性,但这不是一个好主意,也不是一个安全的做法。微软建议禁用NTLM,我们应该遵循这一建议。
八、SAML
现代认证经常通过网络进行,安全断言标记语言(Security Assertion Markup Language或SAML)允许基于浏览器的单点登录跨越各种系统。在一个SAML请求中,有三个角色。
- 首先,是想要使用基于网络的服务的最终用户。在SAML语言中,终端用户被称为 "委托人(Principal)"。
- 其次,是提供身份证明(Identity)的组织。通常是终端用户的雇主、学校或其他账户提供者。这个组织被称为身份提供者。
- 最后,是终端用户希望访问的基于网络的服务。这个组织被称为服务提供者(Provider)。以下是基于网络的单点登录是如何使用SAML的。
首先,终端用户的委托人向服务提供商请求访问一个资源。服务提供者检查用户是否有一个登录的会话,如果有,就跳过并授予访问权。然而,让我们关注一下用户尚未登录的情况。在这种情况下,服务提供者将用户重定向到用户身份提供者的单点登录服务。
然后,用户试图使用用户名和密码或其他认证技术对身份提供者进行认证。这里的关键是,用户必须向身份提供者进行认证。
身份提供者然后创建一个为服务提供者定制的XHTML表格。用户必须使用这些信息来请求服务提供商提供所谓的安全断言(Security assertion)。该断言请求包括来自身份提供者的身份证明。
接着,服务提供者验证该请求,并与所需的服务创建一个安全上下文(Security context),并将用户重定向到该服务。然后,用户请求所需的资源,而资源服务通过授予访问权进行回应。
这种方法有两个好处:
- 首先,在用户向身份提供者认证一次后,该认证会话可以持续一段时间,由身份提供者指定。在这段时间内,用户不需要重新认证,提供了一个真正的单点登录体验;
- 其次,服务提供者可以使用身份提供者的认证,而不需要获得用户的密码,密码仍然是用户和身份提供者之间的共享秘密。
九、OAuth与OpenID连接
OAuth和OpenID Connect协议为网络提供了联合的单点登录体验。许多流行的网络服务使用这些协议来依赖身份提供者,包括LinkedIn、谷歌、Facebook、亚马逊和其他公司。
OAuth和OpenID Connect是相关的协议,有不同的目的。OAuth是一个授权协议。它本身并不执行认证。OAuth中的Auth是指授权。当我们使用OAuth时,我们会看到下图,帮助我们澄清一个服务访问另一个服务的权限。一定要仔细阅读这些信息,因为它们包含了关于我们所授予的授权的重要信息。
OpenID Connect是一个与OAuth一起工作的认证协议。它是身份和认证提供者,帮助用户向其他服务证明其身份。 OAuth和OpenID Connect协议在网络上常用于认证。如果我们在一家使用它们的公司工作,无论是作为身份提供者还是消费者,都需要对它们了如指掌。即使我们不直接使用它们,也应该了解它们的功能,以便为用户提供良好的安全建议,让他们与服务提供商分享信息。
十、基于证书的认证(Certificate-based authentication)
数字证书(Digital Certificates)可以作为一种认证技术,通过SSH连接到服务器,为智能卡供电,并将网络访问限制在特定设备上。当我们使用数字证书进行认证时,创建的证书与我们用来保护网站的证书类似。证书的目的是向第三方提供一个可信的公钥副本。保留相应的私钥以证明我们是是公钥的所有者。使用密钥进行认证如下所示:
首先,我们需要创建一个公钥和私钥对,并保留私钥,同时与我们想认证的服务器共享公钥。当我们试图使用基于密钥的加密方式登录服务器时,服务器会生成一个随机的挑战信息(Random Challenge Message)并将其发送给我们。我们用自己的私钥对该信息进行加密,然后将加密后的版本发回给服务器。服务器用接着的公钥对信息进行解密,如果它与原始挑战信息相匹配,就知道我们可以使用私钥,就可以证明我们的身份并为我们提供对服务器的访问。这基本上提供了与强密码相同的保护水平,但主要的好处是,它可以自动化。一台服务器可以使用基于证书的认证连接到另一台服务器,而无需有人输入密码。
我们也可以使用基于证书的认证机构,让公钥由受信任的CA签署。这不仅使远程系统确信我们有私钥,而且还确信我们就是所声称的人。基于证书的认证可用于服务器与服务器之间的连接,它也是基于PKI的智能卡背后的使能技术,还可以与IEEE802.1x标准一起用于网络认证。