Sections du handbook▾
Fondations
Comprendre les menaces qui pèsent sur un hôte LinuxPourquoi on durcitLes principes de défense derrière chaque règleConfiguration effective : la vérité qu'aucun fichier ne contientLes normes que Pavois cartographieModèle d'identifiant de contrôle SOCLEPreuves & exportsComment la note A-E est calculéeCe qu'un PASS prouve : le verdict qualifiéModèle de confiance du bundle de preuveSOCLE, n'est-ce pas votre propre norme ? (gouvernance & la question de la circularité)Ce que Pavois couvre, et ce qu'il ne couvre pasDomaines
Durcir SSHDurcir PAMContrôle d'accès obligatoire (SELinux / AppArmor)Durcir le pare-feu localDurcir sudoPermissions et propriété des fichiersDurcir les montages et le système de fichiersDurcir les modules noyauDurcir le noyau et le réseau avec sysctlJournalisation d'audit avec auditdDurcir la journalisation avec journald et rsyslogDurcir les services systemdHygiène des paquetsDurcir le chargeur d'amorçage (GRUB)Synchroniser l'heureBannières de connexion et MOTDContrôler l'accès à cron et atDurcir le bureau GNOME (dconf)Outillage
Annuler un durcissement : les points de restaurationExploiter Pavois : privilèges, air-gap, durée, dérogationsLancer Pavois en CI (GitHub Actions)État des fonctionnalités : livré, partiel, roadmapGouvernance : licence, versionnement, provenance, sécurité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-undern'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 viapset l'historique du shell. Utilisez--ssh-prompt(litPAVOIS_SSH_PASSWORD) ou--sudo-prompt(litPAVOIS_SUDO_PASSWORD), ou un fichier de clé écrit depuis un secret en mode0600. - 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
- Démarrer : buildez et lancez votre premier scan en local.
- Comment la note est calculée : choisissez un
--fail-underraisonnable. - Preuves et exports : tous les formats de sortie.