Udostępnij za pośrednictwem


Konfigurowanie skanowania kodu

Skanowanie kodu w usłudze GitHub Advanced Security dla Azure DevOps umożliwia analizowanie kodu w repozytorium Azure DevOps w celu znalezienia luk w zabezpieczeniach i błędów kodowania. Będziesz potrzebować GitHub Advanced Security for Azure DevOps lub, jeśli używasz autonomicznego środowiska, GitHub Code Security for Azure DevOps z włączoną funkcją. Wszelkie problemy zidentyfikowane przez analizę są zgłaszane jako alert. Skanowanie kodu używa języka CodeQL do identyfikowania luk w zabezpieczeniach.

CodeQL to aparat analizy kodu opracowany przez GitHub w celu zautomatyzowania kontroli zabezpieczeń. Kod można analizować przy użyciu języka CodeQL i wyświetlać wyniki jako alerty skanowania kodu. Aby uzyskać bardziej szczegółową dokumentację dotyczącą języka CodeQL, zobacz dokumentację języka CodeQL.

GitHub Advanced Security for Azure DevOps współpracuje z Azure Repos. Aby użyć GitHub Advanced Security z repozytoriami GitHub, zobacz GitHub Advanced Security.

Wymagania wstępne

Kategoria Wymagania
uprawnienia — Aby wyświetlić podsumowanie wszystkich alertów dla repozytorium: Współautor uprawnienia dla repozytorium.
— Aby odrzucić alerty w usłudze Advanced Security: uprawnienia administratora projektu.
- Aby zarządzać uprawnieniami w Zaawansowanych zabezpieczeniach: członek grupy Administratorzy kolekcji projektów lub uprawnienie Zaawansowane zabezpieczenia: zarządzanie ustawieniami ustawione na Dozwolone.

Aby uzyskać więcej informacji na temat uprawnień zabezpieczeń zaawansowanych, zobacz Zarządzanie uprawnieniami zabezpieczeń zaawansowanych.

Informacje o typach konfiguracji skanowania kodu

Istnieją dwa główne sposoby konfigurowania skanowania kodu dla repozytorium: konfiguracja domyślna i konfiguracja zaawansowana.

Domyślna konfiguracja Konfiguracja zaawansowana
Configuration Automatyczna, bez wymaganej konfiguracji potoku Dodawanie zadań CodeQL do potoku jest wykonywane ręcznie.
wykrywanie języka Automatycznie wykrywa i skanuje języki obsługiwane przez język CodeQL Języki należy określić w zadaniu przetwarzania potokowego
Pokrycie gałęzi Skanuje tylko gałąź domyślną Skanuje dowolną gałąź, która uruchamia rurociąg
Dostosowywanie buildu Brak niestandardowych kroków kompilacji — używa none trybu kompilacji Pełna kontrola nad krokami kompilacji dla skompilowanych języków
Najlepsze dla Szybkie włączanie, standardowe potrzeby skanowania Skanowanie obejmujące wiele gałęzi, niestandardowa pula agentów lub częstotliwość skanowania

Domyślna konfiguracja to najszybszy sposób włączania skanowania kodu. Tworzy konfigurację skanowania zarządzanego w tle i nie wymaga żadnych zmian potoku. Zalecamy rozpoczęcie od domyślnej konfiguracji dla większości repozytoriów.

Advanced setup zapewnia pełną kontrolę, dodając zadania CodeQL bezpośrednio do Azure Pipelines. Użyj konfiguracji zaawansowanej, jeśli musisz:

  • Zarządzanie określonymi pulami agentów dla różnych języków lub potrzeb obliczeniowych
  • Dostosowywanie kroków kompilacji dla skompilowanych języków
  • Skanuj gałęzie poza gałęzią domyślną
  • Integracja skanowania kodu w istniejącym pipeline CI/CD
  • Używanie określonego zestawu zapytań CodeQL lub zapytań niestandardowych

Wskazówka

Możesz rozpocząć od domyślnej konfiguracji i przejść do konfiguracji zaawansowanej później, jeśli potrzebujesz większej kontroli lub użyj obu tych opcji. Aby uzyskać informacje na temat konfigurowania konfiguracji domyślnej, zobacz Konfigurowanie funkcji GitHub Advanced Security.

Konfigurowanie domyślnych opcji konfiguracji

Po włączeniu domyślnej konfiguracji języka CodeQL można skonfigurować pulę agentów i harmonogram skanowania z ustawień organizacji. Te opcje mają zastosowanie do wszystkich repozytoriów w organizacji, które używają domyślnej konfiguracji.

Aby uzyskać dostęp do konfigurowalnych opcji, przejdź do obszaru Ustawienia organizacji>Repozytoria i rozwiń listę rozwijaną Domyślne opcje konfiguracji CodeQL.

Zrzut ekranu przedstawiający rozwinięte opcje konfiguracji domyślnej codeQL przedstawiające ustawienia puli agentów i harmonogramu skanowania.

Pula agentów

Wybierz pulę agentów używaną do uruchamiania domyślnych skanów konfiguracji CodeQL we wszystkich repozytoriach w organizacji. Możesz wybrać jedną z opcji:

  • Azure Pipelines — używa agentów hostowanych Microsoft. Użycie puli agentów Azure Pipelines zużywa współbieżność potoku.
  • Własne pule agentów — korzysta z własnych agentów. Wybierz pulę hostowaną samodzielnie, jeśli repozytoria wymagają dostępu do sieci prywatnych, określonych narzędzi kompilacji lub innych zasobów niedostępnych dla hostowanych agentów.
  • Zarządzane pule DevOps — używa pul zarządzanych Azure z niestandardowymi obrazami maszyn wirtualnych.

Harmonogram skanowania

Wybierz, kiedy domyślne skanowanie konfiguracji CodeQL jest uruchamiane dla wszystkich repozytoriów w organizacji. Możesz wybrać konkretny dzień tygodnia dla cotygodniowych skanowań. Następna zaplanowana data uruchomienia jest wyświetlana poniżej listy rozwijanej.

Anuluj uruchomione lub oczekujące skanowania

Jeśli musisz zatrzymać aktywnie działające lub zakolejkowane domyślne skany konfiguracji, możesz je ręcznie anulować poprzez ustawienia organizacji>repozytoria. Użytkownicy z uprawnieniami 'Zaawansowane zabezpieczenia: zarządzanie ustawieniami' w repozytorium mogą anulować uruchomione lub oczekujące na uruchomienie domyślne konfiguracje.

Zaawansowana konfiguracja skanowania kodu

CodeQL to narzędzie oparte na potoku, w którym wyniki są agregowane dla każdego repozytorium.

Wskazówka

Skanowanie kodu może być bardziej czasochłonnym zadaniem kompilacji, dlatego zalecamy dodanie zadania skanowania kodu do osobno sklonowanego potoku produkcyjnego lub utworzenia nowego potoku.

Dodaj zadania w następującej kolejności:

  1. Advanced Security Initialize CodeQL (AdvancedSecurity-Codeql-Init@1)
  2. Niestandardowe kroki kompilacji
  3. Zaawansowane zabezpieczenia Wykonaj analizę CodeQL (AdvancedSecurity-Codeql-Analyze@1)

Zrzut ekranu przedstawiający konfigurację potoku skanowania kodu dla YAML.

Ponadto określ język, który analizujesz w Initialize CodeQL zadaniu. Listę rozdzielaną przecinkami można użyć do analizowania wielu języków jednocześnie. Obsługiwane języki to csharp, cpp, go, java, javascript, python, ruby, swift. Jeśli używasz własnych agentów, możesz również dodać zmienną enableAutomaticCodeQLInstall: true , aby automatycznie zainstalować najnowsze bity CodeQL dla agenta.

Oto przykładowy potok początkowy:

trigger:
  - main

pool:
  # Additional hosted image options are available: https://dori-uw-1.kuma-moon.com/en-us/azure/devops/pipelines/agents/hosted#software
  vmImage: ubuntu-latest

steps:

  - task: AdvancedSecurity-Codeql-Init@1
    inputs:
      languages: "java"
      # Supported languages: csharp, cpp, go, java, javascript, python, ruby, swift
      # You can customize the initialize task: https://dori-uw-1.kuma-moon.com/en-us/azure/devops/pipelines/tasks/reference/advanced-security-codeql-init-v1?view=azure-pipelines
      # If you're using a self-hosted agent to run CodeQL, use `enableAutomaticCodeQLInstall` to automatically use the latest CodeQL bits on your agent:
      enableAutomaticCodeQLInstall: true

#   Add your custom build steps here
# - Ensure that all code to be scanned is compiled (often using a `clean` command to ensure you're building from a clean state).
# - Disable the use of any build caching mechanisms as this can interfere with CodeQL's ability to capture all the necessary data during the build.
# - Disable the use of any distributed/multithreaded/incremental builds as CodeQL needs to monitor executions of the compiler to construct an accurate representation of the application.
# - For dependency scanning, ensure you have a package restore step for more accurate results.

# If you had a Maven app:
#   - task: Maven@4
#     inputs:
#       mavenPomFile: 'pom.xml'
#       goals: 'clean package'
#       publishJUnitResults: true
#       testResultsFiles: '**/TEST-*.xml'
#       javaHomeOption: 'JDKVersion'
#       jdkVersionOption: '1.17'
#       mavenVersionOption: 'Default'

# Or a general script:
#   - script: |
#       echo "Run, Build Application using script"
#       ./location_of_script_within_repo/buildscript.sh

  - task: AdvancedSecurity-Dependency-Scanning@1 # More details on this task: https://dori-uw-1.kuma-moon.com/en-us/azure/devops/pipelines/tasks/reference/advanced-security-dependency-scanning-v1?view=azure-pipelines

  - task: AdvancedSecurity-Codeql-Analyze@1 # More details on this task: https://dori-uw-1.kuma-moon.com/en-us/azure/devops/pipelines/tasks/reference/advanced-security-codeql-analyze-v1?view=azure-pipelines

Ponadto określ język, który analizujesz w Initialize CodeQL zadaniu. Jeśli określony język to swift, wymagane są niestandardowe kroki kompilacji.

Wskazówka

  • Użyj java, aby przeanalizować kod napisany w Java, Kotlin lub oba te elementy.
  • Użyj javascript do analizowania kodu napisanego w języku JavaScript, TypeScript lub obu.

Jeśli korzystasz z własnego agenta, zaznacz Enable automatic CodeQL detection and installation, aby automatycznie użyć najnowszych komponentów CodeQL na agencie, jeśli nie zainstalowałeś ręcznie najnowszego pakietu CodeQL do pamięci podręcznej narzędzi agenta.

Aby wygenerować alerty, uruchom pierwsze skanowanie z użyciem pipeline’u, który zawiera zadania skanowania kodu.

Więcej konfiguracji do skanowania kodu

Obsługa języka i zapytań

Eksperci GitHub, badacze bezpieczeństwa i współtwórcy społeczności piszą i utrzymują domyślne zapytania CodeQL używane do skanowania kodu. Zapytania są regularnie aktualizowane, aby poprawić analizę i zmniejszyć wszelkie wyniki fałszywie dodatnie. Zapytania są open source, więc można wyświetlać i współtworzyć zapytania w repozytorium github/codeql.

CodeQL obsługuje i wykorzystuje następujące identyfikatory języków:

Język Identyfikator
C/C++ cpp
C# csharp
Go go
Java/Kotlin java
JavaScript/TypeScript javascript
Python python
Ruby ruby
Swift swift

Wskazówka

  • Służy cpp do analizowania kodu napisanego w języku C, C++ lub obu tych językach.
  • Użyj java, aby przeanalizować kod napisany w Java, Kotlin lub oba te elementy.
  • Użyj javascript do analizy kodu napisanego w językach JavaScript, TypeScript lub obu.

Aby uzyskać więcej informacji, zobacz Obsługiwane języki i struktury.

W dzienniku kompilacji można wyświetlić określone zapytania i szczegóły zadania wykonywane przez bibliotekę CodeQL.

Zrzut ekranu zadania publikowania wyników skanowania kodu.

Dostosowywanie trybu kompilacji do skanowania kodu

Skanowanie kodu obsługuje dwa tryby kompilacji przy konfigurowaniu potoku skanowania.

  • none — baza danych CodeQL jest tworzona bezpośrednio z kodu źródłowego bez kompilowania kodu źródłowego (obsługiwana dla wszystkich języków interpretowanych i dodatkowo obsługiwana dla cpp, java, i csharp).
  • manual — definiujesz kroki kompilacji do użycia dla bazy kodu w przepływie pracy (obsługiwane dla wszystkich skompilowanych języków).

Aby uzyskać więcej informacji na temat różnych trybów kompilacji, w tym porównania korzyści z poszczególnych trybów kompilacji, zobacz Skanowanie kodu CodeQL pod kątem skompilowanych języków.

Wskazówka

Tryb kompilacji none jest używany z innymi językami interpretowanymi, na przykład JavaScript, Python, Ruby. Jeśli dla języka C# lub Java określono tryb kompilacji none z innymi skompilowanymi językami, które nie obsługują trybu kompilacji none, zadanie potoku kończy się niepowodzeniem.

Poniższy kod przedstawia przykład prawidłowej konfiguracji z obsługą wielu języków i trybem kompilacji none.

trigger: none
 
pool:
  vmImage: windows-latest

steps:
- task: AdvancedSecurity-Codeql-Init@1
  displayName: Initialize CodeQL
  inputs:
# build mode `none` is supported for C# and Java, and JavaScript is an interpreted language
# and build mode `none` has no impact on JavaScript analysis
    languages: 'csharp, java, javascript' 
    buildtype: 'none'

- task: AdvancedSecurity-Codeql-Analyze@1
  displayName: Perform CodeQL Analysis

Poniższy kod przedstawia przykład nieprawidłowej konfiguracji z wieloma językami i none trybem kompilacji.

trigger: none
 
pool:
  vmImage: windows-latest

steps:
- task: AdvancedSecurity-Codeql-Init@1
  displayName: Initialize CodeQL
  inputs:
# build mode `none` is supported for C# but build mode `none` is NOT supported for Swift
# so this pipeline definition will result in a failed run
    languages: 'csharp, swift'
    buildtype: 'none'

- task: AdvancedSecurity-Codeql-Analyze@1
  displayName: Perform CodeQL Analysis

Alerty skanowania kodu

GitHub Advanced Security for Azure DevOps alerty skanowania kodu obejmują flagi skanowania kodu przypisane do repozytoriów, które wskazują na luki w zabezpieczeniach na poziomie kodu aplikacji.

Aby użyć skanowania kodu, należy najpierw skonfigurować GitHub Advanced Security dla Azure DevOps.

Zakładka Zaawansowane zabezpieczenia w Repos w Azure DevOps stanowi centrum wyświetlania alertów skanowania kodu. Wybierz kartę Skanowanie kodu, aby zobaczyć alerty dotyczące skanowania. Można filtrować według gałęzi, stanu, strumienia, typu reguły i surowości. Obecnie centrum alertów nie wyświetla alertów dotyczących ukończenia skanowania w gałęziach pull request.

Nie ma wpływu na wyniki, jeśli nazwy potoków lub gałęzi zostaną zmienione — wyświetlenie nowej nazwy może potrwać do 24 godzin.

Jeśli zdecydujesz się uruchamiać niestandardowe zapytania CodeQL, nie ma domyślnie oddzielnego filtru dla alertów generowanych z różnych pakietów zapytań. Można filtrować według reguły, która jest odrębna dla każdego zapytania.

Zrzut ekranu przedstawiający alerty skanowania kodu dla repozytorium.

Jeśli wyłączysz Advanced Security dla repozytorium, utracisz dostęp do wyników w karcie Advanced Security i zadaniu kompilacji. Zadanie kompilacji nie kończy się niepowodzeniem, ale żadne wyniki z kompilacji uruchomionych z tym zadaniem, podczas gdy zabezpieczenia zaawansowane są wyłączone, nie są zachowywane i są ukrywane.

Szczegóły alertu

Wybierz alert, aby uzyskać więcej szczegółów, w tym wskazówki dotyczące korygowania. Każdy alert zawiera lokalizację, opis, przykład i ważność.

Zrzut ekranu przedstawiający szczegóły alertu skanowania kodu.

Sekcja Wyjaśnienie
Lokalizacja Sekcja Lokalizacje zawiera szczegółowe informacje o konkretnym wystąpieniu, w którym kodQL wykrył lukę w zabezpieczeniach. Jeśli istnieje wiele wystąpień kodu naruszających tę samą regułę, dla każdej odrębnej lokalizacji zostanie wygenerowany nowy alert. Karta Lokalizacje zawiera bezpośredni link do fragmentu kodu, którego dotyczy problem, dzięki czemu można wybrać fragment kodu, który ma zostać skierowany do internetowego interfejsu użytkownika Azure DevOps do edycji.
opis Opis jest dostarczany przez narzędzie CodeQL na podstawie problemu.
Zalecenie Zaleceniem jest sugerowana poprawka dla danego alertu skanowania kodu.
Przykład W przykładowej sekcji przedstawiono uproszczony przykład zidentyfikowanej słabości kodu.
Ważność Poziomy ważności mogą być niskie, średnie, wysokie lub krytyczne. Wynik ważności jest oparty na danym wyniku Wspólnego Systemu Oceny Podatności (CVSS) dla zidentyfikowanego Wspólnego Wykazu Słabości (CWE). Dowiedz się więcej o tym, jak surowość jest oceniana w tym wpisie na blogu GitHub.

Wyświetlanie alertów dla repozytorium

Każda osoba z uprawnieniami współautora dla repozytorium może wyświetlić podsumowanie wszystkich alertów dla repozytorium na karcie Zabezpieczenia zaawansowane w Repos. Wybierz kartę Skany kodu, aby wyświetlić wszystkie alerty skanowania tajnych.

Aby wyświetlić wyniki, należy najpierw uruchomić zadania skanowania kodu. Po zakończeniu pierwszego skanowania wszystkie wykryte luki w zabezpieczeniach zostaną wyświetlone na karcie Zabezpieczenia zaawansowane.

Domyślnie na stronie alertów są wyświetlane wyniki skanowania kodu dla domyślnej gałęzi repozytorium.

Stan danego alertu odzwierciedla stan na domyślnej gałęzi i najnowszego przebiegu rurociągu, nawet jeśli alert istnieje w innych gałęziach i rurociągach.

Odrzucanie alertów skanowania kodu

Aby odrzucić alerty, potrzebne są odpowiednie uprawnienia. Domyślnie tylko administratorzy projektu mogą odrzucać alerty usługi Advanced Security.

Aby odrzucić alert:

  1. Przejdź do alertu, który chcesz zamknąć, i kliknij na niego.
  2. Wybierz listę rozwijaną Zamknij alert .
  3. Jeśli jeszcze nie wybrano, wybierz opcję Ryzyko zaakceptowane lub Fałszywie dodatnie jako przyczynę zamknięcia.
  4. Dodaj opcjonalny komentarz do pola tekstowego Komentarz .
  5. Wybierz pozycję Zamknij , aby przesłać i zamknąć alert.
  6. Stan alertu zmienia się z Otwórz na Zamknięty , a przyczyna odrzucenia jest wyświetlana.

Zrzut ekranu przedstawiający sposób odrzucania alertu skanowania kodu.

Ta akcja usuwa alert we wszystkich oddziałach. Inne gałęzie, które zawierają tę samą lukę w zabezpieczeniach, również zostaną odrzucone. Każdy alert, który został wcześniej odrzucony, można ręcznie otworzyć ponownie.

Zarządzanie alertami skanowania kodu w pull requestach

Jeśli alerty są tworzone dla nowych zmian kodu w prośbie o ściągnięcie, alert jest zgłaszany jako adnotacja w sekcji komentarzy na karcie Przegląd prośby o ściągnięcie i jako alert na karcie Zaawansowane zabezpieczenia w repozytorium. Dodano nową pozycję w selektorze gałęzi dla gałęzi prośby o ściągnięcie.

Możesz przejrzeć zmienione wiersze kodu, wyświetlić podsumowanie wyników i rozwiązać adnotację w sekcji przegląd.

Zrzut ekranu przedstawiający adnotację aktywnego żądania ściągnięcia kodu.

Aby odrzucić alerty związane z żądaniem wciągnięcia, musisz przejść do widoku szczegółów alertu, aby zamknąć alert i usunąć adnotację. W przeciwnym razie po prostu zmiana stanu komentarza (1) rozwiązuje adnotację, ale nie zamyka ani nie naprawia alertu bazowego.

Zrzut ekranu przedstawiający adnotację zamkniętego żądania ściągnięcia kodu.

Aby wyświetlić cały zestaw wyników dla gałęzi żądania pobrania, przejdź do pozycji Repos>Advanced Security i wybierz gałąź żądania pobrania. Wybranie pozycji Pokaż więcej szczegółów (2) w adnotacji spowoduje przekierowanie do widoku szczegółów alertu na karcie Zabezpieczenia zaawansowane.

Wskazówka

Adnotacje są tworzone tylko wtedy, gdy linie kodu, które dotyczą różnic, są całkowicie unikatowe dla pull requestu w porównaniu z jego docelową gałęzią.