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使用這些存放成品。您可以允許 CodeBuild 和 CodePipeline 透過服務角色存取此 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 Resource Name (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-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}/*'