Zum Hauptinhalt springen
GitLab vs. GitHub: DevSecOps Pipeline
  1. Blogs/

GitLab vs. GitHub: DevSecOps Pipeline

Autor
Romano Roth
Ich bin überzeugt: Der nächste Wettbewerbsvorteil ist nicht AI selbst, sondern die Organisation drumherum. Als Chief AI Officer bei Zühlke arbeite ich mit C-Level-Führungskräften daran, Unternehmen zu bauen, die wahrnehmen, entscheiden und sich kontinuierlich anpassen. Seit über 20 Jahren mache ich diese Überzeugung zur Praxis.
Frag die KI über diesen Artikel

von Romano Roth und Patrick Steger

Diese Videoserie zeigt Ihnen, wie Sie eine enterprise-taugliche DevSecOps-Pipeline mit GitLab und GitHub aufbauen, und vergleicht die beiden Plattformen miteinander.

Einführung
#

GitLab

GitHub

ThemaGitLabGitHub
Security ToolsBietet Integrationspunkte zur Einbindung von Security Tools. Stellt von GitLab gewartete Integrationen für die von GitLab empfohlenen Standard-Security-Tools bereit.Bietet Integrationspunkte zur Einbindung von Security Tools. Es gibt keine von GitHub empfohlenen oder gewarteten Standard-Security-Tools. Es gibt von der Community bereitgestellte Tools für Open Source und kommerzielle Lösungen.

Erstellen eines einfachen Projekts
#

GitLab

GitHub

AspektGitLabGitHub
Repository erstellenKann ein neues leeres Repository erstellen. Bietet die Möglichkeit, mit einer von GitLab bereitgestellten Standard-Projekt-/Repo-Struktur zu starten (z. B. C#, SpringBoot, PHP usw.). Diese sind leicht auffindbar.Kann ein neues leeres Repository erstellen. Kann ein neues Repository basierend auf einem Template-Projekt erstellen. Template-Projekte sind schwer zu finden, wenn keine in Ihrer Organisation vorhanden sind.
ImportKann aus anderen Repositories wie jedem Git-Repository (URL), GitHub, Jira, Bitbucket usw. importieren.Kann aus bestehenden Repositories importieren. Auch aus GitLab. Funktioniert allerdings nicht bei Verwendung von Social-Login.
Pipeline-Definition.gitlab-ci.yml ist der Einstiegspunkt, der die gesamte Pipeline definiert. Option, weitere Dateien einzubinden (deren Inhalt wird zur Laufzeit automatisch eingebunden).Pipelines werden Workflows genannt. Wir können für jeden Workflow eine eigene Datei haben. Innerhalb der Workflow-Datei definieren wir, was den Workflow/die Pipeline auslöst. Es ist möglich, aus einer Workflow-Datei “Sub-Workflows” aufzurufen.
Pipeline-StrukturDie Pipeline ist in Stages und Jobs unterteilt, wobei Stages nacheinander ausgeführt werden und alle Jobs einer Stage parallel laufen (Abhängigkeiten können konfiguriert werden). Das ist ein sehr eleganter Ansatz, kann aber bei komplexen Pipelines schwer verständlich werden.Pipelines/Workflows sind im UI sauber getrennt und erleichtern das Auffinden des richtigen Workflows/der richtigen Pipeline. Workflows nutzen Actions, um Jobs/Steps zu implementieren. Solche Actions sind über einen Marketplace verfügbar und nicht immer leicht zu finden.
Einfacher EinstiegSehr einfach, eine erste einfache Pipeline zu erstellen, da GitLab Defaults für fast alles bereitstellt, was zum Start benötigt wird.Recht komplex, die erste einfache Pipeline zum Laufen zu bringen, da GitHub nicht viel automatisch bereitstellt.
Pipeline RunsPipeline-Läufe finden Sie im Menü CI/CD -> Pipelines.Pipeline-/Workflow-Läufe sind im UI im Tab “Actions” sauber pro Workflow aufgelistet.
ArtefakteArtefakte können einfach deklariert werden und stehen dann in der Pipeline-Ergebnisansicht zum Download bereit. Dies wird von GitLab bereitgestellt und ist gut dokumentiert. Standard-Artefakte wie Test-Ergebnisse können mit Standard-GitLab-Funktionalität im GitLab-UI sichtbar gemacht werden.Artefakte werden über eine Action verfügbar gemacht (z. B. mit der upload-artifact Action aus dem Marketplace). Standard-Artefakte wie Test-Ergebnisse erfordern weitere Actions aus dem Marketplace. Die UI-Qualität variiert.
Mehrere PipelinesVerschiedene Pipelines müssen mit Regeln konfiguriert werden (z. B. basierend darauf, auf welchen Branch committet wurde). Dies kann bei komplexen Szenarien kompliziert werden.Verschiedene Pipelines werden einfach in zusätzlichen Workflow-Dateien konfiguriert. Dies wird mit der Zeit natürlich und unterstützt komplexe Szenarien.
VisualisierungSchöne grafische Ansicht zur Visualisierung von Stages und Jobs sowie deren Abhängigkeiten (jedoch nicht der Bedingungen).Schöne grafische Ansicht zur Visualisierung des Workflow-/Pipeline-Laufs für ausgeführte Runs.

Software Composition Analysis (SCA)
#

GitLab

GitHub

AspektGitLabGitHub
Standard-ToolVon GitLab bereitgestellter Open-Source-Scanner verfügbar, dokumentiert und leicht auffindbar. Einfach ein von GitLab bereitgestelltes Template hinzufügen.Kein von GitHub bereitgestelltes Standard-Tool. Eines im Marketplace finden. Wir wählten CRDA von RedHat basierend auf Snyk (was sich als nicht enterprise-tauglich erwies).
Tool-QualitätDas Standard-Tool hat eine angemessene Qualität und Findings und ist enterprise-tauglich.Marketplace-Tools (Actions) werden von Drittanbietern bereitgestellt. Seien Sie sich des Risikos bewusst und überlegen Sie, welchen Anbietern Sie vertrauen.
IntegrationFindings sind gut im GitLab-UI integriert (Pipeline-Ansicht, Security & Compliance -> Vulnerability Report). Vulnerabilities sind auch als Download (json) verfügbar.GitHub verfügt über eine integrierte Funktionalität namens Dependabot, die in den Einstellungen aktiviert werden kann und regelmässige, geplante Scans von unverändertem Code ermöglicht.
FormatGitLab verwendet ein GitLab-spezifisches Format zur Integration von Vulnerabilities im GitLab-UI.Das GitHub-Format zur Anzeige von Vulnerabilities basiert auf Standards. Dies erweist sich als besser für individuelle Integrationen.
Geplante ScansKeine eingebauten geplanten Re-Scans, können aber explizit definiert werden.Dependabot kann auf neue Findings hinweisen und Pull Requests für bekannte Fixes anbieten. Wird aber nicht beim Commit ausgeführt und kann Merges nicht blockieren.
BesonderheitVergleichsweise einfacher Editor für Dateien im Projekt.Vollständig integrierte Entwicklungsumgebung (ähnlich wie Visual Studio Code). Dies hat sich als sehr leistungsstark erwiesen.

License Compliance
#

GitLab

GitHub

AspektGitLabGitHub
ToolLicense Compliance wird als verwaltetes GitLab-Tool bereitgestellt (basierend auf dem Open-Source-Projekt License-Finder), das einfach und unkompliziert hinzugefügt werden kann.Erfordert eine Community-bereitgestellte (Marketplace) oder eine eigene Action zur Implementierung. Es ist sinnvoll, dafür einen eigenen Sub-Workflow zu definieren.
KonfigurationAlle verwendeten Lizenzen des Projekts sind in einem Standard-GitLab-UI sichtbar. Akzeptable Lizenzen können als Teil der Plattform (Projekteinstellungen) konfiguriert werden.Es kann definiert werden, welche Lizenzen konfigurierbar sind, und eine fehlerhafte/fehlgeschlagene Pipeline wird ausgelöst, wenn andere Lizenzen gefunden werden.
WorkflowUnterstützung grundlegender Workflows zur Verifizierung und Akzeptanz neuer Lizenzen (z. B. Einbindung eines Security-Team-Mitglieds als Akzeptierender/Reviewer).Fehlgeschlagene Lizenzen werden als “angepasste Test-Ergebnisse” gemeldet. Ergebnisse sind nur im Pipeline-Lauf sichtbar.
SichtbarkeitFehlgeschlagene (nicht als akzeptabel markierte) Lizenzen werden gemeldet.Es gibt keinen einfachen Weg, “alle vom Projekt verwendeten Lizenzen” zu sehen (dies ist nur in der Log-Ausgabe des Pipeline-Laufs verfügbar).

Static Application Security Testing (SAST)
#

GitLab

GitHub

AspektGitLabGitHub
Standard-ToolVon GitLab bereitgestelltes Standard-Tool basierend auf semgrep und anderen Open-Source-Tools (z. B. spotbugs) verfügbar. Mit wenigen Konfigurationszeilen einfach zu integrieren.GitHub stellt ein Standard-Tool für statische Analyse bereit (CodeQL). Wir haben zusätzlich die Open-Source-Tools semgrep und spotbugs hinzugefügt.
QualitätGitLab hat zusätzliche Regeln zu den Open-Source-Tools hinzugefügt, sodass weit mehr Sicherheitsprobleme gefunden werden als beim einfachen Open-Source-semgrep-Tool. Insgesamt sehen die Findings gut genug aus.Die kombinierten Ergebnisse aller drei Tools übersehen immer noch wichtige Findings. Eigene Arbeit (z. B. Definition eigener Regeln) oder zusätzliche Lizenzen sind erforderlich, um sich zu verbessern.
MarketplaceN/ADas Finden geeigneter SAST-Tools (Actions) im Marketplace ist nicht trivial. Viele Tools erfordern Lizenzen.
IntegrationFindings der Tools sind im GitLab-Benutzeroberfläche integriert (Vulnerability-Ansicht).Findings der Tools (sie müssen sarif unterstützen) sind in der GitHub-Benutzeroberfläche integriert (Security-Tab).

Container Scanning
#

GitLab

GitHub

AspektGitLabGitHub
ToolStandard-Tool von GitLab bereitgestellt (basierend auf Trivy und Grype). Einfach hinzuzufügen.Kein GitHub-Standard. Wir haben Trivy als Container-Scanner ausgewählt; man muss ihn im Marketplace finden.
IntegrationDas Ergebnis wird im GitLab-UI an zwei Stellen integriert: im Pipeline-Lauf und im Vulnerability Report.Ergebnisse werden im GitHub-UI unter Security -> Code Scanning integriert (sofern sie einen sarif-Report bereitstellen).
FindingsFindings sind angemessen gut.Findings sind angemessen gut (mit unserem ausgewählten Tool). Duplikate mit SCA können auftreten.
Container RegistryDas Erstellen eines Container-Images und das Bereitstellen in der Standard-Container-Registry erfordert etwas mehr Aufwand, ist aber dokumentiert.Das Erstellen eines Containers und das Bereitstellen in der Container-Registry ist angemessen dokumentiert, aber nicht trivial.
Pipeline-AbbruchFindings brechen die Pipeline nicht ab; sie werden lediglich gemeldet. Wir können GitLab nicht so konfigurieren, dass eine Pipeline beim Auffinden von Vulnerabilities abgebrochen wird.Findings brechen die Pipeline nicht ab; sie werden lediglich gemeldet. Den Abbruch der Pipeline zu erreichen, erfordert etwas individuellen Aufwand.

Secret Detection
#

GitLab

GitHub

AspektGitLabGitHub
ToolGitLab stellt ein Standard-Tool basierend auf GitLeaks bereit. Die Integration ist einfach.GitHub verfügt über eine integrierte Funktionalität für Secrets. Die Integration ist einfach.
FähigkeitenGefundene Secrets sind begrenzt; ein gutes SCA-Tool wird als Ergänzung benötigt. Der Fokus von GitLeaks liegt auf Security-Tokens (z. B. AWS Access Tokens), nicht auf regulären Schlüsseln oder Passwörtern.Findet Secrets im Repository. Gefundene Secrets sind begrenzt. Der Fokus liegt auf Security-Tokens, nicht auf regulären Schlüsseln oder Passwörtern. Sie können eigene Secret-Patterns definieren und testen.
IntegrationFindings werden im GitLab-UI gemeldet; sowohl in der Pipeline als auch im Vulnerability Report.Zum Zeitpunkt der Aufnahme des Videos funktionierte der “Push Protection” für Secrets nicht.
Secret StorageGitLab hat keinen integrierten sicheren Weg, Secrets zu speichern. Sie unterstützen HashiCorp Vault, der Vault muss aber anderswo gehostet und von Ihnen verwaltet werden.GitHub hat einen gut geschützten Secrets-Bereich, in dem Secrets sicher gespeichert werden können. UND sie unterstützen ausserdem Azure KeyVault out-of-the-box. Ein riesiger Pluspunkt.

Dynamic Application Security Testing (DAST)
#

GitLab

GitHub

AspektGitLabGitHub
ToolBietet Standard-Tooling basierend auf OWASP ZAP.Keine Out-of-the-Box-Lösung. Wir wählten OWASP ZAP basierend auf der Action zaproxy/action-full-scan.
FähigkeitenScan-Fähigkeiten sind out-of-the-box sehr begrenzt, erfordern erhebliche Konfiguration. Out-of-the-Box-Findings sind meist irrelevant.Scan-Fähigkeiten sind out-of-the-box begrenzt, aber Ergebnisse besser als in GitLab.
ContainerEs muss zuerst ein Container erstellt werden, der gestartet werden kann, um DAST dagegen auszuführen. Der Container kann in der GitLab-internen Laufzeitumgebung gestartet werden.Es muss zuerst ein Container erstellt werden. Der Container kann in GitHub mit einem Ubuntu-Image gestartet werden, auf dem Docker installiert ist.
IntegrationErgebnisse sind schön im Pipeline-Lauf integriert. Ergebnisse sind auch im Vulnerability-Management-Report des GitLab-UI zu finden.Ergebnisse sind nicht im GitHub-UI integriert. Es wird lediglich ein eigenständiger Report bereitgestellt. Der Grund ist die fehlende sarif-Unterstützung in OWASP ZAP.

Vulnerability Management
#

GitLab

GitHub

AspektGitLabGitHub
FunktionalitätGitLab bietet Funktionalität, um Vulnerabilities im Plattform-UI zu verwalten. Sie können Vulnerabilities manuell hinzufügen.GitHub bietet begrenzte Funktionalität, um Vulnerabilities im Plattform-UI zu verwalten. Am kritischsten fehlt: die Fähigkeit, eigene Vulnerabilities/Findings hinzuzufügen.
VerwerfenDas Verwerfen eines Findings ist möglich, aber ohne Begründung. Am meisten fehlt uns die Fähigkeit, eine Beschreibung hinzuzufügen, warum wir ein Finding verworfen haben.Das Verwerfen von Findings als False Positive, “won’t fix” (akzeptiertes Risiko) oder “test code only” ist mit einem Kommentar möglich.
IssuesSie können aus einer Vulnerability ein Issue erstellen -> “Developer Task”.Sie können aus einer Vulnerability/einem Finding ein Issue erstellen -> “Developer Task”.
AuflösenSie können Findings manuell als gelöst markieren oder die automatisch erkannte Auflösung akzeptieren.Auflösen ist nur automatisch möglich. Keine Markierung als “fixed” im Vulnerability Management.
IntegrationEs ist zwar möglich, Findings zusätzlicher Tools zu integrieren, sie werden jedoch in einem nicht standardisierten Format benötigt, was schwer zu erhalten ist.Sie können Findings zusätzlicher Tools integrieren, wenn diese den Report im sarif-Format liefern.
EinschränkungenN/ASie können nicht für eine begrenzte Zeit verwerfen. Sie können den Schweregrad eines Findings nicht ändern.

Merge Request / Pull Request
#

GitLab

GitHub

AspektGitLabGitHub
Branch ProtectionSie können Branches schützen, sodass Merge Requests verpflichtend sind.Sie können erzwingen, dass Pull Requests für einen Branch verpflichtend sind.
Security FindingsListet das Delta der Security Findings zwischen dem gemergten und dem Default-Branch auf. Deltas und Findings sind für alle in GitLab integrierten Security Tools verfügbar.Sie können einige Ergebnisse der Security Tools darstellen; eine erhebliche Anpassung ist erforderlich, um eine akzeptable Qualität zu erreichen.
DarstellungDeltas/Findings werden schön dargestellt und können angesteuert werden.Neue Findings sind dann in gewissem Umfang für die Security Tools (Checks) verfügbar. Aufgelöste Findings sind nicht sichtbar. Findings werden nicht über Tools hinweg aggregiert.
ApprovalsSie können definierte Personen festlegen, die berechtigt sind zu genehmigen, wenn neue Vulnerabilities einer bestimmten Kritikalität gefunden werden.Sie können definierte Personen festlegen, die berechtigt sind, den Pull Request zu genehmigen, dies basiert jedoch nicht auf neuen Findings/Vulnerabilities.
Weitere InfosSie sehen auch nicht-sicherheitsbezogene Aspekte wie: Code-Änderungen, Review-Kommentare, Test-Ergebnisse, Pipeline-Läufe.Sie sehen auch nicht-sicherheitsbezogene Aspekte wie: Code-Änderungen, Review-Kommentare, Test-Ergebnisse.

Schedule Pipeline
#

GitLab

GitHub

AspektGitLabGitHub
TriggerWird durch einen dedizierten Scheduler in GitLab ausgelöst.Wird direkt aus einer Workflow-Definitionsdatei heraus ausgelöst.
Branch-AuswahlSie können den Branch frei wählen, auf dem er ausgeführt werden soll.Wird immer nur auf dem Default-Branch ausgeführt, was höchstwahrscheinlich nicht das ist, was Sie brauchen. Es gibt (komplizierte) Workarounds, um die Ausführung auf einem anderen Branch auszulösen.
KonfigurationSie müssen die Pipeline-Definitionsdatei erweitern, um zu erkennen, wann ein Scheduler den Lauf ausgelöst hat (um nicht benötigte Jobs auszuschliessen, den Pipeline-Lauf anzupassen usw.).Erstellen Sie eine dedizierte Workflow-Datei dafür. Dieser neue Workflow enthält nur Jobs, die für Security-Checks auf dem Production-Branch/-Code erforderlich sind.

Unsere Empfehlung
#

GitLab

GitHub

GitLabGitHub
Default-Branch definieren: Dies ist der Branch, der von GitLab verwendet wird, um Security Vulnerabilities im integrierten Vulnerability-Management-Tool anzuzeigen.Top-Level-Workflows (Pipelines) erstellen, die (einfachere) Workflows zu vollständigen DevSecOps-Pipelines orchestrieren.
Eine geplante Pipeline definieren: Damit stellen Sie sicher, dass Sie Ihren Production-Code auf neue Vulnerabilities scannen.Wiederverwendbare Workflows auf Job-Ebene definieren.
Merge Requests verwenden: Um die Auswirkungen von Änderungen auf die Security-Posture zu visualisieren.Definieren Sie, auf welchen Branches Pipelines ausgeführt werden sollen.
Erwägen Sie die Verwendung eines Vault zur Speicherung von Credentials: GitLab hat keine wirkliche Lösung integriert. Sie sollten ein Drittanbieter-Tool in Betracht ziehen.Eine geplante Pipeline für den aktuellen Production-Release-Branch definieren.
Erwägen Sie den Einsatz von Out-of-the-Box-GitLab-Tooling: Dies vereinfacht die Sache erheblich und gibt Ihnen einen Vorsprung beim Einsatz potenziell “gerade-gut-genug”-Tools relativ kostengünstig.Pull Requests verwenden, um neu eingeführte Sicherheitsprobleme zu finden. Die Summary-Ansicht ist weniger ideal.
DAST: Vergessen Sie nicht, die Scanner-Konfiguration anzupassen: Ohne Anpassung sind die Ergebnisse schwach.Nutzen Sie die Möglichkeit, Branches zu schützen. Mindestens der Release-Branch sollte geschützt werden.
(Security-)Reviewen Sie die Tools, die Sie aus dem Marketplace beziehen.
Nutzen Sie die von GitHub bereitgestellten Standard-GitHub-Secrets zur Speicherung von Secrets oder verwenden Sie den professionellen Azure Key Vault.
Evaluieren Sie Security Tools und nutzen Sie ein Set, das für Sie gut genug funktioniert. Leider gibt es kein Out-of-the-Box-Standard-Tooling.
DAST: Vergessen Sie nicht, die Scanner-Konfiguration anzupassen.
Bis GitHub die Möglichkeit bietet, Vulnerabilities manuell hinzuzufügen, müssen Sie möglicherweise ein zusätzliches Tool zur Nachverfolgung von Vulnerabilities verwenden.

Code
#

GitLabGitHub
https://gitlab.com/romano_roth/gitlabdevsecopspipelinehttps://github.com/romanoroth/GitHubDevSecOps

Zusammenfassung
#

Unsere epische Reise geht zu Ende. Im letzten Monat haben wir 24 Videos erstellt, 12 zu GitLab und 12 zu GitHub, in denen wir eine DevSecOps-Pipeline aufgebaut haben. Nun, in diesem 25. Video, vergleichen wir GitLab vs. GitHub.

📌 GitLab liefert schneller Ergebnisse und verfügt über Out-of-the-Box-Tooling für alles, ihm fehlt jedoch ein ordentliches Secret Management.

➡️ GitLab ist unsere Empfehlung, wenn Sie schnell ans Ziel kommen wollen und damit einverstanden sind, sich an die Defaults zu halten.

📌 GitHub bietet mehr Flexibilität, unterstützt grossartiges Secret Management und hat eine lebendige Community, kommt aber mit hohem Supply-Chain-Risiko, hat keine vernünftigen Security-Tool-Defaults und es fehlt ein kritisches Vulnerability-Management-Feature (externe Vulnerability hinzufügen).

➡️ GitHub ist unsere Empfehlung, wenn Sie komplexe Anwendungen/Pipelines haben oder mit einigen externen (Security-)Tools integrieren müssen.

💡 Egal ob Sie Entwickler, Projektmanager oder einfach jemand sind, der sich für Technologie interessiert, unsere Empfehlungen können Ihnen helfen, eine fundierte Entscheidung darüber zu treffen, welche Plattform für Sie am besten geeignet ist.