0Pricing
Cloud & IT Cert Prep · 课时

S3 访问控制:桶策略与 ACL

编写桶策略,将其与 ACL 进行比较,并配置公有访问阻止设置以实现安全托管。

S3 访问控制:桶策略与 ACL 是 CoddyKit 上的免费 Cloud & IT Cert Prep 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cloud & IT Cert Prep 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cloud & IT Cert Prep 课程共包含 4 节课。

S3 访问控制概述

S3 提供多种相互重叠的访问控制机制:IAM policies(基于身份,控制主体可以执行的操作)、bucket policies(针对存储桶的基于资源的 JSON 策略)、Access Control Lists (ACLs)(旧版的对象级或存储桶级授权),以及 S3 Block Public Access(账户级或存储桶级覆盖设置,无论其他策略如何配置,都会阻止所有公共访问)。目前对于大多数使用场景,建议采用存储桶策略加 Block Public Access 的方式;ACL 被视为旧版机制。

存储桶策略:基于资源的 JSON

存储桶策略是直接附加到 S3 存储桶的 JSON 文档。它规定哪些主体(IAM 用户、角色、AWS 账户、服务或公共用户)可以对哪些资源(存储桶和/或特定键前缀)执行哪些操作。存储桶策略支持跨账户访问,无需使用 IAM 角色:您可以直接在存储桶策略中授予其他 AWS 账户的 IAM 角色对存储桶中特定对象的读取权限。每个存储桶只能有一个策略,大小上限为 20 KB。

# Allow a specific IAM role from another account to read objects
{
  'Version': '2012-10-17',
  'Statement': [{
    'Effect': 'Allow',
    'Principal': {
      'AWS': 'arn:aws:iam::999999999999:role/PartnerReadRole'
    },
    'Action': 's3:GetObject',
    'Resource': 'arn:aws:s3:::my-bucket/partner-data/*'
  }]
}

使对象可公开读取

要提供公共内容(例如静态网站资源、公共数据集),您可以通过存储桶策略使对象可公开读取。首先,在存储桶级别禁用 Block Public Access,然后添加一条存储桶策略声明,其中包含 Principal: '*' 和 Action: s3:GetObject。必须同时禁用 Block Public Access 设置并在存储桶策略中使用 Allow;只启用其中一项将无法正常工作。除非您确实希望所有对象都公开,否则请始终将 Resource 限制在特定前缀,而不是整个存储桶。

# Public read policy for static website assets
{
  'Version': '2012-10-17',
  'Statement': [{
    'Effect': 'Allow',
    'Principal': '*',
    'Action': 's3:GetObject',
    'Resource': 'arn:aws:s3:::my-website-bucket/public/*'
  }]
}

S3 Block Public Access 设置

S3 Block Public Access 是一种安全保护机制,包含四项可以覆盖存储桶策略和 ACLs 的设置:BlockPublicAcls(拒绝设置公共 ACLs 的请求)、IgnorePublicAcls(忽略现有的公共 ACLs)、BlockPublicPolicy(拒绝授予公共访问权限的存储桶策略)以及 RestrictPublicBuckets(根据公共策略限制访问)。这四项设置默认全部启用。您还可以在账户级别启用 Block Public Access,无论各个存储桶的设置如何,都会对所有存储桶阻止公共访问——这非常适合防止意外公开数据。

# Enable all Block Public Access settings on a bucket
aws s3api put-public-access-block \
  --bucket my-private-bucket \
  --public-access-block-configuration \
    BlockPublicAcls=true,IgnorePublicAcls=true,BlockPublicPolicy=true,RestrictPublicBuckets=true

访问控制列表(ACLs):旧版机制

S3 ACLs 是最初的访问控制机制,早于 IAM。ACL 会向 AWS 账户或预定义组(所有用户、经过身份验证的 AWS 用户、日志传送服务)授予预定义权限(READ、WRITE、FULL_CONTROL)。ACLs 可以应用于存储桶级别,也可以应用于单个对象级别。AWS 目前建议禁用 ACLs(S3 的“Bucket Owner Enforced”设置会使存储桶所有者拥有所有对象,从而禁用 ACLs),改用存储桶策略和 IAM。SAA-C03 考试仍会将 ACLs 作为旧版概念进行考查。

# Disable ACLs by setting ownership to BucketOwnerEnforced
aws s3api put-bucket-ownership-controls \
  --bucket my-bucket \
  --ownership-controls '{"Rules":[{"ObjectOwnership":"BucketOwnerEnforced"}]}'

CloudFront 的源访问控制

通过 CloudFront 提供 S3 内容时,您通常希望存储桶保持私有,同时允许 CloudFront 获取对象。请使用源访问控制(OAC)——这是源访问身份(OAI)的现代替代方案。OAC 会创建一个 CloudFront 身份,您可以在存储桶策略中授予该身份 s3:GetObject 权限,同时保持启用 Block Public Access。这样,用户必须通过 CloudFront(以使用缓存、WAF 和 HTTPS),而不能直接访问存储桶——这是 SAA-C03 考试中常见的安全架构模式。

# Bucket policy granting CloudFront OAC access
{
  'Version': '2012-10-17',
  'Statement': [{
    'Effect': 'Allow',
    'Principal': {
      'Service': 'cloudfront.amazonaws.com'
    },
    'Action': 's3:GetObject',
    'Resource': 'arn:aws:s3:::my-bucket/*',
    'Condition': {
      'StringEquals': {
        'AWS:SourceArn': 'arn:aws:cloudfront::123456789012:distribution/EDFDVBD6EXAMPLE'
      }
    }
  }]
}

跨账户 S3 访问

有两种方式可以授予其他 AWS 账户访问您的 S3 存储桶的权限。选项 1——存储桶策略:添加一条声明,将外部账户的 ARN 指定为 Principal,并指定所需的 S3 操作。外部账户的 IAM 用户或角色仍需要具备调用 S3 的 IAM 权限,同时存储桶策略也必须对其 Allow。选项 2——带信任策略的 IAM 角色:在您的账户中创建一个信任外部账户的角色;外部账户中的身份通过承担该角色获得您存储桶的权限。对于只读场景,存储桶策略更简单;对于操作性访问,角色更合适。

Web 应用的 CORS 配置

跨源资源共享(CORS)允许托管在一个域名上的 Web 应用向另一个域名上的 S3 存储桶发起 JavaScript 获取请求。没有 CORS 配置时,浏览器会出于安全原因阻止这些请求。您需要向存储桶添加 CORS 配置,指定允许的来源、HTTP 方法和标头。当托管在 example.com 上的 React SPA 需要直接从 S3 存储桶 URL 获取图像或文件时,通常需要使用 CORS。

# Apply a CORS configuration
aws s3api put-bucket-cors \
  --bucket my-website-bucket \
  --cors-configuration '{"CORSRules":[{"AllowedOrigins":["https://example.com"],"AllowedMethods":["GET"],"AllowedHeaders":["*"],"MaxAgeSeconds":3600}]}'

用于临时访问的预签名 URL

预签名 URL可以授予对私有 S3 对象的限时访问权限(用于 GET 或 PUT),而无需更改任何存储桶或对象权限。该 URL 中包含您的凭证和过期时间——任何拥有该 URL 的人都可以在其过期前访问对象。您可以使用预签名 URL:让应用中的经过身份验证的用户下载私有文件;允许客户端直接向 S3 上传,而无需经过您的后端;或临时共享报告。有效期可以从 1 秒到 7 天不等(使用 STS 临时凭证时最长为 12 小时)。

# Generate a pre-signed GET URL valid for 24 hours
aws s3 presign s3://my-private-bucket/reports/invoice.pdf \
  --expires-in 86400

# Generate a pre-signed PUT URL (for client uploads)
aws s3 presign s3://my-private-bucket/uploads/new-file.pdf \
  --expires-in 3600 \
  --method PUT

用于安全控制的存储桶策略条件

使用存储桶策略条件来增加基于上下文的安全控制。常见模式包括:aws:SourceIp 将访问限制在特定 IP 范围内(例如 VPC 端点或企业网络);aws:SecureTransport: true 通过拒绝 HTTP 请求来强制使用 HTTPS(这是所有存储敏感数据的存储桶都应遵循的最佳实践);s3:x-amz-server-side-encryption 确保上传对象时必须使用服务器端加密;aws:PrincipalOrgID 将访问限制在您的 AWS 组织中的主体,从而防止数据泄露到外部账户。

# Deny non-HTTPS access to the bucket
{
  'Effect': 'Deny',
  'Principal': '*',
  'Action': 's3:*',
  'Resource': [
    'arn:aws:s3:::my-secure-bucket',
    'arn:aws:s3:::my-secure-bucket/*'
  ],
  'Condition': {
    'Bool': {'aws:SecureTransport': 'false'}
  }
}

用于私有访问的 S3 VPC 端点

默认情况下,私有子网中的 EC2 实例通过互联网(经由 NAT 网关)访问 S3,这会产生 NAT 费用,并使流量暴露于公共互联网。S3 网关端点无需 NAT 网关即可从 VPC 内部私密连接到 S3,且不收取额外费用。您可以将网关端点添加到路由表;发往 S3 的流量会自动通过 AWS 的私有网络进行路由。您还可以使用 aws:SourceVpce 添加存储桶策略条件,将访问限制为仅允许通过该端点发起的请求。

# Create an S3 gateway endpoint and associate with route tables
aws ec2 create-vpc-endpoint \
  --vpc-id vpc-12345678 \
  --service-name com.amazonaws.us-east-1.s3 \
  --route-table-ids rtb-12345678

快速检查

测试您对本课 AWS Solutions Architect(SAA-C03)概念的理解。

课程回顾

在本课中,您学习了:存储桶策略是基于资源的 JSON 文档,用于控制跨账户访问 S3 以及服务对 S3 的访问;S3 Block Public Access 是一种安全覆盖机制,可防止意外公开数据;以及预签名 URL、VPC 端点和 CORS 配置可以安全地应对特定的访问模式。接下来我们将学习 S3 版本控制、MFA Delete 和复制。

常见问题解答

「S3 访问控制:桶策略与 ACL」课时是免费的吗?

是的 — 「S3 访问控制:桶策略与 ACL」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cloud & IT Cert Prep 课程的其余内容,请升级到 CoddyKit PRO。 Cloud & IT Cert Prep 课程共包含 4 节课。

「S3 访问控制:桶策略与 ACL」这节课中我会学到什么?

编写桶策略,将其与 ACL 进行比较,并配置公有访问阻止设置以实现安全托管。 你通过在浏览器中直接运行的动手代码来练习 Cloud & IT Cert Prep,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Cloud & IT Cert Prep 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Cloud & IT Cert Prep 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「S3 访问控制:桶策略与 ACL」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Cloud & IT Cert Prep 课中编写并运行代码吗?

能。每节 Cloud & IT Cert Prep 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 桶、对象与区域
  2. S3 访问控制:桶策略与 ACL
  3. 版本控制、MFA 删除与复制
  4. 存储类别与生命周期策略
← 返回 Cloud & IT Cert Prep