在 AWS EKS (Elastic Kubernetes Service) 环境中,正确管理 Pod 的权限是确保应用程序安全和合规性的关键。随着微服务架构的普及,Kubernetes 和 EKS 成为许多企业的首选容器 orchestration 平台。然而,随着 Pod 数量的增加,如何有效地管理这些 Pod 对 AWS 服务的访问权限,成为一个至关重要的问题。
在这篇文章中,我们将探讨几种常见的方法来解决 EKS Pod 访问 AWS 服务(如 RDS 和 DynamoDB)时的权限问题,并提供一些最佳实践建议。
1.使用 IAM Roles for Service Accounts (IRSA)
IRSA 是一种将 IAM 角色与 Kubernetes 服务帐户 (Service Account) 关联起来的方法,使 Pod 可以通过服务帐户获得临时 AWS 凭证。
步骤:
1.创建 IAM 角色并附加策略:
创建一个 IAM 角色,并附加所需的策略(如访问 RDS 和 DynamoDB 的权限)。
2.创建服务帐户并注解角色 ARN:
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-app-sa
namespace: default
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::ACCOUNT_ID:role/my-app-role
在 Deployment 中使用服务帐户:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
template:
metadata:
labels:
app: my-app
spec:
serviceAccountName: my-app-sa
containers:
- name: my-app
image: my-app-image
2. 使用 EKS Pod Identity (较新方法)
EKS Pod Identity 是一种更简单的方法,允许 Pod 直接使用 IAM 角色,而无需通过服务帐户。
步骤:
创建 Pod 身份关联:
aws eks create-pod-identity-association \
--cluster-name my-cluster \
--namespace default \
--service-account my-app-sa \
--role-arn arn:aws:iam::ACCOUNT_ID:role/my-app-role
在 Deployment 中使用服务帐户:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
template:
spec:
serviceAccountName: my-app-sa
3. 使用 Node IAM Role (不推荐)
这种方法通过将策略附加到节点的 IAM 角色来授予 Pod 权限,但这种方式安全性较低,因为所有运行在该节点上的 Pod 都将获得相同的权限。
步骤:
将策略附加到节点 IAM 角色:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
template:
spec:
containers:
- name: my-app
image: my-app-image
必需的 IAM 策略示例
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"dynamodb:GetItem",
"dynamodb:Query",
"dynamodb:Scan"
],
"Resource": "arn:aws:dynamodb:region:account-id:table/table-name"
},
{
"Effect": "Allow",
"Action": [
"rds-db:connect",
"rds:DescribeDBInstances"
],
"Resource": "arn:aws:rds:region:account-id:db:database-name"
}
]
}
推荐做法
使用 IRSA 或 EKS Pod Identity: 这两种方法都比使用 Node IAM Role 更安全,且更符合 Kubernetes 的最佳实践。
遵循最小权限原则: 只授予 Pod 所需的最低权限。
为不同的应用使用不同的角色: 这样可以更好地隔离权限。
定期审核和审查权限: 确保权限设置仍然符合安全要求。
最佳实践
网络配置: 确保 EKS 集群的 VPC、安全组和子网配置正确,以便 Pod 可以访问 RDS 和 DynamoDB。
细粒度控制: 使用服务帐户进行细粒度的权限控制。