Para o nosso exercício vamos usar uma aplicação de código aberto, propositalmente vulnerável, a WebGoat
Para executar o exercício do começo ao fim vamos precisar configurar contas pessoais em algumas plataformas e ter um fork do WebGoat no nosso GitHub pessoal.
Você deve ter um perfil/conta criado nas seguintes plataformas/serviços
- Sonarcloud - De preferência, faça o login/cadastro com sua conta do GitHub
- Snyk - De preferência, faça o login/cadastro com sua conta do GitHub
- GitGuardian - De preferência, faça o login/cadastro com sua conta do GitHub
Faça um fork do repositório WebGoat para sua conta pessoal. Não é necessário baixar o código na sua máquina pessoal. Vamos rodar tudo online 🎉
No seu fork, vá em Setings
> Security & analysis
e clique em Enable
nas três opções disponíveis.
Em seguida, no menu da esquerda, vá em Options
, na seção Features
e marque o checkbox Issues
.
- Acesse https://sonarcloud.io/, faça login com sua conta do GitHub e, em seguida clique no ícone ➕ no canto superior direito, próximo à barra de busca.
- Selecione a opção
Analyze new project
- Clique em
Import another organization
- Clique no botão
Choose an organization on GitHub
- Clique no seu usuário
- Selecione
All repositories
e clique emInstall
- Na tela seguinte, clique
Continue
- Selecione
Free plan
e clique emCreate organization
- Na lista de repositórios procure e selecione
WebGoat
. Depois clique emSet Up
O Sonarcloud irá informar que não recomenda uma análise automática do repositório. Assim, vamos criar uma Action para executar a análise.
- Clique em
With GitHub Actions
e siga o passo a passo informado na tela.- Quando perguntado What option best describes your build?, selecione
Maven
- Quando perguntado What option best describes your build?, selecione
🚨 Você precisará alterar algumas pequenas configurações para a executar o projeto:
- As configurações do seu
pom.xml
devem ser ajustadas para entender que o WebGoat possui vários módulos. Ajuste conforme o snippet de código abaixo, substituindo o valor em<sonar.projectKey>
pela chave correta do seu projeto no Sonarcloud e o valor em<sonar.organization>
pelo seu usuário do GitHub.
<!-- Sonar properties-->
<sonar.projectKey>pedrolacerda_WebGoat</sonar.projectKey>
<sonar.moduleKey>${artifactId}</sonar.moduleKey>
<sonar.organization>pedrolacerda</sonar.organization>
<sonar.host.url>https://sonarcloud.io</sonar.host.url>
- A última linha do arquivo de workflow do Sonar que você criou, na qual o projeto é executado, deve ser alterada para ficar assim:
run: ./mvnw verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar
Segue exemplo de arquivo completo
name: Sonarcloud
on:
workflow_dispatch:
pull_request:
branches: [develop]
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis
- name: Set up JDK 11
uses: actions/setup-java@v1
with:
java-version: 11
- name: Cache SonarCloud packages
uses: actions/cache@v1
with:
path: ~/.sonar/cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar
- name: Cache Maven packages
uses: actions/cache@v1
with:
path: ~/.m2
key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
restore-keys: ${{ runner.os }}-m2
- name: Build and analyze
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: ./mvnw verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar
- Execute o workflow manualmente e aguarde os resultados aparecerem no Sonarcloud.
- ❓ O que mais te chamou atenção?
- Clique na aba
Security
e em seguida, no menu esquerdo,Code scanning alerts
- Na tela seguinte, no canto direto, clique em
Set up more code scanning tools
- A primeira opção é o CodeQL Analysis, clique em
Set up this workflow
- Substitua o conteúdo do arquivo de workflow pelo código abaixo:
name: "CodeQL"
on:
push:
branches: [develop]
pull_request:
branches: [develop]
workflow_dispatch:
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
language: [ 'java', 'javascript' ]
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: ${{ matrix.language }}
- name: Set up JDK 1.11
if: matrix.language == 'java'
uses: actions/setup-java@v1
with:
java-version: 1.11
- name: Build with Maven
if: matrix.language == 'java'
run: mvn -B package --file pom.xml
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1
- Execute o workflow manualmente e aguarde os resultados aparecerem em
Security
>Code scanning alerts
>CodeQL
- ❓ Os resultados parecem com os do Sonarcloud?
O Anchore é uma ferramenta open source para análise de vulnerabilidades. Vamos configurá-lo para analisar a segurança do container do WebGoat.
- Em
Security
>Code scanning alerts
, selecione novamenteSet up more code scanning tools
- A opção na segunda coluna da primeira linha é Anchore Container Scan. Clique em
Set up this workflow
- Elimine as linhas 24 e 25 e altere o parâmetro
image
para:
image: "webgoat/goatandwolf"
O arquivo final deve ficar como o a seguir:
name: Anchore Container Scan
on:
workflow_dispatch:
jobs:
Anchore-Build-Scan:
runs-on: ubuntu-latest
steps:
- name: Checkout the code
uses: actions/checkout@v2
- name: Run the Anchore scan action itself with GitHub Advanced Security code scanning integration enabled
uses: anchore/scan-action@main
with:
image: "webgoat/goatandwolf"
acs-report-enable: true
fail-build: false
- name: Upload Anchore Scan Report
uses: github/codeql-action/upload-sarif@v1
with:
sarif_file: results.sarif
- Execute o workflow manualmente e verifique os resultados na aba
Security
>Code scanning alerts
>Anchore Container Vulnerability Report (T0)
- ❓ Containers são seguros?
Você deve ter percebido que alguns pull requests foram abertos automaticamente no seu repositório. Além disso, há um banner de alerta no repositório:
❓ O que são esses alertas? ❓ Por que os PRs foram abertos?
Vimos até agora como realizar análises no código que está no nosso repositório no branch principal. Mas e se quisermos validar que estamos entregando código seguro antes que alguma vulnerabilidade seja entregue em produção?
Vamos criar um PR para ver como isso ficaria 👍
- Crie um novo branch chamado
new-feature-branch
- Altere/adicione os seguintes arquivos, para que eles tenham o conteúdo idêntico ao dos arquivos linkados:
- webgoat-integration-tests/src/test/java/org/owasp/webgoat/SqlInjectionLessonTest.java
- webgoat-lessons/secure-passwords/src/main/java/org/owasp/webgoat/Secrets.java (Criar arquivo)
- webgoat-lessons/sql-injection/src/main/java/org/owasp/webgoat/sql_injection/introduction/SqlInjectionLesson11.java (Criar arquivo)
- webgoat-lessons/sql-injection/src/main/resources/html/SqlInjection.html
- webgoat-lessons/sql-injection/src/main/resources/i18n/WebGoatLabels.properties
- Em seguida, clique em
Pull requests
e verá que apareceu um banner amarelo sugerindo que você abra um novo PR para o merge das modificações. Clique no botãoCompare & pull request
- Tenha certeza que você está abrindo um pull request apenas para dentro do seu próprio repositório e clique
Create pull request
❓ Como os workflows de segurança foram executados?
Configure o GitGuardian e o Snyk para analisarem o repositório.
❓ Qual tipo de análise essas ferramentas fazem?
O Zap permite executar DAST via GitHub Actions. Mais informações em: https://github.com/marketplace/actions/owasp-zap-full-scan