- 统一身份认证
统一身份认证(Identity and Access Management,身份认证和访问控制,简称 IAM)的技术选型和实践。
为满足以上需求,在初期技术选项时主要关注以下几个开源组件。
以下为 keycloak 和 Dex 的简单对比。为什么不把 Ory 加进来,因为没有实际用过,不便于发表意见,如果你是一个 Ory 用户欢迎补充。
| 特性/工具 | Keycloak | Dex |
|---|---|---|
| 类型 | 全面的 IAM 解决方案 | 身份代理 |
| 用户管理 | 支持内置用户管理 | 不直接管理用户,依赖外部身份提供者 |
| 协议支持 | OpenID Connect、OAuth 2.0、SAML 2.0 | OpenID Connect |
| SSO | 支持 | 依赖外部身份提供者实现 |
| 社交登录 | 支持多种社交登录选项 | 不直接支持,可通过连接外部身份提供者实现 |
| 角色管理 | 支持复杂的角色和权限管理 | 不直接支持 |
| 扩展性 | 高,适合各种规模和复杂性的需求 | 适合将多个身份源统一到一个认证流程的环境 |
| 使用场景 | 需要全面、集中式身份管理的组织 | 需要统一多个身份源认证,如在云原生环境中 |
| 用户界面 | 提供丰富的用户和管理员界面 | 主要是 API,没有详细的用户界面 |
| 适用性 | 适用于需要完整 IAM 解决方案的组织 | 适用于作为多个身份源代理,尤其在 Kubernetes 环境中 |
以下为 OAuth2 Proxy 和 Pomerium 的简单对比。
| 特性/工具 | OAuth2 Proxy | Pomerium |
|---|---|---|
| 主要用途 | 身份验证代理 | 边缘身份验证和访问控制 |
| 身份认证方法 | 支持多种 OAuth 2.0 提供商 | 支持 OAuth 2.0、OpenID Connect 和 SAML |
| 安全性 | 基本的身份验证和授权 | 高级访问控制,包括路由规则和策略 |
| 单点登录(SSO) | 支持 | 支持 |
| 部署复杂性 | 相对简单,易于部署 | 较为复杂,但提供更多的配置选项和灵活性 |
| 用户界面 | 主要通过配置文件和命令行界面操作 | 提供 Web 界面用于配置和管理 |
| 适用场景 | 适合于小型应用和简单的身份验证需求 | 适合于大型企业和复杂的访问控制需求 |
| 集成能力 | 适合单一应用或小型系统 | 适合复杂的系统架构和多应用环境 |
| 扩展性和灵活性 | 基本扩展性,适用于标准用例 | 高度可扩展和灵活,适用于复杂多变的环境 |
| 社区和支持 | 拥有活跃的社区 | 社区支持强大,提供企业级支持和服务 |
为满足核心诉求,根据不同场景我们做了以下选择。
一个简单的应用统一身份认证总架构示例如下。
C4Context
Person(admin, "超级管理员")
Person_Ext(extUser, "自助注册")
Person_Ext(socialUser, "社交登录")
Person(developer, "内部人员")
Boundary(iam, "IAM", "iam") {
Container(keycloak, "keycloak", "Quarkus", "Admin 控制台
用户、组织、角色、权限管理")
Container(ldap, "LDAP/AD","ldap", "LDAP 或 Windows AD 作为用户源")
ContainerDb(spiUser, "自定义用户源", "Java SPI", "通过实现 SPI 自定义用户源")
System_Ext(providers, "身份联合", "Github、Gitlab、Wechart、SAML v2.0、OIDC 等
用户身份联合")
}
Boundary(sso, "Plugins Applications", "sso") {
Container(backstage, "Backstage","react","开发者门户")
Container(grafana, "Grafana","grafana","监控告警平台")
Container(k8s, "Kubernetes","kubernetes","Kubernetes Service Account")
}
Boundary(apps, "OAuth Proxy Applications", "sso") {
Container(proxy, "oauth2-proxy","golang","认证代理
认证和 RBAC 权限管理
通过后透传用户、角色等信息")
Container(login, "自研应用","any", "需要登录才可访
自身无用户权限管理功能")
}
Rel(admin, keycloak, "用户管理", "http")
Rel(developer, keycloak, "用户自助", "http")
Rel(extUser, keycloak, "用户自助注册", "http")
Rel(socialUser, keycloak, "社交账户登录", "http")
Rel(developer, backstage, "开发者门户", "http")
Rel(developer, proxy, "SSO", "http")
Rel(developer, grafana, "SSO", "http")
Rel(developer, k8s, "统一身份", "http")
Rel(proxy, login, "RBAC","x-user-id/group/role")
Rel(keycloak, ldap, "user storage")
Rel(keycloak, spiUser, "user storage")
Rel(keycloak, providers, "identity provider")
Rel(backstage, keycloak, "plugin auth backend")
Rel(proxy, keycloak, "oidc provider")
Rel(grafana, keycloak, "oidc provider")
Rel(k8s, keycloak, "oidc provider")
UpdateRelStyle(proxy, keycloak,$lineColor="blue" $offsetX="260")
UpdateLayoutConfig($c4ShapeInRow="4", $c4BoundaryInRow="4")
统一身份认证(Identity and Access Management,身份认证和访问控制,简称 IAM)的技术选型和实践。
为满足以上需求,在初期技术选项时主要关注以下几个开源组件。
以下为 keycloak 和 Dex 的简单对比。为什么不把 Ory 加进来,因为没有实际用过,不便于发表意见,如果你是一个 Ory 用户欢迎补充。
| 特性/工具 | Keycloak | Dex |
|---|---|---|
| 类型 | 全面的 IAM 解决方案 | 身份代理 |
| 用户管理 | 支持内置用户管理 | 不直接管理用户,依赖外部身份提供者 |
| 协议支持 | OpenID Connect、OAuth 2.0、SAML 2.0 | OpenID Connect |
| SSO | 支持 | 依赖外部身份提供者实现 |
| 社交登录 | 支持多种社交登录选项 | 不直接支持,可通过连接外部身份提供者实现 |
| 角色管理 | 支持复杂的角色和权限管理 | 不直接支持 |
| 扩展性 | 高,适合各种规模和复杂性的需求 | 适合将多个身份源统一到一个认证流程的环境 |
| 使用场景 | 需要全面、集中式身份管理的组织 | 需要统一多个身份源认证,如在云原生环境中 |
| 用户界面 | 提供丰富的用户和管理员界面 | 主要是 API,没有详细的用户界面 |
| 适用性 | 适用于需要完整 IAM 解决方案的组织 | 适用于作为多个身份源代理,尤其在 Kubernetes 环境中 |
以下为 OAuth2 Proxy 和 Pomerium 的简单对比。
| 特性/工具 | OAuth2 Proxy | Pomerium |
|---|---|---|
| 主要用途 | 身份验证代理 | 边缘身份验证和访问控制 |
| 身份认证方法 | 支持多种 OAuth 2.0 提供商 | 支持 OAuth 2.0、OpenID Connect 和 SAML |
| 安全性 | 基本的身份验证和授权 | 高级访问控制,包括路由规则和策略 |
| 单点登录(SSO) | 支持 | 支持 |
| 部署复杂性 | 相对简单,易于部署 | 较为复杂,但提供更多的配置选项和灵活性 |
| 用户界面 | 主要通过配置文件和命令行界面操作 | 提供 Web 界面用于配置和管理 |
| 适用场景 | 适合于小型应用和简单的身份验证需求 | 适合于大型企业和复杂的访问控制需求 |
| 集成能力 | 适合单一应用或小型系统 | 适合复杂的系统架构和多应用环境 |
| 扩展性和灵活性 | 基本扩展性,适用于标准用例 | 高度可扩展和灵活,适用于复杂多变的环境 |
| 社区和支持 | 拥有活跃的社区 | 社区支持强大,提供企业级支持和服务 |
为满足核心诉求,根据不同场景我们做了以下选择。
一个简单的应用统一身份认证总架构示例如下。
C4Context
Person(admin, "超级管理员")
Person_Ext(extUser, "自助注册")
Person_Ext(socialUser, "社交登录")
Person(developer, "内部人员")
Boundary(iam, "IAM", "iam") {
Container(keycloak, "keycloak", "Quarkus", "Admin 控制台
用户、组织、角色、权限管理")
Container(ldap, "LDAP/AD","ldap", "LDAP 或 Windows AD 作为用户源")
ContainerDb(spiUser, "自定义用户源", "Java SPI", "通过实现 SPI 自定义用户源")
System_Ext(providers, "身份联合", "Github、Gitlab、Wechart、SAML v2.0、OIDC 等
用户身份联合")
}
Boundary(sso, "Plugins Applications", "sso") {
Container(backstage, "Backstage","react","开发者门户")
Container(grafana, "Grafana","grafana","监控告警平台")
Container(k8s, "Kubernetes","kubernetes","Kubernetes Service Account")
}
Boundary(apps, "OAuth Proxy Applications", "sso") {
Container(proxy, "oauth2-proxy","golang","认证代理
认证和 RBAC 权限管理
通过后透传用户、角色等信息")
Container(login, "自研应用","any", "需要登录才可访
自身无用户权限管理功能")
}
Rel(admin, keycloak, "用户管理", "http")
Rel(developer, keycloak, "用户自助", "http")
Rel(extUser, keycloak, "用户自助注册", "http")
Rel(socialUser, keycloak, "社交账户登录", "http")
Rel(developer, backstage, "开发者门户", "http")
Rel(developer, proxy, "SSO", "http")
Rel(developer, grafana, "SSO", "http")
Rel(developer, k8s, "统一身份", "http")
Rel(proxy, login, "RBAC","x-user-id/group/role")
Rel(keycloak, ldap, "user storage")
Rel(keycloak, spiUser, "user storage")
Rel(keycloak, providers, "identity provider")
Rel(backstage, keycloak, "plugin auth backend")
Rel(proxy, keycloak, "oidc provider")
Rel(grafana, keycloak, "oidc provider")
Rel(k8s, keycloak, "oidc provider")
UpdateRelStyle(proxy, keycloak,$lineColor="blue" $offsetX="260")
UpdateLayoutConfig($c4ShapeInRow="4", $c4BoundaryInRow="4")