Deployment-Gating mit OPA

In der Architektur „ DevSecOps “ müssen die im Rahmen der CI-Pipeline gesammelten Nachweise vor der Bereitstellung validiert werden, um sicherzustellen, dass die Assets die Compliance-Anforderungen erfüllen. Dieser Validierungsprozess fungiert als Qualitätskontrolle und verhindert, dass nicht konforme Assets in Staging- oder Produktionsumgebungen bereitgestellt werden.

Weitere Informationen zum Thema „Evidence Gating“ finden Sie unter „ Validierung von Beweismitteln “.

Wir stellen Open Policy Agent (OPA) vor

Um mehr Flexibilität zu bieten, unterstützt die Pipeline nun das Deployment-Gating mithilfe von Open Policy Agent (OPA). OPA ist eine Open-Source-Richtlinien-Engine für allgemeine Zwecke, die die Entscheidungsfindung hinsichtlich der Richtlinien von der Ausführung der Pipeline entkoppelt. Damit können Sie Compliance-Regeln als Code definieren, wodurch die Auswertungen in hohem Maße anpassbar und vollkommen transparent sind. OPA verwendet Rego als Abfragesprache, was das Erstellen und Pflegen von Richtlinien vereinfacht.

Weitere Informationen zu Open Policy Agent finden Sie unter „ Open Policy Agent “.

Was ist Rego?

Rego ist die native, deklarative Abfragesprache, die von OPA verwendet wird. Damit können Sie Ihre „Richtlinien als Code“ schreiben Anstatt sich auf fest programmierte Pipeline-Logik zu verlassen, werten Sie die Evidenzdaten der Pipeline aus und geben eine Entscheidung zurück.

Im Zusammenhang mit dem Deployment-Gating kann man sich Rego als Filter zwischen den von Ihnen gesammelten Nachweisen und Ihrer Zielumgebung vorstellen. Anstatt sich auf eine starre Pipeline-Logik zu verlassen, nimmt Rego die (als JSON formatierten) Daten der Pipeline entgegen und wertet sie anhand Ihrer benutzerdefinierten Regeln aus, um eine endgültige Entscheidung über die Bereitstellung zu treffen.

Weitere Informationen zu Rego finden Sie in den „Rego-Richtlinien “.

Der Standard für die „ allow “-Regel

Standardmäßig muss Ihre Rego-Versicherungspolice eine „ allow “-Klausel enthalten. Im Zusammenhang mit dieser Pipeline ist dies nicht nur ein Vorschlag – es ist eine zwingende Vorgabe.

Die Pipeline-Engine fragt speziell den booleschen Wert „ allow “ ab, um die endgültige Entscheidung über die Durchführung oder den Abbruch der Bereitstellung zu treffen. Wenn Sie eine benutzerdefinierte Rego-Richtlinie bereitstellen, müssen Sie diese Regel ausdrücklich definieren. Fehlt die Regel „ allow “ oder ergibt ihre Auswertung den Wert „ false “, wird die Pipeline sofort angehalten, die Bereitstellung blockiert und es werden die von Ihnen definierten Ablehnungsmeldungen ausgegeben.

Um maximale Sicherheit zu gewährleisten, arbeitet OPA nach einem strengen „Fail-Closed“-Prinzip. Ihre Richtlinie sollte standardmäßig immer auf „ false “ gesetzt sein und nur dann den Wert „ true “ annehmen, wenn alle erforderlichen Compliance-Bedingungen erfüllt sind.

package one_pipeline.config
# Default deny
default allow := false
# Allow only if your custom checks pass
allow {
    check_sast_scans_passed
    check_secrets_scans_passed
}

OPA in Ihrer Pipeline aktivieren

Um OPA für das Deployment-Gating zu nutzen, müssen Sie bestimmte Eigenschaften (Umgebungsvariablen) in Ihren Pipeline-Einstellungen konfigurieren. Anhand der folgenden Tabelle können Sie ermitteln, welche Eigenschaften für Ihren jeweiligen Pipeline-Typ erforderlich sind:

Anforderungen Pipeline-Objekt Zweck
Gating aktivieren (Werbeaktion) opt-in-evidence-checks Aktiviert das Compliance-Gate in den Validierungspipelines für Werbeaktionen.
OPA aktivieren (CD & CC) opt-in-rego-translation Weist die Pipelines für Continuous Deployment (CD) und Continuous Compliance (CC) an, die neue OPA-Logik zu verwenden.
Logik definieren (die Regeln) policy-path Weist die Pipeline-Engine auf Ihre benutzerdefinierten „ .rego “-Richtliniendateien hin.
Daten bereitstellen (die Fakten) evidence-checks-config-path Verweist auf Ihre Dateien zur statischen Datenvalidierung unter .json.

Richtliniendateien und Datenvalidierungsdateien

Die Konfigurationsdatei (.rego) – Die Logik

Hier geben Sie Ihre eigentlichen Regeln und Bedingungen ein. Ihre Richtlinie könnte beispielsweise lauten: „Lassen Sie diese Bereitstellung nur zu, wenn ein Schwachstellen-Scan durchgeführt wurde und die Ergebnisse zeigen, dass keine kritischen Probleme vorliegen.“ Sie können Ihre benutzerdefinierte Richtliniendatei über die Pipeline-Umgebungseigenschaft „ policy-path “ bereitstellen. Wird keine Richtliniendatei angegeben, verwendet die Pipeline die Standard-Richtliniendatei.

Die Datenvalidierungsdatei (.json) – Die Fakten

Diese Datei dient als Ihre statische Referenzliste. Anstatt Daten direkt in Ihre Rego-Regeln fest zu codieren, verwenden Sie diese Datei, um Listen mit zugelassenen Variablen zu verwalten – wie beispielsweise Ihre zulässigen Image-Registries (us.icr.io oder eu.icr.io) oder bestimmte Repositorys, die von bestimmten Prüfungen ausgenommen sind. Sie können Ihre Datenvalidierungsdatei über die Pipeline-Umgebungseigenschaft „ evidence-checks-config-path “ bereitstellen. Wird keine Datenvalidierungsdatei bereitgestellt, verwendet die Pipeline die Standard-Datenvalidierungsdatei.

Beispiel für eine Datenvalidierungsdatei:

        package one_pipeline.config
        pre_deployment := {
            "com.ibm.prod_change_request": {
                "asset_type": [
                "*",
                "image"
                ],
                "source": [
                "prod",
                "stage"
                ],
                "target": [
                "prod",
                "stage"
                ],
                "recommended": [
                "*"
                ]
            }
        }
        post_deployment := {
            "com.ibm.prod_change_request": {
                "asset_type": [
                "*",
                "image"
                ],
                "source": [
                "prod",
                "stage"
                ],
                "target": [
                "prod",
                "stage"
                ],
                "recommended": [
                "*"
                ]
            }
        }

Jeder Block in der Konfiguration legt genau fest, welche Nachweise erwartet werden, woher sie stammen und wie streng sie durchgesetzt werden sollen.

  • Die Beweistyp-ID (com.ibm.prod_change_request): Der Schlüssel der obersten Ebene gibt die spezifische Kategorie des zu bewertenden Beweismittels vor. Zu den gängigen Beispielen gehören com.ibm.static-scan, com.ibm.unit-tests oder com.ibm.image_signing.
  • asset_type: Legt fest, auf welche Art von Artefakt diese Regel zutrifft. Beispielsweise könnte dies nur für image oder repo gelten. Mit der Option „ ["*"] “ wird die Regel auf alle Asset-Typen angewendet.
  • source (Quellumgebungen): Gibt an, woher die Beweismittel stammen. Dabei kann es sich um einen bestimmten Zweig oder eine Pipeline-Umgebung handeln (z. B. ci-pipeline, stage, prod).
  • target (Zielumgebungen): Definiert die Zielumgebung, in der diese Evidenz im Hinblick auf die Bereitstellung validiert wird (z. B. stage, prod). Weitere Informationen zu Quelle und Ziel finden Sie hier.
  • gating mode: In den letzten Feldern geben Sie an, welchen Gating-Modus Sie für den Belegtyp anwenden möchten. Weitere Informationen zu den unterstützten Gating-Modi finden Sie hier.

Hinweis: Alle Prüfungen vor der Bereitstellung müssen im Array „ pre_deployment :{} “ definiert werden, und alle Prüfungen nach der Bereitstellung müssen im Array „ post_deployment :{} “ definiert werden. Wenn Sie den Standardpfad für die Richtlinie verwenden, müssen Sie außerdem den Import des Pakets „ one_pipeline.config “ in Ihre Registrierungsdatei für die Datenvalidierung einfügen.

Nahtlose Migration für die Validierung bestehender JSON-Daten

Für Teams, die die Pipeline bereits nutzen, lautet die wichtigste Frage in der Regel: „Muss ich alle meine bestehenden JSON-Konfigurationsdateien manuell in Rego umschreiben?“

Die Antwort lautet Nein. Um die Migration völlig nahtlos zu gestalten, können Sie Ihre bestehenden JSON-Datenvalidierungsdateien direkt in die Pipeline einbinden. Die Pipeline erkennt Ihre bestehenden JSON-Dateien automatisch und wertet sie nahtlos zusammen mit den neuen OPA-Funktionen aus.

Hinweis: Diese Abwärtskompatibilität gilt speziell für Dateien zur Datenüberprüfung. Wenn Sie benutzerdefinierte Auswertungs Logik en implementieren möchten, müssen Sie eine Rego- Richtliniendatei schreiben.


Das Skript zum Konvertieren von JSON in Rego

Die Pipeline unterstützt zwar von Haus aus ältere JSON-Dateien zur Datenvalidierung, doch möglicherweise möchten Sie Ihre Konfigurationen irgendwann auf natives Rego umstellen, um den „Policy-as-Code“-Standard vollständig zu übernehmen.

Um Ihnen dabei zu helfen, stellen wir ein eigenständiges Dienstprogramm-Skript zur Verfügung, das Ihre bestehenden JSON-Datenvalidierungsdateien automatisch in das neue Rego-Format konvertiert.

Scriptspeicherposition: /opt/one-pipeline/polyglot/polyglot/translate-pipeline-config.sh

So verwenden Sie das Konvertierungsskript

Sie können dieses Skript lokal oder im Rahmen eines Pipeline-Laufs ausführen. Wenn Sie das Skript lokal ausführen, müssen Sie die Ziel- und Quellumgebung explizit angeben.

Skriptparameter

Parameter Erforderlich? Beschreibung
--input Ja Der Dateipfad zu Ihrer bestehenden JSON-Konfigurationsdatei aus der früheren Version.
--target-env Ja Die Zielumgebung für die Validierung (z. B. prod, stage). Hinweis: Bei Ausführung innerhalb der Pipeline erfolgt die automatische Auflösung über get_env.
--source-env Ja Die Quellumgebung der Belege (z. B. master, stage). Hinweis: Bei Ausführung innerhalb der Pipeline erfolgt die automatische Auflösung über get_env.
--output Nein Der Zielpfad, unter dem die generierte Datei „ .rego “ gespeichert wird. Wird dieser Parameter weggelassen, erfolgt die Ausgabe je nach Logik des Python-Skripts entweder über die Standardausgabe oder als Datei neben der Eingabedatei.

Beispiel für die Verwendung

# Convert a JSON config to Rego using named parameters
/opt/one-pipeline/polyglot/polyglot/translate-pipeline-config.sh \
  --input ./legacy-evidence-config.json \
  --output ./new-evidence-config.rego \
  --target-env prod \
  --source-env master

Hinweis: Sie müssen außerdem die Pipeline-Umgebungseigenschaften „ source-environment “ und „ target-environment “ angeben, falls Sie die Datei „ .json “ direkt in der Eigenschaft „ --config-path “ angeben.


Pipeline zur Validierung von Beförderungen: „Shift-Left“-Compliance-Gating

Durch die Integration von Open Policy Agent (OPA) in die Promotion-Validierungs-Pipeline werden Compliance-Prüfungen direkt in die Pull-Request-Phase (PR) integriert. Dieser „Shift-Left “-Ansatz ermöglicht es Entwicklern, ihre Dateninhalte zu validieren und Compliance-Lücken zu erkennen, bevor der Code zusammengeführt wird. Indem fehlende oder unzureichende Nachweise bereits früh im Entwicklungszyklus aufgedeckt werden, können Teams Hindernisse für die Bereitstellung in späteren Phasen vermeiden und den Nacharbeitsaufwand erheblich reduzieren.

Flexible Konfiguration: Mehrere Validierungsdateien

Komplexe Umgebungen erfordern oft modulare Regelsätze. Um dies zu unterstützen, können Sie mithilfe der Pipeline zur Validierung von Promotions Ihre Nachweise gleichzeitig anhand mehrerer Konfigurationen bewerten.

Sie können mehrere Datenvalidierungsdateien angeben, indem Sie deren Pfade als durch Kommas getrennte Liste an den Parameter „ evidence-checks-config-path “ übergeben. In diesem Fall vergleicht die Pipeline die Evidenz-Nutzdaten mit jeder Konfigurationsdatei und erstellt für jede Datei eine eigene Auswertungs-Tabelle. Und im PR-Kommentarbereich werden die Bewertungstabellen für jede Datei als separate Kommentare angezeigt.

Automatisiertes PR-Feedback

Um maximale Transparenz zu gewährleisten, gleicht die Pipeline die aktuelle Evidenz-Nutzlast mit jeder von Ihnen bereitgestellten Konfigurationsdatei ab. Nach Abschluss der Auswertung erstellt die Pipeline automatisch detaillierte Zusammenfassungs- und Auswertungs-Tabellen und fügt diese direkt an den PR an.

Wenn Sie mehrere Datenvalidierungsdateien konfigurieren, veröffentlicht die Pipeline die Ergebnisse für jede Datei als separaten PR-Kommentar. Dadurch erhalten die Prüfer einen klaren, umfassenden Überblick über den Konformitätsstatus in verschiedenen Kontexten, ohne dass die Ergebnisse miteinander vermischt werden.

In jedem PR-Kommentar findest du:

  • Drei Auswertungs-Tabellen: Eine vollständige Aufschlüsselung der Validierungsergebnisse. Weitere Informationen zum Verständnis dieser Tabellen finden Sie unter „ Die Evidenz-Check-Tabelle verstehen “.
  • Konfigurationslinks: Direkte Links zu der spezifischen Datenvalidierungsdatei und der Richtliniendatei, die für genau diese Auswertung verwendet wurden, wodurch sich Ihre Regeln leicht überprüfen und Fehler beheben lassen.

In der Phase der Aktionsvalidierung dient diese OPA-Konformitätsprüfung der Transparenz und dem Feedback. Wenn Verstöße gegen Ihre Regeln festgestellt werden, wird die Pipeline weder angehalten noch bricht sie ab. Stattdessen läuft die Pipeline bis zum Ende durch und veröffentlicht die detaillierten Ergebnisse im PR. Dadurch wird sichergestellt, dass Entwickler einen vollständigen Bericht über alle Compliance-Lücken erhalten und diese beheben können, ohne dass der Build während des Prozesses abstürzt.

Der OPA-Datenvertrag: Kommunikation mit der Pipeline

Wenn Sie eine benutzerdefinierte Richtlinie erstellen, wertet OPA Ihre Regeln im Hintergrund einwandfrei aus. Die Pipeline benötigt jedoch eine standardisierte Methode, um diese Ergebnisse zu interpretieren, damit sie den Entwicklern genau zeigen kann, was passiert ist. An dieser Stelle kommt der Datenvertrag ins Spiel.

Stellen Sie sich diesen Vertrag als eine Art Handschlag zwischen Ihrer benutzerdefinierten Rego-Datei und der Pipeline-Engine vor. Sie haben völlige Freiheit, jede noch so komplexe Logik zu programmieren, die Sie benötigen, um zu einer Entscheidung zu gelangen. Ganz am Ende Ihrer Richtlinie müssen Sie Ihre Ergebnisse jedoch zwei konkreten Ergebnissen zuordnen: dem Objekt „ table_results “ und der Regel „ allow “.

Das „ table_results “-Objekt (für PR-Feedback)

Um die detaillierten Tabellen „ Markdown “ in Ihren PR-Kommentaren zu generieren, sucht die Pipeline nach einer bestimmten Datenstruktur namens „ table_results “.

Wenn Ihre Policy innerhalb von „ table_results “ ein „ res “-Objekt ausgibt, das genau diese acht Felder enthält, übernimmt die Pipeline. Es wertet Ihre Ausgabe sicher aus und wandelt sie automatisch in die übersichtliche, detaillierte Tabelle „ Markdown “ um, die Sie im PR sehen:

table_results contains res if {
    # ... your custom evaluation logic goes here ...
    
    # Map your findings to the contract structure
    res := {
        "RuleType":       "Required",       
        "AssetType":      "image",          
        "AssetId":        "12345678",      
        "EvidenceTypeId": "com.ibm.scan",   
        "Tool":           "zap",         
        "Status":         "failure",        
        "Source":         "ci-pipeline",    
        "Target":         "prod",           
    }
}

Die „ allow “-Regel (für die Pipeline-Ausführung)

Wie bereits erwähnt, ist der zweite obligatorische Bestandteil dieses Vertrags die „ allow “-Regel.

Warum ist dies erforderlich?

Während „ table_results “ die Berichterstellung zu Ihren Compliance-Prüfungen übernimmt, ist die Regel „ allow “ der eigentliche Kill-Switch für die Pipeline. Die Pipeline-Engine ist fest so programmiert, dass sie den booleschen Wert „ allow “ abfragt, um die endgültige Go/No-Go-Entscheidung zu treffen.

Wenn Sie eine benutzerdefinierte Richtliniendatei bereitstellen, aber vergessen, die Regel „ allow “ einzufügen, weiß die Pipeline nicht, wie sie fortfahren soll. Da hier ein striktes „Fail-Closed“-Sicherheitsmodell zum Einsatz kommt, wird der Pipeline-Lauf standardmäßig abgebrochen und die Bereitstellung blockiert.

Pipelines für Continuous Deployment (CD) und Continuous Compliance (CC)

Während sich die „Promotion Validation“-Pipeline auf Überprüfungen auf PR-Ebene konzentriert, können Sie OPA auch für das Deployment-Gating innerhalb Ihrer Continuous-Deployment- (CD) und Continuous-Compliance- (CC) Pipelines nutzen.

OPA aktivieren

Um OPA-basiertes Compliance-Gating in Ihren CD- und CC-Pipelines zu aktivieren, müssen Sie das Flag „ opt-in-rego-translation “ explizit aktivieren (setzen Sie es auf „ true “ oder „ 1 “).

Konfigurationsbeschränkungen

Genau wie bei der Promotion-Pipeline können Sie sowohl eine Policy-Datei (Ihre Logik) als auch eine Datenvalidierungsdatei (Ihre Fakten) bereitstellen. Es gibt jedoch einen wesentlichen Unterschied: Die CD- und CC-Pipelines akzeptieren derzeit jeweils nur eine Datenvalidierungsdatei und keine durch Kommas getrennte Liste.

Anhänge zu Änderungsanträgen (CR) und Schritte zum Abschluss der Pipeline

Wenn Sie die CD-Pipeline ausführen, verarbeitet die Engine Ihre Datenvalidierungsdatei und fügt sie zu Prüfungszwecken Ihrem Änderungsantrag bei. Das Verhalten beim Anhängen von Dateien hängt vollständig vom von Ihnen angegebenen Format ab:

  • Wenn Sie eine JSON-Datei zur Datenvalidierung im alten Format bereitstellen: Die Pipeline konvertiert diese automatisch im Hintergrund. Sowohl die ursprüngliche JSON-Datei als auch die generierte Rego-Konfigurationsdatei sind dem Schritt „Änderungsanforderung“ beigefügt.
  • Wenn Sie eine native Rego-Datei zur Datenvalidierung bereitstellen: Die Pipeline bindet direkt nur die von Ihnen bereitgestellte Rego-Datei ein.

Genau dieses Bindungsverhalten gilt auch für den Prozess der Konfigurationswiederherstellung, der während des Schritts „CD Finish“ ganz am Ende der Pipeline stattfindet.