使用密钥斗篷保护 Apigee Edge 代理?
Secure Apigee Edge proxy with keycloak?
我们在 Apigee Edge 和后端服务器(使用 Kubernetes 中的 NginxIngress 公开)之间使用双向 TLS 通信。但是,我们希望将 Apigee Edge 与 keycloak 集成以保护 Apigee Endpoint 端点(例如 https://org-name-env.apigee.net/path)。
我是 Apigee 和 Keycloack 的新手,经过大量搜索后,我发布了这个问题,以获取有关将 Keycloak 与 Apigee Edge 结合使用的正确文档。任何文章、社区答案、建议、方向、文档或 POC 都会有所帮助。
Apigee 社区是提出此类问题的好地方https://community.apigee.com/
我不是 100% 确定这个位置的全部,但我相信 Apigee Edge 在南向腿上的双向 TLS 方法不能直接扩展以支持外部密钥管理服务,例如钥匙斗篷。 Apigee trustStore 和 'target endpoint' 配置已基本修复。也就是说,在您的 Apigee 政策中,您不必使用 Apigee 的目标端点概念作为流量的最终目的地。由于 Edge 策略定义中的一些额外的复杂性、额外的 JS 等,您可以调用 KeyCloak 的管理员 API,然后使用响应对象构建您自己的南向双向 TLS 安全调用到您的后台 -结束服务。
下面是我为进行设置而创建的文档,并为此创建了一个降价文档,如下所示:
1 使用KeyCloak生成JWT token
- 假设完成了 KeyCloak 的基本设置,如领域、角色、用户等, 为用户创建 JWT 令牌。 (您可以使用 KeyCloak 领域的 public 密钥从 jwt.io 验证此 JWT 令牌,以确保 JWT 令牌有效且已签名)。 public 键可以在
Realm Settings
中找到。参考this image得到public键。
添加 -----BEGIN PUBLIC KEY-----
并将 -----END PUBLIC KEY-----
附加到这个复制的 public 密钥,以便在 Apigee 配置和 jwt.io 上使用它。以下是有效且可用的 public 密钥的样子:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhAj9OCZd0XjzOIad2VbUPSMoVK1X8hdD2Ad+jUXCzhZJf0RaN6B+79AW5jSgceAgyAtLXiBayLlaqSjZM6oyti9gc2M2BXzoDKLye+Tgpftd72Zreb4HpwKGpVrJ3H3Ip5DNLSD4a1ovAJ6Sahjb8z34T8c1OCnf5j70Y7i9t3y/j076XIUU4vWpAhI9LRAOkSLqDUE5L/ZdPmwTgK91Dy1fxUQ4d02Ly4MTwV2+4OaEHhIfDSvakLBeg4jLGOSxLY0y38DocYzMXe0exJXkLxqHKMznpgGrbps0TPfSK0c3q2PxQLczCD3n63HxbN8U9FPyGeMrz59PPpkwIDAQAB
-----END PUBLIC KEY-----
有关使用 KeyCloak 生成 JWT 的更多详细信息,请参阅 medium.com 中的 this post。
2 在 Apigee 中使用 VerifyJWT 策略
- 假设为服务器端点创建了基本的 Apigee 策略, 添加一个 AssignMessage policy to give the public key in the PreFlow section of the Proxy, so that all the requests will go via this policy and a public key of KeyCloak will be assigned to a variable.
Click 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 使用上一步分配的 public 密钥验证 JWT 令牌。在 PublicKey 标记中提及以 public 键作为其值的变量名称。
最终的 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 标签验证其他输入。
点击 AssignMessage、JWTPolicy 或 KeyValueMap 了解更多。
我们在 Apigee Edge 和后端服务器(使用 Kubernetes 中的 NginxIngress 公开)之间使用双向 TLS 通信。但是,我们希望将 Apigee Edge 与 keycloak 集成以保护 Apigee Endpoint 端点(例如 https://org-name-env.apigee.net/path)。
我是 Apigee 和 Keycloack 的新手,经过大量搜索后,我发布了这个问题,以获取有关将 Keycloak 与 Apigee Edge 结合使用的正确文档。任何文章、社区答案、建议、方向、文档或 POC 都会有所帮助。
Apigee 社区是提出此类问题的好地方https://community.apigee.com/
我不是 100% 确定这个位置的全部,但我相信 Apigee Edge 在南向腿上的双向 TLS 方法不能直接扩展以支持外部密钥管理服务,例如钥匙斗篷。 Apigee trustStore 和 'target endpoint' 配置已基本修复。也就是说,在您的 Apigee 政策中,您不必使用 Apigee 的目标端点概念作为流量的最终目的地。由于 Edge 策略定义中的一些额外的复杂性、额外的 JS 等,您可以调用 KeyCloak 的管理员 API,然后使用响应对象构建您自己的南向双向 TLS 安全调用到您的后台 -结束服务。
下面是我为进行设置而创建的文档,并为此创建了一个降价文档,如下所示:
1 使用KeyCloak生成JWT token- 假设完成了 KeyCloak 的基本设置,如领域、角色、用户等, 为用户创建 JWT 令牌。 (您可以使用 KeyCloak 领域的 public 密钥从 jwt.io 验证此 JWT 令牌,以确保 JWT 令牌有效且已签名)。 public 键可以在
Realm Settings
中找到。参考this image得到public键。
添加-----BEGIN PUBLIC KEY-----
并将-----END PUBLIC KEY-----
附加到这个复制的 public 密钥,以便在 Apigee 配置和 jwt.io 上使用它。以下是有效且可用的 public 密钥的样子:
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhAj9OCZd0XjzOIad2VbUPSMoVK1X8hdD2Ad+jUXCzhZJf0RaN6B+79AW5jSgceAgyAtLXiBayLlaqSjZM6oyti9gc2M2BXzoDKLye+Tgpftd72Zreb4HpwKGpVrJ3H3Ip5DNLSD4a1ovAJ6Sahjb8z34T8c1OCnf5j70Y7i9t3y/j076XIUU4vWpAhI9LRAOkSLqDUE5L/ZdPmwTgK91Dy1fxUQ4d02Ly4MTwV2+4OaEHhIfDSvakLBeg4jLGOSxLY0y38DocYzMXe0exJXkLxqHKMznpgGrbps0TPfSK0c3q2PxQLczCD3n63HxbN8U9FPyGeMrz59PPpkwIDAQAB
-----END PUBLIC KEY-----
有关使用 KeyCloak 生成 JWT 的更多详细信息,请参阅 medium.com 中的 this post。
2 在 Apigee 中使用 VerifyJWT 策略- 假设为服务器端点创建了基本的 Apigee 策略, 添加一个 AssignMessage policy to give the public key in the PreFlow section of the Proxy, so that all the requests will go via this policy and a public key of KeyCloak will be assigned to a variable.
Click 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 使用上一步分配的 public 密钥验证 JWT 令牌。在 PublicKey 标记中提及以 public 键作为其值的变量名称。 最终的 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 标签验证其他输入。
点击 AssignMessage、JWTPolicy 或 KeyValueMap 了解更多。