AWS国内版ALB
# 说明
本文档描述AWS国内版ALB产品如何通过OIDC标准协议集成竹云IDaaS,实现将用户身份验证工作由竹云进行验证。通过借助ALB产品,使您可以将验证用户身份的工作交给ALB负载均衡器完成,而应用程序可以专注于其业务逻辑。
# 术语说明
ALB: Application Load Balancer
竹云IDaaS:基于云原生身份云服务平台,可提供统一身份认证、单点登录和用户全生命周期管理,以下简称IDaaS或平台。
# 身份验证流程
流程说明
- 用户向在 Application Load Balancer 后面托管的网站发送 HTTPS 请求。当满足具有身份验证操作的规则的条件时,负载均衡器将检查请求标头中的身份验证会话 Cookie。
- 如果 Cookie 不存在,则负载均衡器会将用户重定向到 IdP 授权终端节点,以便 IdP 可对用户进行身份验证。
- 验证用户身份之后,IdP 会使用授权代码将用户发回负载均衡器。
- 负载均衡器会将此授权代码发送给 IdP 令牌终端节点。
- 在收到有效的授权代码后,IdP 将向 Application Load Balancer 提供 ID 令牌和访问令牌。
- 然后,Application Load Balancer 将访问令牌发送到用户信息终端节点。
- 用户信息终端节点交换用户声明的访问令牌。
- Application Load Balancer 将具有
AWSELB
身份验证会话 Cookie 的用户重定向到原始 URI。由于大多数浏览器将 Cookie 限制为 4K 大小,因此负载均衡器会将超出 4K 大小的 Cookie 分片为多个 Cookie。如果从 IdP 接收的用户声明和访问令牌的总大小超过 11K 字节,则负载均衡器会向客户端返回 HTTP 500 错误并递增ELBAuthUserClaimsSizeExceeded
指标。 - Application Load Balancer 验证 cookie 并将用户信息转发到
X-AMZN-OIDC-*
HTTP 标头设置中的目标。有关更多信息,请参阅用户申请编码和签名验证 (opens new window)。 - 目标向应用 Application Load Balancer 发回响应。
- Application Load Balancer 向用户发送最终响应。
每个新请求都经历步骤 1 到 11,而后续请求则经过步骤 9 到 11。也就是说,只要 cookie 尚未过期,每个后续请求都从步骤 9 开始。
用户在 IdP 进行身份验证后,会在请求标头中添加 AWSALBAuthNonce
cookie。这不会改变应用程序负载均衡器处理来自 IdP 的重定向请求的方式。
如果 IdP 在 ID 令牌中提供了有效的刷新令牌,则负载均衡器将保存刷新令牌并在访问令牌过期时使用刷新令牌刷新用户索赔,直至会话超时或 IdP 刷新失败。如果用户注销,刷新将失败并且负载均衡器会将用户重定向到 IdP 授权终端节点。这使负载均衡器能够在用户注销后删除会话。
# AWS ALB配置
使用管理员账号登录AWS国内版控制台,搜索EC2后, 点击进入EC2控制台, 在左侧菜单树中,找到“负载均衡”
# 创建目标群组
由于创建负载均衡器的监听Listeners时,需要选择一个目标群组,需提前创建一个群组。 点击菜单负载均衡-》目标群组,在工作区中选择“Create target Group”,根据自身业务的需求进行选择后,点击保存即可。
# 创建负载均衡器
点击菜单负载均衡-》负载均衡器,在工作区下拉菜单中,选择“Create Application Load Balancer”,点击进入创建ALB详细页面。
Basic configuration
Load balancer name:输入ALB的名称,如test-alb
Scheme:选择Internet-facing
IP address type:选择IPv4
Network mapping
vpn:选择默认值
Mapping: 注意AWS要求必须选择至少2个可用区(Availability Zone)
Security groups
Security groups:选择默认的分组
Listeners and routing
Protocol:选择https
Port:选择443端口
Default action:选择上面刚刚创建的“目标分组”
Secure listener settings
Security policy:选择默认值,默认是AWS推荐策略
Default SSL/TLS certificate:因为选择的https协议,必须上传证书给ALB。准备好证书后,使用AWS的证书导入功能,输入证书正文、证书私钥、以及证书链后导入即可。
检查以上配置信息无误后,最后点击“Create load balancer”进行保存。
注意:以上填写的配置,业务系统需要以实际情况为准。
# 编辑监听器Listener
在负载监听器的主页中,找打刚创建的负载监听器记录,点击该负载监听器进入详情页面,在“Listeners and rules”区域中,选中刚默认创建的“HTTPS:443”,点击“Manage listener”下拉菜单进行编辑。
Authentication
点击启用“Use OpenID or Amazon Cognito”, 输入竹云IDaaS租户OIDC服务端地址和注册的应用ID和Secret。
Issuer:https://{your_domain}/api/v1/oauth2
Authorization endpoint:https://{your_domain}/api/v1/oauth2/authorize
Token endpoint:https://{your_domain}/api/v1/oauth2/token
User info endpoint:https://{your_domain}/api/v1/oauth2/userinfo
Client ID:竹云IDaaS注册应用后,系统自动生成Client ID
Client secret:竹云IDaaS注册应用后,系统自动生成Client Secret(Serect生成后需要业务系统自行保存,忘记后不能找回只能重置)
以上参数值中{your_domain}替换为开通竹云IDaaS租户的域名即可
# Action types
ALB请求竹云IDaaS完成用户的身份认证后,希望ALB采用何种动作进行下一步操作。如选择“Return fixed response”,响应码定义为“200”, 响应信息:{"status": "success"}。
当按照以上配置完成后, 当用户访问ALB并通过IDaaS认证后,ALB在浏览器页面中将显示内容:{"status": "success"}
注意:需根据实际业务进行配置,本示例仅进行功能上的验证工作
最后,点击“Save changes”保存监听器的配置内容。
# 其它项配置
负载均衡器除了配置监控器外,还可用进行Network Mapping、Security等操作。由于ALB通过OIDC集成IDaaS时,需要调用IDaaS相关接口,若涉及安全-》出站规则可咨询IDaaS人员获取服务IP,然后进行IP网络策略设置。
# 竹云IDaaS配置
# 注册ALB应用
管理员登录竹云IDaaS管理后台,点击资源-》应用, 在自建应用区域中,点击“添加自建应用”,输入应用系统的Logo和名称点击保存完成应用的注册。
# 认证集成配置
点击刚注册的应用系统,进入应用系统的配置页面,认证集成选择“OIDC”,进行保存。点击“认证集成”配置后,进入应用系统的配置页面。
通用配置
回调地址:用户通过IDaaS认证通过后,IDaaS平台调用该地址将临时授权码信息返回ALB应用,ALB回调地址格式:https://
DNS
/oauth2/idpresponse在AWS控制中,找到刚创建的ALB并点击进行详情页面,在详情页面中可显示DNS Name,点击复制并替换回调地址格式中实际的DNS即可
映射配置
用户访问ALB时,通过IDaaS验证用户身份成功后,ALB通过OIDC接口获取到当前登录用户信息,并将用户信息转发给后面的业务系统。ALB通过sub字段从IDaaS平台获取到当前登录用户,并封装到http头x-amzn-oidc-identity中供业务系统使用。
在IDaaS平台增加一个sub应用属性,业务系统根据实际情况,可选择使用平台的属性名包含:用户ID、用户名、手机、邮箱等标识符等
注意:IDaaS平台必须增加一个返回ALB应用的sub字段属性,否则用户在通过IDaaS身份验证后,IDaaS返回临时授权码给ALB时,ALB系统提示500 Internal Server Error
# 用户授权
选择刚刚注册的应用系统,点击授权管理-》应用账号 “配置”链接后,进入应用系统的用户授权页面,选择添加一个用户并授权访问ALB应用。
# 登录验证
- 访问ALB
打开浏览器,访问ALB的DNS域名地址,如https://test-alb-1071773009.cn-north-1.elb.amazonaws.com.cn/, 浏览器重定向到竹云IDaaS统一登录页面。
认证通过显示成功信息
在统一登录页面中, 输入用户名和密码等凭证信息,竹云IDaaS认证通过后,将OIDC的授权码信息通过回调地址传递给ALB,由于本示例在ALB的“Action type”中选择“Return fixed response”,ALB直接打印{"status": "success"},表示整个认证集成配置已成功。