Selamlar, bu yazımızda Azure Devops ortamında bir Pipeline ile Java ile yazılmış bir gradle projesinin kaynak kod taramasını gerçekleştireceğiz. Bunun için Azure Devops’da bulunan Fortify Static Code Analyzer (SCA) Assessment eklentisini kullanarak ScanCentral ile bir tarama yapacağız.
- Kullanılan SCA Versiyonu: 23.2
Gereksinimler:
- Gradle projesinin gradle ile build alınabiliyor olması gerekmektedir.
- SCA Assesment eklentisini kullanabilmek için Azure Agent’ının kurulu olduğu makinede, SCA dizini içerisinde lisans dosyası bulunmalıdır.
- Sourceanalyzer.exe’nin kurulu olduğu makinede gradle kurulu olmalıdır.
- Android SDK makinede yüklü olmalıdır
Hazırlık
ℹ️ Bu yazı kapsamında, https://github.com/android/gradle-recipes reposundan alınan addCustomBuildConfigFields klasörü ayrı bir git reposu olarak yüklenmiştir: https://github.com/rbozburun/gradle-test
- SCA taramasının Fortify Software Security Center (SSC) arayüzüne yüklenebilmesi için bir Service Connection tanımlanmalıdır. (Bkz. Requirements for Fortify Static Code Analyzer Tasks (microfocus.com))
- Bunun için, Azure Devops’da ilgili proje üzerinden Project Settings > Service Connections menüsünden Generic Service Connection oluşturulmalıdır.
URL kısmına “https://hostname:8443/ssc/” formatında SSC url verilmeli ve Token kısmına Fortify SSC’den alınan CIToken bilgisi girilmelidir. Diğer alanlar boş bırakılabilir.
Azure Devops Ortamında Pipeline’ın Oluşturulması
Azure Devops ortamında oturum açılarak yeni bir pipeline oluşturulur ve https://github.com/rbozburun/gradle-test reposu seçilerek devam edilir.
1- Gradle Versiyon Güncellemesi
Projede kullanılan gradle versiyonu /gradle/wrapper/gradle-wrapper.properties
içerisinden görüntülenebilmektedir. Buradaki versiyon 8.6 olarak görülmektedir (gradle-8.6-bin.zip
). Makinede kullanılan gradle versiyonu ise 8.8’dir:
Projenin gradle versiyonunu 8.8’e çıkarmak için normalde “./gradlew.bat wrapper --gradle-version 8.8
” komutu kullanılmalıdır. SourceAnalyzer’ın ilgili buildi içerisinde bunu yapabilmek için aşağıdaki gibi bir pipeline taskı oluşturulur:
trigger:
- main
pool: Default
steps:
- task: CmdLine@2
inputs:
script: 'sourceanalyzer -b gradle_f gradlew wrapper --gradle-version 8.8'
2- Android SDK ve Android Home Değişkenlerinin Tanımlanması
Azure Agent’ın kullanabilmesi için ANDROID_SDK_HOME ve ANDROID_HOME değişkenlerinin pipeline’a variable olarak eklenmesi gerekmektedir.
Sağ üstten, Variables butonuna tıklanarak değişenler aşağıdaki gibi pipeline’a tanımlanır.
Değişken tanımlama işlemi bittikten sonra pipeline içerisinde bu değişenler CMD üzerinden set ile eklenir.
trigger:
- main
pool: Default
steps:
- task: CmdLine@2
inputs:
script: 'sourceanalyzer -b gradle_f gradlew wrapper --gradle-version 8.8'
- task: CmdLine@2
inputs:
script: |
set ANDROID_HOME=$(ANDROID_HOME)
set ANDROID_SDK_ROOT=$(ANDROID_SDK_ROOT)
- task: CmdLine@2
inputs:
script: 'echo %ANDROID_HOME%'
3- Fortify SCA Assesment Eklentisinin Yapılandırılması
Eklentinin düzgün çalışabilmesi için 1. ve 2. adımları tamamladıktan sonra artık eklentiyi kullanabiliriz. Bunun için sağ taraftan Show Assistant diyip Assistant’ı açıp arama kutucuğuna Fortify yazıyoruz:
Burada Fortify Static Code Analyzer Assesment taskını seçerek ilerliyoruz.
Genel Ayarlar:
Build ID for Fortify SCA:
Proje için bir build-id girilir.Run SCA clean**:
** Translate aşamasında oluşan eski dosyaları silebilmek için işaretli olmalıdır.Enable verbose logging:
Hata ayıklama yapabilmek adına işaretli olmalıdır.Enable debug logging:
Hata ayıklama yapabilmek adına işaretli olmalıdır.
Translation Ayarları:
Run Fortify SCA translation
: Transalte aşamasının yapılabilmesi için işaretli olmalıdır.Application Type
: Projemiz bir Android projesi olduğu ve Kotlin ile yazıldığı için Other seçilir.Build Tool Options
: gradlew clean build
Tarama Ayarları:
Run Fortify SCA scan:
SCA taraması yapılabilmesi için işaretli olmalıdırScan type:
Dağıtık yapıda SCA kurulum varsa ScanCentral, direkt agent’ın kurulu olduğu makinede SCA taraması yapılmak isteniyorsa da Local seçilir.Fortify SSC service connecttion
: Hazırlık aşamasında oluşturulan SSC service connection seçilir.Upload Results to SSC
: Sonuçların SSC arayüzüne yüklenebilmesi için işaretli olmalıdır.
Yukarıdaki alanlar doldurulduktan sonra, version ID kullanılarak SSC üzerindeki proje versiyonu seçilir. İsteğe bağlı olarak bir Build Failure Criteria belirlenebilir. Aşağıdaki örnekte ben kritik zafiyet varsa build kırılsın istediğim için “[fortify priority order]:critical
” ifadesini kullandım.
Daha sonrasında Add denilerekten SCA taskı pipeline’a eklenir. Son durum aşağıdaki gibi olmalıdır:
trigger:
- main
pool: Default
steps:
- task: CmdLine@2
inputs:
script: 'sourceanalyzer -b gradle_f gradlew wrapper --gradle-version 8.8'
- task: CmdLine@2
inputs:
script: |
set ANDROID_HOME=$(ANDROID_HOME)
set ANDROID_SDK_ROOT=$(ANDROID_SDK_ROOT)
- task: CmdLine@2
inputs:
script: 'echo %ANDROID_HOME%'
- task: FortifySCA@7
inputs:
applicationType: 'other'
buildToolOptions: 'gradlew clean build'
fortifyBuildId: 'gradle_f'
runFortifyClean: false
scaVerbose: true
scaDebug: true
fortifyScanType: 'ScanCentralScan'
scanCentralFortifyServerName: 'SSC'
scanCentralRunFortifyUpload: true
scanCentralFortifyApplicationIdentifierType: 'byId'
scanCentralFortifyApplicationVersionId: '10019'
fortifyBuildFailureCriteria: '[fortify priority order]:critical'
taskResultForBuildFailureCriteria: 'FAIL'
Pipeline tetiklendiğinde ScanCentral SAST sekmesine SCA görevi düşer ve tarama sonlandıktan sonra proje versiyonuna ilgili FPR dosyası yüklenir.
Mevcut durumda sadece Low seviye 1 adet zafiyet tespit edildiği için pipeline kırılmamıştır.