Blog
Wie können Sie beweisen, dass Ihre Infrastruktur konform ist?

Wenn Sie Ihre Cloud-Infrastruktur aufbauen. Und Sie müssen bestimmte Compliance-Standards einhalten. Dies können Sie mit präventiven und detektiven Kontrollen erreichen. In diesem Blogbeitrag möchte ich mich auf die präventive Kontrolle konzentrieren. Wie Sie die Bereitstellungspipeline stoppen können, wenn die Infrastruktur nicht konform ist. Und wie Sie dies mit CloudWatch Reports visualisieren können.
Nehmen wir an, unser Unternehmen hat die folgende Regel:
S3-Buckets müssen KMS-verschlüsselt sein
Wie können Sie eine Bereitstellung blockieren, die einen S3-Bucket ohne KMS-Verschlüsselung bereitstellen würde? Die Antwort lautet: mit CloudFormation Guard. Mit CloudFormation Guard können Sie präventive Compliance-Regeln schreiben. Diese können Sie dann zur Überprüfung Ihrer CloudFormation-Vorlagen verwenden.
Erstellen Sie eine Datei template.yaml mit dem folgenden Inhalt:
Resources:
MyBucket:
Type: AWS::S3::Bucket
Installieren Sie CloudFormation Guard anhand der mitgelieferten Anweisungen.
Anschließend müssen Sie eine s3.guard Datei mit folgendem Inhalt erstellen:
# Select all resources of the type AWS::S3::Bucket
let buckets = Resources.*[ Type == 'AWS::S3::Bucket' ]
# Only when there are reources of the type AWS::S3::Bucket
rule S3_bucket_encryption_at_rest when %buckets !empty {
# Check that each resource has the SSEAlgorithm set to aws:kms
%buckets.Properties {
BucketEncryption.ServerSideEncryptionConfiguration[*] {
ServerSideEncryptionByDefault.SSEAlgorithm == 'aws:kms' <<S3 Bucket must use KMS encryption.>>
}
}
}
Für weitere Informationen über die Regeln und das Format. Ich empfehle die Lektüre Einführung in AWS CloudFormation Guard 2.0.
Gut, jetzt können wir die Vorlage mit dem folgenden Befehl validieren:
cfn-guard validate --rules s3.guard --data template.yml
Wenn Sie nun die template.yml wie folgt ändern:
Resources:
MyBucket:
Type: AWS::S3::Bucket
Properties:
BucketEncryption:
ServerSideEncryptionConfiguration:
- ServerSideEncryptionByDefault:
SSEAlgorithm: aws:kms
Wenn Sie den Befehl erneut ausführen, wird er jetzt ausgeführt.
Wenn Sie diesen Schritt in Ihrer Deployment-Pipeline ausführen. Dadurch wird Ihr CodeBuild-Projekt gestoppt und scheitert. Es wird verhindert, dass die nicht konforme Infrastruktur bereitgestellt wird. Aber wenn Sie eine Bereitstellung haben, die blockiert ist. Sie möchten nicht in den CloudWatch-Protokollen des Builds nachsehen. Und Sie haben vielleicht viele Guard-Dateien, die Sie überprüfen möchten.
Um es sich einfacher zu machen, können Sie CodeBuild Reports verwenden. Mit diesen Berichten erhalten Sie einen visuellen Überblick darüber, welche Regel bestanden hat und welche Rolle fehlgeschlagen ist.
Aber standardmäßig erzeugt cfn-guard keine kompatiblen Berichte. Und wenn Sie ihn ausführen und er Fehler aufweist, wird er mit einem Exit-Code von 1 beendet.
Ich habe ein Konvertierungstool geschrieben, das Ihnen dabei hilft: report2junit.
Es führt die JSON-Berichte zusammen und wandelt sie in das von CodeBuild Reports verwendete JUnit-Format um. Durch die Verwendung von || true postfix wird die Ausführung von CodeBuild fortgesetzt.
Stattdessen gibt das Tool report2junit einen Exit-Code von 1 zurück, nachdem es den Bericht erstellt hat. Und da der Bericht vorhanden ist, wenn er fehlschlägt, können Sie anhand dieses Berichts feststellen, welche Regel fehlgeschlagen ist.
Dadurch müssen Sie nicht mehr in die CodeBuild-Protokolle schauen.
version: 0.2
phases:
install:
runtime-versions:
python: 3.8
commands:
- pip install -Ur requirements.txt
- mkdir -p reports
build:
commands:
- cfn-guard validate --rules s3.guard --data template.yml --output-format json --show-summary none > reports/s3-guard.json || true
- cfn-guard validate --rules dynamodb.guard --data template.yml --output-format json --show-summary none > reports/dynamodb-guard.json || true
post_build:
commands:
- report2junit reports/s3-guard.json reports/dynamodb-guard.json --destination-file reports/cfn-guard.xml
reports:
Tests:
base-directory: ./reports
file-format: JUNITXML
files:
- cfn-guard.xml
Fazit
Wenn Sie CloudFormation Guard in Kombination mit CodeBuild Reports verwenden, ist es einfacher zu sehen, welche Regeln fehlgeschlagen sind, und es wird eine Historie geführt.
Wenn Sie über einen soliden Satz von Compliance-Regeln verfügen. Sie erhalten einen Bericht, mit dem Sie beweisen können, dass die Erstellung der Infrastruktur konform war. Außerdem können Sie verhindern, dass nicht konformer Code in der Produktion eingeführt wird.
Verfasst von

Joris Conijn
Joris is the AWS Practise CTO of the Xebia Cloud service line and has been working with the AWS cloud since 2009 and focussing on building event-driven architectures. While working with the cloud from (almost) the start, he has seen most of the services being launched. Joris strongly believes in automation and infrastructure as code and is open to learning new things and experimenting with them because that is the way to learn and grow.
Unsere Ideen
Weitere Blogs
Contact



