基于 Traefik 的 ForwardAuth 配置

简介: 基于 Traefik 的 ForwardAuth 配置

前言

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
YAML

另外一般出于安全,会再加一些安全相关的 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
YAML

当然,也是出于安全,会用到 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
YAML

🎉完成!

使用 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"
YAML

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
YAML

需要用到 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
BASH

🎉完成!

📚️参考文档

EOF

相关文章
|
缓存 Prometheus Kubernetes
kubernetes 【网络组件】coredns【1】配置使用详解
kubernetes 【网络组件】coredns【1】配置使用详解
kubernetes 【网络组件】coredns【1】配置使用详解
|
4月前
|
Kubernetes 负载均衡 应用服务中间件
使用 Kubeadm 部署 Kubernetes(K8S) 安装 -- Ingress-Ngnix
使用 Kubeadm 部署 Kubernetes(K8S) 安装 -- Ingress-Ngnix
107 0
|
Kubernetes 应用服务中间件 Linux
kubernetes 部署 nginx-ingress-controller
kubernetes 部署 nginx-ingress-controller
293 0
|
Kubernetes 负载均衡 应用服务中间件
k8s部署nginx(Pod、Deployment、Service)
k8s部署nginx(Pod、Deployment、Service)
2982 0
k8s部署nginx(Pod、Deployment、Service)
|
负载均衡 网络架构 Docker
Traefik
Traefik 是一款开源的反向代理和负载均衡工具,它可以自动地为容器化的应用程序提供动态路由和负载均衡服务。Traefik 支持多种后端服务,并且可以根据容器的标签和元数据自动发现和配置后端服务。
581 1
|
Kubernetes 负载均衡 应用服务中间件
22-Kubernetes-Service详解-Ingress介绍
22-Kubernetes-Service详解-Ingress介绍
|
弹性计算 负载均衡 Kubernetes
你所不了解的 Traefik
在之前的文章中,我们简单介绍了关于 Traefik 的相关概念及组件原理机制,具体可参考:为什么选择 Traefik Ingress ?
219 0
|
Kubernetes Cloud Native 中间件
为什么选择 Traefik Ingress ?
何为 Traefik Ingress ? 在解析此概念之前,我们回顾下 Kubernetes 生态组件 Ingress Controller (中文释义:入口控制器)的概念。
135 0
|
应用服务中间件 网络安全 nginx
Kubernetes Nginx Ingress Controller源码分析
main controllers/nginx/pkg/cmd/controller/main.go:29 func main() { // start a new nginx controller ngx := newNGINXController() // create a custom .
2533 0
|
域名解析 Kubernetes 负载均衡
《Kubernetes》,你需要掌握的 Service 和 Ingress
本文主要介绍 k8s中的网络设置
338 0