SAML2单点登陆接入流程分析

最近有个客户系统需要接入自己内部的统一认证服务,采用的是saml2.0协议,系统自身的iam充当SP角色,客户内部统一认证充当Idp服务,最后由于客户SSO流程返回数据不是标准的SAML2.0协议,没有带回请求时RelayState带的参数数据,导致iam解析SAML2.0协议异常,整个交互流程通过wireshark抓包分析,不然又要被客户diao了~。


SAML协议介绍

SAML(Security Assertion Markup Language)是一种用于在不同安全域之间交换认证和授权数据的XML标准,常用于实现单点登录(SSO)。SAML单点登录的交互流程及主要角色介绍如下。

主要角色

  1. 用户(User)

    • 试图访问服务的最终用户。

  2. 服务提供者(Service Provider, SP)

    • 提供具体服务的实体,如Web应用或云服务。

    • 依赖身份提供者(IdP)进行用户认证。

  3. 身份提供者(Identity Provider, IdP)

    • 负责用户认证并生成SAML断言。

    • 向服务提供者(SP)提供认证信息。

  4. 用户代理(User Agent)

    • 通常是用户的浏览器,负责在IdP和SP之间传递消息。

SAML单点登录交互流程

SAML2单点登陆接入流程分析

  1. 用户访问SP

    • 用户通过浏览器访问SP的资源。

  2. SP生成SAML请求

    • SP生成SAML认证请求(AuthnRequest),并将用户重定向到IdP。

  3. 用户被重定向到IdP

    • 用户代理将SAML请求发送到IdP。

  4. IdP认证用户

    • IdP验证用户身份(如通过用户名和密码)。

  5. IdP生成SAML响应

    • IdP生成包含用户信息的SAML断言,并创建SAML响应(Response)。

  6. 用户被重定向回SP

    • IdP将SAML响应发送回用户代理,用户代理再将其转发给SP。

  7. SP验证SAML响应

    • SP验证SAML响应的有效性,并提取用户信息。

  8. 用户访问资源

    • SP根据SAML断言中的信息,授权用户访问资源。

SP 与 IdP 之间通信方式

SP 与 IdP 之间的通信方式分为 HTTP Redirect Binding、HTTP POST Binding、HTTP Artifact Binding。每种方式在不同的阶段会用不同类型的 HTTP 与对方通信。

HTTP Redirect Binding

SP 通过重定向 GET 请求把 SAML Request 发送到 IdP,IdP 通过立即提交的 Form 表单以 POST 请求的方式将 SAML Response 发到 SP。

SAML2单点登陆接入流程分析

HTTP POST Binding

SP 通过立即提交的 Form 表单以 POST 请求的方式将 SAML Request 发到 IdP。IdP 通过立即提交的 Form 表单以 POST 请求的方式将 SAML Response 发到 SP。

SAML2单点登陆接入流程分析

HTTP Artifact Binding

SP、IdP 双方只通过浏览器交换 SAML Request、SAML Response 的索引编号,收到编号后,在后端请求对方的 Artifact Resolution Service 接口来获取真正的请求实体内容。从而避免 SAML Request、SAML Response 暴露在前端。

SAML2单点登陆接入流程分析

相关证书操作:

# 提取idp证书
keytool -rfc -keystore ./saml-idp.keystore -storepass xxx -exportcert -alias "idp"

# 自签SP证书
openssl req -new -x509 -days 36500 -nodes -out sp.crt -keyout sp.key

将sp.key由默认PKCS#1转成PKCS#8
openssl pkcs8 -topk8 -inform pem -nocrypt -in sp.key -outform pem -out sp.pem

SAML单点登陆接入联调

SAML2.0抓包分析:

要抓取 SAML 2.0 的交互数据包,需要关注 HTTP 或 HTTPS 协议中的 SAML 请求(SAMLRequest)和 SAML 响应(SAMLResponse)。SAML 2.0 是基于 XML 的单点登录(SSO)协议,用于身份提供商(IdP)和服务提供商(SP)之间的身份验证和授权。

1. 启动 Wireshark 并选择网络接口

  • 打开 Wireshark,选择要监听的网络接口(例如以太网或 Wi-Fi)。

  • 开始捕获数据包。

2. 设置捕获过滤器(可选)

如果知道 SAML 交互的 IP 地址或端口,可以设置捕获过滤器以减少捕获的数据量。例如:

  • 如果 SAML 交互是通过 HTTPS(端口 443)进行的:

tcp port 443
  • 如果知道具体的 IP 地址:

host <IdP_IP> or host <SP_IP>
ip.dst == xxx && tcp.port == 443
  • 不确定数据包的方向(源或目标),可以使用 ip.srcip.dst 来分别指定源 IP 和目标 IP。

  • 如果使用的是 UDP 协议而不是 TCP,将 tcp.port 替换为 udp.port

分析 HTTP 302 跳转数据包

  1. 找到过滤后的 HTTP 302 数据包。

  2. 展开数据包的 HTTP 层,查看以下字段:

    • Status Code: 确认状态码为 302

    • Location: 查看 Location 字段,这是跳转的目标 URL。

    • Request URI: 查看原始请求的 URI,了解是从哪个 URL 触发的跳转。

  • 过滤所有 HTTP 302 响应

http.response.code == 302
  • 过滤特定 IP 地址的 HTTP 302 响应 如果只关心某个特定 IP 地址的 302 跳转,可以结合 IP 地址进行过滤。例如:

ip.addr == 10.1.2.3 && http.response.code == 302

  • 过滤包含 Location 头的 HTTP 302 响应 302 跳转通常会在响应头中包含 Location 字段,指示跳转的目标 URL。可以进一步过滤包含 Location 头的 302 响应:

http.response.code == 302 && http.location

使用显示过滤器(基于协议字段)

 如果 iam.chegva.com 字符串出现在 HTTP 请求或响应的 URL、Host 头、或其他协议字段中,可以使用显示过滤器。

  • 过滤 HTTP 请求中包含 iam.chegva.com 的数据包

http.request.uri contains "iam.chegva.com"
  • 过滤 HTTP 响应中包含 iam.chegva.com 的数据包

http.response contains "iam.chegva.com"

  • 过滤 HTTP Host 头中包含 iam.chegva.com 的数据包

http.host contains "iam.chegva.com"

使用字节流过滤器(基于原始数据)

如果 iam.chegva.com 字符串出现在数据包的原始字节流中(例如在 HTTPS 加密流量中),可以使用字节流过滤器。

  • 过滤包含 iam.chegva.com 字符串的所有数据包

frame contains "iam.chegva.com"
  • 过滤 TCP 流中包含 iam.chegva.com 字符串的数据包

tcp.payload contains "iam.chegva.com"

3. 触发 SAML 2.0 交互

  • 在浏览器中访问使用 SAML 2.0 的服务(例如单点登录页面)。

  • 完成登录流程,确保 SAML 请求和响应被触发。

4. 使用显示过滤器筛选 SAML 数据包

在 Wireshark 中,使用显示过滤器来筛选 SAML 相关的数据包。SAML 请求和响应通常是通过 HTTP POST 或 HTTP Redirect 传输的。

  • 筛选 HTTP POST 请求中的 SAML 数据包

http.request.method == "POST" and (http contains "SAMLRequest" or http contains "SAMLResponse")
  • 筛选 HTTP GET 请求中的 SAML 数据包(如果是通过 URL 重定向传输的):

http.request.method == "GET" and (http contains "SAMLRequest" or http contains "SAMLResponse")
  • 筛选 HTTPS 流量中的 SAML 数据包 如果需要解密 HTTPS 流量以查看 SAML 内容,需要配置 Wireshark 解密 TLS 流量(见下文)。

5. 解密 HTTPS 流量(可选)

SAML 2.0 交互通常是通过 HTTPS 加密传输的。要解密 HTTPS 流量,需要配置 Wireshark 使用服务器的私钥或浏览器的 TLS 会话密钥。

  • 使用服务器的私钥

    1. 获取服务器的私钥文件(例如 .key.pem 文件)。

    2. 在 Wireshark 中,进入 Edit > Preferences > Protocols > TLS

    3. RSA keys list 中添加服务器的私钥文件。

    4. 重新捕获流量,Wireshark 将自动解密 HTTPS 流量。

  • 使用浏览器的 TLS 会话密钥

    1. 配置浏览器导出 TLS 会话密钥(例如,在 Chrome 中设置 SSLKEYLOGFILE 环境变量)。

    2. 在 Wireshark 中,进入 Edit > Preferences > Protocols > TLS

    3. (Pre)-Master-Secret log filename 中指定导出的密钥文件路径。

    4. 重新捕获流量,Wireshark 将自动解密 HTTPS 流量。

6. 分析 SAML 数据包

  • 找到包含 SAMLRequestSAMLResponse 的 HTTP 数据包。

  • 展开数据包的 HTTP 层,查看 Form itemURL 中的 SAML 内容。

  • 如果需要查看 SAML 的 XML 内容,可以将 SAMLRequestSAMLResponse 的值复制出来,并使用 Base64 解码工具解码(例如在线工具或命令行工具)。

7. 保存捕获的数据包

  • 如果需要保存捕获的数据包,可以点击 File > Save As,将捕获文件保存为 .pcap.pcapng 格式。

解码 SAMLRequest 或 SAMLResponse

SAML 请求和响应通常是 Base64 编码的。你可以使用以下方法解码:

  • 在线工具:将 Base64 字符串粘贴到在线解码工具中。

  • 命令行工具

echo "<Base64_String>" | base64 --decode

通过以上步骤,可以成功抓取并分析 SAML 2.0 的交互数据包。如果需要进一步分析 SAML 的 XML 内容,可以使用 XML 解析工具(Base64 Decode + Inflate)或浏览器插件(如 SAML-tracer)。

RelayState在SAML2.0协议中的作用

SAML2单点登陆接入流程分析


参考:

anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/6307.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注