Jalankan Codex Security di GitHub Actions

Pindai pull request dan repositori dengan Codex Security Action, simpan laporan, unggah SARIF, dan konfigurasikan penerapan kebijakan.

Jalankan Codex Security di GitHub Actions untuk meninjau perubahan pull request atau memindai repositori Anda secara terjadwal. Action menginstal CLI, menyimpan laporan terstruktur, serta menambahkan ringkasan job dan anotasi kode sumber. Mulailah dengan hasil yang bersifat saran, lalu konfigurasikan penerapan kebijakan setelah meninjau cakupan dan kualitas pemindaian.

Siapkan alur kerja

Menjalankan pemindaian memerlukan akses Codex Security. Untuk menambahkan API key OpenAI Anda:

  1. Di repositori GitHub Anda, buka Settings → Secrets and variables → Actions.
  2. Pilih New repository secret.
  3. Masukkan CODEX_SECURITY_API_KEY sebagai nama dan tempel API key OpenAI Anda sebagai nilainya. Simpan rahasia tersebut.

Contoh alur kerja di bawah meneruskan rahasia ini ke Codex Security Action secara otomatis. Anda tidak perlu memasukkan API key ke dalam file alur kerja.

Jalankan alur kerja hanya untuk repositori dan pull request yang Anda percayai. Pemindaian menggunakan izin lokal runner dan tidak berhenti untuk meminta persetujuan. Tempatkan kredensial yang tidak terkait dan langkah deployment dalam job terpisah.

Tambahkan alur kerja GitHub Actions

Pindai repositori secara terjadwal

Alur kerja di bawah memindai cabang default Anda setiap Senin pukul 07:23 UTC. Anda juga dapat menjalankannya secara manual dari tab Actions GitHub. Alur kerja ini menggunakan runner Ubuntu 24.04 x64 yang dihosting GitHub dan menyiapkan sandbox yang diperlukan secara otomatis.

  1. Di repositori Anda, pilih Add file → Create new file.
  2. Beri nama file .github/workflows/codex-security-repository.yml.
  3. Tempel alur kerja di bawah dan commit ke cabang default Anda.
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 }}

Menyesuaikan runner: Action memerlukan Node.js 24 dan Python 3.11 atau lebih baru, yang disediakan oleh runner ini. Penyiapan sandbox menginstal paket bubblewrap dan memuat profil AppArmor yang disediakan sebelum pemindaian. Menginstal paket saja tidak cukup pada runner ini.

Untuk menjalankan alur kerja secara manual, buka Actions → Codex Security repository → Run workflow. Buka eksekusi yang telah selesai untuk meninjau ringkasan, anotasi, dan laporan yang dapat diunduh.

Temuan hanya dilaporkan karena fail-on-severity bernilai none. Kesalahan pemindai dan pelaporan wajib tetap menyebabkan job gagal.

Untuk memindai folder tertentu, tambahkan jalur literal yang dipisahkan baris baru ke blok with pada langkah pemindaian:

paths: |
  src/api
  src/auth

Jalur memerlukan scope: repository dan tidak memperluas pola glob. Untuk pemindaian diff, jangan sertakan paths. Pertahankan persist-credentials: false dan jalankan pemindaian segera setelah checkout.

Pindai perubahan pull request

Dengan rahasia yang sama, buat .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 }}

Buka atau perbarui PR dari cabang dalam repositori yang sama. Action menggunakan riwayat lengkap untuk menemukan merge base yang tepat dan memindai perubahan hingga head PR yang di-checkout. Lihat pemeriksaan Codex Security di bagian Checks pada PR. Mulailah dengan temuan yang bersifat saran, lalu pilih kebijakan tingkat keparahan saat Anda siap menggunakan hasilnya sebagai syarat perubahan.

Contoh ini melewati PR dari fork dan PR yang dibuka oleh dependabot[bot]. Job yang dilewati bukan bukti bahwa tinjauan keamanan telah dilakukan. Untuk menyertakan PR bot ini, hapus pengecualian aktor dan juga konfigurasikan CODEX_SECURITY_API_KEY sebagai rahasia untuk dependabot[bot]. Action tidak mendukung pull_request_target atau workflow_run.

Pemindai membaca panduan SECURITY.md yang berlaku dari checkout, termasuk perubahan kebijakan dalam PR. Tinjau perubahan tersebut bersama kode.

Konfigurasikan akses Daybreak opsional

Daybreak bersifat opsional. Kedua contoh alur kerja menggunakan gpt-6-sol. Jika organisasi Anda telah disetujui untuk Trusted Access for Cyber, hapus # sebelum cyber-access-program dalam blok with pada langkah pemindaian:

model: gpt-6-sol
cyber-access-program: daybreak_blue

Gunakan API key dari proyek yang telah mengaktifkan Daybreak Blue dengan akses ke gpt-6-sol.

Input program juga menerima standard. Tanpa akses Daybreak, gunakan model yang dapat diakses API key Anda dengan perlindungan standar dan jangan sertakan cyber-access-program atau tetapkan nilainya ke standard. Memilih model atau program tidak memberikan akses. Lihat panduan akses Daybreak untuk Action.

Penolakan atau pemblokiran keamanan yang membatalkan pemindaian menyebabkan Action gagal, termasuk saat fail-on-severity bernilai none. Input tersebut mengontrol kebijakan temuan, bukan kesalahan pemindai.

Tetapkan anggaran pemindaian opsional

Kedua contoh alur kerja tidak menyertakan max-cost, sehingga tidak memiliki ambang penghentian berdasarkan perkiraan biaya. Untuk menetapkannya, tambahkan jumlah USD positif melalui input max-cost. Untuk pemindaian CLI langsung, gunakan --max-cost.

Batas biaya memerlukan dukungan informasi harga CLI untuk model yang dipilih. Ambang perkiraan tersebut bukan batas pengeluaran mutlak: biaya permintaan yang sedang berlangsung dapat melampauinya. Tinjau temuan dan coverage.json jika pemindaian berhenti pada ambang batas. Lihat opsi output dan kebijakan untuk perilaku batas biaya.

Simpan laporan dan unggah SARIF

Contoh menetapkan upload-artifacts: "true" untuk menyimpan laporan yang dapat diunduh dengan masa retensi tujuh hari. Laporan dapat berisi cuplikan kode sumber, bukti kerentanan, dan detail remediasi. Pilih masa retensi dan akses repositori yang sesuai untuk kode Anda. Action hanya mengunggah laporan tervalidasi dalam daftar izinnya; jangan unggah output results-directory secara rekursif.

Pengunggahan SARIF bersifat opsional. Untuk repositori privat atau internal, aktifkan GitHub Code Security sebelum mengunggah. Ganti blok permissions pada alur kerja dengan:

permissions:
  contents: read
  security-events: write
  actions: read # Required for private repositories

Lalu tambahkan langkah ini setelah pemindaian di salah satu alur kerja:

- 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-repository

Untuk alur kerja PR, gunakan category: codex-security-pr agar setiap cakupan memiliki kategori yang berbeda. Pertahankan id: security pada langkah pemindaian. Laporan yang lengkap dan tervalidasi tetap tersedia untuk diunggah saat temuan menyebabkan kegagalan kebijakan tingkat keparahan. SARIF tidak diunggah untuk pemindaian yang gagal atau terhenti, diff kosong, atau dry run.

Lihat referensi input dan output Action untuk semua pengaturan, kolom status, dan jalur laporan.

Pilih kebijakan tingkat keparahan

Alur kerja GitHub dimulai dengan fail-on-severity: none. Untuk menyebabkan kegagalan jika ada temuan tingkat tinggi atau kritis dari pemindaian yang selesai, ubah input langkah pemindaian:

fail-on-severity: high

Jadikan Codex Security sebagai pemeriksaan status wajib dalam aturan repositori Anda untuk memblokir penggabungan saat job PR gagal. GitHub menganggap job yang dilewati secara bersyarat sebagai berhasil, bahkan untuk pemeriksaan wajib. PR dari fork dan PR dari dependabot[bot] lolos pemeriksaan ini tanpa pemindaian. Untuk memblokir pelewatan tersebut, wajibkan pemindaian yang berhasil dan selesai.

Action mengikuti hasil CLI:

  • Kode keluar 0 menetapkan scan-status: completed dan policy-status: passed.
  • Kode keluar 1 menetapkan scan-status: completed dan policy-status: failed; langkah gagal jika ada temuan yang mencapai atau melampaui tingkat keparahan yang dikonfigurasi.
  • Kode keluar 2 atau proses yang terhenti menetapkan scan-status: failed dan policy-status: not-evaluated; langkah gagal.
  • Laporan wajib yang tidak valid atau tidak tersedia, checkout yang berubah, kegagalan mengunggah artefak yang diminta, dan kegagalan pembersihan runtime juga menyebabkan langkah gagal.

Pemindaian yang selesai berarti analisis yang dikonfigurasi memberikan hasil yang valid. Pengecualian cakupan, investigasi yang ditunda, dan catatan lain dalam coverage.json tidak menciptakan hasil pemindaian terpisah atau meniadakan penerapan kebijakan tingkat keparahan. Selesainya pemindaian tidak menjamin bahwa setiap kerentanan telah ditemukan. Tinjau coverage.json saat menilai hasil.

Wajibkan pemindaian yang berhasil dan selesai

Untuk kebijakan yang lebih ketat, tambahkan gerbang terpisah yang berjalan meskipun job pemindaian gagal atau dilewati GitHub. Langkah di dalam job pemindaian tidak dapat memeriksa job yang dilewati karena tidak ada satu pun langkahnya yang dijalankan.

Dalam alur kerja PR, tambahkan pemetaan outputs ini ke job security yang ada, dengan indentasi yang sama seperti runs-on dan steps:

outputs:
  scan-status: ${{ steps.security.outputs.scan-status }}

Lalu tambahkan job ini di bawah jobs, sejajar dengan job security yang ada:

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" = completed

Jadikan Codex Security gate sebagai pemeriksaan status wajib untuk kebijakan ini. Gerbang ini memerlukan job pemindaian yang berhasil dan scan-status: completed. Memeriksa keduanya memastikan kegagalan kebijakan tingkat keparahan, pelaporan, dan pembersihan tetap menggagalkan pemeriksaan, bahkan ketika pemindaian itu sendiri telah selesai.

Dengan pengecualian pada contoh, gerbang ini memblokir PR dari fork dan PR dari dependabot[bot]. Gerbang ini juga memblokir diff kosong dan dry run, yang ditandai Action sebagai skipped. Gerbang ini tidak memindai PR yang dikecualikan. Pilih kebijakan ini hanya jika kasus tersebut harus mencegah penggabungan.

Atasi masalah pemindaian

  • Referensi Git tidak dikenal atau diff tidak sesuai harapan: Lakukan checkout head PR dengan fetch-depth: 0.
  • Kesalahan saat memulai sandbox: Di Ubuntu 24.04, instal paket bubblewrap dan muat profil AppArmor sebelum Action. Menginstal paket saja tidak memuat profil yang diperlukan.
  • Kredensial tidak tersedia: Pastikan CODEX_SECURITY_API_KEY tersedia bagi alur kerja tepercaya dan dipetakan ke variabel lingkungan OPENAI_API_KEY pada langkah pemindaian.
  • Kesalahan penyiapan Python: Action memerlukan Python 3.11 atau lebih baru.
  • Catatan cakupan: Tinjau pengecualian cakupan dan investigasi yang ditunda dalam coverage.json. Catatan ini tidak menyebabkan kegagalan eksekusi atau meniadakan penerapan kebijakan tingkat keparahan.
  • SARIF tidak tersedia: Periksa scan-status, report-status, dan sarif-upload-ready. Jika SARIF opsional tidak tersedia, Action memberikan peringatan tanpa mengubah hasil pemindaian; kegagalan pengunggahan artefak yang diminta tetap menyebabkan job gagal.
  • Kesalahan pengunggahan SARIF: Pastikan organisasi Anda telah mengaktifkan GitHub Code Security untuk repositori dan alur kerja memberikan izin actions: read, contents: read, dan security-events: write.

Untuk setiap perintah, flag, artefak, dan kolom output, lihat referensi CLI. Untuk penyedia lain, lihat ringkasan CI/CD.