搜索

2.4. 使用 SAML 保护应用程序

download PDF

您可以使用 Keycloak SAML 适配器功能 pack 提供的 Galleon 层使用安全断言标记语言(SAML)来保护 Web 应用程序。

有关 Keycloak SAML 适配器功能 pack 的详情,请参考 Keycloak SAML 适配器功能 pack 来使用 SAML 保护应用程序

要使用 SAML 保护应用程序,请按照以下步骤执行:

2.4.1. 在 JBoss EAP 中使用 SAML 的应用程序安全性

Keycloak SAML 适配器 Galleon pack 是一个 Galleon 功能 pack,包含三个层: keycloak-samlkeycloak-client-samlkeycloak-client-saml-ejb。使用功能软件包中的层在 JBoss EAP 中安装必要的模块和配置,以使用红帽构建的 Keycloak 作为使用安全断言标记语言(SAML)的单点登录。

下表描述了每个层的用例。

layer适用于描述

keycloak-saml

OpenShift

将此层用于 Source 到镜像(s2i),并自动注册 SAML 客户端。您必须将这个层与 cloud-default-config 层一起使用。

keycloak-client-saml

裸机、OpenShift

将此层用于裸机上的 Web 应用程序,以及 CLI 脚本或部署配置中提供的 keycloak-saml 子系统配置的 Source 到镜像(s2i)。

keycloak-client-saml-ejb

裸机

将这个层用于您要传播身份到 Jakarta Enterprise Beans 的应用。

要启用 SAML 的使用,您可以配置 keycloak-saml 子系统或应用程序本身。

部署配置

要使用部署描述符使用 SAML 保护应用程序,请更新应用程序的部署配置,如下所示:

  • 在应用部署描述符 web.xml 文件中,将 auth-method 属性设置为 SAML

    部署描述符更新示例

    <login-config>
        <auth-method>SAML</auth-method>
    </login-config>

  • 使用 SAML 配置信息,在 WEB-INF 目录中创建一个名为 keycloak-saml.xml 的文件。您可以从 SAML 供应商获取此文件。

    keycloak-saml.xml示例

    <keycloak-saml-adapter>
        <SP entityID=""
            sslPolicy="EXTERNAL"
            logoutPage="SPECIFY YOUR LOGOUT PAGE!">
            <Keys>
                <Key signing="true">
                    <PrivateKeyPem>PRIVATE KEY NOT SET UP OR KNOWN</PrivateKeyPem>
                    <CertificatePem>...</CertificatePem>
                </Key>
            </Keys>
            <IDP entityID="idp"
                 signatureAlgorithm="RSA_SHA256"
                 signatureCanonicalizationMethod="http://www.w3.org/2001/10/xml-exc-c14n#">
                <SingleSignOnService signRequest="true"
                                     validateResponseSignature="true"
                                     validateAssertionSignature="false"
                                     requestBinding="POST"
                                     bindingUrl="http://localhost:8180/realms/example_saml_realm/protocol/saml"/>
                <SingleLogoutService signRequest="true"
                                     signResponse="true"
                                     validateRequestSignature="true"
                                     validateResponseSignature="true"
                                     requestBinding="POST"
                                     responseBinding="POST"
                                     postBindingUrl="http://localhost:8180/realms/example_saml_realm/protocol/saml"
                                     redirectBindingUrl="http://localhost:8180/realms/example_saml_realm/protocol/saml"/>
            </IDP>
        </SP>
    </keycloak-saml-adapter>

    PrivateKeyPem 的值和 CertificatePem 对每个客户端都是唯一的。

子系统配置

您可以通过配置 keycloak-saml 子系统来保护使用 SAML 的应用程序。您可以从红帽构建的 Keycloak 获取包含子系统配置命令的客户端配置文件。如需更多信息,请参阅生成客户端适配器配置

2.4.2. 在红帽构建的 Keycloak 中创建 SAML 客户端

在红帽构建的 Keycloak 中创建一个安全断言标记语言(SAML)客户端,以用于 JBoss EAP 来保护应用程序。

以下流程概述了使用红帽构建的 Keycloak 部署至 JBoss EAP 的应用程序以进行测试所需的最小步骤。有关详细配置,请参阅红帽构建的 Keycloak 服务器管理指南中的创建 SAML 客户端

先决条件

流程

  1. 导航到红帽构建的 Keycloak Admin 控制台。
  2. 创建客户端。

    1. 单击 Clients,然后单击 Create client
    2. 选择 SAML 作为客户端 类型
    3. 输入您要保护为客户端 ID 的应用程序的 URL。例如: http://localhost:8080/simple-webapp-example/secured/

      重要

      客户端 ID 必须与应用程序的 URL 完全匹配。如果客户端 ID 不匹配,您会收到类似如下的错误:

      2023-05-17 19:54:31,586 WARN  [org.keycloak.events] (executor-thread-0) type=LOGIN_ERROR, realmId=eba0f106-389f-4216-a676-05fcd0c0c72e, clientId=null, userId=null, ipAddress=127.0.0.1, error=client_not_found, reason=Cannot_match_source_hash
    4. 输入客户端名称。例如,jbeap-saml
    5. 点击 Next
    6. 输入以下信息:

现在,您可以使用配置的客户端来保护 JBoss EAP 上部署的 Web 应用。如需更多信息,请参阅使用 SAML 保护 Web 应用程序

2.4.3. 使用 SAML 保护 Web 应用程序

Keycloak SAML 适配器功能 pack 为非 OpenShift 部署提供两个层: keycloak-client-samlkeycloak-client-saml-ejb。使用 keycloak-client-saml 层来保护 servlet based-web 应用,以及 keycloak-client-saml-ejb 来保护 Jakarta Enterprise Beans 应用。

您可以将应用程序配置为使用 SAML 的方法有两种:

  • 通过配置 keycloak-saml 子系统。

    如果您不想在应用程序部署中添加配置,请使用此方法。

  • 通过更新部署配置

    如果您不想向服务器添加配置,并更喜欢在应用程序部署中保留配置,则使用此方法。

先决条件

流程

  1. 使用 jboss-eap-installation-manager 将所需的 Keycloak SAML 适配器层添加到服务器。以下是可用层的详情:

  2. 配置应用程序的 web.xml 以保护应用程序资源。

    <?xml version="1.0" encoding="UTF-8"?>
    
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
        metadata-complete="false">
    
        <security-constraint>
            <web-resource-collection>
                <web-resource-name>secured</web-resource-name>
                <url-pattern>/secured</url-pattern>
            </web-resource-collection>
    
            <auth-constraint>
                <role-name>Admin</role-name>    1
            </auth-constraint>
        </security-constraint>
    
        <security-role>
            <role-name>*</role-name>
        </security-role>
    </web-app>
    1
    仅允许具有 Admin 角色的用户访问应用。要允许具有任何角色的用户访问应用程序,请使用通配符 ** 作为 role-name 的值。
  3. 使用管理 CLI 或更新应用部署,使用 SAML 保护应用程序。

    • 通过更新应用部署。

      1. 在应用程序的 web.xml 中添加登录配置,并将身份验证方法指定为 SAML。

        <web-app>
        ...
            <login-config>
                <auth-method>SAML</auth-method>     1
            </login-config>
        ...
        </web-app>
        1
        使用 SAML 保护应用程序。
      2. 从红帽构建的 Keycloak 下载配置 keycloak-saml.xml 文件,并将它保存到应用程序的 WEB-INF/ 目录中。

        如需更多信息,请参阅生成客户端适配器配置

        keycloak-saml.xml示例

        <keycloak-saml-adapter>
            <SP entityID=""
                sslPolicy="EXTERNAL"
                logoutPage="SPECIFY YOUR LOGOUT PAGE!">
                <Keys>
                    <Key signing="true">
                        <PrivateKeyPem>PRIVATE KEY NOT SET UP OR KNOWN</PrivateKeyPem>
                        <CertificatePem>...</CertificatePem>
                    </Key>
                </Keys>
                <IDP entityID="idp"
                     signatureAlgorithm="RSA_SHA256"
                     signatureCanonicalizationMethod="http://www.w3.org/2001/10/xml-exc-c14n#">
                    <SingleSignOnService signRequest="true"
                                         validateResponseSignature="true"
                                         validateAssertionSignature="false"
                                         requestBinding="POST"
                                         bindingUrl="http://localhost:8180/realms/example_saml_realm/protocol/saml"/>
                    <SingleLogoutService signRequest="true"
                                         signResponse="true"
                                         validateRequestSignature="true"
                                         validateResponseSignature="true"
                                         requestBinding="POST"
                                         responseBinding="POST"
                                         postBindingUrl="http://localhost:8180/realms/example_saml_realm/protocol/saml"
                                         redirectBindingUrl="http://localhost:8180/realms/example_saml_realm/protocol/saml"/>
                </IDP>
            </SP>
        </keycloak-saml-adapter>

        PrivateKeyPem 的值和 CertificatePem 对每个客户端都是唯一的。

    • 通过使用管理 CLI。

      1. 从红帽构建的 Keycloak 下载客户端配置文件 keycloak-saml-subsystem.cli

        如需更多信息,请参阅生成客户端适配器配置

        keycloak-saml-subsystem.cli示例

        /subsystem=keycloak-saml/secure-deployment=YOUR-WAR.war/:add
        
        /subsystem=keycloak-saml/secure-deployment=YOUR-WAR.war/SP="http://localhost:8080/simple-webapp-example/"/:add(sslPolicy=EXTERNAL,logoutPage="SPECIFY YOUR LOGOUT PAGE!"
        
        /subsystem=keycloak-saml/secure-deployment=YOUR-WAR.war/SP="http://localhost:8080/simple-webapp-example/"/Key=KEY1:add(signing=true, \
        PrivateKeyPem="...", CertificatePem="...")
        
        /subsystem=keycloak-saml/secure-deployment=YOUR-WAR.war/SP="http://localhost:8080/simple-webapp-example/"/IDP=idp/:add( \
            SingleSignOnService={ \
                signRequest=true, \
                validateResponseSignature=true, \
                validateAssertionSignature=false, \
                requestBinding=POST, \
                bindingUrl=http://localhost:8180/realms/example-saml-realm/protocol/saml}, \
            SingleLogoutService={ \
                signRequest=true, \
                signResponse=true, \
                validateRequestSignature=true, \
                validateResponseSignature=true, \
                requestBinding=POST, \
                responseBinding=POST, \
                postBindingUrl=http://localhost:8180/realms/example-saml-realm/protocol/saml, \
                redirectBindingUrl=http://localhost:8180/realms/example-saml-realm/protocol/saml} \
        )
        
        /subsystem=keycloak-saml/secure-deployment=YOUR-WAR.war/SP="http://localhost:8080/simple-webapp-example/"/IDP=idp/:write-attribute(name=signatureAlgorithm,value=RSA_SHA256)
        
        /subsystem=keycloak-saml/secure-deployment=YOUR-WAR.war/SP="http://localhost:8080/simple-webapp-example/"/IDP=idp/:write-attribute(name=signatureCanonicalizationMethod,value=http://www.w3.org/2001/10/xml-exc-c14n#)

        PrivateKeyPem 的值和 CertificatePem 对每个客户端都是唯一的。

      2. 使用应用程序 WAR 的名称(如 simple-webapp-example.war )更新客户端配置文件中出现的每个 WAR.war。

        注意

        生成的 CLI 脚本在第二个语句的末尾缺少

        /subsystem=keycloak-saml/secure-deployment=YOUR-WAR.war/SP=""/:add(sslPolicy=EXTERNAL,logoutPage="SPECIFY YOUR LOGOUT PAGE!"

        您必须添加缺少的

      3. 使用管理 CLI 运行 keycloak-saml-subsystem.cli 脚本来配置 JBoss EAP。

        $ <EAP_HOME>/bin/jboss-cli.sh -c --file=<path_to_the_file>/keycloak-saml-subsystem.cli
  4. 部署应用。

    $ mvn wildfly:deploy

验证

  1. 在浏览器中,导航到应用 URL。例如: http://localhost:8080/simple-webapp-example/secured

    您将被重定向到红帽构建的 Keycloak 登录页面。

  2. 您可以使用您在红帽构建的 Keycloak 中定义的用户凭证登录。

您的应用程序现在使用 SAML 进行保护。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.