استقرار چند حساب با استفاده از کلید KMS مدیریت شده توسط مشتری

در وبلاگ قبلی خود در مورد خطوط لوله برنامه نوشتم. این CodePipeline از یک سطل S3 استفاده می کند. اگر به جای کلید مدیریت شده آمازون به یک کلید مدیریت شده توسط مشتری نیاز دارید چه؟ و آیا می خواهید اکانت متقابل الگوهای CloudFormation را مستقر کنید؟ در این وبلاگ توضیح خواهم داد که چگونه می توانید به این هدف برسید.
خود کلید
بیایید با خود کلید شروع کنیم. هنگامی که CodePipeline مصنوعات را از یک مرحله به مرحله دیگر منتقل می کند، از S3 برای انتقال داده ها استفاده می کند. به همین دلیل باید به S3 و CodePipeline اجازه دهیم تا داده ها را رمزگشایی و رمزگذاری کنند:
- Action:
- kms:Decrypt
- kms:DescribeKey
- kms:Encrypt
- kms:ReEncrypt*
- kms:GenerateDataKey*
Effect: Allow
Principal:
AWS: "*"
Resource: "*"
Condition:
StringEquals:
aws:PrincipalOrgID: !Ref OrgId
kms:ViaService:
- Fn::Sub: s3.${AWS::Region}.amazonaws.com
- Fn::Sub: codepipeline.${AWS::Region}.amazonaws.com
در مرحله بعد، CloudFormation این الگوها را در سراسر حساب مستقر خواهد کرد. به همین دلیل باید به CloudFormation اجازه دهیم تا داده ها را رمزگشایی کند.
- Action: kms:Decrypt
Effect: Allow
Principal:
AWS: "*"
Resource: "*"
Condition:
StringEquals:
aws:PrincipalOrgID: !Ref OrgId
kms:ViaService: !Sub cloudformation.${AWS::Region}.amazonaws.com
نمونه های نشان داده شده در اینجا استفاده از کلید را برای خدمات AWS در سازمان AWS خود محدود می کند. سطل S3 باید از کلید KMS برای رمزگذاری استفاده کند.
خط لوله
CodePipeline باید بداند که ما از KMS به عنوان یک روش رمزگذاری استفاده می کنیم. به همین دلیل باید بگوییم از چه کلیدی استفاده کنیم.
Pipeline:
Type: AWS::CodePipeline::Pipeline
Properties:
ArtifactStores:
- Region: eu-west-1
ArtifactStore:
Location: !Sub codepipeline-artifacts-${AWS::AccountId}-eu-west-1
Type: S3
EncryptionKey:
Type: KMS
Id: alias/bucket-key
- Region: eu-central-1
ArtifactStore:
Location: !Sub codepipeline-artifacts-${AWS::AccountId}-eu-central-1
Type: S3
EncryptionKey:
Type: KMS
Id: alias/bucket-key
ما از نام مستعار استفاده می کنیم تا مجبور نباشیم با شناسه کلید سر و کار داشته باشیم.
استقرار اکانت/منطقه متقابل
ممکن است قبلاً آن را در قطعه کد قبلی دیده باشید. هنگامی که در سراسر منطقه مستقر می شوید، باید یک سطل و کلید در هر منطقه را پیکربندی کنید. هنگامی که در سراسر حساب مستقر می شوید، به 2 نقش نیاز دارید.
- نقشی که باید در حساب دیگر به عهده گرفت. (نقش بین حسابی، پیکربندی شده در سطح اقدام)
- نقشی برای استفاده برای اجرای CloudFormation. (cloudformation-execution-role، پیکربندی شده در پیکربندی)
Actions:
- Name: Ireland-CreateChangeSet
Region: eu-west-1
RunOrder: 1
RoleArn: !Sub arn:aws:iam::${DevelopmentAccountId}:role/cross-account-role
InputArtifacts:
- Name: BuildArtifactAsZip
ActionTypeId:
Category: Deploy
Owner: AWS
Provider: CloudFormation
Version: "1"
Configuration:
ActionMode: CHANGE_SET_REPLACE
RoleArn: !Sub arn:aws:iam::${DevelopmentAccountId}:role/cloudformation-execution-role
StackName: !Sub ${ProjectName}-$development
ChangeSetName: !Sub ${ProjectName}-development-ChangeSet
TemplatePath: BuildArtifactAsZip::packaged-template.yaml
Capabilities: CAPABILITY_NAMED_IAM
ParameterOverrides: |
{
"EnvType": "development"
}
- Name: Ireland-ExecuteChangeSet
Region: eu-west-1
RunOrder: 2
RoleArn: !Sub arn:aws:iam::${DevelopmentAccountId}:role/cross-account-role
ActionTypeId:
Category: Deploy
Owner: AWS
Provider: CloudFormation
Version: "1"
Configuration:
ActionMode: CHANGE_SET_EXECUTE
RoleArn: !Sub arn:aws:iam::${DevelopmentAccountId}:role/cloudformation-execution-role
StackName: !Sub ${ProjectName}-development
ChangeSetName: !Sub ${ProjectName}-development-ChangeSet
نقش متقابل حساب به توانایی انجام عملیات خام روی CloudFormation نیاز دارد. دسترسی به قالب ها و امکان پاس کردن cloudformation-execution-role داشته باشید. را BuildAccountId
شناسه حسابی است که کلیدهای KMS، سطل های S3 و خط لوله را نگه می دارد. این نقش باید بتواند به سطل های S3 دسترسی داشته باشد و از کلید KMS برای رمزگشایی استفاده کند.
CrossAccountRole:
Type: AWS::IAM::Role
Properties:
RoleName: cross-account-role
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Action: sts:AssumeRole
Effect: Allow
Principal:
AWS: !Sub arn:aws:iam::${BuildAccountId}:root
Policies:
- PolicyName: AllowCloudFormationDeployments
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action: iam:PassRole
Resource: !Sub arn:${AWS::Partition}:iam::${AWS::AccountId}:role/cloudformation-execution-role
- Effect: Allow
Action: cloudformation:DescribeStacks
Resource:
- !Sub arn:${AWS::Partition}:cloudformation:eu-west-1:${AWS::AccountId}:stack/*
- !Sub arn:${AWS::Partition}:cloudformation:eu-central-1:${AWS::AccountId}:stack/*
- Effect: Allow
Action:
- cloudformation:CreateStack
- cloudformation:DeleteStack
- cloudformation:UpdateStack
- cloudformation:CreateChangeSet
- cloudformation:ExecuteChangeSet
- cloudformation:DeleteChangeSet
- cloudformation:DescribeChangeSet
- cloudformation:SetStackPolicy
- cloudformation:SetStackPolicy
- cloudformation:ValidateTemplate
Resource:
- !Sub arn:${AWS::Partition}:cloudformation:eu-west-1:${AWS::AccountId}:stack/*
- !Sub arn:${AWS::Partition}:cloudformation:eu-central-1:${AWS::AccountId}:stack/*
- PolicyName: AllowArtifactAccess
PolicyDocument:
Version: 2012-10-17
Statement:
- Effect: Allow
Action:
- s3:GetObject
- s3:GetObjectVersion
Resource:
- !Sub arn:${AWS::Partition}:s3:::codepipeline-artifacts-${BuildAccountId}-eu-west-1/*
- !Sub arn:${AWS::Partition}:s3:::codepipeline-artifacts-${BuildAccountId}-eu-central-1/*
- Effect: Allow
Action: kms:Decrypt
Resource:
- !Sub arn:${AWS::Partition}:kms:eu-west-1:${BuildAccountId}:key/02d730ed-125b-4d2e-a498-7b0187298924
- !Sub arn:${AWS::Partition}:kms:eu-central-1:${BuildAccountId}:key/e127b617-6951-42b7-83ae-12acc16d12a7
نقش اجرایی همه حقوق لازم برای استقرار الگوی واقعی را دارد:
CloudFormationServiceRole:
Properties:
RoleName: cloudformation-execution-role
AssumeRolePolicyDocument:
Version: 2012-10-17
Statement:
- Action: sts:AssumeRole
Effect: Allow
Principal: { Service: cloudformation.amazonaws.com }
ManagedPolicyArns:
- !Sub arn:${AWS::Partition}:iam::aws:policy/AdministratorAccess
نتیجه
هنگام استفاده از کلیدهای مدیریت شده توسط مشتری، به پیکربندی اضافی نیاز دارید. کلید خود، پیکربندی جایی است که استفاده می شود و برخی از مجوزهای منطقی است. دریافت همه اینها از مستندات AWS می تواند چالش برانگیز باشد زیرا تا حدودی یک مورد حاشیه ای است.