spinny:~/writing $ vim devsecops-shift-left-security-guide.md
1~2কোড লেখার সময় পাওয়া একটি vulnerability ঠিক করতে একজন developer-এর কয়েক মিনিট লাগে। একই vulnerability production-এ ধরা পড়লে একটি পুরো sprint খরচ হয়। আর যদি কোনো attacker আগে খুঁজে পায়, তাহলে এর মূল্য লক্ষ লক্ষ টাকা। এটিই **shift-left security**-এর মূল যুক্তি - security checks-কে development lifecycle-এ যতটা সম্ভব আগে নিয়ে আসা।3~4DevSecOps এই ধারণাটিকে একটি practice-এ পরিণত করে: security শেষে একটি আলাদা পর্যায় নয়, বরং এটি development-এর প্রতিটি পর্যায়ে বোনা একটি ক্রমাগত প্রক্রিয়া, কোডের প্রথম লাইন থেকে production deployment পর্যন্ত।5~6## দেরিতে Security-এর খরচ7~8IBM-এর Cost of a Data Breach Report ধারাবাহিকভাবে দেখিয়েছে যে security issues ঠিক করার খরচ যত দেরিতে ধরা পড়ে তত দ্রুত বৃদ্ধি পায়: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উপসংহার স্পষ্ট: security-কে যত আগে আনবেন, খরচ এবং সময়ে তত বেশি সাশ্রয় হবে।20~21## DevSecOps Pipeline22~23একটি পরিপক্ব DevSecOps pipeline প্রতিটি পর্যায়ে security checks সংযুক্ত করে: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চলুন প্রতিটি পর্যায় ঠোস tools এবং configuration সহ বিশ্লেষণ করি।44~45## পর্যায় 1: IDE-তে Security46~47সবচেয়ে দ্রুত feedback loop। ফাইল save করার আগেই vulnerabilities ধরুন।48~49### প্রস্তাবিত Tools50~51- **Semgrep**: OWASP vulnerabilities-এর জন্য community rules সহ হালকা static analysis52- **Snyk IDE Extension**: real-time dependency vulnerability scanning53- **GitLens + GitLeaks**: আপনার editor-এ secrets detect করুন54- **ESLint Security Plugins**: Node.js-এর জন্য `eslint-plugin-security`, DOM XSS-এর জন্য `eslint-plugin-no-unsanitized`55~56### উদাহরণ: ESLint Security Configuration57~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-এর আগে স্বয়ংক্রিয়ভাবে চলে, বিপজ্জনক কোডকে repository-তে প্রবেশ করতে বাধা দেয়।79~80### Gitleaks: Git-এ পৌঁছানোর আগে Secrets ধরুন81~82Codebases-এ সবচেয়ে সাধারণ security ভুল হলো secrets commit করা - API keys, database passwords, tokens। একবার একটি secret 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~99Install এবং activate করুন:100~101```bash102pip install pre-commit103pre-commit install104```105~106এখন প্রতিটি `git commit` স্বয়ংক্রিয়ভাবে leaked secrets এবং সাধারণ vulnerabilities-এর জন্য scan করে। কিছু পাওয়া গেলে, commit block হয়ে যায়।107~108### Custom Gitleaks Rules109~110আপনি আপনার organization-এর secrets-এর জন্য custom patterns যোগ করতে পারেন: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 Pipeline Security124~125এখানেই ভারী কাজ হয়। আপনার CI pipeline-কে প্রতিটি pull request-এ একাধিক security scans চালাতে হবে।126~127### SAST (Static Application Security Testing)128~129SAST tools source code execute না করে analyze করে, vulnerabilities নির্দেশ করে এমন patterns খোঁজে।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~161Semgrep-এর `p/owasp-top-ten` ruleset সবচেয়ে সাধারণ vulnerabilities ধরে: SQL injection, XSS, SSRF, path traversal, insecure deserialization, এবং আরও অনেক কিছু।162~163### SCA (Software Composition Analysis)164~165SCA আপনার dependencies পরিচিত vulnerabilities-এর জন্য scan করে। এটি অত্যন্ত গুরুত্বপূর্ণ - আধুনিক application code-এর 80%-এর বেশি open-source dependencies থেকে আসে।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### Trivy দিয়ে Container Security186~187আপনি যদি Docker images build করেন, তাহলে সেগুলোকে vulnerabilities-এর জন্য scan করা অপরিহার্য। **Trivy** সবচেয়ে জনপ্রিয় open-source container scanner।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### SBOM Generation215~216**Software Bill of Materials (SBOM)** আপনার application-এর প্রতিটি component-এর সম্পূর্ণ তালিকা। Compliance frameworks এবং সরকারি নিয়মাবলী দ্বারা ক্রমবর্ধমানভাবে প্রয়োজন (US Executive Order on Cybersecurity federal software-এর জন্য 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: Secure Docker Images239~240একটি production Docker image-কে least privilege নীতি অনুসরণ করা উচিত। একটি hardened 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মূল practices:279~2801. **Multi-stage builds ব্যবহার করুন**: builder stage-এ dev dependencies থাকে; runner stage-এ শুধু production code থাকে2812. **Root হিসেবে চালাবেন না**: একটি non-root user তৈরি করুন এবং সেখানে switch করুন2823. **Alpine images ব্যবহার করুন**: ছোট attack surface (default-এ কম packages installed)2834. **Image versions pin করুন**: supply chain attacks এড়াতে `node:latest`-এর বদলে `node:22-alpine`2845. **`npm ci` ব্যবহার করুন**: lock file থেকে deterministic installs, `npm install` নয়285~286## পর্যায় 5: Secret Management287~288Hard-coded secrets developer-caused incidents-এ breaches-এর এক নম্বর কারণ।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### Secret Management Hierarchy321~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প্রতিটি developer-এর OWASP Top 10 জানা উচিত। সংক্ষিপ্ত সংস্করণ:338~339| # | Vulnerability | এটি কী | প্রতিরোধ |340|---|--------------|-----------|------------|341| 1 | **Broken Access Control** | Users এমন resources access করে যা তাদের করা উচিত নয় | Default-এ deny করুন, server side-এ validate করুন |342| 2 | **Cryptographic Failures** | দুর্বল encryption, plaintext data | শক্তিশালী algorithms ব্যবহার করুন (AES-256, bcrypt), সর্বত্র TLS |343| 3 | **Injection** | SQL, NoSQL, OS command injection | Parameterized queries, input validation |344| 4 | **Insecure Design** | ত্রুটিপূর্ণ architecture | Threat modeling, secure design patterns |345| 5 | **Security Misconfiguration** | Default credentials, খোলা cloud buckets | Hardened defaults, automated config audits |346| 6 | **Vulnerable Components** | Dependencies-এ পরিচিত CVEs | SCA scanning, নিয়মিত updates |347| 7 | **Auth Failures** | দুর্বল passwords, ভাঙা sessions | MFA, rate limiting, secure session management |348| 8 | **Data Integrity Failures** | Unsigned updates, অবিশ্বস্ত CI/CD | Code signing, SBOM, pipeline integrity |349| 9 | **Logging Failures** | কোনো audit trail নেই | Structured logging, anomalies-এ alerting |350| 10 | **SSRF** | Server-side request forgery | Outbound URLs allowlist করুন, inputs validate করুন |351~352## সম্পূর্ণ GitHub Actions Security Workflow353~354একটি সম্পূর্ণ, production-ready workflow যা উপরের সবকিছু একত্রিত করে: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## Track করার Metrics449~450আপনার DevSecOps program কাজ করছে কিনা কীভাবে জানবেন? এই metrics track করুন:451~452- **Mean time to remediate (MTTR)**: detection-এর পর আপনি কত দ্রুত vulnerabilities ঠিক করেন453- **Vulnerability escape rate**: production-এ পৌঁছানো vulnerabilities-এর শতাংশ454- **False positive rate**: অত্যধিক false positives alert fatigue এবং উপেক্ষিত warnings-এর দিকে নিয়ে যায়455- **Dependency freshness**: আপনার dependencies-এর গড় বয়স (পুরনো = পরিচিত CVEs থাকার সম্ভাবনা বেশি)456- **SBOM coverage**: up-to-date SBOMs সহ projects-এর শতাংশ457~458## শুরু করা: একটি ব্যবহারিক Roadmap459~460সবকিছু একসাথে implement করার চেষ্টা করবেন না। পর্যায়ক্রমিক পদ্ধতি ভালো কাজ করে: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 আপনার pipeline-এ আরও tools যোগ করা সম্পর্কে নয় - এটি security-কে software তৈরির একটি স্বাভাবিক অংশ বানানো সম্পর্কে। লক্ষ্য প্রতিটি PR-কে security warnings দিয়ে block করা নয়, বরং developers-কে দ্রুত feedback দেওয়া যাতে তারা issues ঠিক করতে পারেন যখন code তাদের মনে তাজা থাকে।488~489বেসিক দিয়ে শুরু করুন: secrets-এর জন্য pre-commit hooks, CI-তে dependency scanning, এবং Docker images-এর জন্য container scanning। তারপর আপনার team-এর প্রয়োজন অনুসারে iterate করুন।490~491Security এমন একটি feature নয় যা আপনি একবার ship করেন। এটি একটি practice যা আপনি প্রতিটি commit-এ গড়ে তোলেন।492~493> **DevSecOps Starter Checklist:**494>495> - [x] Gitleaks pre-commit hooks installed496> - [x] .env এবং secret files .gitignore-এ497> - [x] CI pipeline-এ Semgrep SAST498> - [x] Dependency scanning-এর জন্য Snyk বা npm audit499> - [x] Container image scanning-এর জন্য Trivy500> - [x] Dockerfiles-এ non-root user501> - [x] Environment variables বা secret manager-এ secrets502> - [x] প্রতিটি release-এ SBOM generation503> - [x] পুরো team জুড়ে OWASP Top 10 সচেতনতা504~
NORMAL · devsecops-shift-left-security-guide.md [readonly]504 lines · :q to close