OAuth2 Proxy@セキュリティ系ミドルウェア¶
はじめに¶
本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。
01. OAuth2 Proxyとは¶
OAuth2 Proxyは、ダウンストリームからのトークン検証リクエストをIDプロバイダーにプロキシする。
OAuth 2.0をベースとしたSSO (例:OAuth、OIDC、など) のトークン検証リクエストをプロキシできる。
認証処理のないアプリケーションやツールのダッシュボードに認証機能を追加できる。
02. OAuth2 Proxyの仕組み¶
アーキテクチャ¶
03. ユースケース¶
クライアントからのリクエストの場合¶
クライアントは、OAuth2 Proxyにリクエストを送信し、認証を実施する。
リバースプロキシからのトークン検証リクエストの場合¶
リバースプロキシ (例: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: /