OSS認証・認可比較:Keycloak vs Authentik vs Ory でAuth0を脱却する
オープンソースラボ編集部 ・ 2026年6月13日
OSS認証・認可比較:Keycloak vs Authentik vs Ory でAuth0を脱却する
Auth0(月$23/1000MAU〜)・Okta(月$2/ユーザー〜)・Firebase Auth(月$0.0055/MAU〜)に対して、Keycloak(Red Hat製のエンタープライズOSS IdP)・Authentik(モダンUIのOSS SSO)・Ory(マイクロサービス向けOSS認証)はIDaaSをセルフホストできます。
OSS認証をセルフホストする理由
- コスト: Auth0 Growth(月$240/10K MAU)→ KeycloakセルフホストはVPS代のみ
- GDPR/個人情報保護法: ユーザー認証情報を自社サーバーで管理・EUへのデータ転送なし
- カスタマイズ: ログイン画面・メール・認証フローを完全にカスタマイズ
- プロトコル: SAML・OIDC・OAuth2・LDAP・SCIM を単一プラットフォームで対応
主要ツールの概要
Keycloak
2014年Red Hat公開、Java/Quarkus製のOSSです。GitHubスター23k+。SAML・OIDC・OAuth2・LDAP/Active Directory統合を備えたエンタープライズグレードのOSS IDプロバイダです。大企業・政府機関・大学での採用実績が豊富です。
# docker-compose.yml - Keycloak 24 + PostgreSQL
version: '3.8'
services:
keycloak:
image: quay.io/keycloak/keycloak:24.0.3
restart: unless-stopped
ports:
- "8080:8080"
environment:
KC_DB: postgres
KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
KC_DB_USERNAME: keycloak
KC_DB_PASSWORD: ${DB_PASSWORD}
KC_HOSTNAME: auth.yourcompany.com
KC_PROXY: edge # nginx/Cloudflare等のリバースプロキシを使う場合
KEYCLOAK_ADMIN: admin
KEYCLOAK_ADMIN_PASSWORD: ${KEYCLOAK_ADMIN_PASSWORD}
KC_HTTP_ENABLED: "true"
KC_HTTP_PORT: "8080"
command: start
depends_on:
- postgres
volumes:
- ./themes:/opt/keycloak/themes # カスタムログイン画面
postgres:
image: postgres:16-alpine
environment:
POSTGRES_DB: keycloak
POSTGRES_USER: keycloak
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
# Keycloak の初期設定
export KEYCLOAK_URL=https://auth.yourcompany.com
# レルム(テナント)の作成
curl -X POST "$KEYCLOAK_URL/admin/realms" -H "Authorization: Bearer $ADMIN_TOKEN" -H "Content-Type: application/json" -d '{
"realm": "mycompany",
"enabled": true,
"registrationAllowed": false,
"loginWithEmailAllowed": true,
"sslRequired": "external"
}'
# OIDCクライアント(Next.jsアプリ)を登録
curl -X POST "$KEYCLOAK_URL/admin/realms/mycompany/clients" -H "Authorization: Bearer $ADMIN_TOKEN" -H "Content-Type: application/json" -d '{
"clientId": "nextjs-app",
"protocol": "openid-connect",
"publicClient": false,
"standardFlowEnabled": true,
"redirectUris": ["https://app.yourcompany.com/api/auth/callback/keycloak"],
"webOrigins": ["https://app.yourcompany.com"],
"secret": "your-client-secret"
}'
// Next.js + NextAuth.js + Keycloak の設定
// app/api/auth/[...nextauth]/route.ts
import NextAuth from 'next-auth'
import KeycloakProvider from 'next-auth/providers/keycloak'
const handler = NextAuth({
providers: [
KeycloakProvider({
clientId: process.env.KEYCLOAK_CLIENT_ID!,
clientSecret: process.env.KEYCLOAK_CLIENT_SECRET!,
issuer: `${process.env.KEYCLOAK_URL}/realms/${process.env.KEYCLOAK_REALM}`,
}),
],
callbacks: {
async jwt({ token, account }) {
if (account) {
// Keycloakのアクセストークン・リフレッシュトークンをセッションに保存
token.accessToken = account.access_token
token.refreshToken = account.refresh_token
token.expiresAt = account.expires_at
}
// アクセストークンの有効期限チェック・自動更新
if (Date.now() < (token.expiresAt as number) * 1000 - 60000) {
return token
}
// リフレッシュトークンでアクセストークンを更新
const refreshed = await refreshAccessToken(token.refreshToken as string)
return { ...token, ...refreshed }
},
async session({ session, token }) {
session.accessToken = token.accessToken as string
return session
},
},
})
async function refreshAccessToken(refreshToken: string) {
const params = new URLSearchParams({
client_id: process.env.KEYCLOAK_CLIENT_ID!,
client_secret: process.env.KEYCLOAK_CLIENT_SECRET!,
grant_type: 'refresh_token',
refresh_token: refreshToken,
})
const resp = await fetch(
`${process.env.KEYCLOAK_URL}/realms/${process.env.KEYCLOAK_REALM}/protocol/openid-connect/token`,
{ method: 'POST', body: params }
)
const tokens = await resp.json()
return {
accessToken: tokens.access_token,
refreshToken: tokens.refresh_token,
expiresAt: Math.floor(Date.now() / 1000) + tokens.expires_in,
}
}
export { handler as GET, handler as POST }
# Keycloak Admin API で ユーザー管理を自動化
from keycloak import KeycloakAdmin
import os
keycloak_admin = KeycloakAdmin(
server_url=os.environ['KEYCLOAK_URL'],
username='admin',
password=os.environ['KEYCLOAK_ADMIN_PASSWORD'],
realm_name='mycompany',
client_id='admin-cli',
verify=True,
)
def create_user(email: str, first_name: str, last_name: str, temp_password: str) -> str:
'''ユーザーを作成して仮パスワードを設定'''
user_id = keycloak_admin.create_user({
'email': email,
'username': email,
'firstName': first_name,
'lastName': last_name,
'enabled': True,
'emailVerified': True,
'credentials': [{'type': 'password', 'value': temp_password, 'temporary': True}],
})
# ウェルカムメールを送信
keycloak_admin.send_verify_email(user_id)
return user_id
def assign_role(user_id: str, role_name: str):
'''ユーザーにレルムロールを付与'''
role = keycloak_admin.get_realm_role(role_name)
keycloak_admin.assign_realm_roles(user_id, [role])
# 使用例: 新入社員のアカウント一括作成
new_employees = [
('yamada@yourcompany.com', '山田', '太郎'),
('tanaka@yourcompany.com', '田中', '花子'),
]
for email, first, last in new_employees:
user_id = create_user(email, first, last, 'TempPass123!')
assign_role(user_id, 'employee')
print(f'作成完了: {email} (ID: {user_id})')
Authentik
2020年公開、Python/TypeScript製のOSSです。GitHubスター14k+。**直感的なモダンUIと、プロキシプロバイダー機能(認証を必要としないアプリへの認証レイヤーの追加)**が特長です。Keycloakより設定が簡単でスタートアップに向いています。
# docker-compose.yml - Authentik
version: '3.8'
services:
postgresql:
image: postgres:16-alpine
environment:
POSTGRES_PASSWORD: ${PG_PASS}
POSTGRES_USER: authentik
POSTGRES_DB: authentik
volumes:
- pg_data:/var/lib/postgresql/data
redis:
image: redis:alpine
server:
image: ghcr.io/goauthentik/server:2024.6.0
restart: unless-stopped
command: server
environment:
AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: authentik
AUTHENTIK_POSTGRESQL__NAME: authentik
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY}
AUTHENTIK_EMAIL__HOST: smtp.sendgrid.net
AUTHENTIK_EMAIL__PORT: "587"
AUTHENTIK_EMAIL__USE_TLS: "true"
AUTHENTIK_EMAIL__USERNAME: apikey
AUTHENTIK_EMAIL__PASSWORD: ${SENDGRID_KEY}
AUTHENTIK_EMAIL__FROM: auth@yourcompany.com
ports:
- "9000:9000"
- "9443:9443"
depends_on:
- postgresql
- redis
worker:
image: ghcr.io/goauthentik/server:2024.6.0
restart: unless-stopped
command: worker
environment:
AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: authentik
AUTHENTIK_POSTGRESQL__NAME: authentik
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY}
depends_on:
- postgresql
- redis
volumes:
pg_data:
機能比較表
| 比較項目 | Keycloak | Authentik | Ory |
|---|---|---|---|
| SAML対応 | ✅ | ✅ | △ |
| LDAP/AD統合 | ✅ | ✅ | ❌ |
| UI設定の容易さ | ★★☆ | ★★★ | ★☆☆(CLI主体) |
| マイクロサービス向け | △ | △ | ✅ |
| プロキシ認証 | △ | ✅ | ❌ |
| GitHub Stars | 23k+ | 14k+ | 4k+ |
OSS認証はセキュリティカテゴリ/categories/securityのVault(シークレット管理)・Vaultwardenと組み合わせてゼロトラストセキュリティ基盤を構築します。DevOpsカテゴリ/categories/devopsのGitLab・Harbor(コンテナレジストリ)のSSOとしてKeycloakを使うことで、社内ツール全体を一元認証できます。
FAQ
Q. Auth0からKeycloakへの移行で何が難しいですか?
A. 難易度順に: ①ソーシャルログイン設定の再構築: Auth0のGoogle/GitHub/Microsoft連携設定をKeycloakのIdentity Providerとして再設定(Auth0より手順が多い)②カスタムルール/アクション: Auth0のActionsはKeycloakのEvent Listenerまたはカスタムプロバイダー(Java)で実装③ユーザーデータ移行: Auth0 Management APIでユーザーをエクスポートしてKeycloak Admin APIで一括インポート(パスワードハッシュはAuth0→KeycloakでアルゴリズムのマッピングがBcryptなら対応可能)④SDKの切り替え: auth0-react→keycloak-jsまたはnext-auth/providers/keycloak。移行後のメリット: ①ユーザー数無制限(Auth0は月25K MAUまで無料)②カスタムログイン画面(Auth0 Universalは有料ドメインカスタマイズ)。
Q. Authentik vs Keycloak のどちらが中小スタートアップに向いていますか?
A. エンジニア2〜10名のスタートアップにはAuthentikを推奨します。理由: ①WebUIが直感的でKeycloakより設定に詰まりにくい②プロキシプロバイダー機能でGrafana・n8n・BookStackなどUIを持つツールへの認証を数クリックで追加③Active Directory不要の環境なら機能は十分。Keycloakを選ぶ理由: ①Large Enterprise・Active Directory/LDAP統合が必須②SAML・SSOの商業サポートが必要(Red Hat)③既存のJakarta EE/Javaエコシステムとの統合。実際の使い分け: 社内ツールのSSO統合(Grafana・Vault・GitLab)→Authentikが最も簡単、顧客向けSAML連携・B2Bアイデンティティ→Keycloakが安定。
Q. KeycloakでMFA(多要素認証)を強制するには?
A. ①Keycloak管理画面 → Authentication → Policies → OTP Policy で設定②Browser Authentication Flowを複製して「OTP Form」を「Required」に設定③ユーザーにMFAの登録を促す(Required Actionに「Configure OTP」を追加)。対応MFAアプリ: Google Authenticator・Authy・Microsoft Authenticator(TOTP準拠)。WebAuthn(FIDO2)対応: Keycloak 15以降でYubiKey・TouchID・Windows Helloをパスワードレス認証として使用可能(Keycloak管理画面 → Authentication → Policies → WebAuthn Policy)。組織ポリシーで全ユーザーにMFAを強制: User Attribute Condition + OTP Required Actionでグループ・ロール単位にMFA要否を設定できます。
Q. Ory はどういう場合に使いますか?
A. マイクロサービスアーキテクチャでIDロジックをサービスとして分離したい場合にOryが最適です。Ory Hydra(OAuth2/OIDC サーバー)・Ory Kratos(ユーザー管理・ログイン)・Ory Keto(権限管理・Google Zanzibar実装)を独立したマイクロサービスとして組み合わせます。活用例: ①10以上のマイクロサービスが独立したAPIで、それぞれがOIDCトークンを検証して認可②モバイルアプリ(React Native)とWebが同じOryバックエンドを共有③きめ細かい権限管理(オブジェクト単位のACL)が必要なSaaSアプリ。注意: OryはKubernetesへのデプロイ前提で設計されており、Docker Composeでの単純セットアップはKeycloakよりも複雑です。小規模チームには過剰なアーキテクチャになる可能性があります。
まとめ
| ユースケース | 推奨ツール |
|---|---|
| LDAP/AD統合・大規模・エンタープライズ | Keycloak |
| スタートアップ・直感的UI・プロキシ認証 | Authentik |
| マイクロサービス・きめ細かい権限管理 | Ory |