コンテンツにスキップ

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プロバイダー (例:Keycloak、など) の認可エンドポイントにトークン検証リクエストを転送し、一連の処理の後に認可レスポンスを受信する。

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: /