天天看点

SAML2.0 从零到壹最佳实践

前言

SAML协议是一个比较复杂的协议,有很多文章介绍了SAML协议的基础知识,但是如何SAML协议如何实现,如何配置一个SAML的SP服务方,提供一个支持调试的SAML的认证服务(IDP),缺乏一个深入浅出的介绍系统性的介绍。

本博客详细介绍了SAML协议的基础概念,实现,相关的DEMO以及提供调试的IDP。

需要知道的基础概念

首先需要了解几个基本的服务方:

IDP:账号认证的服务方,如赛赋IDaaS作为IDP,主要就是完成认证

SP:向用户提供商业服务的软件(实体),比如禅道

Browser:用户方的浏览器,用户通过浏览器进行资源的访问和相关跳转完成身份的认证

需要知道的几个地址(容易混淆)

“用户登录地址”,应用的SAML协议登录路径

“relayState地址”,应用认证成功后的跳转地址。

“AssertionConsumerServiceUrl”,应用接收统一身份认证平台SAML协议回调接口url

entityId,统一身份认证平台的SAML断言标识的路径,如

http://www.cipherchina.com:7777/cipher/saml/metadata

(其中,赛赋IDaaS的entityId的端口号默认为7777,路径默认为/cipher/saml/metadata,域名或IP为赛赋IDaaS实际部署的服务器IP地址或域名)

统一身份认证平台接收SAML协议请求的回调路径。如

http://www.cipherchina.com:8645/cipher/saml/sso

(其中,回调路径使用的端口号默认为8645,路径默认为/cipher/saml/sso,域名或IP为赛赋IDaaS实际部署的服务器IP地址或域名)

认证的流程

1.用户通过浏览器访问 SP(应用资源) 的某个受保护的资源;

2.SP 鉴别到该用户未鉴权,生成 SAML 认证请求,其中包含应 RelayState地址、IDP的SAML的请求路径

3.SP生成的SAML认请求的数据示例如下:

<?xml version="1.0" encoding="UTF-8"?>

<saml2p:AuthnRequest AssertionConsumerServiceURL="https://saml_sp.app.com/saml/SSO"

                    Destination="http://www.cipherchina.com:8645/cipher/saml/login" ForceAuthn="false"

                    ID="a2fae32f725c3fi4469294ghj6d50j0" IsPassive="false" IssueInstant="2019-12-05T06:06:04.141Z"

                    ProtocolBinding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" Version="2.0"

                    xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol">

   <saml2:Issuer xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion">

       https://signin.aliyun.com/1459982555170282/saml/SSO

   </saml2:Issuer>

</saml2p:AuthnRequest>
           

客户端携带 SAML 认证请求,访问IDP的SAML认证服务

http://www.cipherchina.com:8645/cipher/saml/login?SAMLRequest=XXXXXX
           

其中SAMLRequest后的参数为步骤2中SP生成的SAML认请求数据

4.IDP返回身份认证页面

5.用户使用IDP的身份认证页提交身份认证信息,如用户名密码,扫码等

6.认证通过后,IDP 端生成包含用户身份信息和IDP签名的SAML认证断言

认证断言的示例

7.IDP将包含认证断言的重定向地址发送给客户端浏览器。

8.客户端浏览器进行跳转,携带认证断言,访问 SP的 AssertionConsumerService(ACS) URL

9.SP验证认证断言中IDP的签名合法,根据断言中的用户信息创建session

10.SP返回一个重定向地址给客户端浏览器,打开用户请求的资源页面,如跳转到“relayState地址”

认证流程图:

SAML2.0 从零到壹最佳实践

IDP服务地址赛赋IDaaS

赛赋科技IDaaS提供线上调试的地址,注册后可以快速理解和配置IDP服务。

注册后,添加SAML应用,配置指导

SAML协议的安全设计

在SAML协议中,对协议的安全设计十分完整,包协议中定义的客户端、SP及IDP的交互流程,并且还使用了密码学对SAML中关键的交互数据进行了签名和加密处理。

1.对SAML数据进行签名

为有效的确保SAML的交互过程中的数据不被伪造和篡改,支持对任何SAML数据进行签名。特别是重要的SAML认证断言。

具体的,在本项目中使用了X.509格式的数字证书进行签名,使用了RSA公钥密码算法,SHA-256哈希算法,其密钥长度为1024位。

2.SAML认证断言的安全性设计:加密和断言有效期

在SAML的认证断言中,包含了大量的用户账号信息,因此十分有必要对其进行加密处理。

对SAML认证断言的加密同样支持包括国密算法和AES算法等多种对称加密算法,在本项目中,使用了AES算法,密钥长度为1024位,能够有效的保证SAML认证断言的保密性。

另外,为防止重放攻击,在设计中还对认证断言的有效期进行了限制,认证断言的有效期可配置,建议配置使用较短的有效期。

相关实现

赛赋IDaaS git项目

https://github.com/CipherChina

继续阅读