使用keycloak保护Apigee Edge代理?

问题描述 投票:0回答:2

我们正在使用Apigee Edge和Backend服务器之间的双向TLS通信(使用Kubernetes中的NginxIngress公开)。但是,我们希望将Apigee Edge与keycloak集成以保护Apigee端点端点(例如https://org-name-env.apigee.net/path)。

我是Apigee和Keycloack的新手,在搜索了很多之后,我发布了这个问题,以获得关于使用Keypiloak和Apigee Edge的正确文档。任何文章,社区答案,建议,方向,文档或POC都会有所帮助。

rest keycloak apigee
2个回答
1
投票

Apigee社区是一个很好的地方问这些类型的问题https://community.apigee.com/

我对这个职位的整体情况并不是100%肯定,但我相信Apigee Edge在南行的双向TLS方法不能直接扩展,以支持像KeyCloak这样的外部密钥管理服务。 Apigee trustStore和'目标端点'配置基本上是固定的。也就是说,在您的Apigee策略中,您不必将Apigee的目标端点概念用作流量的最终目的地。由于Edge策略定义中的一些额外的复杂性,额外的JS等,您可以调用KeyCloak的管理API,然后使用响应对象构建您自己的南向双向TLS安全调用到您的后端服务。


1
投票

下面是我创建的用于进行设置的文档,并为其创建了一个markdown文档,如下所示:

1 Generating JWT token using KeyCloak
  • 假设KeyCloak的基本设置(如Realm,Roles,Users等)已完成,请为用户创建JWT令牌。 (您可以使用KeyCloak域的公钥从jwt.io验证此JWT令牌,以确保JWT令牌有效并签名)。公钥可以在Realm Settings找到。请参阅this image以获取公钥。 添加-----BEGIN PUBLIC KEY-----并将-----END PUBLIC KEY-----附加到此复制的公钥,以在Apigee配置和jwt.io中使用它。以下是有效且可用的公钥的外观:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhAj9OCZd0XjzOIad2VbUPSMoVK1X8hdD2Ad+jUXCzhZJf0RaN6B+79AW5jSgceAgyAtLXiBayLlaqSjZM6oyti9gc2M2BXzoDKLye+Tgpftd72Zreb4HpwKGpVrJ3H3Ip5DNLSD4a1ovAJ6Sahjb8z34T8c1OCnf5j70Y7i9t3y/j076XIUU4vWpAhI9LRAOkSLqDUE5L/ZdPmwTgK91Dy1fxUQ4d02Ly4MTwV2+4OaEHhIfDSvakLBeg4jLGOSxLY0y38DocYzMXe0exJXkLxqHKMznpgGrbps0TPfSK0c3q2PxQLczCD3n63HxbN8U9FPyGeMrz59PPpkwIDAQAB
-----END PUBLIC KEY-----

有关使用KeyCloak生成JWT的更多详细信息,请参阅medium.com上的this帖子。

2 Using VerifyJWT policy in Apigee
  • 假设为服务器端点创建了基本的Apigee策略,添加AssignMessage策略以在代理的PreFlow部分中提供公钥,以便所有请求将通过此策略进行,并且KeyCloak的公钥将分配给变量。 单击here以了解有关在Apigee中配置流的更多信息。 AssignMessage策略XML看起来像这样:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-1">
    <DisplayName>Assign Message-1</DisplayName>
    <Properties/>
    <AssignVariable>
        <Name>public.key</Name>
        <Value>-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhAj9OCZd0XjzOIad2VbUPSMoVK1X8hdD2Ad+jUXCzhZJf0RaN6B+79AW5jSgceAgyAtLXiBayLlaqSjZM6oyti9gc2M2BXzoDKLye+Tgpftd72Zreb4HpwKGpVrJ3H3Ip5DNLSD4a1ovAJ6Sahjb8z34T8c1OCnf5j70Y7i9t3y/j076XIUU4vWpAhI9LRAOkSLqDUubRX/ZdPmwTgK91Dy1fxUQ4d02Ly4MTwV2+4OaEHhIfDSvakLBeg4jLGOSxLY0y38DocYzMXe0exJXkLxqHKMznpgGrbps0TPfSK0c3q2PxQLczCD3n63HxbN8U9FPyGeMrz59PPpkwIDAQAB
-----END PUBLIC KEY-----</Value>
        <Ref/>
    </AssignVariable>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <AssignTo createNew="false" transport="http" type="request"/>
</AssignMessage>

注意:始终建议使用KeyValueMap而不是直接使用私钥或秘密等值。

  • 下一步是使用JWTPolicy使用上一步中指定的公钥验证JWT令牌。提及在PublicKey标记中具有公钥作为其值的变量名称。最终的XML文件如下所示。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<VerifyJWT async="false" continueOnError="false" enabled="true" name="Verify-JWT-1">
    <DisplayName>Verify JWT-1</DisplayName>
    <Algorithm>RS256</Algorithm>
    <PublicKey>
        <Value ref="public.key"/>
    </PublicKey>
    <Subject>Subject from the JWT token</Subject>
    <Issuer>http://issue-of-the-token.com</Issuer>
    <Audience>aud1,aud2</Audience>
</VerifyJWT>

注意:可以使用AdditionalClaims标记验证其他输入。 点击AssignMessageJWTPolicyKeyValueMap了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.