使用 Istio 的多云应用程序
通过使用应用程序身份和访问适配器,您可以将所有身份管理集中在一个地方。
当前不支持 App Identity and Access 适配器。
由于企业使用来自多个提供者的云,或者使用内部部署和外部部署解决方案的组合,因此异构部署模型可帮助保留现有基础架构,并避免被供应商套牢。 可以将适配器配置为使用任何符合 OIDC 的身份提供者,例如 App ID。 该服务使适配器能够控制所有环境 (包括前端和后端应用程序) 中的认证和授权策略。 此外,适配器在完成所有这些工作的同时,无需对代码进行任何更改,也无需重新部署应用程序。
App Identity and Access 适配器可为您提供哪些功能? 请观看以下视频,了解更多信息。
多云体系结构
多云计算环境将多个云计算和/或私有计算环境整合到一个网络架构中。 通过在多个环境中分配工作负载,您可能会发现弹性、灵活性和成本效益都得到了提高。 为了获得这些优点,通常要将基于容器的应用程序与编排层(如 Kubernetes)配合使用。
了解 Istio 和适配器
Istio 是一个开放式源代码服务网,用于透明地分层到可以与 Kubernetes 集成的现有分布式应用程序上。 为了降低部署的复杂性,Istio 提供了对整个服务网格的行为洞察和操作控制。 App ID 与 Istio 组合使用时,将成为一个适用于多云体系结构的可缩放的集成身份解决方案,无需任何定制应用程序代码更改。 更多信息,请查看 什么是 Istio。
Istio 使用 Envoy 代理侧柜来调解服务网中所有服务的所有入站和出站流量。 通过使用代理,Istio 可抽取有关流量的信息(也称为遥测),这些信息将发送到名为 Mixer 的 Istio 组件以强制实施策略决策。 App Identity and Access 适配器根据定制策略来分析遥测(属性),以控制对服务网的身份和访问权管理,从而扩展 Mixer 功能。 访问管理策略链接到特定的 Kubernetes 服务,可以针对特定的服务端点进行微调。 有关策略和遥测的更多信息,请参阅 Istio 文档。
由于 Istio 限制,目前 App Identity and Access 适配器在内部存储用户会话信息,不在各个副本中或通过故障转移配置来持久存储信息。 使用适配器时,请将工作负载限制为在单个副本上运行,直到此限制解决为止。
保护前端应用程序
如果您使用的是基于浏览器的应用程序,您可以使用 Open ID Connect(OIDC) / OAuth 2.0 authorization_grant
流程来验证用户身份。 检测到未经认证的用户时,会自动将这些用户重定向到认证页面。 认证完成后,浏览器会重定向到隐式
/oidc/callback
端点,其中适配器会拦截该请求。 此时,适配器会从身份提供者那里获取令牌,然后将用户重定向回原始请求的 URL。
要查看用户会话信息(包括会话令牌),可以查看 Authorization
头。
Authorization: Bearer <accessToken> <IDToken>
您还可以使已认证的用户注销。 如以下示例所示,已认证的用户访问附加有 oidc/logout
的任何受保护端点时,该用户会注销。
https://myhost/path/oidc/logout
如果需要,可以使用刷新令牌来自动获取新的访问令牌和身份令牌,而无需用户重新认证。 如果配置的身份提供者返回刷新令牌,此令牌会持久存储在会话中,并用于在身份令牌到期时检索新令牌。
保护后端应用程序
适配器可与 OAuth 2.0 JWT Bearer 流程配合使用,通过验证 JWT Bearer 标记来保护服务 API。 Bearer 授权流程期望请求包含具有有效访问令牌和可选身份令牌的 Authorization 头。 期望的头结构为 Authorization=Bearer {access_token} [{id_token}]
。
未认证的客户机会返回 HTTP 401 响应状态,其中包含获取授权所需的作用域列表。 如果令牌无效或到期,那么 API 策略将返回包含可选 error 组成部分的 HTTP 401 响应,其中显示 Www-Authenticate=Bearer scope="{scope}" error="{error}"
。
有关令牌及其使用方式的更多信息,请参阅了解令牌。
准备工作
在开始之前,请确保已安装以下先决条件。
-
目前,IBM Cloud Kubernetes Service托管 Istio 不支持策略执行。 要使用适配器,必须使用手动安装的 Istio。
安装适配器
要安装 chart,请在集群中初始化 Helm,定义要使用的选项,然后运行安装命令。
-
如果使用的是 IBM Cloud Kubernetes Service,请确保登录并设置集群的上下文。
-
验证是否已启用 Istio 策略实施。 如果没有,请打开。
-
添加存储库。
helm repo add appidentityandaccessAdapter https://raw.githubusercontent.com/ibm-cloud-security/app-identity-and-access-Adapter/master/helm/appidentityandaccessAdapter
-
安装 chart。
helm install --name appidentityandaccessAdapter appidentityandaccessAdapter/appidentityandaccessAdapter
通过设置
image.tag
标志,可以在安装期间指定图像标记。 例如,--set image.tag=0.5.0
。 您还可以在本地安装 chart。 为此,请在运行安装命令之前,通过运行git clone git@github.com:ibm-cloud-security/app-identity-and-access-Adapter.git
来克隆存储库。
应用授权和认证策略
认证或授权策略是要使请求能够访问资源而必须满足的一组条件。 通过定义身份提供者的服务配置和概述何时必须使用特定流量的策略,您可以控制对服务网格中任何资源的访问。 要查看 CRD 示例,请查看 样本目录。
要创建策略,请执行以下操作:
- 定义配置。
- 注册端点。
定义配置
根据是要保护前端还是后端应用程序,使用下列其中一个选项来创建策略配置。
-
对于前端应用程序:需要用户认证的基于浏览器的应用程序可以配置为使用 OIDC/OAuth 2.0 认证流程。 要定义
OidcConfig
CRD(包含用于支持身份提供者认证流程的客户机),请使用以下示例作为指南。apiVersion: "security.cloud.ibm.com/v1" kind: OidcConfig metadata: name: oidc-provider-config namespace: sample-namespace spec: discoveryUrl: https://us-south.appid.cloud.ibm.com/oauth/v4/<tenantID>/.well-known/openid-configuration clientId: <clientID> clientSecret: <randomlyGeneratedClientSecret> clientSecretRef: name: <nameOfKubeSecret> key: <keyInKubeSecret>
YAML 配置文件组件说明 字段 类型 必需 描述 discoveryUrl
字符串 是 一个熟知端点,用于提供包含 OIDC/OAuth 2.0 配置信息的 JSON 文档。 clientId
字符串 是 用于认证的客户机的标识。 clientSecret
字符串 - 否
用于认证客户机的明文私钥。 如果没有提供,则 clientSecretRef
必须存在。clientSecretRef
对象 否 用于认证客户机的引用私钥。 参考文献可以代替 clientSecret
。clientSecretRef.name
字符串 是 Kubernetes Secret 的名称,其中包含 clientSecret
。clientSecretRef.key
字符串 是 Kubernetes Secret 中保存 clientSecret
的字段。 -
对于后端应用程序:OAuth 2.0 Bearer 令牌规范定义了一种通过使用 JSON Web 令牌(JWT) 来保护 API 的模式。 通过使用以下配置作为示例,定义一个
JwtConfig
CRD,其中包含用于验证令牌签名的公用密钥资源。apiVersion: "security.cloud.ibm.com/v1" kind: JwtConfig metadata: name: jwt-config namespace: sample-app spec: jwksUrl: https://us-south.appid.cloud.ibm.com/oauth/v4/<tenantID>/publickeys
注册应用程序端点
在 Policy
CRD 中注册应用程序端点,以用于验证入局请求并强制实施认证规则。 每个 Policy
仅应用于对象所在的 Kubernetes 名称空间,并且可以指定要保护的服务、路径和方法。
apiVersion: "security.cloud.ibm.com/v1"
kind: Policy
metadata:
name: samplepolicy
namespace: sample-app
spec:
targets:
-
serviceName: <svcSampleApp>
paths:
- exact: /web/home
method: ALL
policies:
- policyType: oidc
config: <oidcProviderConfig>
rules:
- claim: scope
match: ALL
source: access_token
values:
- appid_default
- openid
- claim: amr
match: ANY
source: id_token
values:
- cloud_directory
- google
- exact: /web/user
method: GET
policies:
- policyType: oidc
config: <oidcProviderConfig>
redirectUri: https://github.com/ibm-cloud-security/app-identity-and-access-Adapter
- prefix: /
method: ALL
policies:
-
policyType: jwt
config: <jwtConfig>
服务对象 | 类型 | 必需 | 描述 |
---|---|---|---|
serviceName |
string |
是 | Policy 名称空间中要保护的 Kubernetes 服务的名称。 |
paths |
array[Path Object] |
是 | 用于定义要保护的端点的路径对象的列表。 如果未指定,那么将保护所有路径。 |
路径对象 | 类型 | 必需 | 描述 |
---|---|---|---|
exact or prefix |
string |
是 | 要应用策略的路径。 选项包括 exact 和 prefix 。exact 将所提供的端点与最后一个 / 完全匹配。prefix 与以您提供的路由前缀开头的端点相匹配。 |
method |
enum |
否 | 受保护的 HTTP 方法。 有效选项为 ALL、GET、PUT、POST、DELETE 和 PATCH - 缺省值为 ALL: |
policies |
array[Policy] |
否 | 要应用的 OIDC/JWT 策略。 |
策略对象 | 类型 | 必需 | 描述 |
---|---|---|---|
policyType |
enum |
是 | OIDC 策略的类型。 选项包括:jwt 或 oidc 。 |
config |
string |
是 | 要使用的提供者配置的名称。 |
redirectUri |
string |
否 | 您希望在用户成功认证后将用户重定向到的 URL,缺省值:原始请求 URL。 |
rules |
array[Rule] |
否 | 要用于令牌验证的一组规则。 |
规则对象 | 类型 | 必需 | 描述 |
---|---|---|---|
claim |
string |
是 | 要验证的声明。 |
match |
enum |
否 | 验证声明所需的条件。 选项包括:ALL 、ANY 或 NOT 。 缺省值设置为 ALL 。 |
source |
enum |
否 | 要应用规则的令牌。 选项包括:access_token 或 id_token 。 缺省值设置为 access_token 。 |
values |
array[string] |
是 | 用于验证的一组必需值。 |
删除适配器
要删除适配器和所有相关的 CRD,必须删除 Helm 图表以及相关的签名和加密密钥。
helm delete --purge appidentityandaccessAdapter
kubectl delete secret appidentityandaccessAdapter-keys -n istio-system
配置日志记录
缺省情况下,日志的样式为 JSON,并且在 info
显示级别提供,以便轻松与外部日志记录系统集成。 要更新日志记录配置,可以使用 Helm chart。 如 Zap core 所示,支持的记录级别范围为 [-1、7。] 有关级别的更多信息,请参阅 Zap 核心文档。
适配器
要查看适配器日志,可以使用 kubectl
或通过 Kubernetes 控制台从 appidentityandaccessAdapter
pod 来访问相应 pod。
alias Adapter_logs="kubectl -n istio-system logs -f $(kubectl -n istio-system get pods -lapp=appidentityandaccessAdapter -o jsonpath='{.items[0].metadata.name}')"
Adapter_logs | jq
混合器
如果适配器似乎无法接收请求,请检查 Mixer 日志,确保它已成功连接到适配器。
alias mixer_logs="kubectl -n istio-system logs -f $(kubectl -n istio-system get pods -lapp=telemetry -o jsonpath='{.items[0].metadata.name}') -c mixer"
mixer_logs | jq