Skip to main content

Eine sichere CI/CD-Pipeline für Ihre Java-Anwendung mit GitHub Actions erstellen

Artikel von

27. Juni 2022

0 Min. Lesezeit

Mit GitHub Actions ist es einfacher denn je, eine sichere Continuous-Integration- und Continuous-Delivery-Pipeline (CI/CD) für Ihre GitHub-Projekte aufzubauen. Durch die Integration Ihrer CI/CD-Pipeline und Ihres GitHub-Repositorys können Sie mit GitHub Actions den Build-, Test- und Deployment-Prozess automatisieren. Sie können Workflows erstellen, die jeden Pull Request an Ihr Repository erstellen und testen oder zusammengeführte Pull Requests in Produktion bereitstellen. Wenn Sie Snyk in Ihre GitHub-CI/CD integrieren, können Sie Sicherheitsscans als Teil Ihres Build-Zyklus automatisieren, bevor Ihre Anwendung in Produktion geht.

Eine GitHub-Actions-CI-Pipeline für Java einrichten

GitHub-Actions-Workflows sind YAML-Dateien im Ordner .github/workflows. Wenn Sie noch keinen Workflow haben oder einen neuen hinzufügen möchten, wählen Sie Actions und New workflow aus.

GitHub-Actions-Seite mit dem Bereich „Workflows“, einer Schaltfläche „New workflow“ und der ausgewählten Option „All workflows“.

Für dieses Java-Spring-Boot-Projekt habe ich mit Maven folgende CI-Pipeline erstellt:

name: Java CI with Maven

on:
 push:
   branches: [ master ]
 pull_request:
   branches: [ master ]
 workflow_dispatch:

jobs:
 build:

   runs-on: ubuntu-latest

   steps:
   - uses: actions/checkout@v2
   - name: Set up JDK 17
     uses: actions/setup-java@v1
     with:
       java-version: 17
   - name: Build with Maven
     run: mvn -B package --file pom.xml

Diese Action wird bei jedem Push und Pull Request an den Master-Branch ausgeführt. Sie basiert auf Ubuntu und checkt das Repository aus. Dabei verwendet sie die GitHub Action setup-java mit Java 17 und Maven, um die Java-JAR-Datei zu erstellen. Wenn Sie mit der Syntax vertraut sind, ist dieser Workflow recht einfach zu verstehen. Einen vollständigen Überblick über die Möglichkeiten finden Sie in der GitHub-Actions-Dokumentation.

Snyk in Ihre GitHub-CI/CD integrieren

Mit Snyk können Sie Sicherheitstests in Ihr neues Java-Projekt integrieren. Dafür gibt es zwei Hauptmethoden. Zuvor sollten Sie jedoch zwei Dinge einrichten. Melden Sie sich zunächst bei Ihrem Snyk-Konto an oder erstellen Sie kostenlos ein Konto, falls Sie noch keines haben. Legen Sie anschließend Ihren API-Schlüssel als Secret SNYK_TOKEN für Ihr GitHub-Repository fest.

Option 1: Die Snyk CLI in einen Build-Schritt Ihrer GitHub Action integrieren

Mit der Snyk CLI können Sie Sicherheitsscans automatisch während Ihres aktuellen Builds ausführen. Folgen Sie den nachstehenden Schritten – einschließlich der zusätzlichen Schritte nach Build with Maven –, um loszulegen.

 - name: Set up Node 14
   uses: actions/setup-node@v3
   with:
     node-version: 14
 - name: install Snyk CLI
   run: npm install -g snyk
 - name: run Snyk Open Source Test
   run: snyk test
 - name: run Snyk Code Test
   run: snyk code test

Richten Sie NodeJS Version 14 ein und laden Sie die Snyk CLI mit npm herunter. Analysieren Sie anschließend Ihre Abhängigkeiten mit Snyk Open Source und scannen Sie Ihren eigenen Code mit Snyk Code auf Sicherheitslücken.

Deklarieren Sie dann SNYK_TOKEN als Umgebungsvariable, die Ihren API-Schlüssel enthält. Sie können auf das zuvor eingerichtete Secret SNYK_TOKEN verweisen oder den vollständigen Code der GitHub Action wiederverwenden.

env:
 SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}

Der Vorteil dieses Ansatzes ist, dass Sie Ihre Anwendung nur einmal kompilieren und erstellen müssen. Das kann beim Erstellen großer Anwendungen viel Zeit sparen. Der Nachteil: Die Schritte werden nacheinander ausgeführt und sind möglicherweise nicht effizient, wenn einer der späteren Schritte fehlschlägt.

Option 2: Die vordefinierten GitHub Actions von Snyk für Ihre CI/CD-Pipeline verwenden

Snyk hat eine Reihe von GitHub Actions erstellt, die Ihre Projekte auf Sicherheitslücken prüfen. Welche Action Sie benötigen, hängt von Ihrer Programmiersprache oder Ihrem Build-Tool ab. Für unser Java-Projekt verwenden wir beispielsweise die unten gezeigte Maven-basierte GitHub Action.

Die vordefinierten Actions stellen sicher, dass alle Voraussetzungen für den Build Ihrer Anwendung erfüllt sind, und enthalten die neueste CLI-Version zum Scannen Ihres Codes. Auch wenn Sie Ihre Anwendungen möglicherweise mehrmals neu erstellen, können diese Actions einzeln und parallel ausgeführt werden – ein wesentlicher Vorteil dieses Ansatzes.

Beginnen wir mit dem Scannen unserer Abhängigkeiten. Wir haben bereits ein Snyk-Konto und unseren API-Schlüssel als Secret mit dem Namen SNYK_TOKEN gespeichert. Erstellen Sie daher keinen zusätzlichen Schritt im Build-Job, sondern einen neuen Job namens opensource-security.

opensource-security:
   runs-on: ubuntu-latest
   steps:
     - uses: actions/checkout@master
     - name: Run Snyk to check for vulnerabilities
       uses: snyk/actions/maven@master
       env:
         SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}

Laut Dokumentation lautet der Standardbefehl test. Ohne zusätzliche Konfiguration scannt er Ihre Anwendung auf bekannte Sicherheitslücken in den Abhängigkeiten. Wenn Sie ein bestimmtes CLI-Argument wie --all-projects verwenden möchten, um verschachtelte Projekte zu berücksichtigen, nutzen Sie das Schlüsselwort with und setzen Sie die Eigenschaft auf args.

Tabelle der Snyk Maven Action-Eigenschaften, Standardwerte und Beschreibungen für args, command und JSON-Ausgabe.

Während Snyk unsere Abhängigkeiten scannt, prüfen wir den Java-Code in unserer GitHub Action auf Sicherheitslücken. Wiederholen Sie dazu den vorherigen Vorgang, richten Sie einen dritten Job speziell dafür ein und setzen Sie die Eigenschaft command auf code test.

 code-security:
   runs-on: ubuntu-latest
   steps:
     - uses: actions/checkout@master
     - name: Run Snyk to check for vulnerabilities
       uses: snyk/actions/maven@master
       env:
         SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
       with:
         command: code test

Beachten Sie, dass alle drei Jobs parallel ausgeführt werden, was in vielen Fällen effizienter ist.

Sichere Continuous Delivery in Ihre GitHub-CI/CD integrieren

Sehen wir uns nun den Deployment- beziehungsweise Delivery-Teil Ihrer GitHub-CI/CD an. Sobald Build und Tests abgeschlossen sind, wird das Paket auf GitHub veröffentlicht. Dafür verwenden wir in unserem Java-Projekt das Maven-Release-Plugin.

Da wir das Paket nur veröffentlichen möchten, wenn der Build-Job und beide Sicherheits-Jobs erfolgreich abgeschlossen wurden, fügen wir eine Eigenschaft needs mit einer Liste der vorausgesetzten Jobs für die Veröffentlichung hinzu. So stellen wir sicher, dass unser Paket erst bereitgestellt wird, wenn es vollständig erstellt und abgesichert ist.

release:
   needs: [opensource-security, code-security, build]
   runs-on: ubuntu-latest
   steps:
     - uses: actions/checkout@v2
     - name: Set up JDK 17
       uses: actions/setup-java@v1
       with:
         java-version: 17
     - name: Set Git user
       run: |
         git config user.email "ghactions@brianvermeer.nl"
         git config user.name "GitHub Actions"
     - name: Publish JAR
       run: mvn -B release:prepare release:perform -DskipTests
       env:
         GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

Die Maven-Befehle release:prepare und release:perform überprüfen, ob die Veröffentlichung die richtige Versionsnummer hat, und veröffentlichen sie in unserem GitHub-Repository. Da wir Maven diese Aufgabe überlassen, nehmen Sie die folgenden Konfigurationen in Ihrer Datei pom.xml vor.

  <scm>
       <developerConnection>scm:git:https://github.com/bmvermeer/ghaction-example.git</developerConnection>
       <tag>HEAD</tag>
   </scm>
   <distributionManagement>
       <repository>
           <id>github</id>
           <name>GitHub</name>
           <url>https://maven.pkg.github.com/bmvermeer/ghaction-example</url>
       </repository>
   </distributionManagement>

Auch wenn unsere neu veröffentlichte Anwendung derzeit frei von Sicherheitslücken ist, heißt das nicht, dass sie dauerhaft sicher bleibt. Neue Sicherheitslücken können an verschiedenen Stellen auftreten. Deshalb ist es wichtig, Ihren Code und Ihre Abhängigkeiten auch nach dem Deployment einer Anwendung kontinuierlich zu überwachen.

Zusätzlich zu den Scans während der Entwicklung können wir mit Snyk auch Abhängigkeiten nach dem Deployment überwachen. Wenn die Veröffentlichung abgeschlossen ist, verwenden Sie erneut die vordefinierte Snyk Action. Setzen Sie diesmal die Eigenschaft command auf monitor.

 opensource-monitor:
   needs: [release]
   runs-on: ubuntu-latest
   steps:
     - uses: actions/checkout@master
     - name: Run Snyk to check for vulnerabilities
       uses: snyk/actions/maven@master
       env:
         SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
       with:
         command: monitor

Dadurch wird der nach der Veröffentlichung unveränderliche Abhängigkeitsbaum zur Überwachung an Snyk übermittelt. Nun können wir unser Projekt in der Snyk-Benutzeroberfläche aufrufen und automatische Benachrichtigungen erhalten, wenn eine neue Sicherheitslücke in einer unserer Abhängigkeiten gefunden wird. So stellen wir sicher, dass unser veröffentlichtes Java-Projekt frei von Sicherheitslücken bleibt.

Snyk-Projekt-Dashboard mit „nl.brianvermeer.snyk:ghaction-example“, null Problemen und einem Link zum Bericht

Sicherheit in Ihre GitHub Actions integrieren

Mit GitHub Actions lässt sich eine CI/CD-Pipeline für Ihr GitHub-Projekt ganz einfach erstellen. Mit den Snyk Actions können Sie außerdem unkompliziert Sicherheits-Scans auf mehreren Ebenen in alle Ihre Anwendungen integrieren.

GitHub veranschaulicht die Pipeline, die wir heute erstellt haben, mit der folgenden Abbildung. Einige Jobs laufen parallel, während andere erst nach dem erfolgreichen Abschluss anderer Jobs ausgeführt werden. Das vollständige Beispielprojekt finden Sie in diesem GitHub-Repository.

GitHub-Actions-Workflow mit erfolgreichen Build-, Sicherheits-, Release- und Open-Source-Monitor-Jobs, ausgelöst durch einen Push

Heute haben wir Snyk Code und Snyk Open Source verwendet, um den Java-Quellcode und die Pipeline-Abhängigkeiten zu scannen. Sie können den Ansatz jedoch erweitern und Docker-Dateien mit Snyk Container sowie Kubernetes-Dateien mit Snyk IaC scannen.

Mit den Snyk GitHub Actions können Sie Ihrer GitHub-Actions-Workflow automatisch Scans hinzufügen und die Actions passend zu Ihrem Projekt kombinieren. So bleibt Ihr Code heute und in Zukunft sicher.

Starten Sie mit Capture the Flag

Erfahren Sie in unserem virtuellen On-Demand-Workshop für Einsteiger, wie Sie Capture-the-Flag-Herausforderungen lösen.

Weiterlesen

Blog

Frontier-Modelle fanden die Schwachstellen. Nur der Angreifer fand die Angriffsketten.

Die statische Analyse fand die Schwachstellen, doch erst Live-Angriffstests bewiesen, wie sie sich zu Angriffen verketten lassen. Ein Vergleich von Evo COS, Claude Security und Claude Code Security.

feature insights context
Blog

Autonome Angriffe sind bereits Realität. Die Verteidigung muss Schritt halten.

Autonome Angreifer verkürzen das Zeitfenster für die Verteidigung. Erfahren Sie, wie kontinuierliches Erkennen, Beheben, Validieren und Verhindern Sicherheitsteams helfen kann, Schritt zu halten.

Blog

Warum KI-Coding-Agenten immer wieder fehlerhafte Zugriffskontrollen schreiben

KI-Coding-Agenten können Autorisierungslogik erzeugen, die kompiliert und die Prüfung besteht, dabei aber die Daten eines Mandanten für einen anderen offenlegt. Erfahren Sie, warum fehlerhafte Zugriffskontrollen schwer zu erkennen sind und wie Sie sie verhindern.