View a markdown version of this page

为通过置备的资源配置最低权限权限 CloudFormation - AWS 规范性指导

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

为通过置备的资源配置最低权限权限 CloudFormation

AWS CloudFormation 允许您配置许多不同类型的 AWS 资源。预调配的资源需要自己的一组权限才能按预期运行,并配置谁有权访问这些资源。上一章回顾了配置访问和使用 CloudFormation 服务的权限的选项。本章介绍如何将最低权限原则应用于通过 CloudFormation置备的资源。

在本指南中,几乎不可能查看可通过 CloudFormation配置的每类 AWS 资源的安全建议和最佳实践。如果您对某项特定服务有疑问,我们建议您查看该服务的文档。大多数 AWS 服务 文档都包含安全部分以及有关使用该服务所需权限的信息。有关 AWS 服务 文档的完整列表,请参阅 AWS 文档

以下是与服务无关的高级步骤,您可以采取这些步骤来创建符合最低权限原则的 CloudFormation模板:

  1. 准备一份您计划使用配置的资源清单 CloudFormation。

  2. 请参阅 AWS 文档了解相关服务,并查看有关安全性和访问管理的章节。这将帮助您了解特定于服务的要求和建议。

  3. 使用您在前面的步骤中收集的信息来设计 CloudFormation 模板和关联策略,这些策略仅允许所需的权限而拒绝所有其他权限。

接下来,本指南将介绍如何使用真实用例在 CloudFormation 模板中应用最低权限原则的示例。

示例:用于存储管线构件的 Amazon S3 存储桶。

此示例将创建一个用于存储 AWS CodeBuild 项目构件的 Amazon Simple Storage Service(Amazon S3)存储桶。AWS CodePipeline 使用这些存储的构件。您可以通过服务角色 CodePipeline 允许 CodeBuild 和访问此 S3 存储桶,并使用 Amazon S3 存储桶策略控制该访问权限。以下是本示例中使用的资源名称:

  • Deployfiles_build是 CodeBuild 项目的名称。

  • Deployment-Pipeline是中管道的名称 CodePipeline。

定义 Amazon S3 存储桶

首先,在 CloudFormation 模板中定义 S3 存储桶,该存储桶是一个 YAML 格式的文本文件。

amzn-s3-demo-bucket: Type: AWS::S3::Bucket Properties: PublicAccessBlockConfiguration: BlockPublicAcls: true BlockPublicPolicy: true IgnorePublicAcls: true RestrictPublicBuckets: true

定义 Amazon S3 存储桶策略

接下来,在 CloudFormation 模板中创建仅允许Deployfiles_build项目和Deployment-Pipeline管道访问存储桶的存储桶策略。

MyBucketPolicy: Type: AWS::S3::BucketPolicy Properties: Bucket: !Ref amzn-s3-demo-bucket PolicyDocument: Version: "2012-10-17" Statement: - Sid: "S3ArtifactRepoAccess" Effect: Allow Action: - ‘s3:GetObject' - ‘s3:GetObjectVersion' - ‘s3:PutObject' - ‘s3:GetBucketVersioning' Resource: - !Sub ‘arn:aws:s3:::${amzn-s3-demo-bucket}' - !Sub ‘arn:aws:s3:::${amzn-s3-demo-bucket}/*' Principal: Service: - codebuild.amazonaws.com - codepipeline.amazonaws.com Condition: StringLike: ‘aws:SourceArn': - !Sub ‘arn:aws:codebuild:${AWS::Region}:${AWS::AccountId}:project/Deployfiles_build' - !Sub ‘arn:aws:codepipeline:${AWS::Region}:${AWS::AccountId}:Deployment-Pipeline' - !Sub ‘arn:aws:codepipeline:${AWS::Region}:${AWS::AccountId}:Deployment-Pipeline/*'

请注意有关该存储桶策略的以下详细信息:

  • Resource 元素列出了两种不同类型的资源,它们使用以下 Amazon 资源名称(ARN)格式:

    • S3 对象的 ARN 格式为 arn:$<Partition>:s3:::$<BucketName>/$<ObjectName>

    • S3 存储桶 ARN 的格式为 arn:$<Partition>:s3:::$<BucketName>

    s3:GetObjects3:GetObjectVersions3:PutObject 需要 S3 对象资源类型,且 s3:GetBucketVersioning 需要 S3 存储桶资源类型。有关每个操作所需的资源类型的更多信息,请参阅 Amazon S3 的操作、资源和条件键

  • Principal 元素列出了允许执行语句中定义的 Amazon S3 操作的实体。在这种情况下,只允许 CodeBuild 和 CodePipeline 执行这些操作。

  • Condition元素进一步限制了对 S3 存储桶的访问权限,因此只有Deployfiles_build CodeBuild 项目、Deployment-Pipeline CodePipeline 管道和管道操作才能访问该存储桶。

创建服务角色

尽管存储桶策略控制对存储桶的访问权限,但它不授予访问 CodeBuild 和 CodePipeline 访问存储桶的权限。要授予访问权限,您需要为每项服务创建一个服务角色,并在每个服务中添加以下语句。服务角色用于 CodeBuild 并 CodePipeline 允许服务访问 S3 存储桶及其对象。

Sid: "ViewAccessToS3ArtifactRepo" Effect: Allow Action: - ‘s3:GetObject' - ‘s3:GetObjectVersion' - ‘s3:PutObject' - ‘s3:GetBucketVersioning' Resource: - !Sub ‘arn:aws:s3:::${BuildArtifactsBucket}' - !Sub ‘arn:aws:s3:::${BuildArtifactsBucket}/*'