簡體   English   中英

使用 nginx-ingress 和 keycloak 在 kubernetes 中進行身份驗證的正確設計是什么

[英]What is proper design for authentication in kubernetes using nginx-ingress and keycloak

目標

我想使用 keycloak 作為我的 minikube 集群的 oauth/oidc 提供程序。

問題

我對可用的文檔感到困惑。

根據此文檔,ngnix-ingress 可以使用注釋處理外部身份驗證

  • nginx.ingress.kubernetes.io/auth-method
  • nginx.ingress.kubernetes.io/auth-signin

但是從文檔中不清楚這里使用了哪種身份驗證。 是 OAUTH/BASIC/SAML 嗎???

例如,我沒有找到任何變量來為入口提供 oauth CLIENTID。

其他發現

我還發現了這個項目https://github.com/oauth2-proxy/oauth2-proxy這似乎是我需要的並提供以下設計

用戶 -> ngnix-ingress -> oauth2-proxy -> keycloak

問題:

  1. 我是否必須使用 oauth2-proxy 來實現 keycloak oauth?
  2. 我說 ngnix-ingress 沒有直接連接到 keycloak 的功能是對的嗎?
  3. Is there any clear documentation about what exactly nginx.ingress.kubernetes.io/auth-method and nginx.ingress.kubernetes.io/auth-signin are doing?
  4. 是否有任何正確的方法/文檔來構建用戶 -> ngnix-ingress -> oauth2-proxy -> keycloak集成?

nginx 入口 controller 文檔提供了auth-urlauth-signin signin 的示例

...  
metadata:  
  name:  application  
  annotations:  
    nginx.ingress.kubernetes.io/auth-url: "https://$host/oauth2/auth"  
    nginx.ingress.kubernetes.io/auth-signin: "https://$host/oauth2/start?rd=$escaped_request_uri"  
  ...

請注意,此功能僅適用於兩個入口對象:

通過為單個主機部署多個 Ingress 對象來啟用此功能。 一個 Ingress object 沒有特殊的注解並處理身份驗證。

然后其他 Ingress 對象可以被注釋,要求用戶對第一個 Ingress 的端點進行身份驗證,並且可以將401重定向到同一個端點。

文檔展示了如何使用這兩個入口對象以實現此功能的一個很好的示例。

所以這里的第一個入口指向/oauth2路徑,然后在單獨的入口 object 中定義,因為這個入口沒有為自己配置身份驗證。

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/auth-url: "https://$host/oauth2/auth"
    nginx.ingress.kubernetes.io/auth-signin: "https://$host/oauth2/start?rd=$escaped_request_uri"
  name: external-auth-oauth2
  namespace: MYNAMESPACE
spec:
  rules:
  - host: foo.bar.com

前面提到的第二個入口定義了同一域下的/oauth2路徑並指向您的 ouauth2 代理部署,這也回答了您的一個問題

第二個 ingress 對象定義了同域下的/oauth2路徑,並指向 oauth2-proxy 部署:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: oauth2-proxy
  namespace: MYNAMESPACE
  annotations:
    cert-manager.io/cluster-issuer: designate-clusterissuer-prod
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - backend:
          serviceName: oauth2-proxy
          servicePort: 80
        path: /oauth2

Is there any clear documentation about what exactly nginx.ingress.kubernetes.io/auth-method and nginx.ingress.kubernetes.io/auth-signin are doing?

auth-method注釋指定要使用的 HTTP 方法,而auth-signin signin 指定錯誤頁面的位置。 請在此處查看有效的 nginx 控制器方法。

需要了解/考慮的幾點:

  1. 主要目標是什么:

    -- 使用 OIDC 和 keycloak 對 kubernetes集群進行身份驗證?

    -- 使用 dex: https://dexidp.io/docs/kubernetes/

    -- minikube openid 認證

  2. 使用 keycloak保護應用程序和服務

    Keycloak 支持 OpenID Connect(OAuth 2.0 的擴展)和 SAML 2.0。 在保護客戶端和服務時,您需要決定的第一件事是您將使用兩者中的哪一個。 如果您願意,您還可以選擇使用 OpenID Connect 保護一些,使用 SAML 保護其他一些。

    為了保護客戶端和服務,您還需要一個適用於您選擇的協議的適配器或庫。 Keycloak 自帶適用於選定平台的適配器,但也可以使用通用OpenID Connect 依賴方和 SAML 服務提供程序庫。

    在大多數情況下,Keycloak 建議使用 OIDC。 例如,OIDC 也更適合 HTML5/JavaScript 應用程序,因為它比 SAML 更容易在客戶端實現。

    另請查看使用 Keycloak 文檔向您的 Kubernetes Web 應用程序添加身份驗證

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM