AI

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:

機能比較表

比較項目KeycloakAuthentikOry
SAML対応
LDAP/AD統合
UI設定の容易さ★★☆★★★★☆☆(CLI主体)
マイクロサービス向け
プロキシ認証
GitHub Stars23k+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-reactkeycloak-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

関連外部リソース

他の記事も読む

Let's Build Together

OSS導入、自社だけで悩まない。

ツール選定から構築・運用・AI活用まで、オープンソースラボ運営元のClasslessが伴走します。初回のご相談は無料です。