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

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

单点登录(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. 基础软件安装:

    • 下载并安装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安装程序。
  2. 下载IdP组件:

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

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

    • IDP_HOME/lib/endorsed/目录下的所有JAR包复制到TOMCAT_HOME/endorsed/目录下。IDP_HOMETOMCAT_HOME分别指IdP和Tomcat的安装主目录。如果Tomcat根目录下没有endorsed文件夹,则手动创建一个。
  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" />
      
  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" />
      
  7. 配置Apache反向代理:

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

      ProxyPass /idp/ ajp://localhost:8009/idp/
      
  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" />
      
  9. 配置Apache基本认证 (RemoteUser方式):

    • 在Apache的httpd.confssl.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>
      
  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为示例用户名。

  11. 测试IdP安装状态:

    • 在浏览器中访问IdP的状态页面:https://<your_idp_domain>/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>
        
  3. 错误:“NameID format is not support” (NameID格式不受支持)

    • 可能原因与解决: SP期望的NameID格式与IdP提供的不一致。通常,将NameID的nameFormat属性设置为urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified具有较好的兼容性,如上一个示例中所示。具体需参照SP端的要求进行调整。

五、 集成企业LDAP认证

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

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

  1. 修改认证处理器: 编辑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 资产优化软件产品,欢迎企业在需要时随时联系我们,以获得我们的支持服务和软件产品试用体验。

滚动至顶部