网络知识

一文走进云计算中的统一认证——SAML

SAML的全称是Security Assertion Markup Language,它在各种单点登录场景中被广泛使用。比如,某传统企业在AWS上购买了云资源,但是该企业员工的身份登录信息却保存在企业局域网内的ADFS中,此时就需要利用SAML帮助员工能通过ADFS登录到AWS上。再比如,某互联网企业购买了一个办公类SaaS软件,但是它并不想使用SaaS软件厂商提供的登录页面,而是希望在企业内部的办公平台直接登录该SaaS软件,此时就需要利用SAML来把办公平台和该SaaS软件的身份体系打通。在云计算逐渐普及的当下,诸如此类的应用场景越来越多。这就需要相关领域的同学能够对SAML有充分的了解。

但现实是,SAML作为一个十分复杂的安全技术类协议,想要充分的理解它并不是一件容易的事。因此,在本文中,我将以通熟易懂的叙述方式把我在研发过程中总结出来的对SAML的理解分享给大家。作为一个安全类的应用协议,SAML的存在不是孤立的,而是需要一系列的安全模型来支撑它。这些安全模型包括公私钥机制、公钥加密机制、数字签名机制、数字证书机制。而这一切的一切,还得从公私钥机制谈起!

公私钥机制奠定了现代互联网加密协议的基石

1976年,两个斯坦福大学的杰出学者,在经过了三年的合作之后,发表了一篇题为《密码学的新方向》的文章。这篇论文首次引入了公共密钥加密协议与数字签名的概念。谁也想不到,短短几十年后,这篇文章构成了现代互联网加密协议的基石。就是这两位帅爷爷和萌蜀黍!!!

和对称密码基于单个共享密钥的方式不同,非对称密码始终是成对出现:公钥和私钥。由其中任何一个密钥加密的数据只能由另外一个密钥解密。即,由私钥加密的数据只能由公钥解密,由公钥加密的数据只能由私钥解密。非对称密码的这个特点使其在密钥交换和数字签名领域被广泛应用。

公钥加密机制解决对称密钥的传输问题

在需要加密的网络通信场景中,最常见的加密方式是基于共享密钥的对称加密方式。通信过程如下:

消息发送方和接收方事先约定好一把对称密钥K。然后,消息发送方使用密钥K对要发送的消息进行加密,并将加密后的结果通过网络发送给消息接收方。消息接收方利用密钥K对接受到的内容进行解密,并获得原始消息。

由于共享密钥K只被消息发送方和接收方持有。因此,即便数据在传输过程中被劫持,攻击者由于没有密钥K,也无法获得原始消息内容。

但是问题来了,如何事先约定好密钥?如果消息发送方和接收方物理位置很近,还可以通过线下见面的方式约定密钥。但如果通信双方距离十万八千里呢?显然,线下约定的方式是不现实的。那么是否可以找到一种安全的方式,让通信双方基于网络就可以约定共享密钥呢?

真相永远只有一个:利用非对称密码学的机制进行密钥交换。消息接收方提前生成一对公私钥,并将公钥PubK广播出去,私钥PriK自己保存。有了这个前提条件,就可以安全的约定对称密钥了。过程如下:

消息发送方获取被广播的消息接收方的PubK,并使用该PubK对要传输的对称密钥K进行加密,并将加密之后的内容通过网络传输给接收方。消息接收方在收到加密内容之后,使用对应的PriK进行解密得到对称密钥K。

由于PriK只被接收方持有。因此,即便数据在传输过程中被劫持,攻击者由于没有私钥PriK,也无法获得原始消息内容。以这种方式,就解决了对称密钥传输的问题!

数字签名机制防止公钥被伪造

在密钥交换的过程中,有一个步骤值得商榷:消息发送方获取被广播的消息接收方的PubK。这里面涉及一个认证的问题,怎么证明一个PubK就是接收方的PubK呢?如果出现黑客伪造接收方的PubK怎么办?就像下图酱紫。

真相永远只有一个:数字签名。所谓数字签名,就是一个有公信力的权威机构用它自己的私钥对某些数据进行签名(通常称私钥加密为签名),以证明这些数据是可被信任的。

权威机构用自己的私钥将“某个公钥PubK属于某人“这样的消息进行签名,消息发送方在收到消息后,利用权威机构对应的公钥解密以验证消息的签名。如果验证通过,说明“某个公钥PubK属于某人”这个消息是经过权威机构认证的,是可以被信任的,进而可以放心地使用消息中的公钥。如果验证没有通过,说明“某个公钥PubK属于某人”这个消息是不可信任的,进而不会使用消息中的公钥。

通过权威机构私钥签名的方式,保证了PubK来源的可靠性。那么谁是权威机构?实际上,在信息安全领域,有一些被成为CA(Certificate Authority)的机构,比如著名的DigiCert公司,它作为一个可信第三方,对外签发可信的数字证书,当然这个过程是收费的。比如我们浏览器中使用的根证书就是一个典型的例子。

数字证书机制颁发可信证书

行文至此,数字证书的概念已经呼之欲出了!数字证书,又称为公钥证书,用来证明某个公钥被某个实体(通常为人、组织或服务)所持有。这就好比,你的房产证用来证明房子是被你持有。同理,你的公钥证书用来证明这把公钥被你持有。

一个数字证书包括的基本信息有:证书的版本号、证书序列号、使用的签名算法、颁发者的身份标识、证书的有效期、公钥、公钥持有者的身份。这些信息作为被签名的数据,使用指定的签名算法和CA的私钥进行签名,并将签名的结果添加到证书中。这就构成了一个完整的证书。数字证书的典型结构如下:

由于CA机构的公钥是广而告之的,任何组织或实体只要用CA的公钥验证了证书中签名的合法性,就能证明当前证书是可靠的。即,证书中所声明的公钥与持有者关联。同时,该公钥对应的私钥被持有者唯一持有。

通过数字证书的机制,通信双方就可以验证所接收到的公钥是否真的被对方所持有,进而保证使用对方公钥加密的信息只能由对方解密获得,因为对方是私钥的唯一持有者。同时,也可以保证使用对方公钥解密的信息一定由对方加密产生,因为对方是私钥的唯一持有者。而后面这一点正是SAML协议能够安全存在的基石。

SAML协议简化模型

那SAML协议是如何用到数字证书的呢?在SAML协议的模型中,通常涉及到三个角色。它们分别是IDP、SP和Client。

IDP:Identity Provider(身份提供商),指提供身份管理和身份认证的实体,比如微软ADFS SP:Service Provider(服务提供商),指对外提供服务和资源的实体,比如云服务提供商AWS Client:用户,其通过浏览器在经过IDP认证之后访问SP提供的受保护资源。

IDP有自己的私钥以及对应的公钥证书,SP也有自己的私钥以及对应的公钥证书。在SAML协议运转之前,IDP和SP提前交换自己的公钥证书(实际上还有协议的其他内容,这里仅是简化的模型),这个过程通常是由企业的IT管理员配置完成。由于企业IT管理员是可被信任的,所以IDP和SP分别的公钥也被认为是可以被信任的,因此公钥证书可以不再由权威机构颁发,而是由企业IT管理员自己进行签发,这种证书被叫做自签名证书。

IDP和SP通过彼此交换自签名证书,就完成了对彼此的信任。这种信任就是我在前文中提到的SAML协议的基石:使用对方公钥能够解密的信息一定是由对方加密产生,因为对方是私钥的唯一持有者。即,SP收到的消息如果能够用IDP的公钥解密,那么说明收到的消息一定来自IDP。同理,IDP收到的消息如果能够用SP的公钥解密,那么说明收到的消息一定来自SP。

下图是一个简化版的通过SAML协议实现SSO的流程,Client想要通过浏览器访问SP提供的资源,访问前必须先登录到SP站点,但是Client并没有SP站点的账号密码。此时,用户发现SP站点支持某IDP的单点登录,于是就使用自己在IDP中的账号密码尝试登录SP站点。

1. Client通过账号密码登陆到IDP,并告知IDP自己想要登陆SP站点,可否帮助提供下证明。 2. IDP非常愿意为自己的用户提供合法的身份证明。于是乎,就发了一个消息(SAML中叫做断言Assertion)给Client。并且和Client说,你把这个断言出示给SP站点就可以登陆了。 3. Client向SP站点发送了登陆请求,并把IDP颁发的断言出示给了SP。 4. SP站点果然“认识”IDP提供的断言,并允许Client登陆自己的站点。

补充:在具体实践中,SAML协议有大量的规范和细节需要工程师实现,本文为讲解方便,只讨论简化模型

瞧!在上面的过程中,用户仅仅输入了自己在IDP中的账号密码,就轻而易举的登陆到了SP站点。这是因为,当Client将断言出示给SP时,SP根据断言中的信息找到其颁发者IDP,并从自己的数据库中找到IDP对应的公钥证书。如果证书中的公钥能够验证断言中的签名,就说明当前断言是IDP颁发的,是可以被信任的。而断言中包括了“当前用户是谁”这样的信息。因此,Client才能够成功登录到SP站点。

通过Google Admin单点登录到AWS

正如文章开头所言,SAML被广泛用在单点登录的场景中。举个例子,张三服务于一家企业,该企业的员工信息全部通过Google Admin进行管理,该企业的IT资源由全部位于AWS上。这种场景下,企业的员工要想操作企业的IT资源,最原始的方法是通过AWS提供的账号密码登录到AWS的控制台。如图9所示,企业为张三分配一个可以登录AWS的账号密码,张三通过这个账号密码就登录到AWS控制台,进而操作企业位于AWS上的IT资源。(其中涉及到AWS的IAM体系,在此不再赘述)

但实际上,企业已经给张三分配了一个可以登录Google Admin的账号密码。无论是从企业安全风控的角度,还是从张三自身的方便性角度,让张三仅记住一个密码这样的需求是合理的。即我们希望:张三通过被分配的账号密码登录到Google Admin控制台之后,就可以直接单点登录到AWS控制台上,而无需再记住一个AWS的账号密码。

通过SAML协议就可以构建这样的解决方案,最终配置完成后的流程如图10所示。

本文由浅入深的依次讲解了SAML协议的基石:公私钥机制、公钥加密机制、数字签名机制、数字证书机制,并介绍了构建于这些基石之上的SAML协议的简化模型,最后举例了一个SAML协议在实际场景中的应用。文章到此就要结束了。认证是一个古老的话题,历久弥新,而我们还在路上!