~/icsd.ir — bash
SYSTEM_ONLINE

امنیت در GitHub

امنیت در GitHub چندلایه است: محافظت حساب با 2FA، اسکن خودکار dependency‌ها با Dependabot، تشخیص secret‌های لو رفته، اسکن کد برای vulnerability و امضای commit‌ها. این فصل همه این لایه‌ها را پوشش می‌دهد.

امنیت در GitHub چندلایه است: محافظت حساب با 2FA، اسکن خودکار dependency‌ها با Dependabot، تشخیص secret‌های لو رفته، اسکن کد برای vulnerability و امضای commit‌ها. این فصل همه این لایه‌ها را پوشش می‌دهد.

احراز هویت دومرحله‌ای (2FA)

اولین خط دفاع. GitHub از مارچ ۲۰۲۳ برای contributor‌های فعال 2FA را الزامی کرد.

روش‌های 2FA

روش امنیت راحتی
Authenticator app (Google، Authy، Microsoft) عالی خوب
SMS متوسط (SIM swap) عالی
Security Key (YubiKey، WebAuthn) بهترین متوسط
GitHub Mobile App عالی عالی

فعال‌سازی

  1. Settings → Password and authentication
  2. Two-factor authentication → Set up
  3. روش را انتخاب (Authenticator توصیه می‌شود)
  4. QR code را با Google Authenticator یا Authy اسکن کنید
  5. recovery codes را ذخیره کنید (در محل امن)
هشدار: Recovery codes را در یک password manager ذخیره کنید. اگر گوشی گم شد و recovery نداشتید، بازیابی حساب بسیار سخت می‌شود.

Personal Access Tokens (PAT)

PAT جایگزین password برای احراز هویت در API و git است.

دو نوع PAT

  • Classic: scope-based، بدون محدودیت expiry، قدیمی
  • Fine-grained (پیشنهاد): ریپو-سپسیفیک، expiry اجباری، granular permissions

ساخت Fine-grained PAT

  1. Settings → Developer settings → Personal access tokens → Fine-grained tokens
  2. Generate new token
  3. Token name (مثلاً “deploy-script”)
  4. Expiration (حداکثر 1 سال)
  5. Repository access: All repos یا Select
  6. Permissions:
    • Contents: Read and write (برای git pull/push)
    • Metadata: Read
    • Pull requests: Read and write
  7. Generate token
  8. Token را copy کنید (یک‌بار قابل دیدن!)

استفاده

# در git
git clone https://USERNAME:TOKEN@github.com/USER/repo.git

# یا ذخیره با credential helper
git config --global credential.helper store

# در API
curl -H "Authorization: Bearer ghp_xxxxx" 
     https://api.github.com/user/repos
هرگز PAT را commit نکنید! در .env بگذارید و .env را در .gitignore قرار دهید.

SSH Keys امن‌تر

SSH از PAT امن‌تر است چون private key هرگز شبکه را ترک نمی‌کند:

# ساخت با passphrase (پیشنهاد)
ssh-keygen -t ed25519 -C "you@example.com"
# Enter passphrase: ✅ یک passphrase قوی بدهید

# مدیریت با ssh-agent
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
# یک‌بار passphrase بدهید، تا zaman session حفظ می‌شود

SSH key‌های ریپو-سپسیفیک

Deploy keys برای CI یا server‌های خاص:

# ساخت key بدون passphrase (برای automation)
ssh-keygen -t ed25519 -f ~/.ssh/deploy_key -N ""

# اضافه کردن public key به ریپو خاص
# Settings → Deploy keys → Add deploy key
# نام: "Production Server"
# تیک "Allow write access" اگر push نیاز هست
# paste public key

# روی سرور
echo "Host github.com-deploy
  HostName github.com
  User git
  IdentityFile ~/.ssh/deploy_key" >> ~/.ssh/config

git clone git@github.com-deploy:USER/repo.git

Dependabot – اسکن Dependencies

Dependabot به‌طور خودکار:

  • Dependencies را برای vulnerability چک می‌کند
  • PR‌های آپدیت می‌سازد
  • Alert‌های امنیتی می‌فرستد

فعال‌سازی

  1. Settings → Code security and analysis
  2. Dependabot alerts: Enable
  3. Dependabot security updates: Enable
  4. Dependabot version updates: نیاز به config

config برای version updates

# .github/dependabot.yml
version: 2
updates:
  # Python (pip)
  - package-ecosystem: "pip"
    directory: "/"
    schedule:
      interval: "weekly"
      day: "monday"
      time: "06:00"
    open-pull-requests-limit: 10
    reviewers:
      - "alice"
    labels:
      - "dependencies"
      - "python"
    commit-message:
      prefix: "chore(deps)"
    groups:
      django:
        patterns:
          - "django*"
        update-types:
          - "minor"
          - "patch"
  
  # JavaScript (npm)
  - package-ecosystem: "npm"
    directory: "/frontend"
    schedule:
      interval: "weekly"
    versioning-strategy: increase
    ignore:
      - dependency-name: "react"
        versions: ["19.x"]    # نسخه خاصی را ignore کن
  
  # GitHub Actions
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "monthly"
  
  # Docker
  - package-ecosystem: "docker"
    directory: "/"
    schedule:
      interval: "weekly"

پشتیبانی Dependabot

  • Bundler (Ruby)
  • Cargo (Rust)
  • Composer (PHP)
  • Docker
  • Elm
  • git submodule
  • GitHub Actions
  • Go modules
  • Gradle (Java)
  • Maven (Java)
  • Mix (Elixir)
  • npm (Node.js)
  • NuGet (.NET)
  • pip (Python)
  • Pub (Dart/Flutter)
  • Terraform

Secret Scanning

GitHub خودکار push‌های شما را برای secret‌های شناخته‌شده اسکن می‌کند:

  • AWS keys (AKIA…)
  • Stripe API keys
  • Google Cloud keys
  • Azure tokens
  • GitHub tokens (ghp_, gho_)
  • OpenAI API keys
  • … ۲۰۰+ pattern

Push Protection

به‌جای detect کردن بعد از push، می‌تواند push را قبل از انجام block کند:

  1. Settings → Code security → Secret scanning
  2. Push protection: Enable
# تلاش push با secret
git push
# remote: error: GH013: Repository rule violations found
# remote:    - GITHUB-PUSH-PROTECTION: AWS Access Key ID detected
# remote:      Location: src/config.py:42

اگر اشتباهاً secret push شد

  1. Rotate فوری: secret را revoke/regenerate کنید (هرگز فقط حذف کافی نیست)
  2. از تاریخچه پاک کنید با BFG (فصل ۶)
  3. چک کنید آیا کسی استفاده کرده (audit log)

Code Scanning با CodeQL

CodeQL کد را برای vulnerability اسکن می‌کند:

  • SQL injection
  • XSS
  • path traversal
  • hardcoded credentials
  • buffer overflow
  • … صدها rule

فعال‌سازی

  1. Settings → Code security and analysis
  2. Code scanning → Set up → Default

یا با workflow

# .github/workflows/codeql.yml
name: CodeQL

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]
  schedule:
    - cron: '0 6 * * 1'   # هر دوشنبه

jobs:
  analyze:
    runs-on: ubuntu-latest
    permissions:
      security-events: write
    
    strategy:
      fail-fast: false
      matrix:
        language: ['python', 'javascript']
    
    steps:
      - uses: actions/checkout@v4
      
      - name: Initialize CodeQL
        uses: github/codeql-action/init@v3
        with:
          languages: ${{ matrix.language }}
          queries: security-and-quality
      
      - name: Autobuild
        uses: github/codeql-action/autobuild@v3
      
      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v3

نتایج در tab SecurityCode scanning alerts ظاهر می‌شوند.

Signed Commits با GPG

Commit signing تأیید می‌کند که commit واقعاً از طرف شماست (نه کسی که git config user.email را عوض کرده):

۱. ساخت GPG key

gpg --full-generate-key

# گزینه‌ها:
# Type: RSA and RSA (default)
# Size: 4096
# Expire: 1y یا 0 (هرگز)
# نام و ایمیل (همان GitHub)
# passphrase

۲. لیست keys

gpg --list-secret-keys --keyid-format=long
# /home/user/.gnupg/secring.gpg
# sec   rsa4096/3AA5C34371567BD2 2026-05-01
#                  ^^^^^^^^^^^^^^^^ این key ID

۳. Export public key

gpg --armor --export 3AA5C34371567BD2

# -----BEGIN PGP PUBLIC KEY BLOCK-----
# ...
# -----END PGP PUBLIC KEY BLOCK-----

۴. اضافه به GitHub

  1. Settings → SSH and GPG keys → New GPG key
  2. paste public key

۵. تنظیم Git

git config --global user.signingkey 3AA5C34371567BD2
git config --global commit.gpgsign true       # خودکار sign همه commit‌ها
git config --global tag.gpgsign true          # تگ‌ها هم

۶. تست

git commit -m "Test signed commit"

git log --show-signature -1
# commit a3f4b2c... (HEAD -> main)
# gpg: Good signature from "Mohammad Ali"

در GitHub، روی commit، badge Verified ظاهر می‌شود.

SSH signing (آسان‌تر، Git 2.34+)

# اگر SSH key دارید، می‌توانید با آن sign کنید
git config --global gpg.format ssh
git config --global user.signingkey ~/.ssh/id_ed25519.pub
git config --global commit.gpgsign true

# در GitHub: Settings → SSH and GPG keys → New SSH key → Type: Signing key

SECURITY.md

راهنمای گزارش vulnerability:

# SECURITY.md

## نسخه‌های پشتیبانی‌شده

| Version | Supported          |
| ------- | ------------------ |
| 2.x     | :white_check_mark: |
| 1.x     | :x:                |

## گزارش vulnerability

لطفاً مشکلات امنیتی را **به‌صورت خصوصی** گزارش دهید:

- ایمیل: security@example.com
- یا از طریق "Report a vulnerability" در tab Security

ما **در ۲۴ ساعت** پاسخ می‌دهیم. لطفاً vulnerability را عمومی نکنید 
تا پچ آماده شود.

### چه چیزی شامل می‌شود

- نوع مشکل (SQL injection، XSS، …)
- مسیر فایل
- مراحل بازتولید
- تأثیر احتمالی

ما برنامه bug bounty نداریم اما در CHANGELOG و releases از 
گزارش‌دهنده تشکر می‌کنیم.

Security Advisories

وقتی vulnerability پیدا می‌کنید:

  1. Security tab → Advisories → New draft security advisory
  2. عنوان و توضیحات
  3. Severity (Critical/High/Medium/Low)
  4. CVE ID (یا درخواست کنید)
  5. کارهای محرمانه با collaborator‌های امن
  6. هنگام آماده‌سازی fix:
    • private fork
    • private PR
    • release coordinated
  7. منتشر کردن advisory

Branch Protection برای امنیت

یادآوری از فصل ۵، با تأکید روی امنیت:

  • Require signed commits
  • Require status checks (CI)
  • Require code review (≥2 reviewer)
  • Dismiss stale reviews on push
  • Require review from CODEOWNERS
  • Restrict who can push
  • Include administrators

Audit Log

تاریخچه کامل از فعالیت‌ها (برای سازمان‌ها):

  1. Organization settings → Audit log
  2. filter بر اساس action، actor، تاریخ

مفید برای: تشخیص دسترسی غیرمجاز، compliance، تحقیقات.

چک‌لیست امنیتی

مورد وضعیت
2FA حساب فعال الزامی
SSH key با passphrase الزامی
PAT با expiry محدود الزامی
main protected الزامی
Dependabot alerts الزامی
Dependabot security updates الزامی
Secret scanning + push protection الزامی
Code scanning (CodeQL) توصیه
Signed commits توصیه
SECURITY.md توصیه
Audit log review (سازمانی) توصیه
Required reviewers (CODEOWNERS) توصیه
.gitignore با .env، *.pem الزامی
Environment‌های protected توصیه

بهترین شیوه‌ها

  • 2FA با Authenticator app (نه SMS)
  • password manager برای رمز و recovery codes
  • هرگز secret در commit – rotate فوری اگر اشتباه شد
  • token‌های با کم‌ترین scope لازم
  • fine-grained PAT به‌جای classic
  • signed commits در پروژه‌های critical
  • Dependabot روزانه – با تست خودکار
  • Code scanning در CI
  • SECURITY.md مشخص
  • review کردن audit log به‌صورت دوره‌ای

جمع‌بندی

  • 2FA اولین خط دفاع
  • Fine-grained PAT با expiry
  • SSH key با passphrase
  • Dependabot برای آپدیت dependencies
  • Secret scanning + push protection
  • CodeQL برای vulnerability اسکن کد
  • Signed commits با GPG یا SSH
  • SECURITY.md و Security Advisories
  • Branch protection با امنیت

در فصل بعد، GitHub Pages برای میزبانی رایگان سایت و Wiki برای documentation.

نمایش سایت

رنگ سایت
حالت نمایش
اندازهٔ متن
خوانایی

این تنظیمات فقط روی مرورگر شما ذخیره می‌شود.