Mise en place de Gitlab SAST

Dans sa version “Free”, Gitlab propose beaucoup de choses intéressantes, dont une des plus intéressantes, selon moi, est la CI/CD.

En terme de CI, il est très facile de la mettre en place en ajoutant simplement un fichier .gitlab-ci.yml à la racine du projet et en s’assurant que l’option de CI est activée pour le projet.

Parmi les possibilités de la CI, il y a la détection de vulnérabilités aussi appelée SAST (Static Application Security Testing).

Comme mon projet ne comportait aucune notion de CI, j’ai décidé de me laisser guider par la documentation qui indique comment générer le fichier.

Contexte du projet : Java 11, Vaadin, Maven, IntelliJ, Windows 10

Le fichier généré ressemble alors à ça :

stages:
- test
sast:
  stage: test
include:
- template: Security/SAST.gitlab-ci.yml

Résultat peu concluant dans le résultat de la première pipeline :

[INFO] [Find Security Bugs] [2021-11-01T15:55:40Z] ▶ Building Mvnw project at /builds/bdauvissat/timetable.
[ERRO] [Find Security Bugs] [2021-11-01T15:55:40Z] ▶ Project couldn't be built: Command couldn't be executed: fork/exec /builds/bdauvissat/timetable/mvnw: permission denied
[FATA] [Find Security Bugs] [2021-11-01T15:55:40Z] ▶ Command couldn't be executed: fork/exec /builds/bdauvissat/timetable/mvnw: permission denied

Il semblerait que le fichier mvnw à la racine de mon projet n’ai pas le droit d’être exécuté.

Pour le corriger, dans le bash git :

git update-index --chmod=+x mvnw
git push

Suite à ça, relance du build et nouvelle erreur :

[INFO] [Find Security Bugs] [2021-11-01T16:04:16Z] ▶ Building Mvnw project at /builds/bdauvissat/timetable.
[ERRO] [Find Security Bugs] [2021-11-01T16:05:22Z] ▶ Project couldn't be built: exit status 1
[FATA] [Find Security Bugs] [2021-11-01T16:05:22Z] ▶ exit status 1

Sans plus de cérémonies.

Après une question posée sur Stack Overflow, j’ai trouvé comment passer la sortie du runner en mode débug :

stages:
- test
variables:
  SECURE_LOG_LEVEL: debug
sast:
  stage: test
include:
- template: Security/SAST.gitlab-ci.yml

Et là, illumination, un problème de version de librairie :

[ERROR] Failed to execute goal on project timetable: Could not resolve dependencies for project com.spc.internal:timetable:jar:2.0.0: Failed to collect dependencies at net.sf.jasperreports:jasperreports:jar:6.11.0 -> com.lowagie:itext:jar:2.1.7.js7: Failed to read artifact descriptor for com.lowagie:itext:jar:2.1.7.js7: Could not transfer artifact com.lowagie:itext:pom:2.1.7.js7 from/to jaspersoft-third-party (http://jaspersoft.jfrog.io/jaspersoft/third-party-ce-artifacts/): Failed to transfer file http://jaspersoft.jfrog.io/jaspersoft/third-party-ce-artifacts/com/lowagie/itext/2.1.7.js7/itext-2.1.7.js7.pom with status code 308 -> [Help 1]

Direction le pom et je modifie la version de la librairie Jasper et passer de 6.11.0 à 6.18.1

<dependency>
    <groupId>net.sf.jasperreports</groupId>
    <artifactId>jasperreports</artifactId>
    <version>6.18.1</version>
</dependency>

Et là !

PAN !

Nouvelle erreur :

[ERROR] Command '[which, node]' failed with exit code '1'
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:12 min
[INFO] Finished at: 2021-11-02T09:57:06Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal com.vaadin:vaadin-maven-plugin:14.0.5:prepare-frontend (default) on project timetable: 
[ERROR] 
[ERROR] ======================================================================================================
[ERROR] Failed to determine 'node' tool.
[ERROR] Please install it either:
[ERROR]   - by following the https://nodejs.org/en/download/ guide to install it globally
[ERROR]   - or by running the frontend-maven-plugin goal to install it in this project:
[ERROR]   $ mvn com.github.eirslett:frontend-maven-plugin:1.7.6:install-node-and-npm -DnodeVersion="v10.16.0" 
[ERROR] ======================================================================================================
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
[ERRO] [Find Security Bugs] [2021-11-02T09:57:06Z] ▶ Project couldn't be built: exit status 1
[FATA] [Find Security Bugs] [2021-11-02T09:57:06Z] ▶ exit status 1

Le problème provient du fait que Vaadin intègre nodejs et que ça pose problème au moment du build.

Quelques recherches plus tard sur l’intégration continue avec cette librairie, je trouve qu’il existe un plugin maven qui règle le problème :

<plugin>
    <groupId>com.github.eirslett</groupId>
    <artifactId>frontend-maven-plugin</artifactId>
    <version>1.6</version>
    <executions>
        <execution>
            <id>install node and npm</id>
            <goals>
                <goal>install-node-and-npm</goal>
            </goals>
            <phase>generate-resources</phase>
        </execution>
    </executions>
    <configuration>
        <nodeVersion>v13.2.0</nodeVersion>
    </configuration>
</plugin>

Nouvelle relance, nouvelle erreur :

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project timetable: Fatal error compiling: invalid target release: 11 -> [Help 1]

En remontant dans le log, je vois un truc qui me fait tiquer au début :

[DEBU] [Find Security Bugs] [2021-11-02T10:02:01Z] ▶ /bin/bash -c source /root/.bashrc && switch_to java 8

Tiens donc, je suis en java 8 !

Une petite recherche dans la doc Gitlab me permet de voir que par défaut, l’environnement Java est positionné en 8.

Il suffit d’une modification de variable globale dans le fichier de configuration.

stages:
- test
variables:
  SECURE_LOG_LEVEL: debug
  SAST_JAVA_VERSION: 11
sast:
  stage: test
include:
- template: Security/SAST.gitlab-ci.yml

Croisage de doigts, encore un push et là, miracle !

JOB SUCCEEDED

Il ne me restait plus qu’à mettre en place un système pour récupérer les rapports de l’analyse :

stages:
- test
variables:
  SECURE_LOG_LEVEL: debug
  SAST_JAVA_VERSION: 11
sast:
  stage: test
  artifacts:
    paths: [gl-sast-report.json]
    reports:
      sast: gl-sast-report.json
include:
- template: Security/SAST.gitlab-ci.yml

Et à partir de là, dans la merge request Gitlab, il est alors possible de récupérer les rapports au format json

Rapports