traefik ingress 在 AWS EKS 上使用 keycloak 身份验证

traefik ingress with keycloak authentication on AWS EKS

我们正在 AWS EKS 上开发基于企业微服务架构的产品。我们有几个应用程序作为单独的容器部署在 EKS 上。
我们在所有这些应用程序前面部署了 traefik ingress controller(使用 LB 服务作为 ELB)和 ingress 服务来路由到特定服务。这工作得很好。到目前为止一切顺利。
我们还为 auth 部署了 keycloak 容器,它也可以正常工作。

现在,我们想将 traefik 与 keycloak 集成,这样任何进入 traefik 的请求都应该进入 keycloak auth/SSO,然后重定向到原始调用所在的特定服务。
这是我们努力取得任何进展的地方。先有几点疑惑:

1) 有traefik forward-auth。这个可以用在这里吗?任何 example/link 将不胜感激。如果是 kubernetes.
2)有keycloak-gatekeeper。据我了解,它被部署为主要应用程序的边车,并完成所有的授权工作。我的问题是,在边车设计中,每个应用程序都会有自己的看门人。因此,一旦登录到应用程序或服务,用户如果想访问不同的应用程序,就需要再次进行身份验证。我们不希望这样,我们希望 SSO 会话适用于所有应用程序。
其次,我们如何在网守配置中提供动态 upstream-url,例如/service1 应该自动重定向到 gatekeeper 到 service1 和类似的 service2 等等。

我们无法决定要走哪条路。这两种主要用于 kubernetes 部署的方法的文档都很有限。我们可以在这里采取其他方法吗?
请帮忙。如果您需要更多详细信息,请告诉我。

更新1:
现在,我继续使用 keycloak-gatekeeper。我把它作为我的 kibana pod 的边车。以下是网守的 yml 部分:

    containers:
      - name: gatekeeper-sidecar
          image: keycloak/keycloak-gatekeeper
            ports:
            - containerPort: 3000 # expose port 3000
            args:
            - --discovery-url=http://keycloak:8080/auth/realms/realm1
            - --secure-cookie=false
            - --enable-default-deny=true
            - --client-id=Vista
            - --client-secret=2f1aa7dd-2aa9-4fd0-956c-5c45b2bf2091
            - --listen=0.0.0.0:3000 # listen on port 3000 on all interfaces
            - --redirection-url=http://127.0.0.1:3000
            - --upstream-url=http://127.0.0.1:5601
            - --enable-logging=true
            - --enable-json-logging=true
            - --verbose=true

在我的 traefik ingress 服务中,我在下面添加了(kibana 是 kibana 应用程序的 clusterIP 服务,它具有 kibana + 网守 pods)

- match: PathPrefix(`/path1`)
    kind: Rule
    services:
    - name: kibana
      port: 3000
    middlewares:
      - name: stripprefix

现在,每当我浏览到 https://elb_host/path1, it just redirects it https://elb_host/ouath/authorize?state=<..> 并抛出 404.
我希望它首先重定向到 keycloak auth url (https://elb_host/auth/realms/realm1?..) 进行身份验证。
我也在看门人日志中成功获取了 oidc 配置。 但是在我点击 url 后,网守日志中出现以下错误:

{"level":"error","ts":1584946244.340905,"caller":"keycloak-gatekeeper/middleware.go:108","msg":"no session found in request, redirecting for authorization","error":"authentication session not found"}
{"level":"info","ts":1584946244.340992,"caller":"keycloak-gatekeeper/middleware.go:90","msg":"client  

这里可能有什么问题?请帮忙。

终于解决了问题。两个选项:
1) 要么你定义 ingress /oauth 路由到 keycloak gatekeper 本身
2) 或者在你的网守配置中有--base-uri=/path1。这会将 /path1 添加到您的所有重定向 url 中,它将根据您的入口

进行路由