Statische Anwendungssicherheitstests (SAST) in Azure Pipelines
In unserem vorherigen Artikel über automatisierte Cybersicherheit haben wir unter anderem auf Anwendungsbereiche und Technologien nur oberflächlich eingegangen. In diesem Artikel möchten wir Dir anhand von Azure Pipelines und SonarQube in einer Schritt-für-Schritt-Anleitung zeigen, wie Du die Automatisierung von SAST effektiv umsetzen kannst.
Die Integration von SAST in Azure Pipelines ist eine proaktive Maßnahme, um Softwarefehler und Sicherheitslücken frühzeitig zu erkennen. Dieser Ansatz ist nicht nur eine Investition in die Qualität Deiner Anwendungen, sondern auch ein entscheidender Schritt zur Minimierung von Risiken in Deiner Softwareentwicklung.
1. Voraussetzungen
- Azure DevOps Konto: Stelle sicher, dass Du ein Azure DevOps Konto besitzt und Zugriff auf ein Projekt mit einer bestehenden Azure Pipeline hast.
- SAST-Tool: Wähle ein SAST-Tool, das gut in Azure Pipelines integriert werden kann. Viele Tools bieten eigene Azure DevOps-Erweiterungen oder können über einfache Skripte integriert werden.
2. Installation und Konfiguration des SAST-Tools
Viele SAST-Tools bieten Erweiterungen im Azure DevOps Marketplace an, die einfach in Deine Pipeline integriert werden können. Alternativ kannst Du auch Skripte direkt in die Pipeline einbinden.
- Beispiel mit SonarQube: SonarQube Extension installieren: Gehe zum Azure DevOps Marketplace und installiere die SonarQube Extension in Deinem Azure DevOps-Projekt.
- SonarQube-Server konfigurieren: Stelle sicher, dass der SonarQube-Server richtig konfiguriert ist und Azure DevOps darauf zugreifen kann. Dies beinhaltet die Konfiguration eines Service-Connections in Azure DevOps.
3. Pipeline-Konfiguration
Öffnen die Pipeline-Definition für dein Projekt. Du kannst entweder eine YAML-basierte Pipeline verwenden oder eine klassische Pipeline im visuellen Editor erstellen.
Beispiel für eine YAML-basierte Pipeline:
```yaml trigger: - main pool: vmImage: 'ubuntu-latest' variables: SONARQUBE_SCANNER_MODE: 'CLI' SONARQUBE_PROJECT_KEY: 'my_project_key' SONARQUBE_PROJECT_NAME: 'My Project' SONARQUBE_PROJECT_VERSION: '1.0' SONARQUBE_ORG: 'my_org' SONARQUBE_TOKEN: '$(SONARQUBE_TOKEN)' steps: - task: UseDotNet@2 inputs: packageType: 'sdk' version: '5.x' installationPath: $(Agent.ToolsDirectory)/dotnet - task: SonarQubePrepare@5 inputs: SonarQube: 'SonarQube-Server' # Name der Service-Connection scannerMode: 'CLI' configMode: 'manual' cliProjectKey: '$(SONARQUBE_PROJECT_KEY)' cliProjectName: '$(SONARQUBE_PROJECT_NAME)' cliProjectVersion: '$(SONARQUBE_PROJECT_VERSION)' extraProperties: | sonar.exclusions=**/bin/**,**/obj/** sonar.coverage.exclusions=**/Test/** - script: dotnet build displayName: 'Build project' - task: SonarQubeAnalyze@5 displayName: 'Run SonarQube analysis' - task: SonarQubePublish@5 inputs: pollingTimeoutSec: '300' ```
Erklärung der Schritte:
- Trigger: Die Pipeline wird jedes Mal ausgelöst, wenn ein Commit auf den main-Branch gepusht wird.
- UseDotNet@2 Task: Installiert das .NET SDK, um das Projekt zu bauen (falls notwendig).
- SonarQubePrepare@5 Task: Initialisiert die SonarQube-Analyse. Du gibst hier den SonarQube-Server, das Projekt und zusätzliche Konfigurationen an, wie zum Beispiel Ausnahmeregeln für bestimmte Verzeichnisse. Dieser Task bereitet alles vor, um eine gründliche Code-Analyse zu ermöglichen.
- Build-Schritt: Dieser Schritt baut das Projekt. Dieser Schritt kann je nach Projekt unterschiedlich sein (z.B. dotnet build, mvn clean install etc.).
- SonarQubeAnalyze@5 Task: Führt die eigentliche statische Code-Analyse mit SonarQube durch.
- SonarQubePublish@5 Task: Übermittelt die Analyseergebnisse an SonarQube und wartet auf den Abschluss der Analyse.
4. Integration in den CI/CD-Workflow
Nachdem die SAST-Analyse in die Pipeline integriert wurde, ist es wichtig, wie und wann sie ausgeführt wird.
Übliche Zeitpunkte sind:
- Bei jedem Commit: Dies ermöglicht eine sofortige Rückmeldung an die Entwickler.
- Bei Pull Requests: Dies stellt sicher, dass kein unsicherer Code in den Hauptbranch integriert wird.
- Bei regulären Builds: Du kannst die Analyse z.B. bei nächtlichen Builds ausführen, um regelmässige Sicherheitsüberprüfungen durchzuführen.
5. Festlegung von Schwellenwerten und Abbruchkriterien
Du kannst die Pipeline so konfigurieren, dass sie fehlschlägt, wenn bestimmte Schwellenwerte für Sicherheitsprobleme überschritten werden.
Dies kannst du in der SonarQubePrepare@5-Task durch Angabe von zusätzlichen Eigenschaften konfigurieren, zum Beispiel:
```yaml extraProperties: | sonar.exclusions=**/bin/**,**/obj/** sonar.coverage.exclusions=**/Test/** sonar.qualitygate.wait=true ```
Mit sonar.qualitygate.wait=true stelle sicher, dass die Pipeline wartet, bis das Quality-Gate von SonarQube passiert wurde.
6. Ergebnisüberwachung und Reporting
Stelle sicher, dass die Ergebnisse der SAST-Analyse sichtbar und verständlich an die Entwickler zurückgemeldet werden. Azure DevOps zeigt die Ergebnisse direkt im Pipeline-Output an, und du kannst auch in SonarQube detaillierte Berichte einsehen.
7. Automatisierte Benachrichtigungen
Konfiguriere Benachrichtigungen in Azure DevOps, damit Entwickler informiert werden, wenn die Pipeline aufgrund von Sicherheitsproblemen fehlschlägt. Dies kann über E-Mail, Teams oder andere integrierte Benachrichtigungssysteme erfolgen.
8. Kontinuierliche Verbesserung
Überwache die Pipeline regelmässig und passe die Konfiguration an, um die Effektivität der SAST-Analyse zu verbessern. Dies kann bedeuten, Ausnahmen zu aktualisieren, neue Regeln hinzuzufügen oder die Pipeline-Leistung zu optimieren. Durch diese Integration wird sichergestellt, dass Sicherheitsaspekte in jeder Phase des Entwicklungsprozesses berücksichtigt und potenzielle Sicherheitsprobleme frühzeitig erkannt werden. Typische Sicherheitsprobleme die mit SAST sowohl für Source Code als auch für Infrastructure as Code (IaC) erkannt werden können sind u.a.
- SQL Injection
- Cross-Site Scripting (XSS)
- Unsichere Passwortspeicherung
- Pufferüberläufe
- Hartcodierte Anmeldeinformationen
- Ungeprüfte Rückgaben von Systemkommandos
- Unsichere Deserialisierung
- Directory Traversal
- Verwendung von unsicheren Zufallszahlengeneratoren
- Fehlerhafte Zugriffssteuerung
- Unsichere Replikation des Storage Accounts
- Storage Account erlaubt unverschlüsselten HTTP-Zugriff
- Offene Sicherheitsgruppen (Network Security Groups)
- Verschlüsselung der Managed Disk ist deaktiviert
- …
Wie planst Du, SAST-Methoden in Deine Azure-Pipelines zu integrieren, um die Sicherheit und Qualität Deiner Softwareprojekte zu maximieren?
Falls Du unseren ersten Beitrag noch nicht gelesen hast, kannst Du hier gerne weiterlesen:
https://www.linkedin.com/feed/update/urn:li:ugcPost:7226868010962059264/?actorCompanyId=18475986