Blog

Wie Sie CDK-Code mit cdk-nag prüfen und sichern

Yvo van Zee

Aktualisiert Oktober 16, 2025
8 Minuten

Verwendung eines Construct Hub cdk-nag Konstrukts zur Erstellung von sicherem CDK-Anwendungscode

Hintergrund

In meinem vorherigen Blog, CDK Pipelines und CloudFormation Linting, Ich habe darüber geschrieben, wie Sie cfn_nag in CDK-Pipelines verwenden können, um Ihre CloudFormation-Vorlagen auf bewährte Sicherheitspraktiken zu überprüfen. Mit dem Ziel, Ihren Code sicherer und unternehmenstauglicher zu machen. Am 2. Dezember letzten Jahres hat AWS angekündigt die allgemeine Verfügbarkeit des Konstruktions-Hub.

Der Construct Hub ist ein zentraler Ort, an dem die Open-Source-Community, AWS und Anbieter von Cloud-Technologien Konstruktionsbibliotheken für alle CDKs entdecken und gemeinsam nutzen können.

Im Construct Hub wird das konstruieren cdk-nag ist veröffentlicht worden. Mit dem cdk-nag-Konstrukt können Sie Ihre CDK-Anwendungen auf Best Practices prüfen, indem Sie eine Kombination aus verfügbaren Regelpakete. Wenn Sie dieses cdk-nag-Konstrukt verwenden und es innerhalb Ihres Codes einsetzen, um bewährte Sicherheitspraktiken zu überprüfen, wird Ihre Anwendung letztendlich sicherer werden. In diesem Artikel beschreibe ich, wie Sie das cdk-nag-Konstrukt in Kombination mit CDK verwenden können.

Voraussetzungen

Da dieser Blog die Verwendung von CDK beschreibt, sind Kenntnisse über CDK erforderlich. Glücklicherweise hat AWS Workshops zu diesem Thema eingerichtet. Bitte schauen Sie sich diese an, wenn Sie CDK ausprobieren möchten.

Außerdem benötigen Sie Zugang zu einem AWS-Konto mit den entsprechenden Rechten für die Bereitstellung von Ressourcen.

Installation

Die Idee dabei ist, einen einfachen S3-Bucket zu erstellen und cdk-nag den Code mit der Aspect-Funktion in CDK überprüfen zu lassen. Das Ergebnis wird mit dem normalen cfn_nag cli Tool überprüft, um zu sehen, ob es übereinstimmt. Danach importieren wir das Konstrukt des sicheren Buckets, das ich in meinem anderen Blog verwendet habe, um zu prüfen, ob der S3-Bucket dadurch sicher wird.

Beginnen Sie also mit der Erstellung eines CDK-Projekts und arbeiten Sie von dort aus weiter:

➜ mkdir s3bucket_mit_cdk_nag_construct && cd s3bucket_mit_cdk_nag_construct  
➜ cdk init app --Sprache python

Ich verwende hier Python, da in den vorherigen Blogs auch das Python CDK verwendet wurde und ich persönlich finde, dass es mehr Beispiele für Typescript als für Python gibt.

Szenario der realen Welt

In Unternehmen werden häufig Sicherheits-Frameworks eingesetzt, um sicherzustellen, dass die Ressourcen in der Cloud sicher bereitgestellt werden. AWS verfügt über den Service Security Hub, der Regelsätze zur Unterstützung solcher Sicherheits-Frameworks bereitstellen kann.

Bei der Entwicklung einer CDK-Anwendung ist es manchmal schwierig zu überprüfen, ob der von Ihnen erstellte Code konform ist oder nicht, bevor Sie Ihre CDK-Stacks tatsächlich einsetzen.

Mit Tools wie cfn_nag können Sie Ihre CloudFormation-Vorlagen auf bewährte Sicherheitspraktiken überprüfen. Jetzt mit dem Konstrukt cdk_nag aus dem Hub konstruieren ist es möglich, cfn_nag-Regeln und -Prüfungen während der Synthese direkt in Ihren Code-Satz zu implementieren.

Bauen gehen

Da wir CDK Version 2 verwenden, werden uns viele Abhängigkeiten abgenommen. Wir müssen nur noch cdk-nag hinzufügen. Bearbeiten Sie in der CDK-Anwendung die Datei requirements.txt und fügen Sie cdk-nag hinzu. Ich verwende für dieses Beispiel cdk-nag ab Version 2.10, also die neueste Version.

aws-cdk-lib==2.16.0
konstruiert>=10.0.0,<11.0.0
cdk-nag>=2.10.0

Installieren Sie nun alles. Wechseln Sie zunächst in die virtuelle Umgebung, die mit dem Befehl cdk init app erstellt wurde:

➜ cdkpipeline_mit_cfn_nag_construct git:(main) ✗ source .venv/bin/activate  
(.venv) ➜ cdkpipeline_mit_cfn_nag_construct git:(main) ✗ pip install -r requirements.txt
Sammeln von aws-cdk-lib==2.16.0
  Herunterladen von aws_cdk_lib-2.16.0-py3-none-any.whl (64.1 MB)
  |████████████████████████████████| 64.1 MB 311 kB/s  
Sammeln von Konstrukten<11.0.0,>=10.0.0
  Herunterladen von constructs-10.0.87-py3-none-any.whl (54 kB)
  |████████████████████████████████| 54 kB 5.9 MB/s  
Sammeln von cdk-nag>=2.10.0
  Herunterladen von cdk_nag-2.10.4-py3-none-any.whl (661 kB)
  |████████████████████████████████| 661 kB 8.0 MB/s  
Sammeln von jsii<2.0.0,>=1.54.0
  Zwischengespeicherte jsii-1.55.0-py3-none-any.whl verwenden (383 kB)
Sammeln von Veröffentlichungen>=0.0.3
  Zwischengespeicherte Veröffentlichung verwenden-0.0.3-py2.py3-none-any.whl (7.7 kB)
Sammeln von Typisierungserweiterungen<5.0,>=3.7
  Zwischengespeicherte typing_extensions-4.1.1-py3-none-any.whl verwenden (26 kB)
Sammeln von Cattrs<1.11,>=1.8
  Zwischengespeicherte cattrs-1.10.0-py3-none-any.whl verwenden (29 kB)
Sammeln von python-dateutil
  Zwischengespeicherte python_dateutil-2.8.2-py2.py3-none-any.whl verwenden (247 kB)
Sammeln von attrs~=21.2
  Zwischengespeicherte attrs-21.4.0-py2.py3-none-any.whl verwenden (60 kB)
Sammeln von sechs>=1.5
  Zwischengespeicherte six-1.16.0-py2.py3-none-any.whl verwenden (11 kB)
Installation der gesammelten Pakete: six, attrs, typing-extensions, python-dateutil, cattrs, publication, jsii, constructs, aws-cdk-lib, cdk-nag
Erfolgreich installiert attrs-21.4.0 aws-cdk-lib-2.16.0 cattrs-1.10.0 cdk-nag-2.10.4 constructs-10.0.87 jsii-1.55.0 publication-0.0.3 python-dateutil-2.8.2 six-1.16.0 typing-extensions-4.1.1

Nachdem wir nun alle Abhängigkeiten installiert haben, ist es an der Zeit, den Code hinzuzufügen.

S3 Bucket erstellen

Da wir jetzt CDK Version 2 verwenden, ist es nicht erforderlich, das Bucket-Konstrukt als separate pip-Installation zu installieren. Dies wurde bereits mit der Installation der CDK Version 2 Bibliotheken erledigt.

Öffnen Sie das Projekt in Ihrem bevorzugten Editor, bei mir ist es Visual Studio Code.

Öffnen Sie innerhalb des Projekts die Datei s3bucket_with_cdk_nag_construct_stack.py im Ordner s3bucket_with_cdk_nag_construct. Diese Datei wird für die Erstellung des S3-Buckets verwendet.

Fügen Sie den import aws_s3 as s3 hinzu, um das S3-Konstrukt zu importieren.

from aws_cdk importieren (
  aws_s3 als s3,
  Stapel,
)
from constructs import Konstrukt

class S3BucketWithCfnNagConstructStack(Stack):

  def __init__(self, scope: Construct, construct_id: str, **kwargs) -> Keine:
  super().__init__(scope, construct_id, **kwargs)

  s3.Bucket(self, 'S3Bucket')

Was ist der Unterschied zwischen diesem Stack und dem Stack, der in der CDK Pipelines und CloudFormation Linting der CDK Version 1 verwendet, sind die Import-Anweisungen.

Synthetisieren Sie nun das CDK-Projekt. Dadurch wird die CloudFormation-Vorlage angezeigt. Hier ist der Ausschnitt aus meiner Vorlage:

Ressourcen:
  S3Bucket07682993:
  Typ: AWS::S3::Bucket
  UpdateReplacePolicy: Behalten
  LöschungPolitik: Behalten

Das ist die Ausgabe, die ein einfaches S3-Bucket-Konstrukt als CloudFormation json-Ausgabe erzeugt. Wenn Sie cfn_nag_scan lokal ausführen möchten, müssen Sie das Paket cfn-nag als Ruby-Gem installieren:

(.venv) ➜ s3bucket_mit_cdk_nag_construct git:(main) ✗ sudo gem install cfn-nag

Damit können Sie cfn_nag_scan auf die synthetisierte Vorlage im Verzeichnis cdk.out anwenden:

(.venv) ➜ s3bucket_with_cdk_nag_construct git:(main) ✗ cfn_nag_scan -i cdk.out/S3BucketWithCfnNagConstructStack.template.json
------------------------------------------------------------
cdk.out/S3BucketWithCfnNagConstructStack.template.json
------------------------------------------------------------------------------------------------------------------------
| WARN W51
|
| Ressource: ["S3Bucket07682993"]
| Zeilennummern: [4]
|
| S3 Bucket sollte wahrscheinlich eine Bucket Policy haben
------------------------------------------------------------
| WARN W35
|
| Ressource: ["S3Bucket07682993"]
| Zeilennummern: [4]
|
| S3 Bucket sollte die Zugriffsprotokollierung konfiguriert haben
------------------------------------------------------------
| WARN W41
|
| Ressource: ["S3Bucket07682993"]
| Zeilennummern: [4]
|
| S3 Bucket sollte die Verschlüsselungsoption eingestellt haben

Ausfälle zählen: 0
Warnungen zählen: 3

Wie Sie sehen können, ist der einfach über das S3-Bucket-Konstrukt erstellte Bucket nicht so sicher für cfn_nag konfiguriert. Das ist ja schön und gut, aber was wäre, wenn wir einen Aspect für cfn_nag_scan verwenden könnten. Lassen Sie uns mit der Konfiguration von cdk_nag beginnen. Aktualisieren Sie die Datei s3bucket_with_cdk_nag_construct_stack.py, um das cdk_nag-Konstrukt zu verwenden:

from aws_cdk importieren (
  Aspekte,
  Stapel,
  aws_s3 als s3,
)
from constructs import Konstrukt
importieren cdk_nag

class S3BucketWithCfnNagConstructStack(Stack):
  def __init__(self, scope: Construct, construct_id: str, **kwargs) -> Keine:
  super().__init__(scope, construct_id, **kwargs)

  s3.Bucket(self, 'S3Bucket')
  Aspects.of(self).add(cdk_nag.AwsSolutionsChecks())

Wie Sie sehen können, werden in der Import-Anweisung die Pakete Aspects und cdk_nag importiert. Achten Sie darauf, dass der Name des zu importierenden Pakets klein geschrieben ist und nicht mit Bindestrich. Die letzte Zeile im Code ist der eigentliche Teil, der das cdk_nag-Konstrukt aufruft. Hier wird es als Aspect auf die Konstrukte innerhalb dieses Stacks verwendet, aber Sie können cdk_nag auch auf einer Stackebene verwenden. Dann müssen Sie das cdk_nag-Konstrukt in der Datei app.py importieren und stattdessen Aspect.of(App).add(cdk_nag.AwsSolutions(Checks()) verwenden. Mehr zu den Optionen von cdk_nag finden Sie in der Dokumentation zum Hub konstruieren

Jetzt ist also alles bereit, die CDK-App zu synthetisieren:

(.venv) ➜ s3bucket_mit_cdk_nag_construct git:(main) ✗ cdk synth
[Fehler bei /S3BucketWithCfnNagConstructStack/S3Bucket/Resource] AwsSolutions-S1: Für das S3 Bucket sind die Serverzugriffsprotokolle deaktiviert.

[Fehler bei /S3BucketWithCfnNagConstructStack/S3Bucket/Resource] AwsSolutions-S2: Der öffentliche Zugriff auf das S3 Bucket ist nicht eingeschränkt und gesperrt.

[Fehler bei /S3BucketWithCfnNagConstructStack/S3Bucket/Resource] AwsSolutions-S3: Für das S3 Bucket ist die Standardverschlüsselung nicht aktiviert.

[Fehler bei /S3BucketWithCfnNagConstructStack/S3Bucket/Resource] AwsSolutions-S10: Das S3 Bucket verlangt nicht, dass Anfragen SSL verwenden.

Gefundene Fehler

Aufgrund von Fehlern, die durch cdk_nag ausgelöst werden, wird die Synthese nicht durchgeführt. Wenn wir das Ergebnis mit dem normalen cfn_nag_scan vergleichen, können Sie sehen, dass das cdk_nag-Konstrukt einen zusätzlichen Fehler verursacht.

[Fehler bei /S3BucketWithCfnNagConstructStack/S3Bucket/Resource] AwsSolutions-S10: Das S3 Bucket verlangt nicht, dass Anfragen SSL verwenden.

Sichern Sie den Eimer

In meinem vorherigen Beitrag Sicheres S3 Bucket Konstrukt mit CDK Version 2 Ich habe darüber geschrieben, wie man ein sicheres Bucket-Konstrukt erstellt. Lassen Sie uns das ausprobieren und sehen, wie sicher es wirklich ist.

Importieren Sie das Konstrukt des sicheren Buckets von pypi.org. Fügen Sie das Paket secure-bucket-construct==2.1.0 zur Datei requirements.txt hinzu und führen Sie pip install -r requirements.txt erneut aus.

Fügen Sie sie nun der Datei s3bucket_with_cdk_nag_construct_stack.py hinzu, damit wir sie anstelle des normalen S3-Bucket-Imports verwenden können. Die Datei s3bucket_with_cdk_nag_construct_stack.py sollte wie folgt aussehen:

from aws_cdk importieren (
  Aspekte,
  Stapel,
  aws_s3 as s3,
)
from constructs import Konstrukt
from secure_bucket_construct import SecureBucket
importieren cdk_nag

class S3BucketWithCfnNagConstructStack(Stack):

  def __init__(self, scope: Construct, construct_id: str, **kwargs) -> Keine:
  super().__init__(scope, construct_id, **kwargs)

  SecureBucket(self, 'SecureS3Bucket')
  Aspects.of(self).add(cdk_nag.AwsSolutionsChecks())

Beim Synthetisieren der Vorlage können Sie nun sehen, dass in der CloudFormation-Vorlage mehr hinzugefügt wurde, wie ein AWS KMS-Schlüssel, ein S3 Bucket und eine S3 Bucket Policy. Das cdk_nag-Konstrukt löst keine Fehler aus. Funktioniert es noch? Wir können dies mit cfn_nag_scan überprüfen.

Wenn Sie nun cfn_nag_scan auf der synthetisierten Vorlage ausführen, lautet das Ergebnis 0 Fehlschläge und 0 Warnungen:

(.venv) ➜ s3bucket_with_cdk_nag_construct git:(main) ✗ cfn_nag_scan -i cdk.out/S3BucketWithCfnNagConstructStack.template.json
------------------------------------------------------------
cdk.out/S3BucketWithCfnNagConstructStack.template.json
------------------------------------------------------------
Ausfälle zählen: 0
Warnungen zählen: 0

Glückliche Tage!

Rekapitulation: mit cdk-nag aus dem Hub konstruieren sind wir in der Lage zu sehen, ob die Ressourcen während der Synthese gemäß den Best Practices eingesetzt werden. Es wurde auch gezeigt, wie man das secure-bucket-construct von pypi.org die ich in meinem vorherigen Blog erstellt habe.

Testen Sie sich selbst

Den gesamten oben verwendeten Code finden Sie in meinem GitHub: S3 Bucket geprüft mit cdk-nag Konstrukt

 

Verfasst von

Yvo van Zee

I'm an AWS Cloud Consultant working at Oblivion. I specialised myself in architecting and building high available environments using automation (Infrastructure as Code combined with Continuous Integration and Continuous Delivery (CI/CD)). Challenging problems and finding solutions which fit are my speciality.

Contact

Let’s discuss how we can support your journey.