繁体   English   中英

使用Keycloak保护Apigee Edge代理吗?

[英]Secure Apigee Edge proxy with keycloak?

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

我是Apigee和Keycloack的新手,经过大量搜索后,我发布了此问题,以获取有关在Apigee Edge中使用Keycloak的正确文档。 任何文章,社区答案,建议,指导,文档或POC都会有所帮助。

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

我不确定这个职位是否完整,但我认为Apigee Edge在南向分支上采用2路TLS的方法不能直接扩展为支持像KeyCloak这样的外部密钥管理服务。 Apigee trustStore和“目标端点”配置在很大程度上是固定的。 就是说,在Apigee政策中,您不必使用Apigee的目标端点概念作为流量的最终目的地。 由于Edge策略定义,JS等其他复杂性,您可以调出KeyCloak的admin API,然后使用响应对象来构造自己的对后端服务的南向2路TLS安全调用。

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

1使用KeyCloak生成JWT令牌
  • 假设完成了诸如领域,角色,用户等之类的KeyCloak的基本设置,请为用户创建JWT令牌。 (您可以使用KeyCloak领域的公钥从jwt.io验证此JWT令牌,以确保JWT令牌有效并已签名)。 可以在“ Realm Settings找到公共密钥。 参考此图像以获取公共密钥。
    添加-----BEGIN PUBLIC KEY-----并将-----END PUBLIC KEY-----附加到此复制的公共密钥,以在Apigee配置和jwt.io上使用它。 有效和可用的公共密钥如下所示:
 -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhAj9OCZd0XjzOIad2VbUPSMoVK1X8hdD2Ad+jUXCzhZJf0RaN6B+79AW5jSgceAgyAtLXiBayLlaqSjZM6oyti9gc2M2BXzoDKLye+Tgpftd72Zreb4HpwKGpVrJ3H3Ip5DNLSD4a1ovAJ6Sahjb8z34T8c1OCnf5j70Y7i9t3y/j076XIUU4vWpAhI9LRAOkSLqDUE5L/ZdPmwTgK91Dy1fxUQ4d02Ly4MTwV2+4OaEHhIfDSvakLBeg4jLGOSxLY0y38DocYzMXe0exJXkLxqHKMznpgGrbps0TPfSK0c3q2PxQLczCD3n63HxbN8U9FPyGeMrz59PPpkwIDAQAB -----END PUBLIC KEY----- 

请参阅职位从medium.com关于JWT产生的详细信息与KeyCloak。

2在Apigee中使用VerifyJWT策略
  • 假设为服务器端点创建了基本的Apigee策略,则在Proxy的PreFlow部分中添加一个AssignMessage策略以提供公共密钥,以便所有请求都将通过此策略进行处理,并将KeyCloak的公共密钥分配给一个变量。
    单击此处以了解有关在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以了解更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM