امنیت در 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 | عالی | عالی |
فعالسازی
- Settings → Password and authentication
- Two-factor authentication → Set up
- روش را انتخاب (Authenticator توصیه میشود)
- QR code را با Google Authenticator یا Authy اسکن کنید
- recovery codes را ذخیره کنید (در محل امن)
Personal Access Tokens (PAT)
PAT جایگزین password برای احراز هویت در API و git است.
دو نوع PAT
- Classic: scope-based، بدون محدودیت expiry، قدیمی
- Fine-grained (پیشنهاد): ریپو-سپسیفیک، expiry اجباری، granular permissions
ساخت Fine-grained PAT
- Settings → Developer settings → Personal access tokens → Fine-grained tokens
- Generate new token
- Token name (مثلاً “deploy-script”)
- Expiration (حداکثر 1 سال)
- Repository access: All repos یا Select
- Permissions:
- Contents: Read and write (برای git pull/push)
- Metadata: Read
- Pull requests: Read and write
- Generate token
- 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
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های امنیتی میفرستد
فعالسازی
- Settings → Code security and analysis
- Dependabot alerts: Enable
- Dependabot security updates: Enable
- 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 کند:
- Settings → Code security → Secret scanning
- 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 شد
- Rotate فوری: secret را revoke/regenerate کنید (هرگز فقط حذف کافی نیست)
- از تاریخچه پاک کنید با BFG (فصل ۶)
- چک کنید آیا کسی استفاده کرده (audit log)
Code Scanning با CodeQL
CodeQL کد را برای vulnerability اسکن میکند:
- SQL injection
- XSS
- path traversal
- hardcoded credentials
- buffer overflow
- … صدها rule
فعالسازی
- Settings → Code security and analysis
- 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 Security → Code 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
- Settings → SSH and GPG keys → New GPG key
- 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 پیدا میکنید:
- Security tab → Advisories → New draft security advisory
- عنوان و توضیحات
- Severity (Critical/High/Medium/Low)
- CVE ID (یا درخواست کنید)
- کارهای محرمانه با collaboratorهای امن
- هنگام آمادهسازی fix:
- private fork
- private PR
- release coordinated
- منتشر کردن 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
تاریخچه کامل از فعالیتها (برای سازمانها):
- Organization settings → Audit log
- 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.