本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
为通过置备的资源配置最低权限权限 CloudFormation
AWS CloudFormation 允许您配置许多不同类型的 AWS 资源。预调配的资源需要自己的一组权限才能按预期运行,并配置谁有权访问这些资源。上一章回顾了配置访问和使用 CloudFormation 服务的权限的选项。本章介绍如何将最低权限原则应用于通过 CloudFormation置备的资源。
在本指南中,几乎不可能查看可通过 CloudFormation配置的每类 AWS 资源的安全建议和最佳实践。如果您对某项特定服务有疑问,我们建议您查看该服务的文档。大多数 AWS 服务 文档都包含安全部分以及有关使用该服务所需权限的信息。有关 AWS 服务 文档的完整列表,请参阅 AWS 文档。
以下是与服务无关的高级步骤,您可以采取这些步骤来创建符合最低权限原则的 CloudFormation模板:
-
准备一份您计划使用配置的资源清单 CloudFormation。
-
请参阅 AWS 文档了解相关服务,并查看有关安全性和访问管理的章节。这将帮助您了解特定于服务的要求和建议。
-
使用您在前面的步骤中收集的信息来设计 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:GetObject、s3:GetObjectVersion和s3:PutObject需要 S3 对象资源类型,且s3:GetBucketVersioning需要 S3 存储桶资源类型。有关每个操作所需的资源类型的更多信息,请参阅 Amazon S3 的操作、资源和条件键。 -
-
该
Principal元素列出了允许执行语句中定义的 Amazon S3 操作的实体。在这种情况下,只允许 CodeBuild 和 CodePipeline 执行这些操作。 -
该
Condition元素进一步限制了对 S3 存储桶的访问权限,因此只有Deployfiles_buildCodeBuild 项目、Deployment-PipelineCodePipeline 管道和管道操作才能访问该存储桶。
创建服务角色
尽管存储桶策略控制对存储桶的访问权限,但它不授予访问 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}/*'