اختبار أمان التطبيقات الثابت (SAST)
دمج SAST في GitHub Actions
3 دقيقة للقراءة
أتمتة SAST في خط أنابيب CI/CD يضمن فحص كل تغيير في الكود. إليك كيفية إعداد SAST شامل مع GitHub Actions.
سير عمل SAST الكامل
# .github/workflows/sast.yml
name: SAST Security Scan
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
semgrep:
name: Semgrep Scan
runs-on: ubuntu-latest
container:
image: returntocorp/semgrep
steps:
- uses: actions/checkout@v4
- name: Run Semgrep
run: semgrep ci
env:
SEMGREP_RULES: >-
p/security-audit
p/secrets
p/owasp-top-ten
- name: Upload SARIF
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: semgrep.sarif
if: always()
codeql:
name: CodeQL Analysis
runs-on: ubuntu-latest
permissions:
security-events: write
actions: read
contents: read
strategy:
matrix:
language: ['javascript', 'python']
steps:
- uses: actions/checkout@v4
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
queries: +security-extended
- name: Autobuild
uses: github/codeql-action/autobuild@v3
- name: Perform Analysis
uses: github/codeql-action/analyze@v3
with:
category: "/language:${{ matrix.language }}"
إيقاف البناء عند العثور على نتائج
تكوين متى يجب أن تمنع الفحوصات الدمج:
# Semgrep مع عتبات الخطورة
- name: Run Semgrep
run: |
semgrep ci \
--sarif --output=semgrep.sarif \
--error \
--severity ERROR
# أكواد الخروج:
# 0 = لا توجد نتائج
# 1 = تم العثور على نتائج (يمنع PR إذا كان علم --error)
تكامل طلبات السحب
إضافة تعليقات أمنية مباشرة على PRs:
# .github/workflows/pr-security.yml
name: PR Security Review
on:
pull_request:
types: [opened, synchronize]
jobs:
security-review:
runs-on: ubuntu-latest
permissions:
pull-requests: write
contents: read
steps:
- uses: actions/checkout@v4
- name: Run Semgrep
id: semgrep
uses: returntocorp/semgrep-action@v1
with:
config: p/security-audit
generateSarif: "1"
- name: Comment on PR
uses: actions/github-script@v7
if: steps.semgrep.outputs.findings != '0'
with:
script: |
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: '## نتائج الفحص الأمني\n\nتم العثور على مشاكل أمنية. يرجى مراجعة تبويب الأمان.'
})
تكوين متعدد اللغات
التعامل مع المستودعات متعددة اللغات:
jobs:
detect-languages:
runs-on: ubuntu-latest
outputs:
languages: ${{ steps.detect.outputs.languages }}
steps:
- uses: actions/checkout@v4
- name: Detect Languages
id: detect
run: |
LANGS="[]"
[ -f "package.json" ] && LANGS=$(echo $LANGS | jq '. + ["javascript"]')
[ -f "requirements.txt" ] && LANGS=$(echo $LANGS | jq '. + ["python"]')
[ -f "go.mod" ] && LANGS=$(echo $LANGS | jq '. + ["go"]')
echo "languages=$LANGS" >> $GITHUB_OUTPUT
sast:
needs: detect-languages
runs-on: ubuntu-latest
strategy:
matrix:
language: ${{ fromJson(needs.detect-languages.outputs.languages) }}
steps:
- uses: actions/checkout@v4
- name: Run Language-Specific SAST
run: semgrep --config auto --lang ${{ matrix.language }} .
التخزين المؤقت للسرعة
تسريع الفحوصات بالتخزين المؤقت:
- name: Cache Semgrep
uses: actions/cache@v4
with:
path: ~/.semgrep
key: semgrep-${{ hashFiles('.semgrep/**') }}
- name: Cache SonarQube
uses: actions/cache@v4
with:
path: ~/.sonar/cache
key: sonar-${{ runner.os }}-${{ hashFiles('**/sonar-project.properties') }}
تكامل لوحة الأمان
دفع النتائج إلى تبويب أمان GitHub:
- name: Upload to GitHub Security
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: results.sarif
category: sast-semgrep
تظهر النتائج في:
- الأمان ← تنبيهات فحص الكود
- طلبات السحب ← تبويب الفحوصات
- المستودع ← الأمان ← Dependabot
بعد ذلك، سنغطي أفضل ممارسات SAST والتعامل مع الإيجابيات الخاطئة. :::