OSSのSSOと認証基盤比較:Keycloak vs Authentik vs Casdoor でシングルサインオンを構築
オープンソースラボ編集部 ・ 2026年6月14日
OSSのSSOと認証基盤比較:Keycloak vs Authentik vs Casdoor でシングルサインオンを構築
Auth0(月$23〜/月・1,000ユーザー以上は急激に高額)・Okta(月$2/ユーザー〜)に対して、Keycloak(Red Hat製のエンタープライズOSSアイデンティティプロバイダー)・Authentik(モダンでシンプルなSSO)・Casdoor(RBAC・ABAC対応の認証プラットフォーム)はOSSのSSOソリューションです。
SSOと認証基盤が必要な場面
- エンタープライズSSO: 社内の複数SaaSアプリ(Slack・Confluence・GitLab等)をSAML/OIDCで一元ログイン
- B2Bアプリのソーシャルログイン: Google・GitHub・Microsoft・LDAPと連携した認証
- マルチテナントSaaS: 顧客ごとにActive Directory・Google Workspaceと接続するSAML設定
- Zero Trustネットワーク: VPN代替のIDPと組み合わせたアクセス制御
主要ツールの概要
Keycloak
2014年にRed Hatが開発したJava製のエンタープライズグレードのIDプロバイダーです。GitHubスター23k+。SAML2.0・OpenID Connect(OIDC)・OAuth2.0を完全サポートし、LDAP・Active Directory・Google・GitHubとのフェデレーションが可能。カスタムログイン画面(テーマ)・多要素認証・ブルートフォース保護・ユーザーセルフサービス(パスワードリセット等)を標準搭載。大規模エンタープライズでの実績が豊富です。
# docker-compose.yml - Keycloak + PostgreSQL
version: '3.8'
services:
keycloak:
image: quay.io/keycloak/keycloak:latest
command: start-dev # 本番はstartを使用
environment:
KC_DB: postgres
KC_DB_URL: jdbc:postgresql://db:5432/keycloak
KC_DB_USERNAME: keycloak
KC_DB_PASSWORD: keycloak_password
KC_HOSTNAME: auth.yourcompany.com
KEYCLOAK_ADMIN: admin
KEYCLOAK_ADMIN_PASSWORD: admin-password
ports:
- "8080:8080"
depends_on:
- db
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: keycloak
POSTGRES_USER: keycloak
POSTGRES_PASSWORD: keycloak_password
volumes:
- keycloak_db:/var/lib/postgresql/data
volumes:
keycloak_db:
# Keycloak Admin REST APIで自動プロビジョニング
import requests
KEYCLOAK_URL = "https://auth.yourcompany.com"
REALM = "yourcompany"
ADMIN_TOKEN = "admin-access-token"
headers = {
"Authorization": f"Bearer {ADMIN_TOKEN}",
"Content-Type": "application/json",
}
# レルムにユーザーを作成
user_resp = requests.post(
f"{KEYCLOAK_URL}/admin/realms/{REALM}/users",
headers=headers,
json={
"username": "john.doe",
"email": "john.doe@yourcompany.com",
"firstName": "John",
"lastName": "Doe",
"enabled": True,
"emailVerified": True,
"credentials": [{"type": "password", "value": "initial-password", "temporary": True}],
"attributes": {"department": ["Engineering"], "employeeId": ["12345"]},
},
)
print(f"User created: {user_resp.status_code}")
# ユーザーをグループに追加
user_id = user_resp.headers.get("Location", "").split("/")[-1]
groups = requests.get(f"{KEYCLOAK_URL}/admin/realms/{REALM}/groups?search=engineers", headers=headers).json()
if groups:
requests.put(
f"{KEYCLOAK_URL}/admin/realms/{REALM}/users/{user_id}/groups/{groups[0]['id']}",
headers=headers,
)
print(f"Added to group: {groups[0]['name']}")
// Keycloak OIDC でNext.jsアプリに認証を追加
// next-auth を使ったKeycloak連携
// pages/api/auth/[...nextauth].js
import NextAuth from "next-auth";
import KeycloakProvider from "next-auth/providers/keycloak";
export default 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) {
token.idToken = account.id_token; // IDトークン
token.accessToken = account.access_token; // アクセストークン
token.roles = account.id_token
? JSON.parse(atob(account.id_token.split(".")[1])).realm_access?.roles
: [];
}
return token;
},
async session({ session, token }) {
session.accessToken = token.accessToken;
session.roles = token.roles; // Keycloakのロールをセッションに追加
return session;
},
},
});
Authentik
2020年に公開されたPython/Djangoベースのモダンなアイデンティティプロバイダーです。GitHubスター15k+。Keycloakよりセットアップが直感的でUIがモダン。フロー(Flow)ベースの認証ステップで、ソーシャルログイン・LDAP・SAMLをGUIで設定できます。プロキシプロバイダーを使ってヘッダーベースの認証(Basic Authがないサービスにも認証を追加)が可能です。
# docker-compose.yml - Authentik
version: '3.8'
services:
postgresql:
image: postgres:15-alpine
environment:
POSTGRES_PASSWORD: authentik_password
POSTGRES_USER: authentik
POSTGRES_DB: authentik
volumes:
- authentik_db:/var/lib/postgresql/data
redis:
image: redis:alpine
server:
image: ghcr.io/goauthentik/server:latest
command: server
environment:
AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: authentik
AUTHENTIK_POSTGRESQL__PASSWORD: authentik_password
AUTHENTIK_POSTGRESQL__NAME: authentik
AUTHENTIK_SECRET_KEY: your-secret-key-50-chars
AUTHENTIK_ERROR_REPORTING__ENABLED: "false"
ports:
- "9000:9000"
- "9443:9443"
worker:
image: ghcr.io/goauthentik/server:latest
command: worker
environment:
AUTHENTIK_REDIS__HOST: redis
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: authentik
AUTHENTIK_POSTGRESQL__PASSWORD: authentik_password
AUTHENTIK_POSTGRESQL__NAME: authentik
AUTHENTIK_SECRET_KEY: your-secret-key-50-chars
volumes:
authentik_db:
機能比較表
| 比較項目 | Keycloak | Authentik | Casdoor |
|---|---|---|---|
| SSO標準 | SAML/OIDC/OAuth2 | SAML/OIDC/OAuth2 | OIDC/OAuth2/SAML |
| UI操作性 | 複雑 | モダン・直感的 | シンプル |
| LDAP/AD連携 | ✅ | ✅ | ✅ |
| プロキシ認証 | ✅ | ✅(強力) | 限定的 |
| RBAC/ABAC | ✅ | ✅ | ✅(Casbin) |
| 言語 | Java | Python | Go |
| GitHub Stars | 23k+ | 15k+ | 10k+ |
SSOで認証済みユーザーのセッション情報をログとして収集するにはDevOpsカテゴリ/categories/devopsのGrafana Lokiと組み合わせてください。SSOと組み合わせる内部ツールのアクセス管理にはSecurityカテゴリ/categories/securityのVaultwardenと組み合わせてシークレット管理ができます。
FAQ
Q. KeycloakとAuth0のコスト比較を教えてください
A. Auth0はFreeプランが月7,000 MAU(月間アクティブユーザー)まで。それ以上はEssentialsが月$23(1,000 MAU)、Professionalが月$240(5,000 MAU)と急上昇します。1万MAUでは月$480程度。Keycloakはセルフホストのため基本無料(インフラコスト)。1万ユーザーでも$30〜$100/月のVPSで十分運用できます。ただしKeycloakのセットアップ・運用はAuth0より大幅に複雑です。5,000ユーザー以下の小規模チームではAuth0の利便性コストが小さいですが、それ以上ではKeycloakのROIが高くなります。
Q. KeycloakでSAML設定をするにはどうすればいいですか?
A. Keycloak管理コンソールからSAMLクライアントを作成します。基本手順: ①Clients → Create client②Client type: SAMLを選択③Client IDにSP Entity IDを入力④Valid redirect URIsにACS URLを入力⑤Fine Grain SAML Endpoint設定でACS URLを設定⑥SAML Capabilities でSign Assertions・Include AuthnStatement・Sign DocumentsをON⑦「Downloading certificate」でSAML用証明書をダウンロードし、SPに設定⑧SPのメタデータXMLファイルからInbound SAMLを設定するとクレームマッピングが自動設定される。主要SaaS(Salesforce・Slack・Confluence等)はSAMLメタデータXMLを提供しており、それをKeycloakにインポートするだけで設定が完了します。
Q. AuthentikとKeycloakのどちらを選ぶべきですか?
A. Keycloakを選ぶ場合: ①エンタープライズのActive Directory/LDAP連携が必要②SAML設定が複雑なSaaSとの接続③Red Hatのサポートが必要④大規模クラスター構成。Authentikを選ぶ場合: ①設定をGUI操作で直感的に行いたい②プロキシプロバイダーで任意のWebサービスに認証を追加したい③Dockerコンテナ中心の環境。中小規模のチームでKeycloakの学習コストを避けたい場合はAuthentikの方が導入が早く、中長期的な運用コストも低い傾向があります。
Q. NginxにSSOを追加してプライベートサービスを保護するには?
A. Authentikのアウトポストプロキシを使えばNginxの前段にAuthentik認証を追加できます。
server {
listen 443 ssl;
server_name private.yourcompany.com;
location / {
# Authentikアウトポストへの認証リクエスト
auth_request /outpost.goauthentik.io/auth/nginx;
auth_request_set $auth_cookie $upstream_http_set_cookie;
add_header Set-Cookie $auth_cookie;
error_page 401 = @goauthentik_proxy_signin;
# バックエンドへのプロキシ
proxy_pass http://private-service:8080;
}
location /outpost.goauthentik.io {
proxy_pass http://authentik-outpost:9000;
}
location @goauthentik_proxy_signin {
internal;
return 302 /outpost.goauthentik.io/start?rd=$scheme://$host$request_uri;
}
}
まとめ
| ユースケース | 推奨ツール |
|---|---|
| エンタープライズSSO・LDAP・SAML | Keycloak |
| モダンUI・プロキシ認証・中小規模 | Authentik |
| Casbin RBAC/ABAC・Go統合 | Casdoor |