发布于: Jun 28, 2022
Amazon S3 提供了 Block Public Access 功能以便于公共数据访问。在默认情况下,新存储桶、访问点和对象不允许公有访问(公有访问即未经 IAM SigV4 签名的请求,比如通过浏览器直接访问某个 S3 文件的 URL)。但是,用户可以修改存储桶策略、访问点策略或对象权限以允许公有访问。对于企业的安全部门来讲,限制甚至禁止普通用户有意或无意地将生产环境的S3存储桶对公暴露是常见的需求,也符合 Amazon Web Services 安全最佳实践。通过 BPA 功能的应用,可以使得 BPA 设置覆盖这些用户设置的策略和权限,以便于统一地限制这些资源的公有访问。
场景:A 公司提供行业机器学习 解决方案,B 公司作为数据采集公司为 A 公司提供原始数据,以便 A 公司做后续的处理、模型训练等。B 公司需要一次性将自己 S3 存储桶 bucket-b 里的海量数据安全高效地同步到 A 公司的存储桶 bucket-a。
解决方案:B 公司获取 A 公司的 IAM role 信息,双方配置信任关系,最终由 A 公司的 IAM user 以 assumerole 的方式获取B公司 role 的权限并发起 S3 同步操作。
配置步骤:
• A 公司创建名为’s3-ingest’的 IAM role, 附上以下 IAM Policy:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "List", "Effect": "Allow", "Action": "s3:ListBucket", "Resource": [ "arn:aws-cn:s3:::bucket-a", "arn:aws-cn:s3:::bucket-b" ] }, { "Sid": "Get", "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws-cn:s3:::bucket-b/*" }, { "Sid": "Put", "Effect": "Allow", "Action": "s3:PutObject", "Resource": "arn:aws-cn:s3:::bucket-a/*" } ] }
- 添加’s3-ingest’role的trust relationship 规则如下
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": " 456456456456 " }, "Action": "sts:AssumeRole" "Condition": {"StringEquals": {"sts:ExternalId": "COMPANYB666"}} } ] }
该信任规则允许该 role 被 B 公司账号(456456456456)的 IAM 用户来 assume。且通过指定 External ID 条件,强制要求 B 公司相关团队在上传过程中指 定External ID,防止了 Confused Deputy 攻击,进一步增强了安全性。
• A 公司将 IAM role ARN、External ID 等信息告知B公司相关团队;
• B 公司配置 bucket-b 存储桶的 Bucket Policy 以允许 A 公司的 role 访问,
{ "Version": "2008-10-17", "Id": "SourceBucket", "Statement": [ { "Sid": "Read", "Effect": "Allow", "Principal": { "AWS": "arn:aws-cn:iam::123123123123:role/s3-ingest" }, "Action": "s3:*", "Resource": [ "arn:aws-cn:s3:::bucket-b/*", "arn:aws-cn:s3:::bucket-b" ] } ] }
- B 公司配置本地工作环境。在 Amazon Web Services 命令行 client 端通过编辑 config 配置文件新配置一个 profile,
#vi ~/.aws/config
在文本文件下方加入以下内容:
[profile new] role_arn = arn:aws-cn:iam::123123123123:role/s3-ingest external_id = COMPANYB666 source_profile = default region = cn-north-1
- B 公司采用 Amazon Web Services 命令行工具发起文件拷贝,
#aws s3 cp s3://bucket-b/ s3://bucket-a/ --profile new
- 如配置正常,此时已发起了从源桶 bucket-b 往目标桶 bucket-a 的高速数据拷贝。等待拷贝结束后,B 公司即可通知 A 公司拷贝任务完成。
Amazon S3 作为云原生架构的核心组件,提供了大量的访问控制功能,这要求我们 Amazon Web Services 用户的安全团队、云团队对这些功能保持持续的了解,以便当工作中遇到 S3 访问控制相关的场景,无论是新应用新项目的架构设计、安全评估、安全测试,还是从企业/部门角度进行统一的安全规划,威胁建模,风险分析等,都可以做到游刃有余。
相关文章