المصادقة عبر OIDC إلى السحابة
المصادقة عبر OIDC إلى السحابة
كل خط تسليم يُنشر إلى AWS أو GCP أو Azure يحتاج إلى بيانات اعتماد سحابية. النهج التقليدي يخزّن مفاتيح وصول طويلة الأمد كأسرار في المستودع — مفاتيح قد تمتد لأشهر أو سنوات، قابلة للتسريب، وتتطلب تدويرًا يدويًا. انتقلت الصناعة بحزم بعيدًا عن هذا النهج. الطريقة الحديثة والمعيارية في شركات التقنية الكبرى هي المصادقة بلا مفاتيح عبر OpenID Connect (OIDC): تُولّد GitHub Actions رمزًا مؤقتًا موقّعًا تشفيريًا لكل تشغيل، ويُبادل مزود السحابة هذا الرمز ببيانات اعتماد محدودة الصلاحية والنطاق — دون تخزين أي سر ثابت.
كيف تعمل المصادقة بلا مفاتيح عبر OIDC
OpenID Connect هو طبقة هوية خفيفة فوق OAuth 2.0. تعمل GitHub بوصفها مزود الهوية (IdP)؛ وحسابك السحابي هو الطرف المعتمِد. تمر العملية بأربع خطوات:
- تُصدر نقطة نهاية OIDC في GitHub رمز JWT (JSON Web Token) موقّعًا يحتوي على بيانات تعريفية عن سير العمل: المستودع، الفرع، البيئة، المنفّذ، والـ SHA وغيرها.
- يُقدّم المُشغّل هذا الرمز إلى STS (خدمة رمز الأمان) لدى مزود السحابة.
- يتحقق STS من توقيع الرمز عبر JWKS المنشورة (المفاتيح العامة) ويقارن البيانات التعريفية بـسياسة الثقة التي هيّأتها مسبقًا.
- إذا تطابقت البيانات، يُعيد STS بيانات اعتماد قصيرة الأمد (عادةً 15-60 دقيقة). تستخدمها سير العمل ثم تنتهي صلاحيتها تلقائيًا عند انتهاء المهمة.
ضبط OIDC على AWS (Web Identity Federation)
تستخدم AWS IAM Web Identity federation. تُسجّل مزود OIDC الخاص بـ GitHub مرة واحدة في حسابك على AWS، ثم تُنشئ دورًا بسياسة ثقة تُقيّد أيَّ سير عمل على GitHub يحق له الانتحال.
جانب سير العمل في GitHub Actions
يحتاج سير العمل إلى شيئين: الصلاحية id-token: write (للسماح بطلب رمز JWT من نقطة نهاية OIDC) وإجراء aws-actions/configure-aws-credentials الذي يتولى عملية تبادل STS بالكامل بشكل شفاف.
sub في سياسة الثقة محددًا قدر الإمكان. استخدم repo:ORG/REPO:environment:production بدلًا من repo:ORG/REPO:ref:refs/heads/main — الربط بالبيئة يعني أن المهام التي تستهدف بيئة production المحمية (التي تتطلب موافقة بشرية) هي فقط من يمكنها انتحال الدور عالي الصلاحية. هذا يتكامل تمامًا مع ما تعلمناه في درس البيئات.GCP و Azure باختصار
ينطبق معيار OIDC ذاته على جميع السحابات الرئيسية؛ يتغير فقط سطح الإعداد.
- GCP (Workload Identity Federation): أنشئ Workload Identity Pool، أضف GitHub كمزود OIDC، اربطه بحساب خدمة عبر شرط IAM على تعيينات
attribute.repositoryوattribute.environment. استخدم إجراءgoogle-github-actions/authمعworkload_identity_providerوservice_account. - Azure (Federated Identity Credentials): سجّل تطبيقًا في Entra ID، أضف بيانات اعتماد مُدمجة مع مُصدر GitHub ونوع الكيان وفلتر Subject (
repo:ORG/REPO:environment:production). استخدم إجراءazure/loginمعclient-idوtenant-idوsubscription-id— بلا أي سر عميل.
مرجع بيانات سياسة الثقة
يحتوي رمز JWT الصادر من GitHub على بيانات تعريفية غنية يمكنك الفلترة عليها. معرفتها تتيح لك تصميم سياسات ثقة دقيقة:
sub— نص الموضوع الأساسي؛ صيغته تعتمد على ما أطلق التشغيل (فرع، وسم، بيئة، طلب سحب).repository—org/repo— موجود دائمًا.environment— اسم البيئة على مستوى المهمة؛ لا يظهر إلا حين تُعلن المهمة عن بيئة.ref— مرجع git (refs/heads/main).actor— مستخدم GitHub الذي أطلق التشغيل.job_workflow_ref— مرجع كامل لملف سير العمل الاستدعائي؛ ضروري لتقييد أيّ سير عمل قابل لإعادة الاستخدام يحق له انتحال دور معين.
"token.actions.githubusercontent.com:sub": "repo:ORG/REPO:*" (حرف بدل). هذا يسمح لأي فرع، وأي بيئة، وأي حدث تشغيل في ذلك المستودع بانتحال الدور — بما في ذلك سير عمل طلبات السحب من المُستودعات المتفرعة (Forks). قيّد دائمًا بالبيئة أو الفرع المحدد. سير العمل التي تُطلق من طلبات السحب وبإمكانها انتحال دور نشر على الإنتاج تُشكّل ثغرة حرجة في سلسلة التوريد.تشخيص أخطاء OIDC
تظهر أخطاء ضبط OIDC على شكل رسائل AccessDenied أو InvalidIdentityToken مبهمة. التشخيص المنهجي يوفّر ساعات:
- أضف خطوة قبل إجراء بيانات الاعتماد لفكّ تشفير الرمز الخام:
run: echo "$ACTIONS_ID_TOKEN_REQUEST_TOKEN" | cut -d. -f2 | base64 -d 2>/dev/null | python3 -m json.tool— يعرض لك البيانات التعريفية الدقيقة التي ترسلها GitHub. - قارن كل بيانة تعريفية في الرمز مع كل شرط في سياسة الثقة — أي تعارض في حرف واحد يتسبب في الرفض.
- تأكد من ضبط
id-token: writeعلى مستوى سير العمل أو المهمة؛ بدونه تُعيد نقطة نهاية OIDC خطأ 403 قبل أي استدعاء سحابي. - تحقق من أن البصمة (thumbprint) لم تتغير — تُدير GitHub أحيانًا شهادة توقيع OIDC الخاصة بها. تدعم AWS الآن التحقق التلقائي من البصمة إذا حذفت قائمتها (موصى به للإعدادات الجديدة).
أصبحت المصادقة بلا مفاتيح عبر OIDC المعيار الإلزامي لعمليات النشر السحابي على نطاق واسع. إزالة المفاتيح طويلة الأمد تُلغي فئة كاملة من حوادث تسريب بيانات الاعتماد وتُبسّط الوضع التوافقي — لا جداول لتدوير المفاتيح، ولا ثغرات في سجل المراجعة، ولا خطر الكشف الخاطئ عن ~/.aws/credentials.