Homelabの各サービスに認証をかけたいけれど、本格的なSSO基盤を運用するのは少し重い……。そんな時に便利なのが、Tinyauthです。名前の通り非常に軽量で、Proxy認証を手軽に導入できます。
今回は、OIDC ProviderにPocket IDを組み合わせた構築プロセスを、実際のマニフェスト例を交えて記録します。
基本的には、以下の公式ガイドに沿って作業を進めました。
Use Pocket ID as an OAuth provider in Tinyauth.
作業の流れ
今回は以下のような流れで設定を行いました。
- Pocket ID側でプロバイダを作成し、クライアントIDとシークレットを取得
- TinyauthをクライアントID、シークレットを使ってデプロイ
- 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 snippetenv: - 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/v1alpha1kind: Middlewaremetadata: name: tinyauth-auth namespace: app-namespacespec: forwardAuth: address: http://tinyauth.tinyauth.svc.cluster.local/api/auth/traefik trustForwardHeader: true authResponseHeaders: - X-Remote-User - X-Remote-Groups - X-Remote-EmailHTTPRouteでの適用
作成したMiddlewareを ExtensionRef フィルタとして適用します。
apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: app-route namespace: app-namespacespec: 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: 80MiddlewareのNamespaceについて
MiddlewareはClusterwideで参照できないため、各アプリケーションのNamespaceにMiddlewareを置くことにしました。
異なるNamespaceにあるリソースを参照許可する ReferenceGrant という機能もあるようですが、今回は使いませんでした。
アプリケーションのリソースは一箇所にまとめておきたいことや、アプリを追加する際に複数のNamespaceに差分を出したくないこともあり、各Namespaceに配置する形に落ち着きました。
おわりに
TinyauthとPocket IDを組み合わせて、無事にProxy認証を導入することができました。
ReferenceGrantを使えばよりスマートに管理できる可能性もありますが、現状は各NamespaceにMiddlewareを配置する構成で運用しています。 「アプリのリソースは一箇所にまとめる」「複数のNamespaceにまたがる設定を極力減らす」という運用ルールに照らし合わせると、今のところこの形が一番しっくりきています。
シンプルな構成で認証基盤を整えたい方の参考になれば幸いです。









