10.Spring Security SAML 高级配置
10.高级配置
10.1反向代理和负载均衡器
可以在多个后端服务器处理由反向代理或负载平衡器转发的SAML请求的情况下部署SAML扩展。还支持使用代理服务器和后端服务器之间的未加密通道进行通信的SSL终止代理。要在负载均衡器或反向代理后面配置SAML扩展以进行部署,请执行以下步骤:
- 确保将反向代理或负载平衡器配置为使用粘性会话。关于例如发送的请求的信息存储在用户的HTTP会话中,并且将响应发送到另一个后端节点将使原始请求数据不可用并且验证失败。如果仅使用IDP初始化的SSO或将会话复制到所有节点,则不需要粘性会话。
- 通过将securityContext.xml中的contextProvider bean实现更改 为类org.springframework.security.saml.context.SAMLContextProviderLB,向后端服务器提供有关前端URL的信息:
<bean id="contextProvider" class="org.springframework.security.saml.context.SAMLContextProviderLB"> <property name="scheme" value="https"/> <property name="serverName" value="www.myserver.com"/> <property name="serverPort" value="443"/> <property name="includeServerPortInRequestURL" value="false"/> <property name="contextPath" value="/spring-security-saml2-sample"/> </bean>
- 此设置使扩展能够正确地形成所有生成的URL并验证传入SAML消息的端点。
- 如果您使用自动生成的元数据,请确保配置与metadataGeneratorFilter bean中的前端URL匹配的entityBaseURL:
<bean id="metadataGeneratorFilter" class="org.springframework.security.saml.metadata.MetadataGeneratorFilter"> <constructor-arg> <bean class="org.springframework.security.saml.metadata.MetadataGenerator"> <property name="entityBaseURL" value="https://www.myserver.com/spring-security-saml2-sample"/> </bean> </constructor-arg> </bean> 10.2 Context
10.2上下文提供者
上下文提供程序填充有关本地服务提供程序(您的应用程序)的信息,例如entityId,角色,元数据,安全密钥,SSL凭据和信任引擎,以验证签名和SSL / TLS连接。一旦填充的上下文可用于参与处理传入或传出SAML消息的所有组件。ContextProvider可以自定义以更改SAML扩展的行为。默认实现org.springframework.security.saml.context.SAMLContextProviderImpl依赖于ExtendedMetadata中可用的信息,并执行以下步骤来创建上下文:
- 通过在/ alias /之后解析部分URL来定位本地SP的entityId(例如https://www.myserver.com/saml_extension/saml/sso/alias/myAlias?idp=myIdp中的myAlias)并将其与属性别名匹配在ExtendedMetadata中指定。如果URL不包含任何别名部分,则使用在元数据 bean 上配置了属性hostedSPName的默认服务提供者。
- 填充用于解密发送到此服务提供商的数据的凭据。如果ExtendedMetadata指定属性encryptionKey ,它将用作别名以从keyManager bean 查找私钥。否则将使用keyManager bean 的defaultKey。
- 填充用于SSL / TLS客户端身份验证的凭据。如果ExtendedMetadata指定属性tlsKey,它将用作从keyManager bean 查找键的别名。否则,将不会为客户端身份验证提供凭据。
- 填充信任引擎以验证签名。根据第8.2.1节“元数据互操作性配置文件(MetaIOP)”或第8.2.2 节中的ExtendedMetadata信任引擎中的securityProfile设置,将创建“PKIX配置文件”。
- 填充信任引擎以验证SSL / TLS连接。根据第8.2.1节“元数据互操作性配置文件(MetaIOP)”或第8.2.2 节中的ExtendedMetadata信任引擎中的sslSecurityProfile设置,创建“PKIX配置文件”。
在初始化SSO期间,还要求ContextProvider提供对等IDP的元数据。系统执行以下步骤来定位要使用的对等IDP:
- 加载HttpRequest对象的参数idp,并尝试通过entityId定位对等IDP。如果没有 提供idp参数,系统将启动IDP发现过程(在本地SP的ExtendedMetadata中启用时)或使用元数据 bean中指定的默认IDP 。
10.3有效期间隔
出于安全原因,系统会限制启用SAML消息和断言处理的时间窗口。可以使用以下设置自定义时间窗口参数。
在签名登录过程中处理的断言的有效期限制为3000秒。值可以用属性来定制maxAssertionTime 的的WebSSOProfileConsumerImpl豆。
自从使用IDP进行初始身份验证(基于Authentication语句的值AuthInstance)以来,系统允许用户单点登录最多7200秒。有些国内流离失所者允许用户保持认证的比这更长的时间,你可能需要通过设置更改默认值maxAuthenticationAge 的的WebSSOProfileConsumerImpl豆。
由于IDP和SP机器之间的时钟可能无法完美同步,因此应用60秒的容差进行时间比较。公差值(时间偏差)可以通过bean WebSSOProfileConsumerImpl和SingleLogoutProfileImpl中的设置属性responseSkew进行自定义。
下表总结了在处理传入SAML消息期间对时间有效性的所有检查。响应偏差是指 在概要文件bean上设置的属性responseSkew。过去表示检查值的有效窗口将通过responseSkew秒延长到过去,并相应地延伸到未来值。传入消息中可能缺少可为空的值。
表10.1。在WebSSO和WebSSO HoK配置文件中处理传入SAML响应期间的时间检查
response.issueInstant | |
Applied skew: | responseSkew (past + future) |
Nullable: | No |
Fails with: | Throws SAMLException |
Description: | Time when SAML response message was created. |
response.assertion.issueInstant | |
Applied skew: | responseSkew (past + future) + maxAssertionTime (future) |
Nullable: | No |
Fails with: | Throws SAMLException |
Description: | Time when SAML assertion was created, allows validity extension as assertion might be re-used by the caller. |
response.assertion.subject.subjectConfirmation.notOnOrAfter | |
Applied skew: | responseSkew (future) |
Nullable: | No |
Fails with: | Throws SAMLException |
Description: | Time when subject can no longer be confirmed. |
response.assertion.authnStatement.authnInstant | |
Applied skew: | responseSkew (past + future) + maxAuthenticationAge (future) |
Nullable: | No |
Fails with: | Throws CredentialsExpiredException |
Description: | Time when user authenticated to IDP, typically differs from time or response or assertion creation time. |
response.assertion.authnStatement.sessionNotOnOfAfter | |
Applied skew: | no skew |
Nullable: | Yes |
Fails with: | Throws CredentialsExpiredException |
Description: | Time when user's session expires and requires re-authentication, sessions are typically valid for longer period and therefore do not suffer from time synchronization problems. |
response.assertion.condition.notBefore | |
Applied skew: | responseSkew (past) |
Nullable: | Yes |
Fails with: | Throws SAMLException |
Description: | Time limit on validity of assertion. |
response.assertion.condition.notOnOrAfter | |
Applied skew: | responseSkew (future) |
Nullable: | Yes |
Fails with: | Throws SAMLException |
Description: | Time limit on validity of assertion. |
表10.2。在Single Logout配置文件中处理传入SAML LogoutRequest期间的时间检查
response.issueInstant | |
Applied skew: | responseSkew (past + future) |
Nullable: | No |
Fails with: | Sends LogoutResponse with error Status "urn:oasis:names:tc:SAML:2.0:status:Requester" |
Description: | Time when SAML LogoutRequest message was created. |
表10.3。在Single Logout配置文件中处理传入SAML LogoutResponse期间的时间检查
response.issueInstant
response.issueInstant | |
Applied skew: | responseSkew (past + future) |
Nullable: | No |
Fails with: | Throws SAMLException |
Description: | Time when SAML LogoutResponse message was created. |
表10.4。在处理Artifact Resolution配置文件中的传入SAML ArtifactResponse期间进行时间检查
response.issueInstant | |
Applied skew: | responseSkew (past + future) |
Nullable: | No |
Fails with: | Throws MessageDecodingException |
Description: | Time when SAML LogoutResponse message was created. |
10.4增强的客户端/代理
可以使用服务提供商的扩展元数据的属性ecpEnabled配置对增强型客户端/代理的支持。启用后,将使用包含HTTP标头的请求自动激活ECP配置文件 :application / vnd.paos + xml和PAOS:ver ='urn:liberty:paos:2003-08'; 'urn:oasis:names:tc:SAML:2.0:profiles:SSO:ecp'。用于服务器ECP配置文件的绑定始终自动设置为PAOS。
可以使用以下设置结合自动元数据生成启用ECP:
<bean class="org.springframework.security.saml.metadata.MetadataGenerator">
<property name="extendedMetadata">
<bean class="org.springframework.security.saml.metadata.ExtendedMetadata">
<property name="ecpEnabled" value="true"/>
</bean>
</property>
</bean>
10.5端点URL
默认情况下,Spring SAML使用以下端点,这些端点还可以选择包含有关本地服务提供者的实体别名的信息:
表10.5。端点概述
Profile | Binding | Endpoint |
---|---|---|
Web Single Sign-on | HTTP-POST, HTTP-Artifact, PAOS | scheme://server:port/contextPath/saml/SSO |
Web Single Sign-on Holder of Key | HTTP-POST, HTTP-Artifact | scheme://server:port/contextPath/saml/HoKSSO |
Single Logout | HTTP-POST, HTTP-Redirect | scheme://server:port/contextPath/saml/SingleLogout |
将相应处理bean(samlWebSSOProcessingFilter,samlWebSSOHoKProcessingFilter,samlLogoutProcessingFilter或samlIDPDiscovery)上的属性filterProcessesUrl更改为新URL,例如/ samlResponse可以使用以下步骤更改默认URL:
- 更新samlFilter bean并确保修改后的处理过滤器映射到正确的模式,例如/ samlResponse / **,只有在您使用实体别名功能时才需要/ **部分
- 为您的服务提供商重新生成元数据,如果您使用自动元数据生成器,将使用新URL自动生成端点
- 如果您使用的是预先配置的元数据,则可以在现有元数据文件中手动执行更改
过滤器的端点samlEntryPoint,samlLogoutFilter和metadataDisplayFilter可以使用相同的过程进行更改,而无需重新生成元数据。
10.6神器分辨率
使用HTTP-Artifact绑定需要Spring SAML对Identity Provider进行直接SOAP调用。有时需要为呼叫配置正确的HTTP代理。这可以通过在插入到artifactBinding bean的HttpClient上设置属性hostConfiguration来实现。以下配置演示了如何为hostConfiguration创建bean :
<bean id="hostConfiguration" class="org.apache.commons.httpclient.HostConfiguration"/>
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject" ref="hostConfiguration"/>
<property name="targetMethod" value="setProxy"/>
<property name="arguments">
<list>
<value>testHost</value>
<value>8080</value>
</list>
</property>
</bean>
另一个常见用例是使用HTTP-Basic身份验证保护IDP上的工件解析端点的情况。可以通过使用以下bean 设置HTTPClient的属性状态来配置身份验证 :
<bean id="state" class="org.apache.commons.httpclient.HttpState"/>
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject" ref="state"/>
<property name="targetMethod" value="setCredentials"/>
<property name="arguments">
<list>
<util:constant static-field="org.apache.commons.httpclient.auth.AuthScope.ANY"/>
<bean class="org.apache.commons.httpclient.UsernamePasswordCredentials">
<constructor-arg value="username"/>
<constructor-arg value="password"/>
</bean>
</list>
</property>
</bean>