本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
為透過 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使用這些存放成品。您可以允許 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: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}/*'