برنامه نویسی

استقرار چند حساب با استفاده از کلید 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 نقش نیاز دارید.

  1. نقشی که باید در حساب دیگر به عهده گرفت. (نقش بین حسابی، پیکربندی شده در سطح اقدام)
  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 می تواند چالش برانگیز باشد زیرا تا حدودی یک مورد حاشیه ای است.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا