HashiCorp Packer Golden Image testen mit benutzerdefinierten mondoo-Richtlinien


Bicycle

Warum ein weiterer Artikel zu diesem Thema?

Wir haben bereits in einem früheren Artikel über Mondoo gesprochen. Mondoo wird Ihnen von dem Team präsentiert, das Ihnen InSpec und das DevSec-Projekt gebracht hat, mit der Leidenschaft, IT-Operationen menschenlesbar und ausführbar zu machen.

Warum beschäftigen wir uns erneut mit diesem Thema? Weil wir Ihnen zeigen möchten, wie Sie Ihre goldenen Images mit Mondoo testen können, basierend auf einem anderen Artikel, den wir über HashiCorp Packer geschrieben haben. Der Grund dafür ist einfach: Mondoo ist ein großartiges Tool, um Ihre goldenen Images auf Sicherheitslücken zu testen, und kitchen terraform wird eingestellt.

Testen eines goldenen Images mit Mondoo und terratest

Wenn Sie eine bestimmte Menge an Maschinenvorlagen definiert haben, die Sie für Ihre Infrastruktur verwenden möchten, sollten Sie sicherstellen, dass diese Vorlagen sicher sind. Hier kommt Mondoo ins Spiel. Mondoo ist ein Tool, mit dem Sie Ihre goldenen Images auf Sicherheitslücken testen können, aber auch Ihre Infrastruktur auf die Einhaltung bestimmter Sicherheitsstandards und Organisationsstandards prüfen können. Wir können dies mit benutzerdefinierten Richtlinien verwenden, um das veraltete Kitchen Terraform Setup zu ersetzen, das inspec für diesen Zweck verwendete.

Das fehlende Bindeglied zwischen diesen Technologien ist, wie man sein goldenes Image für die Tests mit Mondoo startet. Hier kommt terratest ins Spiel. Terratest ist eine Go-Bibliothek, die es erleichtert, automatisierte Tests für Ihren Infrastrukturcode zu schreiben. Es ist ein großartiges Tool, um Ihr goldenes Image zu starten und es mit Mondoo zu testen. Hier finden Sie auch einen großartigen Artikel darüber, wie man Terratest mit Terraform verwendet.

Wie man ein goldenes Image mit Mondoo und terratest testet

Der tatsächliche Go-Code, um ein goldenes Image mit Mondoo und Terratest zu testen, ist ziemlich einfach. Den vollständigen Code sehen Sie im folgenden Snippet:

 1package test
 2
 3import (
 4//...
 5)
 6
 7const (
 8    remotePort           = 22
 9    remoteUser           = "coder"
10)
11
12func TestMondooBased(t *testing.T) {
13
14    expectedName := fmt.Sprintf("terratest-mondoo-%s", random.UniqueId())
15    cloud := os.Getenv("CLOUD")
16
17    terraformOptions := terraform.WithDefaultRetryableErrors(t, &terraform.Options{
18        // Pfad zum Terraform-Code, der getestet wird.
19        TerraformDir: fmt.Sprintf("./fixtures/%s/", cloud),
20        Vars: map[string]interface{}{
21            "vm_image_id": os.Getenv("PACKER_IMAGE_ID"),
22            "location":    os.Getenv("PACKER_LOCATION"),
23            "subnet_id":   os.Getenv("PACKER_SUBNET_ID"),
24            "vpc_id":      os.Getenv("PACKER_VPC_ID"),
25            "vm_name":     expectedName,
26        },
27    })
28
29    defer terraform.Destroy(t, terraformOptions)
30
31    terraform.InitAndApply(t, terraformOptions)
32
33    target_ipaddress := terraform.Output(t, terraformOptions, "target_ipaddress")
34
35    assert.NotEmpty(t, target_ipaddress)
36
37    runMondooTests(t, target_ipaddress, expectedName, "core")
38    runMondooTests(t, target_ipaddress, expectedName, os.Getenv("TESTNAME"))
39
40}

Wir haben eine Testfunktion, die eingebettete Testfunktionen verwendet, um bestimmte Tests auszuführen. Die runMondooTests-Funktion führt die Mondoo-Tests aus. In unserem Beispiel-Setup haben wir das core-Richtlinienset, das alle Maschinenvorlagen bestehen müssen. Es gibt auch spezielle Tests, die sich auf die eigentliche Bereitstellung der Maschinenvorlage beziehen. Am Ende führen wir die Mondoo-Tests für das core-Richtlinienset und die speziellen Tests für die Maschinenvorlage durch - und beide müssen bestanden werden.

Die tatsächlichen fixtures sind dieselben, die wir im früheren Artikel verwendet haben. Das core-Richtlinienset ist in einer Datei core.mql.yaml definiert und die speziellen Tests sind in einer Datei ${TESTNAME}.mql.yaml definiert. Wir haben die Tests vom Kitchen Terraform Setup zum Mondoo Setup übersetzt.

Die runMondooTests-Funktion ist wie folgt definiert:

 1func runMondooTests(t *testing.T, target_address string, expectedName string, profile string) {
 2
 3    policyBundleFile := fmt.Sprintf("./%s.mql.yaml", profile)
 4    if _, err := os.Stat(policyBundleFile); err != nil {
 5        t.Logf("Richtlinienbündeldatei nicht gefunden: %s", policyBundleFile)
 6        return
 7    }
 8    logFile := fmt.Sprintf("%s_%s.log", expectedName, profile)
 9
10    var policyFilters []string
11
12    assetConfig := &inventory.Config{
13        Type:        "ssh",
14        Host:        target_address,
15        Port:        int32(22),
16        Options:     map[string]string{},
17        Credentials: []*vault.Credential{},
18    }
19
20    bundleLoader := policy.DefaultBundleLoader()
21    policyBundle, err := bundleLoader.BundleFromPaths(policyBundleFile)
22    if err != nil {
23        t.Error(errors.Wrap(err, "Konnte das Richtlinienbündel nicht aus "+policyBundleFile+" laden"))
24        return
25    }
26
27    conf := inventory.New(inventory.WithAssets(&inventory.Asset{
28        Name:        expectedName,
29        Connections: []*inventory.Config{assetConfig},
30        Annotations: map[string]string{},
31        Labels:      map[string]string{},
32    }))
33
34    scanJob := &scan.Job{
35        Inventory:     conf,
36        Bundle:        policyBundle,
37        PolicyFilters: policyFilters,
38        ReportType:    scan.ReportType_FULL,
39    }
40
41    scanService := scan.NewLocalScanner()
42    res, err := scanService.RunIncognito(context.Background(), scanJob)
43    if err != nil {
44        t.Error("Scan fehlgeschlagen: " + err.Error())
45        return
46    }
47
48    if res == nil || res.GetFull() == nil {
49        t.Error("Scan fehlgeschlagen: Kein Ergebnis zurückgegeben, verwenden Sie `debug: true` Protokollierung für weitere Details")
50        return
51    }
52
53    report := res.GetFull()
54    handlerConf := reporter.HandlerConfig{
55        Format:       "compact",
56        OutputTarget: logFile,
57        Incognito:    true,
58    }
59    outputHandler, err := reporter.NewOutputHandler(handlerConf)
60    if err != nil {
61        t.Error("Fehler beim Erstellen eines Ausgabehandlers: " + err.Error())
62        return
63    }
64
65    buf := &bytes.Buffer{}
66    if x, ok := outputHandler.(*reporter.Reporter); ok {
67        x.WithOutput(buf)
68    }
69
70    if err := outputHandler.WriteReport(context.Background(), report); err != nil {
71        t.Error("Fehler beim Schreiben des Berichts auf das Ausgabemedium: " + err.Error())
72        return
73    }
74
75    scoreThreshold := uint64(100)
76    if os.Getenv("SCORE_THRESHOLD") != "" {
77        scoreThreshold, _ = strconv.ParseUint(os.Getenv("SCORE_THRESHOLD"), 10, 32)
78    }
79
80    if report.GetWorstScore() < uint32(scoreThreshold) {
81        t.Errorf("Scan %s wurde mit %d Punkten abgeschlossen und hat die Punktegrenze von %d nicht bestanden", profile, report.GetWorstScore(), scoreThreshold)
82        return
83    }
84
85    t.Logf("Scan %s wurde mit %d Punkten abgeschlossen und hat die Punktegrenze von %d bestanden", profile, report.GetWorstScore(), scoreThreshold)
86}

Diese Funktion führt die Mondoo-Tests für ein bestimmtes Richtlinienset aus. Sie lädt das Richtlinienbündel aus einer Datei und führt dann die Tests gegen die von Terratest erstellte Maschine durch. Das Ergebnis der Tests wird in einer Protokolldatei gespeichert. Am Ende prüft die Funktion, ob die Tests anhand einer bestimmten Punktegrenze bestanden wurden.

Fazit

Die Definition von Maschinenvorlagen ist ein wesentlicher Bestandteil Ihrer Infrastruktur. Sie sollten sicherstellen, dass diese Vorlagen sicher und konform mit bestimmten Standards sind. Mondoo ist ein großartiges Tool, um Ihre goldenen Images auf Sicherheitslücken zu testen, aber auch Ihre Infrastruktur auf die Einhaltung bestimmter Sicherheitsstandards und Organisationsstandards zu prüfen. Und Terratest wird sehr nützlich, um Ihr goldenes Image zu starten und es mit Mondoo zu testen. In diesem Artikel haben wir Ihnen gezeigt, wie Sie Ihre goldenen Images mit Mondoo und Terratest testen können. Wir hoffen, dass dieser Artikel Ihnen geholfen hat und dass Sie etwas Neues gelernt haben.

Vielen Dank fürs Lesen!

Zurück Unsere Trainings entdecken

Wir sind für Sie da

Sie interessieren sich für unsere Trainings oder haben einfach eine Frage, die beantwortet werden muss? Sie können uns jederzeit kontaktieren! Wir werden unser Bestes tun, um alle Ihre Fragen zu beantworten.

Hier kontaktieren