如何允许多企业AWS账号从我方私有ECR仓库拉取镜像与Helm Chart
实现合作方访问私有ECR仓库(镜像+Helm Chart)及IAM配置建议
一、ECR仓库准备
- 创建对应类型的ECR仓库:
- 存储容器镜像:创建标准ECR仓库
- 存储Helm Chart:选择「Helm chart」类型的ECR仓库(AWS ECR原生支持OCI格式的Helm Chart存储)
- 推送资源到仓库:
- 镜像推送:先执行登录命令
aws ecr get-login-password --region <你的区域> | docker login --username AWS --password-stdin <你的账号ID>.dkr.ecr.<你的区域>.amazonaws.com,给镜像打标签后用docker push <你的账号ID>.dkr.ecr.<你的区域>.amazonaws.com/<镜像仓库名>:<标签>完成推送 - Helm Chart推送:执行登录命令
aws ecr get-login-password --region <你的区域> | helm registry login --username AWS --password-stdin <你的账号ID>.dkr.ecr.<你的区域>.amazonaws.com,然后用helm push <本地Chart包路径> oci://<你的账号ID>.dkr.ecr.<你的区域>.amazonaws.com/<Chart仓库名>推送
- 镜像推送:先执行登录命令
二、IAM权限配置(核心)
需为合作方配置最小权限的访问实体,优先用IAM角色(更安全),特殊场景下用IAM用户。
方式1:合作方拥有AWS账号(推荐)
- 创建IAM角色,设置信任策略允许合作方账号的实体扮演该角色:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::<合作方账号ID>:root" }, "Action": "sts:AssumeRole", // 可选:添加IP限制等条件增强安全性 "Condition": { "IpAddress": { "aws:SourceIp": ["合作方固定IP段"] } } } ] } - 给角色附加拉取权限策略,严格限定资源范围:
{ "Version": "2012-10-17", "Statement": [ // 镜像仓库拉取权限 { "Effect": "Allow", "Action": [ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability", "ecr:DescribeImages" ], "Resource": "arn:aws:ecr:<你的区域>:<你的账号ID>:repository/<镜像仓库名>" }, // Helm Chart仓库拉取权限 { "Effect": "Allow", "Action": [ "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability", "ecr:DescribeImages", "ecr:GetRepositoryPolicy", "ecr:DescribeRepositories", "ecr:ListImages" ], "Resource": "arn:aws:ecr:<你的区域>:<你的账号ID>:repository/<Chart仓库名>" }, // 获取授权令牌的必要权限 { "Effect": "Allow", "Action": "ecr:GetAuthorizationToken", "Resource": "*" } ] } - 合作方通过
aws sts assume-role --role-arn arn:aws:iam::<你的账号ID>:role/<角色名> --role-session-name <自定义会话名>获取临时凭证,用该凭证访问ECR。
方式2:合作方无AWS账号(用IAM用户)
- 创建IAM用户,禁用控制台访问,仅开启程序访问(生成Access Key和Secret Key)
- 给用户附加上述相同的最小权限策略
- 通过加密渠道(如线下加密传输、AWS Secrets Manager共享)将密钥安全传递给合作方
三、合作方拉取资源操作步骤
拉取镜像
- 配置凭证后登录ECR:
- 临时角色凭证:先设置环境变量
export AWS_ACCESS_KEY_ID=<临时AK> AWS_SECRET_ACCESS_KEY=<临时SK> AWS_SESSION_TOKEN=<会话Token>,再执行登录命令 - IAM用户密钥:直接执行
aws ecr get-login-password --region <你的区域> | docker login --username AWS --password-stdin <你的账号ID>.dkr.ecr.<你的区域>.amazonaws.com(需提前配置本地AWS凭证)
- 临时角色凭证:先设置环境变量
- 拉取镜像:
docker pull <你的账号ID>.dkr.ecr.<你的区域>.amazonaws.com/<镜像仓库名>:<标签>
拉取Helm Chart
- 配置凭证后登录ECR Helm仓库:执行
aws ecr get-login-password --region <你的区域> | helm registry login --username AWS --password-stdin <你的账号ID>.dkr.ecr.<你的区域>.amazonaws.com - 拉取Chart:
helm pull oci://<你的账号ID>.dkr.ecr.<你的区域>.amazonaws.com/<Chart仓库名> --version <目标版本号>
四、IAM配置最佳实践
- 严格遵循最小权限:仅授予合作方拉取指定仓库的必要权限,避免使用
ecr:*这类宽泛权限 - 优先使用IAM角色:临时凭证自动过期,避免长期密钥泄露风险
- 密钥轮换与监控:若使用IAM用户,强制开启密钥轮换;开启CloudTrail日志,跟踪ECR访问行为
- 定期审计权限:每隔一段时间检查IAM实体权限,移除冗余权限或废弃实体
- 添加信任条件:为IAM角色的信任策略添加IP、用户等限制条件,进一步缩小访问范围
内容的提问来源于stack exchange,提问作者unbox-us
相关产品推荐
相关产品推荐

