Sections du handbook

Lancer Pavois en CI (GitHub Actions)

Revu le

Chaque scan renvoie un code de sortie exploitable par un pipeline et émet SARIF/JUnit/JSON/CSV/HTML. Scannez un conteneur jetable ou une cible SSH, faites échouer le job sous une note, et publiez les findings, secrets gérés proprement.

Pavois est conçu pour la CI : chaque scan renvoie un code de sortie exploitable par un pipeline, et émet SARIF, JUnit, JSON, CSV ou HTML. Les patterns ci-dessous scannent une cible, font échouer le job sous une note choisie, publient les findings vers GitHub code scanning, et archivent le rapport complet.

Codes de sortie

Le code de sortie du processus est le garde-fou :

  • 0 : tous les contrôles comptabilisés passent (et la note est au moins égale à --fail-under).
  • 1 : --fail-under n'est pas atteint, le job échoue. Le seuil est la valeur en points (0 à 100), pas la lettre.
  • 2 : une erreur technique (pavois ou le moteur n'a pas pu terminer le run).

Les codes 100 / 101 de CINC Auditor sont traités À L'INTÉRIEUR de pavois (un contrôle qui échoue est un résultat normal, pas une erreur) et n'atteignent jamais votre shell : un pipeline qui teste 100 ne se déclencherait jamais. La référence est générée depuis le binaire.

Workflow 1 : une cible conteneur jetable

name: hardening
on: [push, pull_request]

jobs:
  pavois:
    runs-on: ubuntu-latest
    permissions:
      security-events: write   # upload SARIF vers code scanning
    steps:
      - uses: actions/checkout@v4
      - uses: jdx/mise-action@v2   # toolchain Go/Node/Python epinglee
      - run: mise run build        # -> go/pavois

      - run: docker run -d --name target --privileged debian:12 sleep infinity
      - run: |
          ./go/pavois scan target \
            --profile profiles/linux/debian12 \
            --format sarif --fail-under 70 > pavois.sarif

      - if: always()
        uses: github/codeql-action/upload-sarif@v3
        with:
          sarif_file: pavois.sarif
      - if: always()
        uses: actions/upload-artifact@v4
        with:
          name: pavois-report
          path: reports/

--fail-under 70 bloque un merge dont la posture effective note moins de 70/100. Comme les étapes d'upload SARIF et d'artefact utilisent if: always(), les findings sont publiés même quand le garde-fou échoue, et un relecteur voit exactement quels contrôles ont régressé.

Workflow 2 : une cible SSH distante (avec secrets)

Pour scanner un hôte réel via SSH, injectez la clé et le mot de passe sudo depuis des secrets GitHub, jamais en arguments de ligne de commande :

      - run: |
          install -m 600 /dev/null ~/.ssh/id
          printf '%s' "${{ secrets.TARGET_SSH_KEY }}" > ~/.ssh/id
      - env:
          PAVOIS_SUDO_PASSWORD: ${{ secrets.TARGET_SUDO_PASSWORD }}
        run: |
          ./go/pavois scan deploy@server1 --key ~/.ssh/id \
            --sudo-prompt --on-target \
            --profile profiles/linux/ubuntu2404 \
            --format sarif --fail-under 70 > pavois.sarif

--sudo-prompt lit PAVOIS_SUDO_PASSWORD depuis l'environnement (sans écho, jamais en argv) ; --on-target exécute le scan sur l'hôte (bien moins d'allers-retours SSH, et cela contourne le souci de TTY Defaults use_pty de Debian avec le sudo en SSH natif).

Secrets, gérés proprement

  • Ne passez jamais --ssh-pass/mots de passe sur la ligne de commande : ils fuient via ps et l'historique du shell. Utilisez --ssh-prompt (lit PAVOIS_SSH_PASSWORD) ou --sudo-prompt (lit PAVOIS_SUDO_PASSWORD), ou un fichier de clé écrit depuis un secret en mode 0600.
  • Limitez le token GitHub à security-events: write ; rien de plus n'est requis pour uploader le SARIF.
  • Préférez une clé à un mot de passe, et un compte de déploiement éphémère à root.

Installer : build ou binaire publié

Les workflows ci-dessus buildent depuis les sources avec mise run build. Sur un tag de release, vous pouvez à la place installer le .deb/.rpm publié depuis les GitHub Releases du projet plutôt que de builder, ce qui est plus rapide et épingle un artefact signé. Dans les deux cas, le même pavois scan s'exécute.

Autres formats

Échangez --format selon le consommateur voulu : junit pour le reporting de test, json pour un garde-fou custom, html pour un artefact lisible, csv pour un tableur. Voir preuves et exports.

FAQ

Comment faire échouer le build sur une mauvaise note ? --fail-under N met le code de sortie à 1 quand la note est sous N points (0 à 100). Couplez-le à if: always() sur les étapes SARIF/artefact pour que les findings se publient quand même en cas d'échec.

Comment passer la clé SSH et le mot de passe sudo en sécurité ? Écrivez la clé depuis un secret dans un fichier 0600 et utilisez --key ; posez PAVOIS_SUDO_PASSWORD depuis un secret et utilisez --sudo-prompt. Ne mettez jamais un mot de passe en argv (il fuit via ps).

Pavois installe-t-il un agent sur la cible ? Non. Il scanne un conteneur jetable ou une cible SSH ; --on-target exécute les checks sur l'hôte pour la vitesse mais ne laisse rien derrière.

Étapes suivantes