コンテンツにスキップ

OAuth2 Proxy@セキュリティ系ミドルウェア

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. OAuth2 Proxyとは

OAuth2 Proxy は、送信元からのアクセストークン署名検証リクエストを ID プロバイダーに送信する。

OAuth 2.0 をベースとした SSO (例:OAuth、OIDC など) のアクセストークン署名検証リクエストをプロキシできる。

認証処理のないアプリケーションやツールのダッシュボードに認証機能を追加できる。


02. OAuth2 Proxyの仕組み

アーキテクチャ

oauth2-proxy_architecture


03. ユースケース

クライアントからのリクエストの場合

クライアントは、OAuth2 Proxy にリクエストを送信し、認証を実施する。


リバースプロキシからのアクセストークン署名検証リクエストの場合

oauth2-proxy_kubernetes_architecture

リバースプロキシ (例:Nginx など) は、リクエストヘッダーの持つ情報 (例:認証系ヘッダー、Cookie など) から、ユーザーが認証済みであるかどうかを判定する。

ユーザーが未認証の場合、リバースプロキシはアクセストークン署名検証リクエストを OAuth2 Proxy にフォワーディングする。

OAuth2 Proxy は、指定された ID プロバイダー (例:Auth0、AWS Cognito、GitHub、Google Cloud Auth、Keycloak、Zitadel) の認可エンドポイントにアクセスアクセストークン署名検証リクエストをフォワーディングし、一連の処理の後に認可レスポンスを受信する。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    # OAuth2 Proxyへのアクセストークン署名検証リクエスト送信処理を発火させるURLを設定する
    nginx.ingress.kubernetes.io/auth-signin: http://<OAuth2 Proxyのドメイン名>/oauth2/sign_in
    # OAuth2 Proxyの認可エンドポイントを設定する
    nginx.ingress.kubernetes.io/auth-url: http://<OAuth2 Proxyのドメイン名>/oauth2/auth
    nginx.ingress.kubernetes.io/proxy-buffer-size: 512k
  name: nginx-ingress
  namespace: ingress
spec:
  ingressClassName: nginx
  rules:
    - host: foo.application.com
      http:
        paths:
          - backend:
              service:
                name: foo-application-service
                port:
                  number: 80
            path: /
            pathType: Prefix


ダッシュボード

▼ Prometheus、Alertmanager

Prometheus、Alertmanager の送信元にある Ingress は、OAuth2 Proxy に認可リクエストを送信する。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/auth-signin: http://<OAuth2 Proxyのドメイン名>/oauth2/sign_in
    nginx.ingress.kubernetes.io/auth-url: http://<OAuth2 Proxyのドメイン名>/oauth2/auth  name: nginx-ingress
  namespace: ingress
spec:
  ingressClassName: nginx
  rules:
    - host: foo.prometheus.com
      http:
        paths:
          - backend:
              service:
                name: prometheus-service
                port:
                  number: 9093
            path: /

▼ Grafana

Grafana の送信元にある Ingress は、OAuth2 Proxy に認可リクエストを送信する。

一方で、Grafana は ID プロバイダーに認可リクエストを直背的に送信できるため、OAuth2 Proxy がなくてもよい。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/auth-signin: http://<OAuth2 Proxyのドメイン名>/oauth2/sign_in
    nginx.ingress.kubernetes.io/auth-url: http://<OAuth2 Proxyのドメイン名>/oauth2/auth  name: nginx-ingress
  namespace: ingress
spec:
  ingressClassName: nginx
  rules:
    - host: foo.grafana.com
      http:
        paths:
          - backend:
              service:
                name: grafana-service
                port:
                  number: 8000
            path: /

▼ Kiali

Kiali の送信元にある Ingress は、OAuth2 Proxy に認可リクエストを送信する。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/auth-signin: http://<OAuth2 Proxyのドメイン名>/oauth2/sign_in
    nginx.ingress.kubernetes.io/auth-url: http://<OAuth2 Proxyのドメイン名>/oauth2/auth  name: nginx-ingress
  namespace: ingress
spec:
  ingressClassName: nginx
  rules:
    - host: foo.kiali.com
      http:
        paths:
          - backend:
              service:
                name: kiali-service
                port:
                  number: 20001
            path: /