Alisson Machado
29 August 2018

DevSecOps: Static Application Security Testing com SonarQube

Quando falamos de DevSecOps, estive um termo chamado Shift Left, que consiste em analisar questões de segurança desde o inicio do desenvolvimento de uma aplicação, ao invés do modelo tradicional que a segurança só era testada no final.


Ao fazer essas análises de segurança dentro de uma pipeline DevOps, temos duas que são conhecidas como SAST ( Static Application Security Testing ) e DAST ( Dynamic Application Security Testing ).

SAST - tem como objetivo analisar o código fonte de uma aplicação e prever ameaças antes mesmo da aplicação ter sido construída.

DAST - tem como objetivo analisar a aplicação já construída, ou seja, é feito o deploy dessa aplicação e depois feitos uma série de testes como SQL Injection, XSS, CSRF e entre outras.


Nesse post vou explicar como podemos utilizar a ferramenta SonarQube para fazer a análise de vulnerabilidades a partir do código fonte de uma aplicação e como é possível interromper a esteira de execução do Jenkins caso o número de vulnerabilidades seja maior do que um valor já pré-definido.


Agora vamos subir um ambiente de testes utilizando o Vagrant, nele vou subir duas máquinas, sendo elas: Jenkins e Docker.

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|

  config.vm.box = "ubuntu/xenial64"

  config.vm.define "jenkins" do |jenkins|
    jenkins.vm.network "private_network", ip: "192.168.33.10"
    jenkins.vm.provider "virtualbox" do |vb|
      vb.memory = 2048
    end
    jenkins.vm.provision "shell", inline: <<-SHELL
        apt update
        wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | apt-key add -
        echo "deb https://pkg.jenkins.io/debian-stable binary/" >> /etc/apt/sources.list
        apt-get update
        apt install openjdk-8-jre -y
        apt-get install jenkins -y --allow-unauthenticated
    SHELL
  end

  config.vm.define "docker-centos" do |docker|
    docker.vm.box = "centos/7"
    docker.vm.network "private_network", ip: "192.168.33.11"
    docker.vm.provider "virtualbox" do |vb|
     vb.memory = 2048
    end
    docker.vm.provision "shell", inline: <<-SHELL
        yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine -y
        yum install -y yum-utils device-mapper-persistent-data lvm2
        yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
        yum-config-manager --enable docker-ce-edge
        yum install docker-ce epel-release git -y
        #systemctl enable docker
        #systemctl start docker        
    SHELL
  end
end


Criar um arquivo chamado Vagrantfile com o conteúdo acima e depois digite o comando: vagrant up para provisionar as duas máquinas. Quando a máquina docker-centos estiver no ar, faça o deploy de um container de sonarqube utilizando a linha abaixo:

 docker run -d --name sonarqube -p 9000:9000 -p 9092:9092 sonarqube


Com o container já em execução acesse no navegador: http://192.168.33.11:9000 O usuário e senha são: admin / admin Faça a criação do token e defina a linguagem do projeto, parecido com a imagem abaixo:


Agora que já temos o projeto e token do usuário criados, vamos para a parte de configuração do jenkins: Acesse: Manage Jenkins > Manage Plugins e instale o plugin sonarqube scanner. Agora Configure o jenkins com o caminho onde está instalado o sonarqube. Configure também para baixar o SonarScanner.


Agora crie uma job do tipo Freestyle chamada SAST, vincule um repositório git:


E adicione um step com o SonarScanner:


Defina o nome do projeto a ser analisado.


Salve e execute a job. Se executada com sucesso, a saída será parecida com essa:


A mensagem ERROR, aparece pois o projeto que vinculei, não passou nos Quality Gates do sonar, para ver o report da análise, é só acessar a interface do Sonar e ver o status do projeto que deve ter ficado parecido com a imagem abaixo:


Esse é um overview da análise estática do projeto, no nosso caso como o foco é segurança, vamos analisar a parte de vulnerabilidades, pois uma foi encontrada. Ao clicar em vulnerabilidade será listada uma tela parecida com a imagem abaixo:


Nela podemos ver a vulnerabilidade encontrada, corrigi-la e depois executar a análise estática de novo.