在现代云原生架构中,身份验证和授权是确保系统安全的关键环节。AWS 提供了多种身份验证机制,其中 IAM OIDC 和 EKS OIDC 是两种常见的解决方案,但它们的使用场景和功能却大不相同。本文将深入探讨这两种 OIDC(OpenID Connect)身份提供商的区别,帮助你更好地理解它们的用途和配置方式。
什么是 OIDC?
OIDC(OpenID Connect)是基于 OAuth 2.0 协议的身份验证层,用于验证用户身份并获取用户信息。它通过标准的 JWT(JSON Web Token)实现身份验证,广泛应用于云原生和分布式系统中。
在 AWS 生态中,OIDC 主要用于两种场景:
IAM OIDC:用于工作负载身份验证(如 Kubernetes Pod 访问 AWS 资源)。
EKS OIDC:用于人类用户身份验证(如开发人员访问 Kubernetes 集群)。
接下来,我们将详细分析这两种 OIDC 身份提供商。
AWS IAM OIDC 身份提供商
用途
AWS IAM OIDC 身份提供商的主要用途是支持 IAM Roles for Service Accounts (IRSA)。IRSA 允许 Kubernetes 集群中的 Pod 直接承担 IAM 角色,从而访问 AWS 资源(如 S3、DynamoDB 等)。这种方式避免了在 Pod 中硬编码 AWS 凭证,提高了安全性。
特点
集成对象:与 AWS IAM 服务集成。
使用场景:用于 Kubernetes 集群中的工作负载(Pod/服务)访问 AWS 资源。
配置方式:通过 EKS 集群的 OIDC 颁发者 URL 创建 IAM OIDC 提供商。
限制:每个 AWS 账户最多只能创建 100 个 OIDC 提供商。
示例配置
以下是一个 IAM OIDC 提供商的信任策略示例,用于允许特定 Kubernetes 服务账户承担 IAM 角色:
json
复制
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.region.amazonaws.com/id/EXAMPLE"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"oidc.eks.region.amazonaws.com/id/EXAMPLE:sub": "system:serviceaccount:NAMESPACE:SERVICE_ACCOUNT_NAME"
}
}
}
]
}
在这个配置中:
Federated
字段指定了 IAM OIDC 提供商的 ARN。Condition
字段限制了只有特定的 Kubernetes 服务账户可以承担该角色。
AWS EKS OIDC 身份提供商
用途
AWS EKS OIDC 身份提供商的主要用途是支持 人类用户访问 Kubernetes 集群。它允许 EKS 集群与外部身份提供商(如企业 SSO 系统)集成,从而实现统一的用户管理和身份验证。
特点
集成对象:与外部身份提供商(如 Okta、Auth0、Google Workspace 等)集成。
使用场景:用于开发人员、运维人员等人类用户访问 Kubernetes API。
配置方式:通过外部身份提供商的 OIDC URL 创建 EKS OIDC 提供商。
限制:每个 EKS 集群只能配置一个 OIDC 提供商。
示例配置
以下是一个 EKS OIDC 提供商的配置示例:
yaml
复制
apiVersion: eks.amazonaws.com/v1alpha1
kind: IdentityProviderConfig
metadata:
name: my-identity-provider
spec:
type: oidc
oidc:
issuerUrl: "https://your-oidc-provider.com"
clientId: "your-client-id"
usernameClaim: "email"
groupsClaim: "groups"
在这个配置中:
issuerUrl
指定了外部身份提供商的 OIDC 颁发者 URL。clientId
是 OIDC 客户端的唯一标识符。usernameClaim
和groupsClaim
用于映射用户信息和权限组。
主要区别总结
如何选择?
如果你的场景是 Kubernetes 工作负载需要访问 AWS 资源(如 S3、RDS 等),则应使用 IAM OIDC。
如果你的场景是 开发人员或运维人员需要访问 Kubernetes 集群,则应使用 EKS OIDC。
总结
AWS IAM OIDC 和 AWS EKS OIDC 虽然都基于 OIDC 协议,但它们的设计目标和应用场景完全不同。IAM OIDC 专注于工作负载身份验证,而 EKS OIDC 则专注于人类用户身份验证。理解它们的区别和适用场景,可以帮助你更好地设计和管理云原生架构中的身份验证机制。