اختبار أمان التطبيقات الثابت (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 والتعامل مع الإيجابيات الخاطئة. :::

اختبار

اختبار الوحدة 2: اختبار أمان التطبيقات الثابت

خذ الاختبار