Blog
Geheimnisse in AWS CloudFormation verschlüsseln

Letztes Jahr habe ich in einem Blog darüber geschrieben, wie Sie in Ihrer CloudFormation-Vorlage Geheimnisse erzeugen und diese im Parameter Store speichern. Das funktioniert, wenn Sie das Geheimnis selbst wählen können. Aber was ist, wenn Ihnen ein Geheimnis vorgegeben wird? Zum Beispiel einen API-Schlüssel oder ein Passwort, das für die Authentifizierung bei einem Drittanbieter verwendet werden soll? Mit der neuesten Funktion des Custom Secret Providers können Sie ein verschlüsseltes Geheimnis angeben, das entschlüsselt wird, bevor es im Parameter Store gespeichert wird.
Wie funktioniert das?
Es ist ganz einfach: Sie geben den verschlüsselten Wert in Ihrer CloudFormation Custom::Secret Ressource als EncryptedContent an:
Resources:
ApiKey:
Type: Custom::Secret
Properties:
Name: /datadog/api-key
EncryptedContent: AQICAHgefwksukJYA7L2AkPMZLGjZsGxHbvY9AoVs55dcju1AwEZui/8lNbnGAhv63Wh0heUAAAA3zCB3AYJKoZIhvcNAQcGoIHOMIHLAgEAMIHFBgkqhkiG9w0BBwEwHgYJYIZIAWUDBAEuMBEEDOXKKVZ4ft75/oZ2TQIBEICBlzf5j1M3w6OH+iphx59kFLnNoKb+u1RCLfIqEitrt6VGu13/jDlnDcPE2DfkZFkW3fnmNn5OXfgt1L9j4XYdIQTEwexorNqUr5pUtMfS9YX8yL9DbArH+XBv/OQPSj8VsuWRcwFP5EwZKB9O4X3l1pZlPafp2Y/ndWXgC1o6YgfplnmjufoUUTy8wi4P5glbwnqGP/iyc7g=
ReturnSecret: true
RefreshOnUpdate: true
ServiceToken: !Sub 'arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:binxio-cfn-secret-provider'
Der Wert sollte mit dem KMS-Schlüssel alias/cmk/cfn-secrets verschlüsselt sein, damit der Anbieter ihn entschlüsseln kann.
Nach der Bereitstellung finden Sie den API-Schlüssel im EC Parameter Store unter dem Namen /datadog/api-key als Typ SecureString. Der Wert ist für Sie im Klartext verfügbar. Wenn Sie in Ihrem Cloudformation-Modul auf das Geheimnis zugreifen müssen, müssen Sie ReturnSecret angeben und es als Attribut Secret referenzieren.
DATADOG_API_KEY: !GetAtt 'ApiKey.Secret'
Installation
Um diese benutzerdefinierte Ressource zu installieren, geben Sie ein:
git checkout https://github.com/binxio/cfn-secret-provider
cd cfn-secret-provider
aws cloudformation create-stack
--capabilities CAPABILITY_IAM
--stack-name cfn-secret-provider
--template-body
file://cloudformation/cfn-custom-resource-provider.json
aws cloudformation wait stack-create-complete
--stack-name cfn-secret-provider
Diese CloudFormation-Vorlage verwendet unseren vorkonfigurierten Provider von s3://binxio-public/lambdas/cfn-secret-provider-0.13.0.zip
Dieser benutzerdefinierte Anbieter darf nur Werte aus dem Schlüssel mit dem Alias alias/cmk/cfn-secrets entschlüsseln, der zusammen mit dem Anbieter erstellt wurde. Wenn
Sie andere Schlüssel verwenden möchten, fügen Sie der Lamdba-Richtlinie Entschlüsselungsberechtigungen hinzu.
Werte verschlüsseln
Nachdem der CloudFormation-Provider bereitgestellt wurde, können Sie die Werte mit dem 4-Zeilen-Python-Dienstprogramm encrypt-secret verschlüsseln.
$ ./encrypt-secret my-secret-api-key
Demo
Um das einfache Beispiel für die benutzerdefinierte Ressource zu installieren, geben Sie ein:
API_KEY=replace-me-with-your-key
aws cloudformation create-stack
--stack-name cfn-secret-provider-demo
--template-body file://cloudformation/demo-stack.json
--parameters ParameterKey=ApiKey,ParameterValue=$(./encrypt-secret $API_KEY)
aws cloudformation wait stack-create-complete
--stack-name cfn-secret-provider-demo
Natürlich wird in diesem Fall das Geheimnis als Parameter übergeben, da es vom Schlüssel abhängt.
um zu überprüfen, ob Ihr Schlüssel im Parameterspeicher gespeichert wurde, geben Sie ein:
aws ssm get-parameter --name /cfn-secret-provider-demo-api-key --with-decryption
Fazit
Mit der Option Verschlüsselter Inhalt des CloudFormation Secret-Anbieters können Sie
bestimmte Geheimnisse in CloudFormation angeben und sie sicher im SSM-Parameterspeicher bereitstellen.
Bis hierher? Wahrscheinlich gefällt Ihnen die Bereitstellung von privaten Schlüsselpaaren und die Bereitstellung von ACM-Zertifikaten mit CloudFormation.
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



