应用身份和访问适配器
使用 Istio 在不进行任何代码更改的情况下保护多云 Kubernetes 应用程序。
如果您在 Kubernetes 上运行容器化应用程序,那么您可以从使用应用身份和访问适配器中获益,它可以为您提供无需代码更改或重新部署的抽象安全级别。
无论您的计算环境是基于单个云提供商、多个云提供商的组合,还是遵循混合云方法,拥有一个集中的身份管理都可以帮助您保留现有基础设施并避免供应商锁定。
使用 应用身份和访问适配器,您可以使用任何 OAuth2/OIDC 提供商:IBM Cloud App ID、Auth0、Okta、Ping Identity、AWS Cognito、Azure AD B2C 等等。可以在所有环境中(包括前端和后端应用程序)以简化的方式应用身份验证和授权策略,而无需进行代码更改或重新部署。
了解 Istio 和适配器
Istio 是一个开源服务网格,它透明地层叠到分布式应用程序上,并与 Kubernetes 无缝集成。为了降低部署的复杂性,Istio 提供了关于服务网格整体的行为洞察力和操作控制。有关更多详细信息,请参阅 Istio 架构。
Istio 使用 Envoy 代理 sidecar 来调解服务网格中所有 Pod 的入站和出站流量。Istio 从 Envoy sidecar 中提取遥测数据并将其发送到 Mixer,Mixer 是负责收集遥测数据和执行策略的 Istio 组件。
应用身份和访问适配器通过针对服务网格中的各种访问控制策略分析遥测数据(属性)来扩展 Mixer 功能。访问控制策略可以链接到特定的 Kubernetes 服务,并且可以针对特定的服务端点进行微调。有关策略和遥测数据的更多信息,请参阅 Istio 文档。
当 应用身份和访问适配器 与 Istio 结合使用时,它为多云架构提供了一个可扩展的集成身份和访问解决方案,不需要任何自定义应用程序代码更改。
安装
应用身份和访问适配器可以使用 Helm 直接从 github.com
存储库安装
$ helm repo add appidentityandaccessadapter https://raw.githubusercontent.com/ibm-cloud-security/app-identity-and-access-adapter/master/helm/appidentityandaccessadapter
$ helm install --name appidentityandaccessadapter appidentityandaccessadapter/appidentityandaccessadapter
或者,您可以克隆存储库并在本地安装 Helm 图表
$ git clone git@github.com:ibm-cloud-security/app-identity-and-access-adapter.git
$ helm install ./helm/appidentityandaccessadapter --name appidentityandaccessadapter.
保护 Web 应用程序
Web 应用程序通常通过称为 authorization_code
的 OpenID Connect (OIDC) 工作流来保护。当检测到未经身份验证/未经授权的用户时,他们将自动重定向到您选择的身份服务并显示身份验证页面。身份验证完成后,浏览器将重定向回适配器拦截的隐式 /oidc/callback
端点。此时,适配器从身份服务获取访问令牌和身份令牌,然后将用户重定向回 Web 应用程序中最初请求的 URL。
身份验证状态和令牌由适配器维护。适配器处理的每个请求都将包括授权头,该头以以下格式承载访问令牌和身份令牌:Authorization: Bearer <access_token> <id_token>
开发人员可以利用令牌来调整应用程序体验,例如显示用户名、根据用户角色调整 UI 等等。
为了终止已验证的会话并清除令牌(也称为用户注销),只需将浏览器重定向到受保护服务下的 /oidc/logout
端点,例如,如果您从 https://example.com/myapp
提供服务,请将用户重定向到 https://example.com/myapp/oidc/logout
每当访问令牌过期时,刷新令牌都会用于自动获取新的访问令牌和身份令牌,而无需您的用户重新进行身份验证。如果配置的身份提供者返回刷新令牌,则它将由适配器持久化,并在旧令牌过期时用于检索新的访问令牌和身份令牌。
应用 Web 应用程序保护
保护 Web 应用程序需要创建两种类型的资源 - 使用 OidcConfig
资源来定义各种 OIDC 提供商,以及 Policy
资源来定义 Web 应用程序保护策略。
apiVersion: "security.cloud.ibm.com/v1"
kind: OidcConfig
metadata:
name: my-oidc-provider-config
namespace: sample-namespace
spec:
discoveryUrl: <discovery-url-from-oidc-provider>
clientId: <client-id-from-oidc-provider>
clientSecretRef:
name: <kubernetes-secret-name>
key: <kubernetes-secret-key>
apiVersion: "security.cloud.ibm.com/v1"
kind: Policy
metadata:
name: my-sample-web-policy
namespace: sample-namespace
spec:
targets:
- serviceName: <kubernetes-service-name-to-protect>
paths:
- prefix: /webapp
method: ALL
policies:
- policyType: oidc
config: my-oidc-provider-config
rules: // optional
- claim: iss
match: ALL
source: access_token
values:
- <expected-issuer-id>
- claim: scope
match: ALL
source: access_token
values:
- openid
保护后端应用程序和 API
后端应用程序和 API 使用 Bearer 令牌流进行保护,在该流中,传入令牌将针对特定策略进行验证。Bearer 令牌授权流期望请求包含 Authorization
头,其中包含 JWT 格式的有效访问令牌。预期的头结构为 Authorization: Bearer {access_token}
。如果令牌成功验证,请求将转发到请求的服务。如果令牌验证失败,将返回 HTTP 401 到客户端,其中包含访问 API 所需的范围列表。
应用后端应用程序和 API 保护
保护后端应用程序和 API 需要创建两种类型的资源 - 使用 JwtConfig
资源来定义各种 JWT 提供商,以及 Policy
资源来定义后端应用程序保护策略。
apiVersion: "security.cloud.ibm.com/v1"
kind: JwtConfig
metadata:
name: my-jwt-config
namespace: sample-namespace
spec:
jwksUrl: <the-jwks-url>
apiVersion: "security.cloud.ibm.com/v1"
kind: Policy
metadata:
name: my-sample-backend-policy
namespace: sample-namespace
spec:
targets:
- serviceName: <kubernetes-service-name-to-protect>
paths:
- prefix: /api/files
method: ALL
policies:
- policyType: jwt
config: my-oidc-provider-config
rules: // optional
- claim: iss
match: ALL
source: access_token
values:
- <expected-issuer-id>
- claim: scope
match: ALL
source: access_token
values:
- files.read
- files.write
已知限制
在撰写本文时,应用身份和访问适配器有两个已知的限制
如果您将应用身份和访问适配器用于 Web 应用程序,则不应创建多个适配器副本。由于 Envoy 代理处理 HTTP 头的方式,无法从 Mixer 返回多个
Set-Cookie
头到 Envoy。因此,我们无法设置处理 Web 应用程序场景所需的所有 cookie。该问题最近在 Envoy 和 Mixer 中得到了解决,我们计划在我们的适配器的未来版本中解决这个问题。**请注意,这仅影响 Web 应用程序,不会以任何方式影响后端应用程序和 API**。作为一般的最佳实践,您应该始终考虑对任何集群内通信使用双向 TLS。目前,Mixer 和应用身份和访问适配器之间的通信通道当前不使用双向 TLS。将来,我们计划通过实施 Mixer 适配器开发人员指南 中描述的方法来解决这个问题。
总结
当多云策略到位时,随着环境的增长和多样化,安全性可能会变得复杂。虽然云提供商提供协议和工具来确保其产品安全,但开发团队仍然负责应用程序级别的安全性,例如使用 OAuth2 的 API 访问控制,使用流量加密来防御中间人攻击,以及为服务访问控制提供双向 TLS。但是,这在多云环境中变得复杂,因为您可能需要为每个服务分别定义这些安全细节。有了适当的安全协议,可以减轻这些外部和内部威胁。
开发团队一直在努力使他们的服务可移植到不同的云提供商,同样,安全措施也应该是灵活的,并且不依赖于基础设施。
Istio 和应用身份和访问适配器允许您在不进行任何代码更改或重新部署的情况下保护您的 Kubernetes 应用程序,无论您使用何种编程语言和框架。遵循这种方法可确保您的应用程序具有最大的可移植性,以及在多个环境中轻松执行相同安全策略的能力。
您可以在 发布博客 中阅读有关应用身份和访问适配器的更多信息。