Exécuter Codex Security dans GitHub Actions
Analysez les pull requests et les dépôts avec l’Action Codex Security, enregistrez les rapports, envoyez les fichiers SARIF et configurez l’application des règles.
Exécutez Codex Security dans GitHub Actions pour examiner les modifications des pull requests ou analyser votre dépôt selon un calendrier. L’Action installe la CLI, enregistre des rapports structurés et ajoute un résumé du job ainsi que des annotations du code source. Commencez par des résultats à titre indicatif, puis configurez l’application des règles après avoir examiné la couverture et la qualité des analyses.
Préparer le workflow
L’exécution d’analyses nécessite un accès à Codex Security. Pour ajouter votre API key OpenAI :
- Dans votre dépôt GitHub, ouvrez Settings → Secrets and variables → Actions.
- Sélectionnez New repository secret.
- Saisissez
CODEX_SECURITY_API_KEYcomme nom et collez votre API key OpenAI comme valeur. Enregistrez le secret.
Les exemples de workflow ci-dessous transmettent ce secret à l’Action Codex Security automatiquement. Vous n’avez pas besoin de placer votre API key dans le fichier du workflow.
N’exécutez le workflow que pour des dépôts et des pull requests de confiance. Les analyses utilisent les autorisations locales du runner et ne s’interrompent pas pour demander une approbation. Placez les identifiants sans rapport avec l’analyse et les étapes de déploiement dans des jobs distincts.
Ajouter le workflow GitHub Actions
Analyser le dépôt selon un calendrier
Le workflow ci-dessous analyse votre branche par défaut chaque lundi à 07:23 UTC. Vous pouvez aussi l’exécuter manuellement depuis l’onglet Actions de GitHub. Il utilise un runner x64 Ubuntu 24.04 hébergé par GitHub et configure automatiquement le sandbox requis.
- Dans votre dépôt, sélectionnez Add file → Create new file.
- Nommez le fichier
.github/workflows/codex-security-repository.yml. - Collez le workflow ci-dessous et effectuez un commit sur votre branche par défaut.
name: Codex Security repository
on:
workflow_dispatch:
schedule:
- cron: "23 7 * * 1" # Mondays at 07:23 UTC
permissions:
contents: read
jobs:
security:
runs-on: ubuntu-24.04
timeout-minutes: 120
steps:
- name: Set up the Ubuntu sandbox
run: |
sudo apt-get update
sudo apt-get install --yes bubblewrap apparmor-profiles
sudo apparmor_parser -r /usr/share/apparmor/extra-profiles/bwrap-userns-restrict
- name: Check out the repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false
- name: Scan the repository
id: security
uses: openai/codex-security@3f61e5150981a5087c32e4395bbaa8ce5ce0c3e3 # action-v0.3.0
with:
scope: repository
model: gpt-6-sol
# For approved Daybreak Blue access, uncomment the next input.
# cyber-access-program: daybreak_blue
effort: high
fail-on-severity: none
upload-artifacts: "true"
env:
OPENAI_API_KEY: ${{ secrets.CODEX_SECURITY_API_KEY }}
Adapter le runner : L’Action nécessite Node.js 24 et Python 3.11 ou une version ultérieure,
que ce runner fournit. La configuration du sandbox installe le package bubblewrap
et charge le profil AppArmor fourni avant l’analyse. L’installation
du package seule ne suffit pas sur ce runner.
Pour exécuter le workflow manuellement, ouvrez Actions → Codex Security repository → Run workflow. Ouvrez une exécution terminée pour consulter le résumé, les annotations et les rapports téléchargeables.
Les problèmes détectés sont uniquement signalés, car fail-on-severity est défini sur none. Les erreurs du scanner et celles
liées aux rapports obligatoires font tout de même échouer le job.
Pour analyser certains dossiers, ajoutez les chemins littéraux, un par ligne, au bloc
with de l’étape d’analyse :
paths: |
src/api
src/authCes chemins nécessitent scope: repository et ne font l’objet d’aucune expansion de motifs glob. Pour les analyses des différences, omettez
paths. Conservez persist-credentials: false et exécutez l’analyse
immédiatement après l’extraction du code.
Analyser les modifications d’une pull request
En utilisant le même secret, créez .github/workflows/codex-security-pr.yml :
name: Codex Security PR
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
permissions:
contents: read
concurrency:
group: codex-security-pr-${{ github.event.pull_request.number }}
cancel-in-progress: true
jobs:
security:
if: github.event.pull_request.head.repo.full_name == github.repository && github.actor != 'dependabot[bot]'
name: Codex Security
runs-on: ubuntu-24.04
timeout-minutes: 60
steps:
- name: Set up the Ubuntu sandbox
run: |
sudo apt-get update
sudo apt-get install --yes bubblewrap apparmor-profiles
sudo apparmor_parser -r /usr/share/apparmor/extra-profiles/bwrap-userns-restrict
- name: Check out the pull request
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0
persist-credentials: false
- name: Scan PR changes
id: security
uses: openai/codex-security@3f61e5150981a5087c32e4395bbaa8ce5ce0c3e3 # action-v0.3.0
with:
scope: diff
model: gpt-6-sol
# For approved Daybreak Blue access, uncomment the next input.
# cyber-access-program: daybreak_blue
effort: high
fail-on-severity: none
upload-artifacts: "true"
env:
OPENAI_API_KEY: ${{ secrets.CODEX_SECURITY_API_KEY }}Ouvrez ou mettez à jour une PR depuis une branche du même dépôt. L’Action utilise l’historique complet pour trouver la base de fusion exacte et analyse les modifications jusqu’à la révision de tête de la PR extraite. Consultez la vérification Codex Security sous Checks dans la PR. Commencez par des résultats à titre indicatif, puis choisissez une politique de sévérité lorsque vous souhaitez conditionner l’acceptation des modifications.
Cet exemple ignore les PR issues de forks et les PR ouvertes par dependabot[bot]. Un job ignoré
ne prouve pas qu’un examen de sécurité a eu lieu. Pour inclure ces PR de bots, supprimez l’exclusion de l’auteur
et
configurez aussi CODEX_SECURITY_API_KEY comme secret
pour dependabot[bot]. L’Action ne prend en charge ni pull_request_target ni workflow_run.
Le scanner lit les instructions SECURITY.md applicables dans le code extrait,
y compris les modifications de politique de la PR. Examinez ces modifications en même temps que le code.
Configurer l’accès facultatif à Daybreak
Daybreak est facultatif. Les deux exemples de workflow utilisent gpt-6-sol. Si votre
organisation a été approuvée pour Trusted Access for
Cyber, supprimez le # placé avant
cyber-access-program dans le bloc with de l’étape d’analyse :
model: gpt-6-sol
cyber-access-program: daybreak_blueUtilisez une API key issue d’un projet sur lequel Daybreak Blue est activé et qui a accès à
gpt-6-sol.
Le paramètre d’entrée du programme accepte également standard. Sans accès à Daybreak, utilisez un
modèle accessible avec votre API key dans le cadre des protections standard et omettez
cyber-access-program ou définissez-le sur standard. Sélectionner un modèle ou un programme
n’accorde aucun accès. Consultez les consignes d’accès à Daybreak de l’Action.
Un refus ou un blocage de sécurité qui interrompt l’analyse fait échouer l’Action, y compris lorsque
fail-on-severity est défini sur none. Ce paramètre contrôle la politique relative aux problèmes détectés, pas les erreurs
du scanner.
Définir un budget d’analyse facultatif
Les deux exemples de workflow omettent max-cost ; ils n’ont donc aucun seuil d’arrêt fondé sur le coût
estimé. Pour en définir un, ajoutez un montant positif en USD avec le paramètre max-cost.
Pour les analyses directes avec la CLI, utilisez --max-cost.
La limite de coût nécessite que la CLI prenne en charge les tarifs du modèle sélectionné. Le
seuil estimé n’est pas un plafond de dépenses strict : le coût des requêtes déjà
en cours peut le dépasser.
Examinez les problèmes détectés et coverage.json si une analyse s’arrête au seuil. Consultez
les options de sortie et de politique
pour connaître le comportement de la limite de coût.
Enregistrer les rapports et envoyer les fichiers SARIF
Les exemples définissent upload-artifacts: "true" pour enregistrer des rapports téléchargeables avec une
période de conservation de sept jours. Les rapports peuvent contenir des extraits de code source, des preuves de
vulnérabilités et des détails de correction. Choisissez une période de conservation et des droits d’accès au dépôt
adaptés à votre code. L’Action envoie uniquement les rapports validés
figurant dans sa liste d’autorisation ; n’envoyez pas récursivement sa sortie results-directory.
L’envoi de SARIF est facultatif. Pour les dépôts privés ou internes, activez GitHub Code Security avant l’envoi. Remplacez le bloc permissions du workflow par :
permissions:
contents: read
security-events: write
actions: read # Required for private repositoriesAjoutez ensuite cette étape après l’analyse dans l’un ou l’autre des workflows :
- name: Upload security findings
if: ${{ always() && steps.security.outputs.sarif-upload-ready == 'true' }}
uses: github/codeql-action/upload-sarif@b96794f015dfd88f77b49b1c93e0fa7110f94c63 # v4.38.0
with:
sarif_file: ${{ steps.security.outputs.sarif-path }}
sha: ${{ steps.security.outputs.scanned-sha }}
ref: ${{ steps.security.outputs.analysis-ref }}
category: codex-security-repositoryPour le workflow de PR, utilisez category: codex-security-pr afin que chaque périmètre ait une
catégorie distincte. Conservez id: security sur l’étape d’analyse. Les rapports complets et validés
restent disponibles pour l’envoi lorsque les problèmes détectés font échouer la politique de sévérité.
Les fichiers SARIF ne sont pas envoyés pour les analyses échouées ou interrompues, les différences vides ou les exécutions
à blanc.
Consultez la référence des entrées et sorties de l’Action pour connaître tous les paramètres, champs d’état et chemins des rapports.
Choisir une politique de sévérité
Les workflows GitHub commencent avec fail-on-severity: none. Pour échouer en présence de problèmes de sévérité élevée ou
critique détectés par une analyse terminée, modifiez le paramètre de l’étape d’analyse :
fail-on-severity: highDéfinissez Codex Security comme vérification de statut obligatoire dans les règles de votre dépôt pour
bloquer les fusions lorsque le job de PR échoue. GitHub considère un job ignoré sous condition comme réussi,
même pour les vérifications obligatoires. Les PR issues de forks et celles de dependabot[bot] réussissent cette
vérification sans analyse. Pour bloquer ces cas, exigez une
analyse réussie et terminée.
L’Action suit le résultat de la CLI :
- Le code de sortie
0définitscan-status: completedetpolicy-status: passed. - Le code de sortie
1définitscan-status: completedetpolicy-status: failed; l’étape échoue si des problèmes atteignent ou dépassent la sévérité configurée. - Le code de sortie
2ou un processus interrompu définitscan-status: failedetpolicy-status: not-evaluated; l’étape échoue. - Des rapports obligatoires invalides ou manquants, une modification du code extrait, l’échec de l’envoi des artefacts demandés et les échecs du nettoyage de l’environnement d’exécution font également échouer l’étape.
Une analyse terminée signifie que l’analyse configurée a produit un résultat valide.
Les exclusions de périmètre, les investigations différées et les autres notes dans coverage.json
ne créent pas de résultat d’analyse distinct et ne permettent pas de contourner la politique de sévérité.
La fin de l’analyse ne garantit pas que toutes les vulnérabilités ont été détectées. Consultez
coverage.json lors de l’évaluation du résultat.
Exiger une analyse réussie et terminée
Pour une politique plus stricte, ajoutez un contrôle distinct qui s’exécute même si le job d’analyse échoue ou si GitHub l’ignore. Une étape du job d’analyse ne peut pas vérifier un job ignoré, car aucune de ses étapes ne s’exécute.
Dans le workflow de PR, ajoutez cette correspondance outputs au job security existant,
au même niveau d’indentation que runs-on et steps :
outputs:
scan-status: ${{ steps.security.outputs.scan-status }}Ajoutez ensuite ce job sous jobs, à côté du job security existant :
security-gate:
name: Codex Security gate
needs: security
if: ${{ always() }}
runs-on: ubuntu-24.04
steps:
- name: Require a successful, completed scan
env:
SCAN_RESULT: ${{ needs.security.result }}
SCAN_STATUS: ${{ needs.security.outputs.scan-status }}
run: test "$SCAN_RESULT" = success && test "$SCAN_STATUS" = completedDéfinissez Codex Security gate comme vérification de statut obligatoire pour cette politique. Elle
exige à la fois un job d’analyse réussi et scan-status: completed. La vérification
de ces deux conditions maintient l’échec du contrôle en cas d’erreur liée à la politique de sévérité, aux rapports ou au nettoyage,
même lorsque l’analyse elle-même est terminée.
Avec les exclusions de l’exemple, ce contrôle bloque les PR issues de forks et celles de
dependabot[bot]. Il bloque aussi les différences vides et les exécutions à blanc, que l’Action
marque comme skipped.
Ce contrôle n’analyse pas les PR exclues. Choisissez cette politique uniquement si ces cas
doivent empêcher la fusion.
Résoudre les problèmes d’analyse
- Référence Git inconnue ou différences inattendues : Extrayez la révision de tête de la PR avec
fetch-depth: 0. - Erreur de démarrage du sandbox : Sur Ubuntu 24.04, installez le package
bubblewrapet chargez le profil AppArmor avant l’Action. L’installation du package seule ne charge pas le profil requis. - Identifiants manquants : Vérifiez que
CODEX_SECURITY_API_KEYest accessible au workflow de confiance et associé à la variable d’environnementOPENAI_API_KEYde l’étape d’analyse. - Erreur de configuration de Python : L’Action nécessite Python 3.11 ou une version ultérieure.
- Notes de couverture : Examinez les exclusions de périmètre et les investigations différées dans
coverage.json. Ces notes ne provoquent pas d’échecs d’exécution et ne permettent pas de contourner la politique de sévérité. - SARIF manquant : Examinez
scan-status,report-statusetsarif-upload-ready. Si le fichier SARIF facultatif manque, l’Action émet un avertissement sans modifier le résultat de l’analyse ; les échecs d’envoi des artefacts demandés font tout de même échouer le job. - Erreur d’envoi de SARIF : Vérifiez que votre organisation a activé GitHub Code
Security pour le dépôt et que le workflow accorde
actions: read,contents: readetsecurity-events: write.
Pour chaque commande, option, artefact et champ de sortie, consultez la référence de la CLI. Pour les autres fournisseurs, consultez la présentation de CI/CD.