SAP S/4HANA 实现SAML单点登录(SSO)指南

本文提供了一份详尽的技术指南,指导用户如何配置开源身份提供者Shibboleth与SAP S/4HANA XS应用(作为服务提供者)之间的SAML 2.0单点登录(SSO)。内容涵盖了SSO原理、Shibboleth IdP的安装与SSL配置、SAP S/4HANA SP的集成要点、元数据交换、常见错误排查以及集成企业LDAP认证的扩展思路。

SAP S/4HANA 实现SAML单点登录(SSO)指南 图1

单点登录(Single Sign On, SSO)是当前企业业务整合中一项流行的技术方案。它的核心价值在于,用户只需进行一次身份验证,便可访问所有相互信任的应用系统,极大地提升了用户体验和管理效率。安全断言标记语言(Security Assertion Markup Language, SAML)则是一个基于XML的开放标准框架,用于在不同安全域之间交换身份验证和授权数据,尤其适用于企业用户身份的跨域传递。

设想一个场景:公司(身份提供者,IdP)的用户需要访问SAP S/4HANA XS应用(服务提供者,SP)。为确保身份安全,除了加密签名等措施,通常会采用SAML规范来传输身份凭证。SAML传输的数据采用XML格式,内容遵循其推荐标准。这种方式的好处在于,它不强制要求IdP和SP采用何种底层系统,只要双方都能理解和处理SAML规范即可。

典型的SAML单点登录流程如下:

  1. 用户在浏览器中输入SP(如SAP S/4HANA XS应用)的URL,尝试访问。
  2. SP生成一个SAML认证请求。
  3. SP引导浏览器重定向到IdP进行用户身份验证。
  4. IdP收到SAML请求,检查用户是否已在本域认证且会话有效。若无效,IdP将要求用户进行登录认证。
  5. IdP认证用户成功后,生成一个SAML响应。
  6. IdP将封装好的SAML响应返回给浏览器,浏览器再将其提交给SP。
  7. SP验证收到的SAML响应的合法性,该响应中包含了用户的身份信息。
  8. SP根据验证通过的SAML响应,确认用户身份,同意用户登录并提供服务。

本文将介绍如何利用开源身份提供者软件Shibboleth作为IdP,为SAP S/4HANA XS应用启用SAML单点登录。

一、 Shibboleth (IdP端) 配置详解

1.1准备安装环境

  • 域名准备:确保IdP服务器和SP服务器(SAP S/4HANA)可通过域名相互解析和通信。
  • 端口开放:IdP服务器的80端口和443端口需要对外开放,并确保没有其他程序占用。检查防火墙设置,允许这两个端口的访问。
  • 时钟同步:IdP服务器与SP服务器的系统时钟必须保持同步,以避免SAML断言因时间戳问题失效。

1.2 IdP安装步骤

1.2.1 基础软件安装:

  • 下载并安装JDK 1.5或更高版本(示例使用JDK 1.6)。确保JAVA_HOME环境变量正确设置。
  • 下载并安装Tomcat 6.0.17或更高版本(示例使用Tomcat 6.0.29)。
  • 下载并安装Apache HTTP Server 2.2或更高版本(示例使用Apache 2.2)。

注意:务必从http://httpd.apache.org/网站下载包含SSL支持的Apache安装程序。

1.2.2 下载IdP组件:

  • 从Shibboleth官方网站(如http://shibboleth.internet2.edu/downloads/shibboleth/idp/latest/)下载最新的IdP安装包。
  • 解压下载的压缩包,并将解压后的目录移动到您计划安装IdP的目标路径。

1.2.3 执行IdP安装程序:

运行IdP的安装脚本或程序。安装过程中会提示输入IdP的宿主名/域名(Hostname,请使用域名而非IP地址)以及IdP的安装主目录(IDP_HOME)。

1.2.4 配置Tomcat Endorsed目录:

将IDP_HOME/lib/endorsed/目录下的所有JAR包复制到TOMCAT_HOME/endorsed/目录下。IDP_HOME和TOMCAT_HOME分别指IdP和Tomcat的安装主目录。如果Tomcat根目录下没有endorsed文件夹,则手动创建一个。

1.2.5 使Tomcat支持SSL传输:

  • 添加SSL支持库:下载tomcat6-dta-ssl-1.0.0.jar(注意:Tomcat 7及更高版本需要不同的JAR包),将其放到TOMCAT_HOME/lib/目录下。
  • 配置SSL连接器:在TOMCAT_HOME/conf/server.xml文件中,添加SSL连接器配置。请将IDP_HOME替换为实际的IdP安装路径,并将PASSWORD替换为IdP安装过程中为keystore设置的密码。
XML
<Connector port="8443"
           protocol="org.apache.coyote.http11.Http11Protocol"
           SSLImplementation="edu.internet2.middleware.security.tomcat6.DelegateToApplicationJSSEImplementation"
           scheme="httpshttps"
           SSLEnabled="true"
           clientAuth="true"
           keystoreFile="IDP_HOME/credentials/idp.jks"
           keystorePass="PASSWORD" />

1.2.6 部署IdP Web应用(idp.war):

创建文件TOMCAT_HOME/conf/Catalina/localhost/idp.xml。

将以下内容粘贴到idp.xml文件中,并替换IDP_HOME为实际路径:

XML
<Context docBase="IDP_HOME/war/idp.war"
         privileged="true"
         antiResourceLocking="false"
         antiJARLocking="false"
         unpackWAR="false"
         swallowOutput="true" />

1.2.7 配置Apache反向代理:

在Apache的配置文件httpd.conf中,添加以下行,设置AJP反向代理到Tomcat上的IdP应用:

Apache
ProxyPass /idp/ ajp://localhost:8009/idp/

1.2.8 调整Tomcat AJP连接器:

修改Tomcat的TOMCAT_HOME/conf/server.xml文件中的AJP/1.3连接器(默认端口8009)。增加request.tomcatAuthentication=”false”和address=”127.0.0.1″属性,允许Apache将认证用户信息传递给IdP。

XML
<Connector port="8009"
           enableLookups="false" redirectPort="8443" protocol="AJP/1.3"
           request.tomcatAuthentication="false" address="127.0.0.1" />

1.2.9 调整Tomcat AJP连接器:

配置Apache基本认证(RemoteUser方式):

在Apache的httpd.conf或ssl.conf配置文件中,定义以下<Location>指令块,为IdP的RemoteUser认证路径启用基本认证。

Apache
<Location /idp/Authn/RemoteUser>
    AuthType Basic
    AuthName "My Identity Provider"
    AuthUserFile D:/opt/shibboleth-idp/credentials/user.db # 替换为实际的user.db路径
    require valid-user
</Location>

1.2.10 创建测试用户:

使用Apache的htpasswd命令创建用于测试的用户。该命令通常位于Apache安装目录的bin目录下。

Bash
# 首次创建文件并添加用户myself
htpasswd -c D:/opt/shibboleth-idp/credentials/user.db myself 
# 后续添加用户 (不需要-c参数)
# htpasswd D:/opt/shibboleth-idp/credentials/user.dbanotheruser

请将路径替换为上一步中AuthUserFile指令指定的实际路径。myself为示例用户名。

1.2.11 测试IdP安装状态:

在浏览器中访问IdP的状态页面:https:///idp/profile/Status。如果页面显示“ok”,则表示IdP基本安装和配置正确。这仅表明IdP服务已启动,后续还需要配置信任关系和属性释放才能真正用于SSO。

二、 SAP S/4HANA (SP端) 配置要点

SAP S/4HANA作为服务提供者(SP)端的配置,可以参考SAP官方文档或社区资源,例如早期SCN上的文档DOC-50418(Use SAML to enable SSO for your SAP S/4HANA XS App)。配置过程中,会需要用到IdP的元数据。IdP的元数据文件通常位于IdP服务器的IDP_HOME/metadata/idp-metadata.xml。

三、 将SP元数据部署到IdP端

  1. 获取并放置SP元数据: 从SAP S/4HANA端获取其SAML SP元数据,将其保存为sp-metadata.xml文件(文件名可自定义),并放置到IdP服务器的IDP_HOME/metadata/目录下。
  2. 配置IdP信任SP元数据: 修改IdP的IDP_HOME/conf/relying-party.xml文件,在其中添加一个新的<metadata:MetadataProvider>元素,使其能够加载并信任上一步放置的SP元数据文件。XML
<metadata:MetadataProvider id="HANA_SP_MD" 
                           xsi:type="metadata:FilesystemMetadataProvider"
                           metadataFile="IDP_HOME/metadata/sp-metadata.xml" /> 
                           ```
确保重启IdP服务(通常是重启Tomcat)使配置生效。

四、 常见问题排查

在配置和测试过程中,可能会遇到一些常见错误。使用Chrome等浏览器的开发者工具可以帮助查看详细的SAML交互信息和错误提示。

1、错误:“Response is not success”(响应不成功)

可能原因与解决:IdP可能默认加密了SAML断言,而SP端未正确配置解密。作为排查步骤或在测试环境中,可以尝试在IdP的IDP_HOME/conf/relying-party.xml文件中,找到针对此SP的<ProfileConfiguration xsi:type=”saml:SAML2SSOProfile”…/>元素,并设置属性encryptAssertions=”never”。

2、错误:“No name id in subject”(Subject中缺少NameID)

可能原因与解决:IdP生成的SAML响应中未包含必需的NameID信息,或者格式不被SP接受。需要在IdP端配置属性解析和释放策略。

  • 修改IDP_HOME/conf/attribute-resolver.xml,添加一个AttributeDefinition来定义PrincipalName作为NameID,并配置其编码方式。例如:
XML
resolver:AttributeDefinition id="principalNameAsNameID" xsi:type="ad:PrincipalName" xmlns="urn:mace:shibboleth:2.0:resolver:ad">
    <resolver:Dependency ref="staticAttributes" /> <resolver:AttributeEncoder xsi:type="enc:SAML1StringNameIdentifier" 
                               xmlns="urn:mace:shibboleth:2.0:attribute:encoder"
                               nameFormat="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"/>
    <resolver:AttributeEncoder xsi:type="enc:SAML2StringNameID" 
                               xmlns="urn:mace:shibboleth:2.0:attribute:encoder"
                               nameFormat="urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified"/>
</resolver:AttributeDefinition>
  • 修改IDP_HOME/conf/attribute-filter.xml,添加一个AttributeFilterPolicy来允许将上一步定义的属性(如principalNameAsNameID)释放给目标SP。
XML
<afp:AttributeFilterPolicy id="releasePrincipalNameIDToHanaSP">
    <afp:PolicyRequirementRule xsi:type="basic:AttributeRequesterString" value="<SP_Entity_ID>" /> <afp:AttributeRule attributeID="principalNameAsNameID">
        <afp:PermitValueRule xsi:type="basic:ANY"/>
    </afp:AttributeRule>
</afp:AttributeFilterPolicy>

本文示例中,IdP的用户认证采用的是Apache的RemoteUser基本认证方式,即通过htpasswd文件管理用户。在真实的企业环境中,用户身份通常由LDAP(轻量级目录访问协议)或Active Directory集中管理。

1、要使Shibboleth IdP使用LDAP进行用户认证,需要进行如下调整:

修改认证处理器:编辑IdP的IDP_HOME/conf/handler.xml文件。将默认的RemoteUser登录处理器注释掉或替换为UsernamePassword类型的登录处理器,并指向JAAS配置文件。

XML
<ph:LoginHandler xsi:type="ph:UsernamePassword"
                   jaasConfigurationLocation="IDP_HOME/conf/login.config"> <ph:AuthenticationMethod>urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport</ph:AuthenticationMethod>
</ph:LoginHandler>

2、配置JAAS登录模块: 创建或修改IDP_HOME/conf/login.config文件(路径与上述jaasConfigurationLocation一致)。在此文件中配置LDAP登录模块的相关参数,如LDAP服务器地址、端口、搜索基准DN、用户绑定DN和密码、用户搜索过滤器等。

通过上述配置,Shibboleth IdP便可以将用户认证请求代理到企业内部的LDAP服务器,实现与现有身份管理体系的无缝集成。

企业在向SAP S/4HANA Cloud转型时,SAP 许可 (License) 从 On-Premise 时代的经典指定用户模型转向全新的 FUE 许可模式,且 SAP 产品的许可 (License) 包含诸如“组件授权、用户授权、计量模式”等复杂模型,这对企业来说如同一个黑匣子,难以理解其工作原理。此外,企业还面临 SAP 的 License 审计等合规性问题。郑州微酷在 SAP License 审计流程方面拥有丰富咨询经验,拥有自主研发的高效 SAP License 资产优化软件产品,欢迎企业在需要时随时联系我们,以获得我们的支持服务和软件产品试用体验。

[/panel]

相关新闻

联系我们

联系我们

130-0752-1773

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部