用 Keycloak 搭建统一单点登录

适用场景

多个内部系统需要统一账号、OIDC/SAML 登录、LDAP 对接和集中授权。Keycloak 适合自建 SSO,尤其是需要细粒度角色和客户端级权限的场景。

前置条件

步骤

  1. 使用 Helm 安装生产实例:
helm repo add codecentric https://codecentric.github.io/helm-charts
helm install keycloak codecentric/keycloakx \
  --namespace keycloak --create-namespace \
  --set replicas=2 \
  --set ingress.enabled=true \
  --set ingress.hostname=sso.example.com \
  --set postgresql.enabled=true
  1. 等待 Pod 就绪并创建管理员:
kubectl -n keycloak get pods
kubectl -n keycloak exec -it deploy/keycloak -- \
  /opt/keycloak/bin/kcadm.sh config credentials \
  --server http://localhost:8080 --realm master \
  --user admin --password "$KEYCLOAK_ADMIN_PASSWORD"
  1. 创建 realm 和客户端:
kcadm.sh create realms -s realm=corp -s enabled=true
kcadm.sh create clients -r corp \
  -s clientId=wiki -s enabled=true \
  -s protocol=openid-connect \
  -s 'redirectUris=["https://wiki.example.com/*"]' \
  -s publicClient=false -s secret="$WIKI_CLIENT_SECRET"
  1. 对接 LDAP 或 Active Directory:
kcadm.sh create components -r corp \
  -s name=ldap -s providerId=ldap \
  -s providerType=org.keycloak.storage.UserStorageProvider \
  -s 'config.connectionUrl=["ldap://ldap.example.com:389"]' \
  -s 'config.usersDn=["ou=people,dc=example,dc=com"]' \
  -s 'config.bindDn=["cn=svc,ou=services,dc=example,dc=com"]' \
  -s 'config.bindCredential=["***"]'
  1. 配置角色和组映射,按最小权限授予客户端角色。

  2. 应用侧使用 OIDC 授权码模式接入,校验 issuer、audience 和签名。Spring Security、oauth2-proxy、Nginx auth_request 都可以作为客户端。

  3. 开启登录审计和暴力破解防护:

kcadm.sh update realms/corp \
  -s bruteForceProtected=true \
  -s failureFactor=5 \
  -s waitIncrementSeconds=60

验证

回滚

常见坑

相关命令