发布于: 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 访问控制相关的场景,无论是新应用新项目的架构设计、安全评估、安全测试,还是从企业/部门角度进行统一的安全规划,威胁建模,风险分析等,都可以做到游刃有余。

相关文章