Validação de PR no Azure DevOps
Tags: veracode, security, devops, tutorial
Published: 2023-01-04 14:14:24

Para construirmos um pipeline de validação no Azure, vamos precisar inicialmente ter em mãos as credenciais necessárias, pode saber como [obtê-las aqui](https://dev.to/m3corp/credenciais-da-veracode-340m). 

Pensando no fluxo que vamos adotar, começamos com o empacotamento dos arquivos necessários para a análise, conforme o [guia de empacotamento](https://docs.veracode.com/r/c_comp_quickref). Isso varia de acordo com a linguagem do projeto que vamos analisar. 
Ao iniciar o nosso fluxo, vamos criar um pacote zipando os arquivos necessários e atribuindo um nome qualquer, sendo que em nosso exemplo vamos utilizar o número de build:
```
- task: ArchiveFiles@2
    inputs:
      rootFolderOrFile: "$(Agent.BuildDirectory)"
      includeRootFolder: true
      archiveType: "zip"
      archiveFile: "$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip"
      replaceExistingArchive: true
    displayName: "Criando pacote para análise"
```

Nosso próximo passo é adicionar o SCA em nossa análise.
Um ponto interessante dele, é que não é preciso aguardar o build completar para utilizá-lo, como vai ser preciso no Pipeline Scan, então caso o projeto seja feito com uma linguagem compilada, pode paralelizar essa etapa com a de build. 

Para implementar o SCA, vamos precisar receber a variável com a credencial e rodar o agente na pasta onde tem o [arquivo com as informações](https://docs.veracode.com/r/Using_Veracode_SCA_with_Programming_Languages) dos componentes de terceiros, isso é algo que varia conforme a linguagem e pode consultar os detalhes aqui.
Em YAML, podemos fazer dessa forma:
```
- bash: |
      cd $(Pasta_Projeto)
      export SRCCLR_API_TOKEN=$(SRCCLR_API_TOKEN)
      curl -sSL https://download.sourceclear.com/ci.sh | bash -s – scan --update-advisor --allow-dirty
    displayName: "Veracode SCA"
```
Caso queira consultar todos os parâmetros disponíveis, consulte essa [documentação](https://docs.veracode.com/r/c_sc_agent_usage).

Depois da configuração do SCA, precisamos configurar o Pipeline Scan. O processo é basicamente fazer o download de um zip com ele do site da Veracode e então descompactar: 
```
- bash: |
      apt-get install unzip
      curl -O -L https://downloads.veracode.com/securityscan/pipeline-scan-LATEST.zip && unzip pipeline-scan-LATEST.zip -d $(Build.ArtifactStagingDirectory)
    displayName: "Download Veracode Pipeline Scanner"
```

Após esse download, podemos utilizá-lo. Em nosso desenho, vamos utilizar como validador uma política que criamos dentro do Portal da Veracode, então antes do scan de fato, vamos fazer o download desse arquivo e política e passar ele como um parâmetro para a análise.
As credenciais que obtemos vão ser utilizadas dentro de duas variáveis, Veracode ID e Veracode Key.
Em YAML ficará assim:
```
- bash: |
      export VERACODE_ID=$(VERACODE_ID)
      export VERACODE_KEY=$(VERACODE_KEY)
      echo "Downloading policy from Veracode"
      java -jar $(Build.ArtifactStagingDirectory)/pipeline-scan.jar --veracode_api_id $(VERACODE_ID) --veracode_api_key $(VERACODE_KEY) --request_policy="Veracode Recommended Very High + SCA"
      echo "Running Veracode Scan"
      java -jar $(Build.ArtifactStagingDirectory)/pipeline-scan.jar --veracode_api_id $(VERACODE_ID) --veracode_api_key $(VERACODE_KEY) --file "$(Build.ArtifactStagingDirectory)/$(Build.BuildId).zip" --issue_details true --policy_file="Veracode_Recommended_Very_High_+_SCA.json"
      echo "Save Veracode results"
      mkdir results_veracode
      mv results.json results_veracode/results.json
      mv filtered_results.json results_veracode/filtered_results.json
    displayName: "Run Veracode Pipeline Scan"
```

Por fim, vamos publicar os resultados obtidos criando um artefato com eles. Assim ao final de cada execução vamos ter um relatório sendo gerado:
```
- task: PublishPipelineArtifact@1
    displayName: "Publicando Resultados Veracode"
    inputs:
      targetPath: '$(Build.SourcesDirectory)/results_veracode'
      artifact: 'Veracode Analysis'
      publishLocation: 'pipeline'
```