Chạy Codex Security trong GitHub Actions
Quét pull request và kho mã bằng Codex Security Action, lưu báo cáo, tải lên SARIF và cấu hình việc thực thi chính sách.
Chạy Codex Security trong GitHub Actions để rà soát các thay đổi trong pull request hoặc quét kho mã theo lịch. Action cài đặt CLI, lưu các báo cáo có cấu trúc và thêm bản tóm tắt tác vụ cùng chú thích mã nguồn. Bắt đầu với các kết quả mang tính tham khảo, sau đó cấu hình việc thực thi chính sách sau khi rà soát phạm vi và chất lượng quét.
Chuẩn bị quy trình
Bạn cần có quyền truy cập Codex Security để chạy quét. Để thêm OpenAI API key:
- Trong kho mã GitHub, mở Cài đặt → Bí mật và biến → Actions.
- Chọn Bí mật kho mã mới.
- Nhập
CODEX_SECURITY_API_KEYlàm tên và dán OpenAI API key làm giá trị. Lưu bí mật.
Các ví dụ quy trình bên dưới tự động chuyển bí mật này đến Codex Security Action. Bạn không cần đặt API key trong tệp quy trình.
Chỉ chạy quy trình đối với các kho mã và pull request mà bạn tin cậy. Quá trình quét sử dụng quyền cục bộ của runner và không tạm dừng để chờ phê duyệt. Đặt các thông tin xác thực không liên quan và các bước triển khai trong những tác vụ riêng biệt.
Thêm quy trình GitHub Actions
Quét kho mã theo lịch
Quy trình dưới đây quét nhánh mặc định vào mỗi thứ Hai lúc 07:23 UTC. Bạn cũng có thể chạy thủ công từ thẻ Actions của GitHub. Quy trình sử dụng runner Ubuntu 24.04 x64 do GitHub cung cấp và tự động thiết lập môi trường cô lập cần thiết.
- Trong kho mã, chọn Thêm tệp → Tạo tệp mới.
- Đặt tên tệp là
.github/workflows/codex-security-repository.yml. - Dán quy trình bên dưới và commit vào nhánh mặc định.
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 }}
Điều chỉnh runner: Action cần Node.js 24 và Python 3.11 trở lên,
đều có sẵn trên runner này. Bước thiết lập môi trường cô lập cài đặt gói bubblewrap
và nạp hồ sơ AppArmor được cung cấp trước khi quét. Chỉ cài đặt
gói là chưa đủ trên runner này.
Để chạy quy trình thủ công, mở Actions → Codex Security repository → Chạy quy trình. Mở một lần chạy đã hoàn tất để rà soát bản tóm tắt, chú thích và các báo cáo có thể tải xuống.
Các phát hiện chỉ được ghi vào báo cáo vì fail-on-severity là none. Lỗi trình quét và
lỗi báo cáo bắt buộc vẫn khiến tác vụ thất bại.
Để quét các thư mục được chọn, thêm các đường dẫn nguyên văn, mỗi đường dẫn một dòng, vào khối
with của bước quét:
paths: |
src/api
src/authCác đường dẫn yêu cầu scope: repository và không mở rộng mẫu glob. Đối với quét phần khác biệt, bỏ
paths. Giữ persist-credentials: false và chạy quét
ngay sau khi checkout.
Quét các thay đổi trong pull request
Sử dụng cùng bí mật đó, tạo .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 }}Mở hoặc cập nhật một PR từ nhánh trong cùng kho mã. Action sử dụng toàn bộ lịch sử để tìm chính xác điểm gốc hợp nhất và quét các thay đổi đến đầu PR đã checkout. Xem mục kiểm tra Codex Security trong Kiểm tra của PR. Bắt đầu với các phát hiện mang tính tham khảo, sau đó chọn chính sách theo mức độ nghiêm trọng khi bạn sẵn sàng dùng kết quả để kiểm soát thay đổi.
Ví dụ này bỏ qua các PR từ fork và các PR do dependabot[bot] mở. Một tác vụ bị bỏ qua
không phải bằng chứng cho việc rà soát bảo mật. Để bao gồm các PR từ bot này, hãy xóa điều kiện
loại trừ tác nhân và đồng thời
cấu hình CODEX_SECURITY_API_KEY làm bí mật
cho dependabot[bot]. Action không hỗ trợ pull_request_target hoặc workflow_run.
Trình quét đọc hướng dẫn SECURITY.md áp dụng từ bản checkout,
bao gồm cả các thay đổi chính sách trong PR. Rà soát những thay đổi đó cùng với mã.
Cấu hình quyền truy cập Daybreak tùy chọn
Daybreak là tùy chọn. Cả hai ví dụ quy trình đều sử dụng gpt-6-sol. Nếu
tổ chức của bạn đã được phê duyệt tham gia Trusted Access for
Cyber, hãy xóa # trước
cyber-access-program trong khối with của bước quét:
model: gpt-6-sol
cyber-access-program: daybreak_blueSử dụng API key từ một dự án đã bật Daybreak Blue và có quyền truy cập
gpt-6-sol.
Đầu vào chương trình cũng chấp nhận standard. Nếu không có quyền truy cập Daybreak, hãy sử dụng
mô hình mà API key của bạn có thể truy cập theo các biện pháp bảo vệ tiêu chuẩn và bỏ
cyber-access-program hoặc đặt thành standard. Việc chọn mô hình hoặc chương trình
không cấp quyền truy cập. Xem hướng dẫn về quyền truy cập Daybreak của Action.
Việc từ chối hoặc chặn vì lý do an toàn làm hủy lần quét sẽ khiến Action thất bại, kể cả khi
fail-on-severity là none. Đầu vào đó kiểm soát chính sách đối với phát hiện, không kiểm soát lỗi
trình quét.
Đặt ngân sách quét tùy chọn
Cả hai ví dụ quy trình đều bỏ qua max-cost, nên không có ngưỡng dừng theo chi phí
ước tính. Để đặt ngưỡng, thêm một số tiền USD dương bằng đầu vào max-cost.
Khi quét trực tiếp bằng CLI, sử dụng --max-cost.
Giới hạn chi phí yêu cầu CLI hỗ trợ định giá cho mô hình đã chọn.
Ngưỡng ước tính không phải giới hạn chi tiêu cứng: chi phí của các yêu cầu đang
xử lý có thể vượt ngưỡng.
Rà soát các phát hiện và coverage.json nếu lần quét dừng ở ngưỡng. Xem
các tùy chọn đầu ra và chính sách
để biết hành vi của giới hạn chi phí.
Lưu báo cáo và tải lên SARIF
Các ví dụ đặt upload-artifacts: "true" để lưu các báo cáo có thể tải xuống với
thời hạn lưu giữ bảy ngày. Báo cáo có thể chứa đoạn mã nguồn, bằng chứng về lỗ hổng
và chi tiết khắc phục. Chọn thời hạn lưu giữ và quyền truy cập kho mã
phù hợp với mã của bạn. Action chỉ tải lên các báo cáo đã được xác thực
trong danh sách cho phép; không tải lên đệ quy đầu ra results-directory của Action.
Tải lên SARIF là tùy chọn. Đối với kho mã riêng tư hoặc nội bộ, bật GitHub Code Security trước khi tải lên. Thay khối permissions của quy trình bằng:
permissions:
contents: read
security-events: write
actions: read # Required for private repositoriesSau đó thêm bước này sau bước quét trong một trong hai quy trình:
- 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Đối với quy trình PR, sử dụng category: codex-security-pr để mỗi phạm vi có một
danh mục riêng. Giữ id: security ở bước quét. Các báo cáo hoàn chỉnh, đã được xác thực
vẫn có thể được tải lên khi các phát hiện khiến chính sách theo mức độ nghiêm trọng không được đáp ứng.
SARIF không được tải lên đối với các lần quét thất bại hoặc bị gián đoạn, phần khác biệt rỗng hoặc lần chạy
thử.
Xem tài liệu tham khảo về đầu vào và đầu ra của Action để biết tất cả thiết lập, trường trạng thái và đường dẫn báo cáo.
Chọn chính sách theo mức độ nghiêm trọng
Các quy trình GitHub bắt đầu với fail-on-severity: none. Để tác vụ thất bại khi có phát hiện ở mức cao hoặc
đặc biệt nghiêm trọng từ một lần quét hoàn tất, thay đổi đầu vào của bước quét:
fail-on-severity: highĐặt Codex Security làm mục kiểm tra trạng thái bắt buộc trong các quy tắc kho mã để
chặn hợp nhất khi tác vụ PR thất bại. GitHub coi tác vụ bị bỏ qua theo điều kiện là thành công,
kể cả với các mục kiểm tra bắt buộc. Các PR từ fork và PR từ dependabot[bot] vượt qua mục
kiểm tra này mà không được quét. Để chặn những trường hợp bị bỏ qua đó, hãy yêu cầu một
lần quét thành công và hoàn tất.
Action tuân theo kết quả của CLI:
- Mã thoát
0đặtscan-status: completedvàpolicy-status: passed. - Mã thoát
1đặtscan-status: completedvàpolicy-status: failed; bước này thất bại khi có phát hiện ở mức bằng hoặc cao hơn mức độ nghiêm trọng đã cấu hình. - Mã thoát
2hoặc một tiến trình bị gián đoạn đặtscan-status: failedvàpolicy-status: not-evaluated; bước này thất bại. - Báo cáo bắt buộc không hợp lệ hoặc bị thiếu, bản checkout bị thay đổi, lỗi tải lên các tạo tác được yêu cầu và lỗi dọn dẹp môi trường chạy cũng khiến bước này thất bại.
Một lần quét hoàn tất có nghĩa là quá trình phân tích đã cấu hình tạo ra một kết quả hợp lệ.
Các phần bị loại khỏi phạm vi, các cuộc điều tra hoãn lại và những ghi chú khác trong coverage.json
không tạo ra một kết quả quét riêng biệt hoặc cho phép bỏ qua chính sách theo mức độ nghiêm trọng.
Việc hoàn tất không chứng nhận rằng mọi lỗ hổng đều đã được tìm thấy. Rà soát
coverage.json khi đánh giá kết quả.
Yêu cầu một lần quét thành công và hoàn tất
Để có chính sách nghiêm ngặt hơn, thêm một tác vụ kiểm soát riêng chạy ngay cả khi tác vụ quét thất bại hoặc bị GitHub bỏ qua. Một bước bên trong tác vụ quét không thể kiểm tra tác vụ bị bỏ qua vì không bước nào của tác vụ đó được chạy.
Trong quy trình PR, thêm ánh xạ outputs này vào tác vụ security hiện có,
ở cùng mức thụt lề với runs-on và steps:
outputs:
scan-status: ${{ steps.security.outputs.scan-status }}Sau đó thêm tác vụ này bên dưới jobs, bên cạnh tác vụ security hiện có:
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Đặt Codex Security gate làm mục kiểm tra trạng thái bắt buộc cho chính sách này. Tác vụ này
yêu cầu cả tác vụ quét thành công lẫn scan-status: completed. Việc kiểm tra
cả hai đảm bảo các lỗi từ chính sách theo mức độ nghiêm trọng, báo cáo và dọn dẹp vẫn được ghi nhận,
ngay cả khi bản thân lần quét đã hoàn tất.
Với các điều kiện loại trừ của ví dụ, tác vụ kiểm soát này chặn các PR từ fork và PR từ
dependabot[bot]. Nó cũng chặn phần khác biệt rỗng và các lần chạy thử, vốn được Action
đánh dấu là skipped.
Tác vụ kiểm soát không quét các PR bị loại trừ. Chỉ chọn chính sách này nếu những trường hợp đó
cần ngăn việc hợp nhất.
Khắc phục sự cố khi quét
- Tham chiếu Git không xác định hoặc phần khác biệt ngoài dự kiến: Checkout đầu PR bằng
fetch-depth: 0. - Lỗi khởi động môi trường cô lập: Trên Ubuntu 24.04, cài đặt gói
bubblewrapvà nạp hồ sơ AppArmor trước Action. Chỉ cài đặt gói sẽ không nạp hồ sơ cần thiết. - Thiếu thông tin xác thực: Xác nhận rằng
CODEX_SECURITY_API_KEYkhả dụng cho quy trình đáng tin cậy và được ánh xạ tới biến môi trườngOPENAI_API_KEYcủa bước quét. - Lỗi thiết lập Python: Action yêu cầu Python 3.11 trở lên.
- Ghi chú về phạm vi quét: Rà soát các phần bị loại khỏi phạm vi và các cuộc điều tra hoãn lại trong
coverage.json. Những ghi chú này không gây lỗi thực thi hoặc cho phép bỏ qua chính sách theo mức độ nghiêm trọng. - Thiếu SARIF: Kiểm tra
scan-status,report-statusvàsarif-upload-ready. Nếu SARIF tùy chọn bị thiếu, Action đưa ra cảnh báo mà không thay đổi kết quả quét; lỗi tải lên tạo tác được yêu cầu vẫn khiến tác vụ thất bại. - Lỗi tải lên SARIF: Xác nhận rằng tổ chức của bạn đã bật GitHub Code
Security cho kho mã và quy trình cấp
actions: read,contents: readvàsecurity-events: write.
Để biết mọi lệnh, cờ, tạo tác và trường đầu ra, xem tài liệu tham khảo CLI. Đối với các nhà cung cấp khác, xem tổng quan về CI/CD.