إدارة الأسرار وأمان البنية التحتية
أسرار GitHub ومصادقة OIDC
4 دقيقة للقراءة
GitHub يوفر إدارة أسرار مدمجة لـ CI/CD. بالاقتران مع OIDC (OpenID Connect)، يمكنك التخلص من بيانات الاعتماد طويلة العمر تماماً.
نظرة عامة على أسرار GitHub
| نوع السر | النطاق | حالة الاستخدام |
|---|---|---|
| أسرار المستودع | مستودع واحد | مفاتيح API، رموز النشر |
| أسرار البيئة | بيئة محددة | الإنتاج مقابل التجهيز |
| أسرار المنظمة | مستودعات متعددة | بيانات اعتماد مشتركة |
إدارة أسرار المستودع
عبر واجهة GitHub
- اذهب إلى Settings ← Secrets and variables ← Actions
- انقر New repository secret
- أدخل الاسم (مثل
AWS_ACCESS_KEY_ID) والقيمة
عبر GitHub CLI
# تعيين سر
gh secret set AWS_ACCESS_KEY_ID
# تعيين من ملف
gh secret set AWS_SECRET_ACCESS_KEY < secret.txt
# سرد الأسرار
gh secret list
# حذف سر
gh secret delete AWS_ACCESS_KEY_ID
استخدام الأسرار في سير العمل
# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: us-east-1
- name: Deploy to S3
run: aws s3 sync ./dist s3://my-bucket
الأسرار الخاصة بالبيئة
# أسرار مختلفة لكل بيئة
jobs:
deploy:
runs-on: ubuntu-latest
environment: production # يستخدم أسرار الإنتاج
steps:
- name: Deploy
run: ./deploy.sh
env:
API_KEY: ${{ secrets.API_KEY }} # مفتاح API الإنتاج
تكوين البيئات في Settings ← Environments:
- إضافة المراجعين المطلوبين
- تعيين قيود فرع النشر
- إضافة أسرار خاصة بالبيئة
OIDC: مستقبل مصادقة CI/CD
OIDC يلغي بيانات الاعتماد الثابتة باستخدام رموز قصيرة العمر:
┌──────────────────┐ ┌─────────────────┐
│ GitHub Actions │ │ مزود السحابة │
│ سير العمل │ │ (AWS, GCP, etc) │
└────────┬─────────┘ └────────┬────────┘
│ │
│ 1. طلب رمز OIDC │
│ ─────────────────────▶ │
│ │
│ 2. التحقق مع GitHub │
│ ◀───────────────────── │
│ │
│ 3. إصدار بيانات اعتماد │
│ قصيرة العمر │
│ ◀───────────────────── │
│ │
│ 4. استخدام بيانات │
│ الاعتماد │
│ ─────────────────────▶ │
│ │
OIDC مع AWS
# لا حاجة لبيانات اعتماد ثابتة!
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
id-token: write # مطلوب لـ OIDC
contents: read
steps:
- uses: actions/checkout@v4
- name: Configure AWS credentials (OIDC)
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789012:role/GitHubActionsRole
aws-region: us-east-1
# لا aws-access-key-id أو aws-secret-access-key!
- name: Deploy
run: aws s3 sync ./dist s3://my-bucket
إعداد دور AWS IAM
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
},
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:myorg/myrepo:*"
}
}
}
]
}
OIDC مع Google Cloud
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
id-token: write
contents: read
steps:
- uses: actions/checkout@v4
- name: Authenticate to Google Cloud
uses: google-github-actions/auth@v2
with:
workload_identity_provider: 'projects/123456789/locations/global/workloadIdentityPools/github/providers/github'
service_account: 'github-actions@my-project.iam.gserviceaccount.com'
- name: Deploy to Cloud Run
run: gcloud run deploy my-service --image gcr.io/my-project/my-app
أفضل ممارسات أمان الأسرار
1. لا تسجل الأسرار أبداً
# GitHub يخفي الأسرار تلقائياً، لكن كن حذراً
- name: Debug
run: |
# سيء: يمكن أن يتسرب في رسائل الخطأ
curl -H "Authorization: Bearer ${{ secrets.TOKEN }}" https://api.example.com
# أفضل: استخدم متغيرات البيئة
curl -H "Authorization: Bearer $TOKEN" https://api.example.com
env:
TOKEN: ${{ secrets.TOKEN }}
2. حدد نطاق السر
# اكشف الأسرار فقط للخطوات التي تحتاجها
jobs:
build:
steps:
- name: Build
run: npm run build
# لا أسرار هنا - مجرد بناء
deploy:
needs: build
environment: production
steps:
- name: Deploy
run: ./deploy.sh
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
3. استخدم حماية البيئة
# طلب الموافقة لنشر الإنتاج
jobs:
deploy:
environment:
name: production
url: https://myapp.com
# المراجعون يجب أن يوافقوا قبل تشغيل الوظيفة
4. دوّر الأسرار بانتظام
# أتمت تدوير الأسرار
gh secret set API_KEY --body "$(generate-new-key)"
# أو استخدم OIDC لتجنب التدوير تماماً
مقارنة: أسرار GitHub مقابل Vault
| الجانب | أسرار GitHub | HashiCorp Vault |
|---|---|---|
| التعقيد | بسيط | معقد |
| الأسرار الديناميكية | لا | نعم |
| تسجيل التدقيق | أساسي | شامل |
| متعدد السحابات | GitHub فقط | أي منصة |
| الأفضل لـ | سير عمل GitHub الأصلية | المؤسسات، متعدد السحابات |
بعد ذلك، سنغطي فحص أمان البنية التحتية كرمز. :::