SAML即安全断言标记语言,英文全称是Security Assertion Markup Language。它是一个基于XML的标准,用于在不同的安全域(security domain)之间交换认证和授权数据。在SAML标准定义了身份提供者(identity provider)和服务提供者(service provider),这两者构成了前面所说的不同的安全域。 SAML是OASIS组织安全服务技术委员会(Security Services Technical Committee)的产品。
定义
SAML(Security Assertion Markup Language)是一个XML框架,也就是一组协议和规范,可以用来传输企业用户身份证明, 主要是企业外的身份跨域传递。比如,公司(idp)的用户要访问SAAS 应用(sp),为了保证身份安全,我们可以采用除了加密签名等措施,还要采用SAML规范来传输,传输的数据以XML形式,内容符合SAML的推荐标准,这样我们就可以不要求idp和sp采用什么样的系统,只要求能理解SAML规范即可,显然比传统的方式更好。SAML 规范是一组Schema 定义。
可以这么说,在Web Service 领域,schema就是规范,在Java领域,API就是规范。
背景
安全是所有Web项目在设计时都要考虑的一个重要因素。无论是选择最短口令,决定何时使用SSL加密HTTP会话,还是通过自动登录cookie来识别用户,都经常要付出重大的设计努力,以保护用户的身份信息和他们可能存放于Web站点的其他资料。糟糕的安全性可能带来公关灾难。当最终用户努力保持对其个人信息的控制时,他们要面临令人迷惑的隐私政策,需要牢记众多站点的不同口令,以及遭遇“钓鱼式攻击”事件。在宏观层次上,数字身份引起了许多复杂的技术和社会问题,业界一些团体如Liberty Alliance和IdentityGang都正试图通过开发新的技术标准来解决它们。在较小的规模上,可以使用一些工具来为用户提供更好的安全性。请考虑口令管理问题。用户访问他们保存个人资料的Web站点,在可以存取他们的资料之前必须经过验证。通过验证来鉴别用户,确保他们是所声称的用户。进行验证最简单方式是使用口令。然而,若每个站点都需要各自的一套口令,用户将有难以控制的大量口令。1998年微软首先尝试通过其Passport network提供该问题的全球解决方案。Passport使得任意Web站点使用用户提交给Passport的个人资料(如用户名、地址、信用卡号)成为可能。Passport是单点登录(single sign-on,SSO)的第一次电子商务尝试。它没有流行起来,部分原因是由于人们对系统封闭性的担心。然而,SSO的理念非常引人注目,许多开放标准和商业计划都追随Passport其后。通过SSO,某个Web站点可以与其他站点共享用户身份信息。 SSO对于使用应用服务提供商(Application Service Provider,ASP)软件服务的企业特别有用。ASP在自己的服务器上宿主应用程序,出售其访问权作为服务。公司可以在它的标准目录服务器里管理自己的用户和口令,然后通过SSO授予用户访问ASP应用程序的权限。SSO允许公司管理自己用户的信息,不必为每一员工维护多个用户账号。对用户来说,SSO的好处在于他们可以在多个应用程序中使用一个用户名和口令,并且在应用程序之间切换时无需重新验证。SSO不仅仅用于Web应用程序,它可用于任何类型的应用程序,只要有安全地传送身份信息的协议。这种通信方式的开放标准就是安全性断言标记语言(SAML)。
SAML的应用随着云计算的发展而得到了更快的推广。越来越多的企业意识到,在每一个SAAS厂商维护一套用户名和密码是一件费时费力的事情, 寻求将企业内的身份认证扩展到SAAS应用中。领先的SAAS应用厂商如Google, Salesforce纷纷提供SAML的单点登录接口。 Sun 推出了一个开源的Java 项目OPENSSO,看起来一度前景美妙, 随着Oracle的收购,这一项目似乎搁浅了(Oracle 有自己的支持saml的商用平台)。IBM,CA 等不甘落后,纷纷推出自己的产品。 Microsoft的ADFS声称支持SAML 2.0(不支持1.1).这些产品的共同特点是兼容性不高, 和自己的产品线结合还算不错, 但是和其它厂商的产品互联有局限性。 异军突起的是一个总部位于美国的丹佛的Pingidentity。 它推出的Pingfederate, 基于Java 平台,除了支持SAML 2.0和1.1外, 还支持WS-Federation (微软主推),近两年又推出支持Oauth的版本(6.6以后)。除了产品,该公司还网拢了一批业界资深的人士, 积极参与SAML的标准制定和应用推广。 可以看到, SAML的应用得到了领先的企业和SAAS应用厂商的大力支持, 目前上百家SAAS厂商 声称自己支持SAML单点登录。
SAML作用
SAML 主要包括三个方面:
1.认证申明。表明用户是否已经认证,通常用于单点登录。
2.属性申明。表明 某个Subject 的属性。
3.授权申明。表明 某个资源的权限。
SAML框架
简单说, SAML就是一方向另一方发送SAML 请求,然后另一方返回SAML响应。数据的传输以符合SAML规范的XML格式表示。 连接中的任何一方都可以发起请求, 根据身份不同, 可以说是IDP init请求, 或是SP init 请求。
这里以SAML实现的业界领先厂商的PingFederate为例,来说说IDP init SSO (详细流程可以参阅参考资料)。 这个是用户通过LDAP 等登录到IDP域后, IDP 给已经登录的用户生成一个SAML Asseration, 这里包括员工的身份信息。 这个信息通过SSL加密传递到SP 后, SP 先验证签名(Sign), 解析出这是一个来自某公司某员工的请求, 要访问它的某个应用程序(Relaystat), SP 会继续把这个要求传递给自己的应用程序, 由它来决定授权。
正如样本中提到的, SAML的规范由几个部分构成:SAML Assertion,SAML Prototol,SAML binding等。