在 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 凭证。

graph TD A[使用 IRSA 管理 EKS Pod 权限] --> B[创建 IAM 角色并附加所需策略] B --> C[创建服务帐户并注解角色 ARN] C --> D[在 Pod 部署中使用服务帐户] D --> E[结束]

步骤:

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 角色,而无需通过服务帐户。

graph TD A[使用 EKS Pod Identity 管理 EKS Pod 权限] --> B[创建 Pod 身份关联] B --> C[在 Pod 部署中使用服务帐户] C --> D[结束]

步骤:

创建 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 都将获得相同的权限。

graph TD A[使用 Node IAM Role 管理 EKS Pod 权限] --> B[将策略附加到 Node IAM 角色] B --> C[Pod 继承权限] C --> D[结束] B --> E["安全性较低,不推荐使用"]

步骤:

将策略附加到节点 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。

  • 细粒度控制: 使用服务帐户进行细粒度的权限控制。