Escanear repositorios en GitHub con Snyk e integrarlo con GitHub Advanced Security

Una de las cosas chulas de GitHub Advanced Security (recuerda que es gratuito para todos los repos públicos en GitHub.com) es que puedes utilizar cualquier herramienta que pueda generar un SARIF, subirlo a GHAS, y que todos los resultados de todas las herramientas estén ubicados en el mismo sitio. Hoy quiero compartir contigo un workflow de GitHub Actions para lanzar varios escaneos con la herramienta Snyk para analizar la infraestructura como código definida con Terraform, imágenes de Docker y el código estático.

Snyk

La compañia Snyk provee diferentes productos desde el punto de vista de seguridad que nos ayuda a detectar vulnerabilidades en el código, en las dependencias, en las imágenes de Docker y en la infraestructura como código que hayamos definido con Terraform.

Productos de Snyk
Productos de Snyk

Es posible darse de alta de forma gratuita en su web para poder probar estos servicios sin coste para nosotros. Una vez que te das de alta solo tienes que recuperar el token generado para ti, para poder utilizar la herramienta ya sea en local, en Visual Studio Code, o desde Github Actions como es el caso de este artículo.

Workflow de GitHub Actions

Si quieres probar los diferentes productos en tu repositorio puedes utilizar este flujo en de GitHub Actions:

name: Snyk Security
on:
  push:
    branches: ["main" ]
  pull_request:
    branches: ["main"]
permissions:
  contents: read
jobs:
  snyk:
    permissions:
      contents: read # for actions/checkout to fetch code
      security-events: write # for github/codeql-action/upload-sarif to upload SARIF results
      actions: write # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status      
    runs-on: ubuntu-latest
    env:
      # This is where you will need to introduce the Snyk API token created with your Snyk account
      SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}
      SARIF_FOLDER: sarif-results
    steps:
      - uses: actions/checkout@v3
      - name: Set up Snyk CLI to check for security issues
        # Snyk can be used to break the build when it detects security issues.
        # In this case we want to upload the SAST issues to GitHub Code Scanning
        uses: snyk/actions/setup@806182742461562b67788a64410098c9d9b96adb
      # For Snyk Open Source you must first set up the development environment for your application's dependencies        
      - uses: actions/setup-dotnet@v3
        with:
          dotnet-version: '7.0.x'
      - name: Install dependencies
        run: dotnet restore
      - name: Build
        run: dotnet build --configuration Release --no-restore
      
      - name: Create ${{env.SARIF_FOLDER}} directory
        run: mkdir ${{env.SARIF_FOLDER}}
      - name: Run Snyk to check for vulnerabilities
        uses: snyk/actions/dotnet@master
        continue-on-error: true # To make sure that SARIF upload gets called       
        with:
          args: --sarif-file-output=${{env.SARIF_FOLDER}}/snyk.sarif
      
      # Runs Snyk Code (SAST) analysis and uploads result into GitHub.
      # Use || true to not fail the pipeline
      - name: Snyk Code test
        run: |           
          snyk code test --all-projects --sarif-file-output=${{env.SARIF_FOLDER}}/snyk-code.sarif || true
      # Runs Snyk Open Source (SCA) analysis and uploads result to Snyk.
      - name: Snyk Open Source monitor      
        run: |
          snyk monitor --all-projects          
      
      # Runs Snyk Infrastructure as Code (IaC) analysis and uploads result to Snyk.
      - name: Snyk IaC test and report
        run: |           
          snyk iac test --sarif > ../${{env.SARIF_FOLDER}}/snyk-iac.sarif || true       
        working-directory: ./terraform
      
      # Build the docker image for testing
      - name: Build a Docker image
        run: docker build -t your/image-to-test . 
      
        # Runs Snyk Container (Container and SCA) analysis and uploads result to Snyk.
      - name: Snyk Container monitor
        run: |           
          snyk container test your/image-to-test --file=Dockerfile  --sarif > ${{env.SARIF_FOLDER}}/snyk-container.sarif || true
      - name: Check results
        run: ls -l ${{env.SARIF_FOLDER}}
        # Push the Snyk Code results into GitHub Code Scanning tab
      - name: Upload result to GitHub Code Scanning
        uses: github/codeql-action/upload-sarif@v2
        with:
          sarif_file: ${{env.SARIF_FOLDER}}

En él voy recopilando en la carpeta sarif-results los resultados de cada una de las ejecuciones que se llevan acabo con Snyk para luego poder subirlos al apartado Code Security dentro de la pestaña Security de tu repositorio de GitHub. El resultado será parecido a lo siguiente:

Resultados de las diferentes herramientas en Security > Code scanning

En este ejemplo se ha analizando una API en .NET, pero puedes revisar aquí el resto de acciones para otros lenguajes.

¡Saludos!