Integracja kontroli analizy kompozycji oprogramowania do przepływów pracy
Integracja analizy składu oprogramowania z potokami ciągłej integracji/ciągłego wdrażania umożliwia automatyczne ciągłe sprawdzanie zabezpieczeń zależności i zgodności w całym cyklu życia tworzenia oprogramowania. Zamiast przeprowadzania oceny zabezpieczeń raz przed wydaniem, zintegrowane z potokiem rozwiązanie SCA stale weryfikuje zależności przy każdej zmianie kodu, wychwytując luki w zabezpieczeniach na wczesnym etapie, kiedy są najłatwiejsze i najtańsze do naprawy.
Dlaczego warto zintegrować usługę SCA z potokami?
Tradycyjne podejścia do zabezpieczeń stworzyły niebezpieczne wzorce, w których zespoły ds. zabezpieczeń wykryły luki w zabezpieczeniach pod koniec opracowywania, gdy presja na wydanie była najwyższa. Ten wzorzec spowodował wysyłanie oprogramowania podatnego na zagrożenia lub kosztowne działania korygowania w ostatniej chwili opóźniające wydania.
Korzyści wynikające z przesunięcia uwagi na bezpieczeństwo na wcześniejsze etapy开发
Wczesne wykrywanie luk w zabezpieczeniach:
- Natychmiastowa opinia: Deweloperzy otrzymują powiadomienia o lukach w zabezpieczeniach w ciągu kilku minut od wprowadzenia zależności podatnych na zagrożenia.
- Niższe koszty usuwania luk: Naprawianie luk w zabezpieczeniach podczas tworzenia kosztuje znacznie mniej niż naprawianie ich w produkcji.
- Zachowywanie kontekstu: Deweloperzy mają pełny kontekst wyboru zależności w przypadku natychmiastowego odnalezienia luk w zabezpieczeniach.
- Poprawki przyrostowe: Małe, ciągłe ulepszenia zabezpieczeń są łatwiejsze do wdrożenia niż duże wysiłki naprawcze.
Ciągła zgodność:
- Wymuszanie polityk: Automatyczne kontrole procesu wymuszają polityki licencyjne i zabezpieczeń przy każdym zatwierdzeniu.
- Ślady audytu: Wyniki skanowania pipeline zapewniają dowody zgodności i ślady audytu.
- Spójne standardy: Wszystkie zmiany kodu przechodzą ten sam przegląd zabezpieczeń niezależnie od tego, kto je przesyła.
- Zapobieganie ryzyku: Blokowanie podatnych na zagrożenia zależności przed scaleniem uniemożliwia akumulację zadłużenia zabezpieczeń.
Szybkość opracowywania:
- Zautomatyzowane przeglądy: Narzędzia SCA automatycznie wykonują analizę zależności bez konieczności ręcznego przeprowadzania przeglądów zespołu ds. zabezpieczeń.
- Przetwarzanie równoległe: Skanowania zabezpieczeń są uruchamiane równolegle z innymi krokami kompilacji, minimalizując wpływ na czas kompilacji.
- Szybsze wersje: Ciągła walidacja zabezpieczeń w trakcie opracowywania umożliwia szybsze i bardziej pewne wydania.
- Zmniejszenie przeróbek: Wczesne uchwycenie problemów eliminuje konieczność kosztownych przeróbek podczas przygotowywania wydania.
Punkty integracji rurociągu
Efektywna implementacja SCA obejmuje wiele punktów integracji w potoku ciągłej integracji/ciągłego wdrażania.
Walidacja żądania ściągnięcia
Kontrole zabezpieczeń przed scaleniem: Walidacja żądań ściągnięcia identyfikuje wrażliwe zależności przed ich scaleniem z głównymi gałęziami, zapobiegając gromadzeniu się długu technicznego dotyczącego zabezpieczeń.
Weryfikacja żądania ściągnięcia usługi Azure Pipelines:
trigger: none
pr:
branches:
include:
- main
- develop
pool:
vmImage: "ubuntu-latest"
steps:
- task: UseNode@1
inputs:
version: "18.x"
displayName: "Install Node.js"
- script: npm ci
displayName: "Install dependencies"
- task: WhiteSource@21
inputs:
cwd: "$(System.DefaultWorkingDirectory)"
projectName: "$(Build.Repository.Name)"
displayName: "Run Mend SCA scan"
- task: PublishTestResults@2
inputs:
testResultsFormat: "JUnit"
testResultsFiles: "**/test-results.xml"
displayName: "Publish scan results"
Weryfikacja pull request w GitHub Actions:
name: Security Scan
on:
pull_request:
branches: [main, develop]
jobs:
sca-scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Node.js
uses: actions/setup-node@v3
with:
node-version: "18"
- name: Install dependencies
run: npm ci
- name: Run Snyk security scan
uses: snyk/actions/node@master
env:
SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
with:
args: --severity-threshold=high
- name: Upload scan results
uses: github/codeql-action/upload-sarif@v2
if: always()
with:
sarif_file: snyk.sarif
Sprawdzanie żądań ściągnięcia:
- Zmiany zależności: Wykryj, które zależności uległy zmianie w pull request.
- Nowe luki w zabezpieczeniach: Identyfikowanie nowych luk w zabezpieczeniach wprowadzonych przez zmiany zależności.
- Naruszenia licencji: Flaguj naruszenia zasad licencji przed scaleniem.
- Progi jakości: Blokuj prośby o scalanie naruszające zasady zabezpieczeń lub zgodności.
- Przejrzyj komentarze: Opublikuj wyniki skanowania jako komentarze do pull requestu, aby były widoczne dla recenzenta.
Budowania ciągłej integracji
Skanowanie SCA w czasie kompilacji: Każda kompilacja ciągłej integracji powinna obejmować skanowanie SCA w celu zweryfikowania zależności w pełnym kontekście aplikacji.
Integracja CI usługi Azure Pipelines:
trigger:
branches:
include:
- main
- develop
- feature/*
pool:
vmImage: "ubuntu-latest"
variables:
buildConfiguration: "Release"
steps:
- task: UseDotNet@2
inputs:
packageType: "sdk"
version: "7.x"
displayName: "Install .NET SDK"
- task: DotNetCoreCLI@2
inputs:
command: "restore"
projects: "**/*.csproj"
displayName: "Restore NuGet packages"
- task: WhiteSource@21
inputs:
cwd: "$(System.DefaultWorkingDirectory)"
projectName: "$(Build.Repository.Name)"
scanComment: "CI Build $(Build.BuildNumber)"
checkPolicies: true
failBuildOnPolicyViolation: true
displayName: "Mend SCA scan with policy enforcement"
- task: DotNetCoreCLI@2
inputs:
command: "build"
projects: "**/*.csproj"
arguments: "--configuration $(buildConfiguration)"
displayName: "Build application"
- task: PublishBuildArtifacts@1
inputs:
pathToPublish: "$(Build.ArtifactStagingDirectory)"
artifactName: "drop"
displayName: "Publish build artifacts"
Integracja CI z GitHub Actions:
name: CI Build
on:
push:
branches: [main, develop]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: "3.11"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run OWASP Dependency-Check
uses: dependency-check/Dependency-Check_Action@main
with:
project: "my-application"
path: "."
format: "SARIF"
args: >
--failOnCVSS 7
--suppression suppression.xml
- name: Upload scan results to GitHub Security
uses: github/codeql-action/upload-sarif@v2
with:
sarif_file: dependency-check-report.sarif
- name: Build application
run: python setup.py build
- name: Generate SBOM
run: |
pip install cyclonedx-bom
cyclonedx-py -i requirements.txt -o sbom.json
- name: Upload SBOM artifact
uses: actions/upload-artifact@v3
with:
name: sbom
path: sbom.json
Funkcje kompilacji ciągłej integracji:
- Pełne skanowanie zależności: Skanuj wszystkie zależności, w tym zależności przechodnie.
- Egzekwowanie zasad: Kompilacje, które naruszają zasady zabezpieczeń lub zgodności, kończą się niepowodzeniem.
- Generowanie SBOM: Tworzenie rachunku za oprogramowanie artefaktów materiałów na potrzeby użycia podrzędnego.
- Porównanie linii bazowej: Porównaj bieżące wyniki skanowania z poprzednimi kompilacjami, aby wykryć regresje.
- Kolekcja metryk: Śledzenie liczby luk w zabezpieczeniach, współczynników korygowania i wyników zgodności w czasie.
Zaplanowane głębokie skanowania
Kompleksowa okresowa analiza: Zaplanowane skanowania zapewniają dokładną analizę bez blokowania przepływu pracy dewelopera.
Zaplanowane skanowanie w usłudze Azure Pipelines:
schedules:
- cron: "0 2 * * *"
displayName: "Nightly security scan"
branches:
include:
- main
always: true
trigger: none
pr: none
pool:
vmImage: "ubuntu-latest"
steps:
- task: NodeTool@0
inputs:
versionSpec: "18.x"
displayName: "Install Node.js"
- script: npm ci
displayName: "Install dependencies"
- task: Snyk@1
inputs:
serviceConnectionEndpoint: "SnykConnection"
testType: "app"
severityThreshold: "low"
monitorOnBuild: true
failOnIssues: false
projectName: "$(Build.Repository.Name)"
displayName: "Deep Snyk scan (all severities)"
- task: BlackDuck@1
inputs:
BlackDuckService: "BlackDuckConnection"
ScanMode: "intelligent"
DetectArguments: "--detect.policy.check.fail.on.severities ALL"
displayName: "Black Duck comprehensive scan"
- task: PublishBuildArtifacts@1
inputs:
pathToPublish: "$(Build.ArtifactStagingDirectory)/SecurityReports"
artifactName: "SecurityReports"
displayName: "Publish detailed scan reports"
Zalety zaplanowanego skanowania:
- Dokładna analiza: Głębokie skanowanie ze wszystkimi poziomami ważności bez blokowania programowania.
- Nowe wykrywanie luk w zabezpieczeniach: Wykrywanie nowo ujawnionych luk w zabezpieczeniach w niezmienionych zależnościach.
- Kompleksowe raportowanie: Generowanie szczegółowych raportów dla zespołów ds. zabezpieczeń i zarządzania nimi.
- Analiza trendów: Śledzenie zmian stanu zabezpieczeń w czasie dzięki spójnemu skanowaniu.
Walidacja ścieżki wydania
Bramy zabezpieczeń przed wdrożeniem: Potoki wydania powinny weryfikować artefakty oprogramowania przed wdrożeniem do środowisk produkcyjnych.
Brama wydania usługi Azure Pipelines:
stages:
- stage: Build
jobs:
- job: BuildJob
steps:
- task: DotNetCoreCLI@2
inputs:
command: "build"
- stage: SecurityValidation
dependsOn: Build
jobs:
- job: SCAValidation
steps:
- task: DownloadBuildArtifacts@0
inputs:
artifactName: "drop"
- task: WhiteSource@21
inputs:
cwd: "$(System.ArtifactsDirectory)/drop"
projectName: "$(Build.Repository.Name)"
checkPolicies: true
failBuildOnPolicyViolation: true
displayName: "Validate artifact dependencies"
- stage: DeployProduction
dependsOn: SecurityValidation
condition: succeeded()
jobs:
- deployment: DeployToProduction
environment: "production"
strategy:
runOnce:
deploy:
steps:
- task: AzureWebApp@1
inputs:
azureSubscription: "AzureConnection"
appName: "my-web-app"
package: "$(Pipeline.Workspace)/drop"
Sprawdzanie poprawności wersji:
- Skanowanie artefaktów: Skanuj skompilowane artefakty i obrazy kontenerów przed wdrożeniem.
- Zasady specyficzne dla środowiska produkcyjnego: Stosowanie bardziej rygorystycznych zasad zabezpieczeń dla wdrożeń produkcyjnych.
- Weryfikacja zgodności: Sprawdź zgodność licencji przed wydaniem produkcyjnym.
- Bramy zatwierdzania: Wymagaj ręcznego zatwierdzania wdrożeń ze znanymi, ale akceptowanymi zagrożeniami.
Bramy jakości i wymuszanie zasad
Definiowanie zasad zabezpieczeń: Narzędzia SCA wymuszają zasady definiujące akceptowalne standardy zabezpieczeń i zgodności.
Zasady oparte na dotkliwości
Blokuj kompilacje na podstawie stopnia luk w zabezpieczeniach:
Przykładowa zasada Mend:
{
"name": "Production Security Policy",
"enabled": true,
"rules": [
{
"type": "VULNERABILITY_SEVERITY",
"action": "FAIL_BUILD",
"minSeverity": "HIGH"
},
{
"type": "VULNERABILITY_AGE",
"action": "FAIL_BUILD",
"maxAge": 30,
"minSeverity": "MEDIUM"
}
]
}
Polityka powoduje zakończenie procesu kompilacji, gdy zawiera ona wysokie lub krytyczne luki w zabezpieczeniach, oraz średnie luki w zabezpieczeniach starsze niż 30 dni.
Przykładowe zasady Snyk:
# .snyk policy file
version: v1.0.0
patch: {}
ignore: {}
policies:
- severity:
low: ignore
medium: warn
high: fail
critical: fail
Zasady oparte na licencjach
Wymuszanie zgodności licencji:
Przykładowe zasady licencji:
{
"name": "License Compliance Policy",
"enabled": true,
"rules": [
{
"type": "LICENSE_TYPE",
"action": "FAIL_BUILD",
"deniedLicenses": ["GPL-2.0", "GPL-3.0", "AGPL-3.0"]
},
{
"type": "LICENSE_TYPE",
"action": "REQUIRE_APPROVAL",
"approvalRequired": ["LGPL-2.1", "LGPL-3.0", "MPL-2.0"]
}
]
}
Kategorie zasad licencji:
- Licencje odrzucone: Licencje zakazane we wszystkich okolicznościach (surowy copyleft dla oprogramowania własnościowego).
- Licencje wymagające zatwierdzenia: Licencje, które wymagają przeglądu prawnego przed użyciem (słabe copyleft, licencje niestandardowe).
- Dozwolone licencje: Licencje permissive dopuszczalne bez przeglądu (MIT, Apache 2.0, BSD).
Niestandardowe zasady polityki
Zaawansowane warunki zasad:
{
"name": "Advanced Security Policy",
"enabled": true,
"rules": [
{
"type": "VULNERABILITY_CVSS_SCORE",
"action": "FAIL_BUILD",
"minScore": 7.0,
"condition": "exploitMaturity == 'FUNCTIONAL' OR exploitMaturity == 'HIGH'"
},
{
"type": "DEPENDENCY_AGE",
"action": "WARN",
"maxAge": 365,
"message": "Dependency has not been updated in over a year"
},
{
"type": "MAINTAINER_STATUS",
"action": "WARN",
"condition": "abandonedProject == true"
}
]
}
Generowanie SBOM w linii produkcyjnych
Dokumenty dotyczące rozliczania oprogramowania (SBOM) zawierają kompleksowy spis wszystkich składników oprogramowania.
Generowanie artefaktów SBOM
Generowanie CycloneDX SBOM:
steps:
- task: UseNode@1
inputs:
version: "18.x"
- script: |
npm ci
npm install -g @cyclonedx/cyclonedx-npm
cyclonedx-npm --output-file sbom.json
displayName: "Generate CycloneDX SBOM"
- task: PublishBuildArtifacts@1
inputs:
pathToPublish: "sbom.json"
artifactName: "SBOM"
Generacja SBOM SPDX:
steps:
- script: |
pip install spdx-tools
pip-licenses --format=json --output-file=licenses.json
# Convert to SPDX format using custom script
python scripts/generate_spdx.py licenses.json sbom.spdx
displayName: "Generate SPDX SBOM"
Przypadki użycia SBOM:
- Dowody zgodności: Zapewnienie klientom lub audytorom wykazania przejrzystości zależności.
- Śledzenie luk w zabezpieczeniach: Użyj rozwiązania SBOM, aby szybko określić, czy nowo ujawnione luki w zabezpieczeniach mają wpływ na wdrożone oprogramowanie.
- Bezpieczeństwo łańcucha dostaw: Śledzenie pochodzenia oprogramowania i wykrywanie ataków łańcucha dostaw.
- Zgodność licencji: Udokumentowanie wszystkich zobowiązań licencyjnych dotyczących wdrożonego oprogramowania.
Integracje specyficzne dla narzędzi
Mend (dawniej WhiteSource)
Zadanie naprawcze usługi Azure Pipelines:
- task: WhiteSource@21
inputs:
cwd: "$(System.DefaultWorkingDirectory)"
projectName: "$(Build.Repository.Name)"
checkPolicies: true
failBuildOnPolicyViolation: true
scanComment: "Build $(Build.BuildNumber)"
displayName: "Mend SCA scan"
Snyk
Zadanie Snyk Azure Pipelines:
- task: SnykSecurityScan@1
inputs:
serviceConnectionEndpoint: "SnykConnection"
testType: "app"
severityThreshold: "high"
monitorOnBuild: true
failOnIssues: true
displayName: "Snyk security scan"
Dependency-Check OWASP
Azure Pipelines OWASP Task:
- script: |
wget https://github.com/jeremylong/DependencyCheck/releases/download/v8.0.0/dependency-check-8.0.0-release.zip
unzip dependency-check-8.0.0-release.zip
./dependency-check/bin/dependency-check.sh \
--project "$(Build.Repository.Name)" \
--scan . \
--format ALL \
--failOnCVSS 7
displayName: "OWASP Dependency-Check scan"
Czarna Kaczka
Zadanie Black Duck w usłudze Azure Pipelines:
- task: BlackDuck@1
inputs:
BlackDuckService: "BlackDuckConnection"
ScanMode: "intelligent"
DetectArguments: "--detect.policy.check.fail.on.severities CRITICAL,HIGH"
displayName: "Black Duck scan"
Najlepsze praktyki dotyczące integracji rurociągu
Optymalizowanie wydajności skanowania:
- Skanowanie przyrostowe: Używaj skanów przyrostowych dla pull requestów, pełnych skanów dla kompilacji gałęzi głównej.
- Buforowanie: Rozwiązywanie zależności pamięci podręcznej i przechowywanie wyników skanowania w celu przyspieszenia kolejnych przebiegów.
- Wykonywanie równoległe: Uruchom skanowanie SCA równolegle z innymi krokami kompilacji, jeśli to możliwe.
- Planowanie skanowania: Uruchamiaj kompleksowe skany zgodnie z harmonogramem zamiast blokować każde zatwierdzenie.
Zarządzaj fałszywymi alarmami:
- Pliki tłumienia: Utrzymywanie plików tłumienia dla znanych fałszywych wyników pozytywnych.
- Zasady obsługujące kontekst: Skonfiguruj zasady, biorąc pod uwagę, czy kod podatny na zagrożenia jest rzeczywiście używany.
- Regularne przeglądy: Okresowo sprawdzaj pominięte wyniki, aby upewnić się, że pozostają fałszywie dodatnie.
Prześlij opinię z możliwością działania:
- Jasne komunikaty: Podaj jasne wyjaśnienia naruszeń zasad i kroków korygowania.
- Wskazówki dotyczące korygowania: Link do dokumentacji wyjaśniającej sposób naprawiania luk w zabezpieczeniach.
- Priorytetyzacja: Uszereguj wyniki według ważności i możliwości wykorzystania, aby ułatwić deweloperom ustalanie priorytetów.
Monitorowanie i ulepszanie:
- Pulpity nawigacyjne metryk: Śledzenie trendów luk w zabezpieczeniach, czasu korygowania i współczynników zgodności.
- Edukacja zespołowa: Szkolenie deweloperów na temat bezpiecznego wyboru zależności i korygowania luk w zabezpieczeniach.
- Iteracja procesu: Stale uściślij zasady i integrację na podstawie opinii i metryk zespołu.
Integrując analizę składu oprogramowania z potokami CI/CD przekształca bezpieczeństwo z bramki późnego etapu w proces ciągłej weryfikacji w całym procesie rozwoju. Automatyczne skanowanie oparte na zasadach wcześnie przechwytuje luki w zabezpieczeniach, wymusza ciągłą zgodność i zapewnia podstawę bezpiecznego dostarczania oprogramowania. W następnej lekcji zapoznasz się z konkretnymi narzędziami analizy głównej przyczyny i sposobem oceny ich możliwości dla potrzeb organizacji.