セルフホスト環境での認証プロバイダを探す
公開日:
カテゴリ: ソフトウェア
セルフホスト環境で使える認証プロバイダを色々探してみました。
各種機能の説明
機能比較する上で(筆者の主観で)重要な機能をピックアップします。
パスワード認証
言わずと知れた認証方式で仕組みは最も単純ですが、管理が難しく最近は下火になってきました。どのような形であれキーボード入力(マウスやタッチパネルなどを含む)が使えれば認証できます。
パスキー
パスワードの代わりに台頭してきた新しい認証方式で、一般人にも使いやすくした公開鍵認証方式です。認証器にはパスワードマネージャもしくはセキュリティキーを使います。
OpenID Connect (OIDC)
一言で言ってしまえば、〇〇でサインインの規格の1つです。アプリ自身が認証情報を持たずに外部の認証プロバイダに任せる方法です。
認証情報を持って認証するアプリをIdP(Identity Provider)、認証情報を持たずにIdPから結果を受け取ってその情報を利用するアプリをRP(Relying Party)と呼びます。
認証プロキシ
プロキシに対して認証をかける機能を追加したものです。この記事ではリバースプロキシに対して適用し、そのリバースプロキシで公開されているアプリに対してアクセス制御を行うものを指します。
認証機能のないWebページへのアクセス制御に適していますが、アプリ側が対応している場合は認証プロキシからユーザの識別情報を受け取ることもできます。
各認証プロバイダの特徴
筆者の目に入ったアプリの中から本件の内容に合いそうなものをピックアップしました。その性質上、古くからあるものを除きGo製のアプリが多いです。
Authelia
Go製の軽量なIDプロバイダです。OIDCのIdPの機能を持つようになるなど、最近じわじわと機能が増えてきています。
Authentik
統合型のIDプロバイダです。非常に高機能で大抵のことには対応していますが、どちらかというと大規模な組織やプロジェクト向けで、全体的に要求スペックが高く重めです。
Dex
OIDCで認証し、OIDCのIdPとなる、OIDCのプロキシのようなアプリです。認証情報は保持しません。
Keycloak
こちらも統合型のIDプロバイダです。こちらも高機能ですが、Java製で全体的に重めです。バックにRedHatがついています。
OAuth2 Proxy
OIDCやOAuth2で認証する認証プロキシ(単機能)です。リバースプロキシ等と組み合わせて、特定のWebサイトに認証をかけることができます。認証情報は保持しません。
Pocket ID
認証方法はパスキーのみのシンプルなOIDCのIdPです。
比較表
いずれもdocker向けのコンテナイメージが存在します。
| アプリ名 | 認証データ | パスワード | パスキー | OIDC RP | OIDC IdP | 認証プロキシ | 開発言語 |
|---|---|---|---|---|---|---|---|
| Authelia | 保持する | ○ | ○ | ×(TBD) | ○ | ○ | Go |
| Authentik | 保持する | ○ | ○ | ○ | ○ | ○ | Python |
| Dex | 保持しない | × | × | ○ | ○ | × | Go |
| Keycloak | 保持する | ○ | ○ | ○ | ○ | × | Java |
| OAuth2 Proxy | 保持しない | × | × | ○ | × | ○ | Go |
| Pocket ID | 保持する | × | ○ | × | ○ | × | Go |
どれを使う?
どのアプリもターゲットが明確である(ように見える)ため、それぞれがどのような機能や特徴を持っているかを把握できれば、自ずと選択肢が見えてくると思います。
- シンプルなIdPが欲しい場合 → Pocket ID
- OIDCの認証プロキシ機能のみ欲しい場合 → OAuth2 Proxy
- 大規模な認証基盤を構築したい場合 → Authentik / Keycloak
またOIDCのIdPとRPのアプリは、設定次第では相互接続も可能です。単機能のアプリ同士であれば、組み合わせて使うのもストレスは少なそうです。
- Pocket ID + OAuth2 Proxy
- Dex + OAuth2 Proxy
カテゴリ: ソフトウェア