spinny:~/writing $ vim devsecops-shift-left-security-guide.md
1~2الثغرة الأمنية التي يتم اكتشافها أثناء كتابة الكود تكلف المطور دقائق لإصلاحها. نفس الثغرة إذا تم اكتشافها في production تكلف sprint كاملاً. وإذا وجدها مهاجم أولاً، فتكلفتها بالملايين. هذه هي الحجة الأساسية وراء **shift-left security** - نقل فحوصات الأمان إلى أبكر مرحلة ممكنة في دورة حياة التطوير.3~4يأخذ DevSecOps هذه الفكرة ويحولها إلى ممارسة: الأمان ليس مرحلة منفصلة في النهاية بل هو عملية مستمرة منسوجة في كل مرحلة من مراحل التطوير، من أول سطر كود إلى نشر production.5~6## تكلفة الأمان المتأخر7~8أظهر تقرير IBM لتكلفة اختراق البيانات باستمرار أن تكلفة إصلاح مشاكل الأمان تنمو بشكل أسي كلما تم اكتشافها في وقت متأخر:9~10| المرحلة | تكلفة الإصلاح | وقت الإصلاح |11|-------|------------|-------------|12| **IDE / Local Dev** | دقائق | ثوانٍ إلى دقائق |13| **Code Review / PR** | ساعات | دقائق إلى ساعات |14| **CI/CD Pipeline** | أيام | ساعات إلى أيام |15| **Staging / QA** | أسابيع | أيام |16| **Production** | أشهر | أسابيع إلى أشهر |17| **Post-breach** | ملايين ($) | أشهر إلى سنوات |18~19الخلاصة واضحة: كل مرحلة تقدم فيها الأمان توفر مرتبة من حيث التكلفة والوقت.20~21## خط أنابيب DevSecOps22~23يدمج خط أنابيب DevSecOps الناضج فحوصات الأمان في كل مرحلة:24~25```mermaid26graph LR27 IDE[IDE / Editor] --> PC[Pre-commit Hooks]28 PC --> PR[Pull Request]29 PR --> CI[CI Pipeline]30 CI --> Build[Build / Package]31 Build --> Deploy[Deploy]32 Deploy --> Runtime[Runtime / Production]33~34 IDE -.- S1[SAST\nSecret Detection\nLinting]35 PC -.- S2[Secrets Scan\nFormat Check]36 PR -.- S3[Code Review\nDependency Audit]37 CI -.- S4[SAST\nSCA\nContainer Scan\nSBOM]38 Build -.- S5[Image Signing\nArtifact Verification]39 Deploy -.- S6[Policy Enforcement\nAdmission Control]40 Runtime -.- S7[DAST\nWAF\nMonitoring]41```42~43دعونا نحلل كل مرحلة مع أدوات وإعدادات ملموسة.44~45## المرحلة 1: الأمان في IDE46~47أسرع حلقة تغذية راجعة. اكتشف الثغرات قبل حتى حفظ الملف.48~49### الأدوات الموصى بها50~51- **Semgrep**: تحليل ثابت خفيف مع قواعد مجتمعية لثغرات OWASP52- **Snyk IDE Extension**: فحص ثغرات التبعيات في الوقت الفعلي53- **GitLens + GitLeaks**: اكتشاف الأسرار في محررك54- **ESLint Security Plugins**: `eslint-plugin-security` لـ Node.js، `eslint-plugin-no-unsanitized` لـ DOM XSS55~56### مثال: إعداد ESLint Security57~58```json59{60 "extends": ["eslint:recommended"],61 "plugins": ["security", "no-unsanitized"],62 "rules": {63 "security/detect-object-injection": "warn",64 "security/detect-non-literal-regexp": "warn",65 "security/detect-unsafe-regex": "error",66 "security/detect-buffer-noassert": "error",67 "security/detect-eval-with-expression": "error",68 "security/detect-no-csrf-before-method-override": "error",69 "security/detect-possible-timing-attacks": "warn",70 "no-unsanitized/method": "error",71 "no-unsanitized/property": "error"72 }73}74```75~76## المرحلة 2: Pre-commit Hooks77~78خط الدفاع الثاني. يعمل تلقائياً قبل كل commit، ويمنع الكود الخطير من الدخول إلى المستودع.79~80### Gitleaks: اكتشف الأسرار قبل وصولها إلى Git81~82أكثر الأخطاء الأمنية شيوعاً في قواعد الكود هو commit الأسرار - API keys و database passwords و tokens. بمجرد وصول سر إلى git history، يصبح من الصعب للغاية إزالته بالكامل (حتى مع force pushes، قد تحتفظ به forks و caches).83~84```yaml85# .pre-commit-config.yaml86repos:87 - repo: https://github.com/gitleaks/gitleaks88 rev: v8.21.089 hooks:90 - id: gitleaks91~92 - repo: https://github.com/semgrep/semgrep93 rev: v1.90.094 hooks:95 - id: semgrep96 args: ['--config', 'auto']97```98~99التثبيت والتفعيل:100~101```bash102pip install pre-commit103pre-commit install104```105~106الآن كل `git commit` يفحص تلقائياً بحثاً عن أسرار مسربة وثغرات شائعة. إذا تم العثور على شيء، يتم حظر commit.107~108### قواعد Gitleaks مخصصة109~110يمكنك إضافة أنماط مخصصة لأسرار مؤسستك:111~112```toml113# .gitleaks.toml114title = "Custom Gitleaks Config"115~116[[rules]]117id = "internal-api-key"118description = "Internal API key detected"119regex = '''INTERNAL_KEY_[A-Za-z0-9]{32}'''120tags = ["key", "internal"]121```122~123## المرحلة 3: أمان CI/CD Pipeline124~125هنا يتم العمل الثقيل. يجب أن يقوم خط أنابيب CI بتشغيل فحوصات أمنية متعددة على كل pull request.126~127### SAST (Static Application Security Testing)128~129تحلل أدوات SAST الكود المصدري دون تنفيذه، وتبحث عن أنماط تشير إلى ثغرات.130~131```yaml132# .github/workflows/security.yml133name: Security Scan134on:135 pull_request:136 branches: [main]137~138jobs:139 sast:140 name: Static Analysis141 runs-on: ubuntu-latest142 steps:143 - uses: actions/checkout@v4144~145 - name: Run Semgrep146 uses: semgrep/semgrep-action@v1147 with:148 config: >-149 p/owasp-top-ten150 p/typescript151 p/nodejs152 p/react153 generateSarif: true154~155 - name: Upload SARIF156 uses: github/codeql-action/upload-sarif@v3157 with:158 sarif_file: semgrep.sarif159```160~161مجموعة قواعد `p/owasp-top-ten` في Semgrep تكتشف أكثر الثغرات شيوعاً: SQL injection و XSS و SSRF و path traversal و insecure deserialization والمزيد.162~163### SCA (Software Composition Analysis)164~165يفحص SCA تبعياتك بحثاً عن ثغرات معروفة. هذا أمر بالغ الأهمية - أكثر من 80% من كود التطبيقات الحديثة يأتي من تبعيات open-source.166~167```yaml168 dependency-scan:169 name: Dependency Audit170 runs-on: ubuntu-latest171 steps:172 - uses: actions/checkout@v4173~174 - name: Run Snyk175 uses: snyk/actions/node@master176 env:177 SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}178 with:179 args: --severity-threshold=high180~181 - name: npm audit182 run: npm audit --audit-level=high183```184~185### أمان الحاويات مع Trivy186~187إذا كنت تبني Docker images، فإن فحصها بحثاً عن ثغرات أمر ضروري. **Trivy** هو أشهر فاحص حاويات مفتوح المصدر.188~189```yaml190 container-scan:191 name: Container Security192 runs-on: ubuntu-latest193 steps:194 - uses: actions/checkout@v4195~196 - name: Build image197 run: docker build -t my-app:${{ github.sha }} .198~199 - name: Run Trivy200 uses: aquasecurity/trivy-action@master201 with:202 image-ref: my-app:${{ github.sha }}203 format: 'sarif'204 output: 'trivy-results.sarif'205 severity: 'CRITICAL,HIGH'206 exit-code: '1'207~208 - name: Upload Trivy SARIF209 uses: github/codeql-action/upload-sarif@v3210 with:211 sarif_file: trivy-results.sarif212```213~214### توليد SBOM215~216**Software Bill of Materials (SBOM)** هو جرد كامل لكل مكون في تطبيقك. تتزايد المطالبة به من أطر الامتثال والأنظمة الحكومية (الأمر التنفيذي الأمريكي للأمن السيبراني يفرض SBOM للبرمجيات الفيدرالية).217~218```yaml219 sbom:220 name: Generate SBOM221 runs-on: ubuntu-latest222 steps:223 - uses: actions/checkout@v4224~225 - name: Generate SBOM with Syft226 uses: anchore/sbom-action@v0227 with:228 format: spdx-json229 output-file: sbom.spdx.json230~231 - name: Upload SBOM232 uses: actions/upload-artifact@v4233 with:234 name: sbom235 path: sbom.spdx.json236```237~238## المرحلة 4: صور Docker الآمنة239~240يجب أن تتبع صورة Docker للـ production مبدأ الحد الأدنى من الصلاحيات. هكذا يبدو Dockerfile المحصن:241~242```dockerfile243# Build stage244FROM node:22-alpine AS builder245WORKDIR /app246COPY package.json package-lock.json ./247RUN npm ci248COPY . .249RUN npm run build250~251# Production stage252FROM node:22-alpine AS runner253WORKDIR /app254~255# Install dumb-init before dropping root256RUN apk add --no-cache dumb-init257~258# Don't run as root259RUN addgroup -S app && adduser -S app -G app260~261# Copy only what's needed262COPY --from=builder --chown=app:app /app/dist ./dist263COPY --from=builder --chown=app:app /app/node_modules ./node_modules264COPY --from=builder --chown=app:app /app/package.json ./265~266# Drop to non-root user267USER app268ENTRYPOINT ["dumb-init", "--"]269~270# Health check271HEALTHCHECK --interval=30s --timeout=3s --retries=3 \272 CMD wget -qO- http://localhost:3000/health || exit 1273~274EXPOSE 3000275CMD ["node", "dist/server.js"]276```277~278الممارسات الرئيسية:279~2801. **استخدم multi-stage builds**: مرحلة builder تحتوي على dev dependencies؛ مرحلة runner تحتوي فقط على كود production2812. **لا تشغل كـ root**: أنشئ مستخدماً غير root وانتقل إليه2823. **استخدم صور Alpine**: سطح هجوم أصغر (حزم أقل مثبتة افتراضياً)2834. **ثبّت إصدارات الصور**: `node:22-alpine` بدلاً من `node:latest` لتجنب هجمات سلسلة التوريد2845. **استخدم `npm ci`**: تثبيتات حتمية من ملف القفل، وليس `npm install`285~286## المرحلة 5: إدارة الأسرار287~288الأسرار المكتوبة في الكود هي السبب الأول للاختراقات في الحوادث التي يسببها المطورون.289~290### ما لا يجب فعله291~292```typescript293// NEVER do this294const API_KEY = "sk-1234567890abcdef";295const DB_PASSWORD = "supersecret123";296~297const client = new Client({298 connectionString: `postgres://admin:${DB_PASSWORD}@db.example.com/prod`299});300```301~302### ما يجب فعله بدلاً من ذلك303~304```typescript305// Use environment variables306const client = new Client({307 connectionString: process.env.DATABASE_URL308});309~310// Or use a secret manager311import { SecretManagerServiceClient } from '@google-cloud/secret-manager';312~313const client = new SecretManagerServiceClient();314const [version] = await client.accessSecretVersion({315 name: 'projects/my-project/secrets/db-password/versions/latest',316});317const dbPassword = version.payload?.data?.toString();318```319~320### تسلسل إدارة الأسرار321~322```mermaid323graph TD324 A[Secret Manager\nAWS Secrets Manager\nGCP Secret Manager\nHashiCorp Vault] --> B[Best: Rotated, audited, centralized]325 C[Environment Variables\nInjected at deploy time] --> D[Good: Not in code, but static]326 E[.env files\nWith .gitignore] --> F[Acceptable: Local development only]327 G[Hard-coded in source] --> H[NEVER: Instant breach risk]328~329 style A fill:#d4edda330 style C fill:#fff3cd331 style E fill:#ffeeba332 style G fill:#f8d7da333```334~335## OWASP Top 10: مرجع سريع336~337يجب على كل مطور معرفة OWASP Top 10. النسخة المختصرة:338~339| # | الثغرة | ما هي | الوقاية |340|---|--------------|-----------|------------|341| 1 | **Broken Access Control** | وصول المستخدمين إلى موارد لا ينبغي لهم الوصول إليها | الرفض افتراضياً، التحقق على جانب الخادم |342| 2 | **Cryptographic Failures** | تشفير ضعيف، بيانات نص عادي | استخدم خوارزميات قوية (AES-256, bcrypt)، TLS في كل مكان |343| 3 | **Injection** | SQL, NoSQL, OS command injection | Parameterized queries، التحقق من المدخلات |344| 4 | **Insecure Design** | بنية معيبة | Threat modeling، أنماط تصميم آمنة |345| 5 | **Security Misconfiguration** | بيانات اعتماد افتراضية، cloud buckets مفتوحة | إعدادات افتراضية محصنة، تدقيق تلقائي للإعدادات |346| 6 | **Vulnerable Components** | CVEs معروفة في التبعيات | فحص SCA، تحديثات منتظمة |347| 7 | **Auth Failures** | كلمات مرور ضعيفة، جلسات معطلة | MFA، تحديد المعدل، إدارة جلسات آمنة |348| 8 | **Data Integrity Failures** | تحديثات غير موقعة، CI/CD غير موثوق | توقيع الكود، SBOM، سلامة خط الأنابيب |349| 9 | **Logging Failures** | لا يوجد سجل تدقيق | تسجيل منظم، تنبيهات على الشذوذ |350| 10 | **SSRF** | Server-side request forgery | قائمة السماح لعناوين URL الصادرة، التحقق من المدخلات |351~352## سير عمل GitHub Actions Security الكامل353~354سير عمل كامل وجاهز للـ production يجمع كل ما سبق:355~356```yaml357# .github/workflows/security.yml358name: Security Pipeline359on:360 pull_request:361 branches: [main]362 push:363 branches: [main]364~365permissions:366 contents: read367 security-events: write368~369jobs:370 secrets-scan:371 name: Secret Detection372 runs-on: ubuntu-latest373 steps:374 - uses: actions/checkout@v4375 with:376 fetch-depth: 0377 - uses: gitleaks/gitleaks-action@v2378 env:379 GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}380~381 sast:382 name: Static Analysis (SAST)383 runs-on: ubuntu-latest384 steps:385 - uses: actions/checkout@v4386 - uses: semgrep/semgrep-action@v1387 with:388 config: p/owasp-top-ten p/typescript p/nodejs389~390 dependency-audit:391 name: Dependency Scan (SCA)392 runs-on: ubuntu-latest393 steps:394 - uses: actions/checkout@v4395 - uses: actions/setup-node@v4396 with:397 node-version: 22398 - run: npm ci399 - run: npm audit --audit-level=high400 - uses: snyk/actions/node@master401 env:402 SNYK_TOKEN: ${{ secrets.SNYK_TOKEN }}403 with:404 args: --severity-threshold=high405 continue-on-error: true406~407 container-scan:408 name: Container Scan409 runs-on: ubuntu-latest410 needs: [sast, dependency-audit]411 steps:412 - uses: actions/checkout@v4413 - run: docker build -t app:${{ github.sha }} .414 - uses: aquasecurity/trivy-action@master415 with:416 image-ref: app:${{ github.sha }}417 severity: CRITICAL,HIGH418 exit-code: '1'419~420 sbom:421 name: SBOM Generation422 runs-on: ubuntu-latest423 needs: [container-scan]424 steps:425 - uses: actions/checkout@v4426 - uses: anchore/sbom-action@v0427 with:428 format: spdx-json429 output-file: sbom.spdx.json430```431~432```mermaid433graph TD434 PR[Pull Request] --> S1[Secret Detection]435 PR --> S2[SAST - Semgrep]436 PR --> S3[SCA - Snyk + npm audit]437 S2 --> S4[Container Scan - Trivy]438 S3 --> S4439 S4 --> S5[SBOM Generation]440 S5 --> Deploy[Deploy]441~442 S1 -.- F1[Block if secrets found]443 S2 -.- F2[Block on critical vulns]444 S3 -.- F3[Block on high severity]445 S4 -.- F4[Block on critical CVEs]446```447~448## المقاييس التي يجب تتبعها449~450كيف تعرف أن برنامج DevSecOps يعمل؟ تتبع هذه المقاييس:451~452- **Mean time to remediate (MTTR)**: مدى سرعة إصلاح الثغرات بعد اكتشافها453- **Vulnerability escape rate**: نسبة الثغرات التي تصل إلى production454- **False positive rate**: الكثير من الإيجابيات الكاذبة تؤدي إلى إرهاق التنبيهات وتجاهل التحذيرات455- **Dependency freshness**: متوسط عمر تبعياتك (أقدم = احتمالية أكبر لوجود CVEs معروفة)456- **SBOM coverage**: نسبة المشاريع التي لديها SBOMs محدثة457~458## البدء: خارطة طريق عملية459~460لا تحاول تنفيذ كل شيء دفعة واحدة. النهج المرحلي يعمل بشكل أفضل:461~462```mermaid463flowchart TD464 A[Week 1-2: Foundations] --> B[Week 3-4: CI/CD Integration]465 B --> C[Month 2: Container Security]466 C --> D[Month 3+: Advanced]467~468 A --> A1[Add Gitleaks pre-commit hooks]469 A --> A2[Enable npm audit in CI]470 A --> A3[Add .gitignore for .env files]471~472 B --> B1[Add Semgrep to GitHub Actions]473 B --> B2[Add Snyk dependency scanning]474 B --> B3[Set up SARIF upload to GitHub]475~476 C --> C1[Add Trivy container scanning]477 C --> C2[Harden Dockerfiles]478 C --> C3[Generate SBOMs]479~480 D --> D1[Secret manager integration]481 D --> D2[Runtime protection - DAST]482 D --> D3[Policy as code - OPA]483```484~485## الخلاصة486~487DevSecOps ليس عن إضافة المزيد من الأدوات إلى خط الأنابيب - إنه عن جعل الأمان جزءاً طبيعياً من كيفية بناء البرمجيات. الهدف ليس حظر كل PR بتحذيرات أمنية بل إعطاء المطورين تغذية راجعة سريعة حتى يتمكنوا من إصلاح المشاكل بينما الكود لا يزال حاضراً في أذهانهم.488~489ابدأ بالأساسيات: pre-commit hooks للأسرار، dependency scanning في CI، و container scanning لصور Docker. ثم كرر بناءً على ما يحتاجه فريقك.490~491الأمان ليس ميزة تطلقها مرة واحدة. إنه ممارسة تبنيها في كل commit.492~493> **DevSecOps Starter Checklist:**494>495> - [x] Gitleaks pre-commit hooks مثبتة496> - [x] ملفات .env و secret في .gitignore497> - [x] Semgrep SAST في CI pipeline498> - [x] Snyk أو npm audit لفحص التبعيات499> - [x] Trivy لفحص صور الحاويات500> - [x] مستخدم غير root في Dockerfiles501> - [x] الأسرار في environment variables أو secret manager502> - [x] توليد SBOM في كل إصدار503> - [x] وعي OWASP Top 10 عبر الفريق504~
NORMAL · devsecops-shift-left-security-guide.md [readonly]504 lines · :q to close