「TinyauthとPocket IDで構築する、Kubernetes上の軽量Proxy認証基盤」

4分で読了
Progress 11 / 18
目次

Homelabの各サービスに認証をかけたいけれど、本格的なSSO基盤を運用するのは少し重い……。そんな時に便利なのが、Tinyauthです。名前の通り非常に軽量で、Proxy認証を手軽に導入できます。

今回は、OIDC ProviderにPocket IDを組み合わせた構築プロセスを、実際のマニフェスト例を交えて記録します。

基本的には、以下の公式ガイドに沿って作業を進めました。

Pocket ID OAuth

Use Pocket ID as an OAuth provider in Tinyauth.

tinyauth.app

作業の流れ

今回は以下のような流れで設定を行いました。

  1. Pocket ID側でプロバイダを作成し、クライアントIDとシークレットを取得
  2. TinyauthをクライアントID、シークレットを使ってデプロイ
  3. TinyauthのエンドポイントをHTTPRouteでプロバイダに設定

Tinyauthをデプロイメントで起動させる際、環境変数でClient IDやSecretなどを与える形式になっています。 そのため、OIDC ProviderごとにTinyauthを一つ立てる必要がありそうでした。

1. Pocket IDの設定

まずはPocket ID側でOIDC Clientを作成しました。 ここで発行されるクライアントIDとシークレットは後で使うので、控えておきます。

2. Tinyauthのデプロイ

先ほど取得したクライアントIDとシークレットを使用して、Tinyauthをデプロイしました。 以下は、Pocket IDとの連携設定を含むデプロイメントの例(一部抜粋・マスク済み)です。

# Tinyauth Deployment snippet
env:
- name: APP_URL
value: "https://auth.example.com"
- name: SECRET
valueFrom:
secretKeyRef:
name: tinyauth-secret
key: SECRET
# Pocket ID OIDC Configuration
- name: PROVIDERS_POCKETID_NAME
value: "PocketID"
- name: PROVIDERS_POCKETID_AUTH_URL
value: "https://id.example.com/authorize"
- name: PROVIDERS_POCKETID_TOKEN_URL
value: "https://id.example.com/api/oidc/token"
- name: PROVIDERS_POCKETID_USER_INFO_URL
value: "https://id.example.com/api/oidc/userinfo"
- name: PROVIDERS_POCKETID_REDIRECT_URL
value: "https://auth.example.com/api/oauth/callback/pocketid"

3. HTTPRouteとMiddlewareの設定

最後に、TraefikのForwardAuth設定とGateway API(HTTPRoute)の設定を行いました。

Traefik Middleware (ForwardAuth)

認証をリクエストするMiddlewareの定義です。address にはTinyauthの内部サービスURLを指定します。

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: tinyauth-auth
namespace: app-namespace
spec:
forwardAuth:
address: http://tinyauth.tinyauth.svc.cluster.local/api/auth/traefik
trustForwardHeader: true
authResponseHeaders:
- X-Remote-User
- X-Remote-Groups
- X-Remote-Email

HTTPRouteでの適用

作成したMiddlewareを ExtensionRef フィルタとして適用します。

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: app-route
namespace: app-namespace
spec:
parentRefs:
- name: traefik-gateway
namespace: traefik
hostnames:
- "app.example.com"
rules:
- filters:
- type: ExtensionRef
extensionRef:
group: traefik.io
kind: Middleware
name: tinyauth-auth
matches:
- path:
type: PathPrefix
value: /
backendRefs:
- name: app-service
port: 80

MiddlewareのNamespaceについて

MiddlewareはClusterwideで参照できないため、各アプリケーションのNamespaceにMiddlewareを置くことにしました。

異なるNamespaceにあるリソースを参照許可する ReferenceGrant という機能もあるようですが、今回は使いませんでした。 アプリケーションのリソースは一箇所にまとめておきたいことや、アプリを追加する際に複数のNamespaceに差分を出したくないこともあり、各Namespaceに配置する形に落ち着きました。

おわりに

TinyauthとPocket IDを組み合わせて、無事にProxy認証を導入することができました。

ReferenceGrantを使えばよりスマートに管理できる可能性もありますが、現状は各NamespaceにMiddlewareを配置する構成で運用しています。 「アプリのリソースは一箇所にまとめる」「複数のNamespaceにまたがる設定を極力減らす」という運用ルールに照らし合わせると、今のところこの形が一番しっくりきています。

シンプルな構成で認証基盤を整えたい方の参考になれば幸いです。