Nutzung von Terraform für verbesserte Asset-Sicherheit mit Mondoo - Teil 2: Data Sources


Bicycle

Da Unternehmen bestrebt sind, ihre digitalen Assets zu schützen, sind innovative Lösungen wie Mondoo aufgetaucht, um die Sicherheit und Compliance in verschiedenen Infrastrukturen zu verbessern. In unserem vorherigen Blog haben wir Mondoo vorgestellt und seine Integration mit Terraform untersucht, um die Bereitstellung von sicheren und konformen Umgebungen zu automatisieren. Heute gehen wir auf den entscheidenden Aspekt der Data Sources in Terraform ein und zeigen, wie die Fähigkeiten von Mondoo genutzt werden können, um ein robustes Infrastrukturmanagement zu gewährleisten.

Was sind Data Sources in Terraform?

In Terraform können mit einer Data Source read-only Informationen abgerufen werden, die für die Konfiguration oder das Management von Ressourcen verwendet werden können. Data Sources sind wichtig, um bestehende Infrastrukturkomponenten zu referenzieren oder Informationen über Ressourcen zu sammeln, die nicht direkt von Terraform verwaltet werden können. Durch die Verwendung von Data Sources können Ressourcen dynamisch konfiguriert werden, basierend auf dem Echtzeit-Zustand der Infrastruktur, um sicherzustellen, dass die Konfigurationen immer aktuell und genau sind.

Mondoo's Data Sources

Dank unserer Zusammenarbeit mit dem Mondoo-Team bietet der Mondoo Terraform Provider ab Juli 2024 fünf wertvolle Data Sources, die die Sicherheits- und Compliance-Checks innerhalb Ihrer Infrastruktur verbessern. Schauen wir uns diese Data Sources im Detail an und lernen, wie sie effektiv genutzt werden können.

mondoo_organization

Mit der Data Source mondoo_organization können Informationen über eine bestimmte Organisation innerhalb von Mondoo abgerufen werden. Organisationen bieten eine Möglichkeit, Spaces zu gruppieren und Teammitglieder und Zugriff zu verwalten.

Verwendungsbeispiel:

1data "mondoo_organization" "org" {
2  id = "your-org-1234567"
3}
4
5output "org_mrn" {
6  description = "MRN of the organization"
7  value       = data.mondoo_organization.org.mrn
8}

Hier werden Details über eine Organisation mit der ID your-org-1234567 abgerufen und ihre MRN ausgegeben.

mondoo_space

Mit der Data Source mondoo_space können Details zu einem bestimmten Bereich in Mondoo abgerufen werden. Spaces leben in Organisationen und enthalten Mondoos Integrationen, Richtlinien und Frameworks.

Verwendungsbeispiel:

1data "mondoo_space" "space" {
2  id = "your-space-1234567"
3}
4
5output "space_name" {
6  description = "The name of the space"
7  value       = data.mondoo_space.space.name
8}

In diesem Beispiel werden Details über einen Bereich mit der ID your-space-1234567 abgerufen und sein Name ausgegeben.

mondoo_assets

Mit der Data Source mondoo_assets können Informationen über alle Assets innerhalb eines Mondoo-Spaces abgerufen werden. Dies ist besonders nützlich, um Details über Assets wie virtuelle Maschinen, Datenbanken oder Cloud-Ressourcen zu sammeln, die kontinuierlichen Sicherheitsbewertungen und Compliance-Checks unterliegen.

Verwendungsbeispiel:

1data "mondoo_assets" "assets_data" {
2  space_id = "my-space-1234567"
3}
4
5output "asset_mrns" {
6    value       = [for asset in data.mondoo_assets.assets_data.assets : asset.mrn]
7    description = "MRNs of the assets"
8}

In diesem Beispiel werden Details zu allen Assets innerhalb des Space mit der ID my-space-1234567 abgerufen und die MRNs ausgegeben. Dies kann für die dynamische Konfiguration anderer Ressourcen auf der Grundlage des Zustands dieser Assets nützlich sein.

mondoo_policies

Mit der Data Source mondoo_policies können Informationen über die in einem Mondoo-Space definierten Sicherheitsrichtlinien abgerufen werden. Dies ist wichtig, um sicherzustellen, dass die Infrastruktur die erforderlichen Sicherheitsstandards und Compliance-Richtlinien einhält.

Verwendungsbeispiel:

 1data "mondoo_policies" "policies_data" {
 2  space_id      = "your-space-1234567"
 3  catalog_type  = "ALL" # available options: "ALL", "POLICY", "QUERYPACK"
 4  assigned_only = true
 5}
 6
 7output "policies_mrn" {
 8  value       = [for policy in data.mondoo_policies.policies_data.policies : policy.policy_mrn]
 9  description = "The MRN of the policies in the space according to the filter criteria."
10}

Hier rufen wir Details über alle zugewiesenen Richtlinien innerhalb des Spaces mit der ID your-space-1234567 ab und geben die MRNs aus. Auf diese Weise kann sichergestellt werden, dass die richtigen Richtlinien innerhalb eines Spaces zugewiesen wurden.

mondoo_frameworks

Mit der Data Source mondoo_frameworks können Sie Informationen über die in einem Mondoo Space definierten Compliance Frameworks abrufen. Frameworks ermöglichen es einer Organisation, ihre Compliance mit Frameworks wie ISO/IEC 27001:2022 und vielen anderen zu managen und zu erhöhen.

Verwendungsbeispiel:

1data "mondoo_frameworks" "frameworks_data" {
2  space_id = "your-space-1234567"
3}
4
5output "framework_mrn" {
6  value       = [for framework in data.mondoo_frameworks.frameworks_data.frameworks : framework.mrn]
7  description = "The MRN of the frameworks in the space."
8}

Diese Konfiguration holt die MRNs aller Frameworks im angegebenen Space Ihr-Space-1234567 ab und zeigt sie an, was eine effektive Anzeige und Verwaltung von Compliance-Frameworks ermöglicht.

Beispiel: Dynamische Konfiguration auf Basis der Data Source einer Richtlinie

Betrachten wir ein Beispiel, in dem wir alle Richtlinien in einem neu erstellten Space, die zuvor deaktiviert waren, dynamisch aktivieren, basierend auf den Ergebnissen der Data Source mondoo_policies.

 1provider "mondoo" {
 2  region = "eu"
 3}
 4
 5resource "mondoo_space" "my_space" {
 6  name   = "My Space Name"
 7  org_id = "your-org-1234567"
 8}
 9
10data "mondoo_policies" "policies_data" {
11  space_id      = mondoo_space.my_space.id
12  catalog_type  = "ALL" # available options: "ALL", "POLICY", "QUERYPACK"
13  assigned_only = false
14}
15
16locals {
17  policies_mrn = [for policy in data.mondoo_policies.policies_data.policies : policy.policy_mrn]
18}
19
20resource "mondoo_policy_assignment" "space" {
21  space_id = mondoo_space.my_space.id
22
23  policies = local.policies_mrn
24
25  state = "enabled" # default is enabled, we also support preview and disabled
26
27  depends_on = [
28    mondoo_space.my_space
29  ]
30}

In diesem Beispiel verwenden wir die Data Source mondoo_policies, um die neuesten Ergebnisse der Sicherheitsüberprüfung abzurufen. Anschließend verwenden wir die Ressource mondoo_policy_assignment, um alle deaktivierten Richtlinien zu aktivieren. Auf diese Weise können wir sicherstellen, dass alle Richtlinien in jedem Fall aktiv sind.

Erstellen von Terraform Provider Data Sources

Wie bereits erwähnt, haben wir bei Infralovers in Zusammenarbeit mit dem Mondoo Team an der Erweiterung der Mondoo Terraform Provider Fähigkeiten gearbeitet. Wir haben unser Wissen über die Entwicklung von Terraform Providern erheblich erweitert. In diesem Blog der Serie möchten wir unser Wissen über die Entwicklung von Data Sources für Mondoo unter Verwendung des Terraform Provider Frameworks teilen.

Mondoo nutzt das terraform-plugin-codegen-framework, welches eine einfache und konsistente Erweiterung des Terraform Providers ermöglicht. Der folgende Code zeigt die Grundstruktur einer solchen Data Source, die wir im Detail besprechen werden. In den folgenden Abschnitten werden die verschiedenen Code- und Bausteine einer Data Source vorgestellt.

Packages und Imports

1package provider
2
3import (
4    "context"
5
6    "github.com/hashicorp/terraform-plugin-framework/datasource"
7    "github.com/hashicorp/terraform-plugin-framework/datasource/schema"
8    "github.com/hashicorp/terraform-plugin-framework/types"
9)

Wie in jedem Go-Code ist das erste, was wir typischerweise tun, den Paketnamen zu definieren, gefolgt vom Importieren der notwendigen Pakete und Abhängigkeiten, die der Code verwenden wird. Zu den wesentlichen Importen gehören hier context für die Verwaltung von Anfragekontexten und mehrere Pakete aus dem Terraform Plugin Framework, die für die Definition von Data Sources und deren Schemata in einem Terraform Provider wichtig sind.

Deklarieren von Datentypen

 1var _ datasource.DataSource = (*testDataSource)(nil)
 2
 3func NewTestDataSource() datasource.DataSource {
 4    return &testDataSource{}
 5}
 6
 7type testDataSource struct{}
 8
 9type testDataSourceModel struct {
10    Id types.String `tfsdk:"id"`
11}

Der mitgelieferte Go-Code definiert eine Terraform Data Source für einen Provider, der das HashiCorp Terraform Plugin Framework verwendet. Die Data Source heißt testDataSource und implementiert das Interface datasource.DataSource. Dieses Interface benötigt mehrere Funktionen, um den Lebenszyklus der Data Source zu verwalten: Metadata, Schema und Read.

Bevor wir mit der Implementierung der Data Source-Lebenszykluslogik beginnen, müssen wir die folgenden Typen definieren:

  • testDataSource: Dies ist eine leere Struktur, die als Empfänger für die Data Source Funktionen dient. Während unserer Entwicklung des Mondoo Providers würden wir diese Struktur verwenden, um die Client-API zu deklarieren, die in Mondoos Fall eine GraphQL-API ist. Dies würde es uns später ermöglichen, diesen Client aufzurufen, um GraphQL-Anfragen zu stellen.
  • testDataSourceModel: Diese Struktur definiert das Schema für die Data Source und enthält z.B. ein Feld Id vom Typ types.String. Zu beachten ist, dass die Struktur ein tfsdk: „id“ zum Id-Feld hinzufügt. Dies sagt Terraform, dass die Data Source ein Feld mit dem Namen „id“ haben kann.

Metadata Funktion

1func (d *testDataSource) Metadata(ctx context.Context, req datasource.MetadataRequest, resp *datasource.MetadataResponse) {
2    resp.TypeName = req.ProviderTypeName + "_test"
3}

Die Funktion Metadata legt den Namen der Data Source fest, indem sie an den Namen des Providers den Zusatz _test anhängt. Dies hilft Terraform, den Data Source Typ zu identifizieren.

Schema Funktion

1func (d *testDataSource) Schema(ctx context.Context, req datasource.SchemaRequest, resp *datasource.SchemaResponse) {
2    resp.Schema = schema.Schema{
3        Attributes: map[string]schema.Attribute{
4            "id": schema.StringAttribute{
5                Computed: true,
6            },
7        },
8    }
9}

Die Funktion Schema definiert das Schema für die Data Source. Sie gibt an, dass die Data Source ein Attribut id hat, das eine berechnete Zeichenkette ist. Das bedeutet, dass die id vom Provider generiert werden kann und nicht vom Benutzer geliefert werden muss.

Read Funktion

 1func (d *testDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) {
 2    var data testDataSourceModel
 3
 4    // Read Terraform configuration data into the model
 5    resp.Diagnostics.Append(req.Config.Get(ctx, &data)...)
 6
 7    if resp.Diagnostics.HasError() {
 8        return
 9    }
10
11    // Read API call logic
12
13    // Example data value setting
14    data.Id = types.StringValue("example-id")
15
16    // Save data into Terraform state
17    resp.Diagnostics.Append(resp.State.Set(ctx, &data)...)
18}

Die Funktion Read holt die Daten von der externen API oder dem Service und aktualisiert den Terraform-Status. Hier lesen wir die Konfigurationsdaten in unser testDataSourceModel und setzen das Attribut id. In der Funktion Read machen wir normalerweise einen API-Aufruf, um die notwendigen Daten abzurufen. Für dieses Beispiel setzen wir das Attribut id auf den Platzhalterwert „example-id“. In einer echten Implementierung würde man dies durch tatsächliche Daten ersetzen, die von Mondoo oder einem anderen Dienst abgerufen werden.

Code Zusammenfassung

Der Code bietet eine grundlegende Implementierung einer Terraform Data Source unter Verwendung des HashiCorp Terraform Plugin Frameworks. Er enthält Funktionen für die Verwaltung des Lebenszyklus der Data Source: Metadata, Schema und Read. Das Schema wird mit einem einzigen berechneten id-Attribut definiert. Die eigentliche Logik des API-Aufrufs zum Abrufen von Daten ist nicht implementiert und müsste an den durch Kommentare gekennzeichneten Stellen hinzugefügt werden. Die Funktion Read setzt einen Platzhalterwert für das Attribut id, der durch echte Daten von einer externen API ersetzt werden sollte.

Zusammenfassung

Data Sources in Terraform sind leistungsstarke Werkzeuge für die dynamische Konfiguration und Verwaltung der Infrastruktur auf der Grundlage von Echtzeitinformationen. Die Data Sources von Mondoo erweitern diese Fähigkeit, indem sie detaillierte Einblicke in Organisationen, Spaces, Richtlinien und Assets bieten. Durch die Nutzung dieser Data Sources kann sichergestellt werden, dass die Infrastruktur sicher und konform mit den neuesten Standards und Richtlinien bleibt.

In unserem nächsten Blogbeitrag werden wir uns mit dem Import bestehender Ressourcen in Terraform befassen. Bleiben Sie dran, um mehr darüber zu erfahren, wie Sie das volle Potenzial von Mondoo und Terraform für robuste Infrastruktursicherheit und Compliance ausschöpfen können.

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