إدارة الأسرار وأمان البنية التحتية

أسرار GitHub ومصادقة OIDC

4 دقيقة للقراءة

GitHub يوفر إدارة أسرار مدمجة لـ CI/CD. بالاقتران مع OIDC (OpenID Connect)، يمكنك التخلص من بيانات الاعتماد طويلة العمر تماماً.

نظرة عامة على أسرار GitHub

نوع السر النطاق حالة الاستخدام
أسرار المستودع مستودع واحد مفاتيح API، رموز النشر
أسرار البيئة بيئة محددة الإنتاج مقابل التجهيز
أسرار المنظمة مستودعات متعددة بيانات اعتماد مشتركة

إدارة أسرار المستودع

عبر واجهة GitHub

  1. اذهب إلى SettingsSecrets and variablesActions
  2. انقر New repository secret
  3. أدخل الاسم (مثل 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 الإنتاج

تكوين البيئات في SettingsEnvironments:

  • إضافة المراجعين المطلوبين
  • تعيين قيود فرع النشر
  • إضافة أسرار خاصة بالبيئة

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 الأصلية المؤسسات، متعدد السحابات

بعد ذلك، سنغطي فحص أمان البنية التحتية كرمز. :::

اختبار

الوحدة 5: إدارة الأسرار وأمان البنية التحتية

خذ الاختبار