Blog
So starten Sie eine Autoscaling-Gruppe mit einem kontoübergreifend verschlüsselten AMI

Die Verwendung verschlüsselter Amazon-Maschinen-Images von einem anderen Konto in einer Autoscaling-Gruppe funktioniert nicht ohne Weiteres. Sie müssen eine explizite KMS-Erlaubnis erstellen, damit es funktioniert. In diesem Blog zeige ich Ihnen, wie Sie dies in CloudFormation mithilfe unseres benutzerdefinierten KMS-Grant-Anbieters in CloudFormation konfigurieren können.
Um Autoscaling-Gruppen auf der Grundlage eines verschlüsselten AMI von einem anderen AWS-Konto zu erstellen, müssen Sie die folgenden drei Schritte ausführen
:
- Einen Customer Managed Key (CMK) erstellen
- Erstellen Sie das AMI mit dem Schlüssel
- Gewähren Sie dem Autoscaling-Dienst Zugriff auf den Schlüssel
Einen kundenverwalteten KMS-Schlüssel erstellen
Um ein Amazon Machine Image zu erstellen, das in verschiedenen Konten verwendet werden kann, müssen Sie einen vom Kunden verwalteten KMS-Schlüssel verwenden. Der Grund dafür ist, dass von AWS verwaltete Schlüssel nicht außerhalb des Kontos verwendet werden können, in dem sie erstellt wurden.
Die folgende CloudFormation-Ressource definiert eine KMS-Verschlüsselungsschlüsselrichtlinie, die es ermöglicht, verschlüsselte Maschinen-Images in anderen Konten zu verwenden
:
EncryptionKey:
Type: AWS::KMS::Key
Properties:
Description: 'EBS encryption key'
EnableKeyRotation: true
KeyPolicy:
Version: '2012-10-17'
Statement:
- Sid: Enable IAM User Permissions
Effect: Allow
Principal:
AWS: !Sub 'arn:aws:iam::${AWS::AccountId}:root'
Action: kms:*
Resource: '*'
- Sid: Allow use of the key
Effect: Allow
Principal:
AWS:
- arn:aws:iam::111111111111:root
- arn:aws:iam::222222222222:root
Action:
- kms:Encrypt
- kms:Decrypt
- kms:ReEncrypt*
- kms:GenerateDataKey*
- kms:DescribeKey
Resource: '*'
- Sid: Allow attachment of persistent resources
Effect: Allow
Principal:
AWS:
- arn:aws:iam::111111111111:root
- arn:aws:iam::222222222222:root
Action:
- kms:ListGrants
- kms:CreateGrant
- kms:RevokeGrant
Resource: '*'
Mit dieser Schlüsselrichtlinie kann der Schlüssel in den Zielkonten 111111111111 und 222222222222 verwendet werden. Jetzt können Sie
ein verschlüsseltes Image mit diesem Schlüssel erstellen.
Erstellen Sie das AMI mit dem Schlüssel
Um das Amazon Maschinen-Image mit dem Schlüssel zu erstellen, können Sie den Packer AMI Builder von Hashicorp verwenden. Das folgende Packer-Snippet zeigt Ihnen die
wesentlichen Teile zur Erstellung eines verschlüsselten Images:
...
"builders": [{
"encrypt_boot": true,
"kms_key_id": "{{user kms_key}}",
"ami_regions": ["eu-central-1"],
"region_kms_key_ids": {
"eu-central-1": "{{user kms_key}}"
},
"ami_users": [ "111111111111", "222222222222" ],
"snapshot_users":[ "111111111111", "222222222222" ],
...
In den Zeilen 3-7 wird das Image mit unserem vom Kunden verwalteten Schlüssel verschlüsselt. In Zeile 9 wird das AMI für unsere Zielkonten freigegeben. In Zeile 10 wird sichergestellt, dass das Zielkonto den Snapshot ebenfalls lesen kann. Dieses Image kann bereits verwendet werden, um Instanzen virtueller Maschinen in den Zielkonten zu starten. Aber jeder Versuch, eine Autoscaling-Gruppe zu starten, schlägt mit der folgenden Fehlermeldung fehl:
Client.InternalError: Client error on launch.
Um dies zu beheben, müssen Sie dem AWS Autoscaling-Service Zugriff auf den KMS-Schlüssel gewähren.
Gewähren Sie dem Autoscaling-Dienst Zugriff auf den Schlüssel
Um dem Autoscaling-Dienst im Zielkonto Zugriff auf den Schlüssel zu gewähren, erstellen Sie wie folgt eine KMS-Erlaubnis:
CustomAMI:
Type: Custom::AMI
Properties:
Filters:
name: your-custom-ami-name
Owners:
- '0000000000' # source account of the ami
ExpectedNumberOfKmsKeys: 1
ServiceToken: !Sub 'arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:binxio-cfn-ami-provider'
KMSGrant:
Type: Custom::KMSGrant
Properties:
Name: autoscaling-access-to-encrypted-custom-ami
KeyId: !GetAtt CustomAMI.KmsKeyId
GranteePrincipal: !Sub 'arn:aws:iam::${AWS::AccountId}:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling'
Operations:
- Encrypt
- Decrypt
- ReEncryptFrom
- ReEncryptTo
- GenerateDataKey
- GenerateDataKeyWithoutPlaintext
- DescribeKey
- CreateGrant
ServiceToken: !Sub 'arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:binxio-cfn-kms-provider'
Die KMS-Schlüssel-ID des Maschinen-Images wird mit Custom::AMI in Zeile 1-9 abgerufen. Der KMS-Grant für den Schlüssel wird in Zeile 11-26 durch Custom::KMSGrant definiert. Jetzt kann die Autoscaling-Gruppe Instanzen von Ihrem verschlüsselten Maschinen-Image starten. Das ist alles, was Sie wissen müssen. Wenn Sie diese benutzerdefinierten Anbieter ebenfalls verwenden möchten, müssen Sie sie installieren.
Installation
Um den benutzerdefinierten KMS Grant Provider zu installieren, geben Sie ein:
git clone https://github.com/binxio/cfn-kms-provider.git
cd cfn-kms-provider
aws cloudformation deploy
--capabilities CAPABILITY_IAM
--stack-name cfn-kms-provider
--template-file ./cloudformation/cfn-resource-provider.yaml
Um den benutzerdefinierten AMI-Anbieter zu installieren, geben Sie ein:
git clone https://github.com/binxio/cfn-ami-provider.git
cd cfn-ami-provider
aws cloudformation deploy
--capabilities CAPABILITY_IAM
--stack-name cfn-ami-provider
--template-file ./cloudformation/cfn-resource-provider.yaml
Dadurch wird unser vorgefertigter Provider von s3://binxio-public-${AWS_REGION}/lambdas/cfn-ami-provider-latest.zip installiert.
Fazit
Wenn Sie ein verschlüsseltes Maschinen-Image von einem anderen Konto in einer Autoscaling-Gruppe verwenden möchten, müssen Sie eine KMS-Berechtigung für die mit dem Autoscaling-Dienst verknüpfte Rolle erstellen. Die Verwendung der Custom::AMI und
Custom::KMSGrant können Sie
den erforderlichen KMS-Grant in einer CloudFormation-Vorlage mit unserem benutzerdefinierten Anbieter bereitstellen.
Verfasst von

Mark van Holsteijn
Mark van Holsteijn is a senior software systems architect at Xebia Cloud-native solutions. He is passionate about removing waste in the software delivery process and keeping things clear and simple.
Unsere Ideen
Weitere Blogs
Contact



