基於 Traefik 的 ForwardAuth 配置

東風微鳴發表於2022-12-25

前言

Traefik 是一個現代的 HTTP 反向代理和負載均衡器,使部署微服務變得容易。

Traefik 可以與現有的多種基礎設施元件(Docker、Swarm 模式、Kubernetes、Marathon、Consul、Etcd、Rancher、Amazon ECS...)整合,並自動和動態地配置自己。

系列文章:

今天我們基於 Traefik on K8S 來詳細說明如何透過 forwardauth 實現認證功能,並透過 ForwardAuth 和 OAuth 2.0 或 CAS 進行整合。

ForwardAuth 中介軟體將身份驗證委託給外部服務。如果服務響應程式碼為 2XX,則授予訪問許可權並執行原始請求。否則,將返回身份驗證伺服器的響應。

ForwardAuth 功能簡圖

ForwardAuth 的簡單配置

建立 ForwardAuth 中介軟體,具體如下:

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: forward-auth
spec:
  forwardAuth:
    # 路徑視具體情況而定
    address: http://your_auth_server/oauth2.0/validate
    authResponseHeaders:
      - Authorization
    trustForwardHeader: true

另外一般出於安全,會再加一些安全相關的 header, 如下:

apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: secure-header
spec:
  headers:
    browserXssFilter: true
    contentTypeNosniff: true
    customResponseHeaders:
      Cache-Control: max-age=31536000
      Pragma: no-cache
      Set-Cookie: secure
    forceSTSHeader: true
    stsIncludeSubdomains: true
    stsSeconds: 14400

當然,也是出於安全,會用到 HTTP 重定向到 HTTPS.

之後,建立 IngressRoute 的示例配置如下:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: alertmanager
spec:
  routes:
    - kind: Rule
      match: Host(`ewhisper.cn`) && PathPrefix(`/alertmanager/`)
      middlewares:
        - name: redirectshttps
        - name: secure-header
        - name: forward-auth
      services:
        - name: alertmanager
          port: 9093

?完成!

使用 OAuth Proxy 和 Traefik ForwardAuth 整合

建立 ForwardAuth 401 錯誤的中介軟體

Traefik v2 ForwardAuth 中介軟體允許 Traefik 透過 oauth2-agent 的 /oauth2/auth 端點對每個請求進行身份驗證,該端點只返回 202 Accepted 響應或401 Unauthorized的響應,而不代理整個請求。

oauth-errorsoauth-auth 中介軟體

---
# 用途:給 oauth url 加 headers
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: auth-headers
spec:
  headers:
    sslRedirect: true
    stsSeconds: 315360000
    browserXssFilter: true
    contentTypeNosniff: true
    forceSTSHeader: true
    sslHost: ewhisper.cn
    stsIncludeSubdomains: true
    stsPreload: true
    frameDeny: true
---
# 用途:forwardauth
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: oauth-auth
spec:
  forwardAuth:
    address: https://oauth.ewhisper.cn/oauth2/auth
    trustForwardHeader: true
---
# 用途:forwardauth 返回 401-403 後重定向到登入頁面
apiVersion: traefik.containo.us/v1alpha1
kind: Middleware
metadata:
  name: oauth-errors
spec:
  errors:
    status:
      - "401-403"
    service: oauth-backend
    query: "/oauth2/sign_in"

oauth 的 IngressRoute 配置:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: oauth
spec:
  routes:
    - kind: Rule
      match: "Host(`ewhisper.cn`, `oauth.ewhisper.cn`) && PathPrefix(`/oauth2/`)"
      middlewares:
        - name: auth-headers
      services:
        - name: oauth-backend
          port: 4180

需要用到 oauth 的其他應用的 IngressRoute 配置:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: alertmanager
spec:
  routes:
    - kind: Rule
      match: Host(`ewhisper.cn`) && PathPrefix(`/alertmanager/`)
      middlewares:
        - name: redirectshttps     
        - name: oauth-errors
        - name: oauth-auth
      services:
        - name: alertmanager
          port: 9093

?完成!

?️參考文件

EOF

三人行, 必有我師; 知識共享, 天下為公. 本文由東風微鳴技術部落格 EWhisper.cn 編寫.

相關文章