name: Security Scan on: push: branches: [main] pull_request: branches: [main] schedule: - cron: "0 8 * * 1" # Run every Monday at 08:00 UTC jobs: # ============================================================ # CodeQL — static analysis for Python + JavaScript/TypeScript # ============================================================ codeql: runs-on: ubuntu-latest permissions: security-events: write actions: read contents: read strategy: fail-fast: false matrix: language: [python, javascript-typescript] steps: - uses: actions/checkout@v4 - name: Initialize CodeQL uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} - name: Perform CodeQL Analysis uses: github/codeql-action/analyze@v3 with: category: "/language:${{ matrix.language }}" # ============================================================ # Dependency review — check for known vulnerabilities # ============================================================ dependency-review: runs-on: ubuntu-latest if: github.event_name == 'pull_request' steps: - uses: actions/checkout@v4 - name: Dependency Review uses: actions/dependency-review-action@v4 with: fail-on-severity: high # ============================================================ # Trivy — scan Docker image for vulnerabilities # ============================================================ trivy-backend: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Build backend image run: docker build -t aiagent-backend:scan ./backend - name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-action@master with: image-ref: aiagent-backend:scan format: sarif output: trivy-backend.sarif severity: "HIGH,CRITICAL" - name: Upload Trivy results uses: github/codeql-action/upload-sarif@v3 if: always() with: sarif_file: trivy-backend.sarif # ============================================================ # Secret scanning — detect hardcoded secrets # ============================================================ secret-scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Gitleaks — scan for secrets uses: gitleaks/gitleaks-action@v2 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}