GitHub Actions / المشاركة والسلطة المحدودة / الدرس 8
أذونات GITHUB_TOKEN ونطاق الأسرار
امنح كل مهمة سلطتها اللازمة وافهم قصور التنقيح.
في هذه الصفحة
أهداف الدرس
- مراجعة أذونات السير والمهمة.
- فصل أسرار المستودع والبيئة والمؤسسة.
يبقى الرمز المدمج سلطة
توفر GitHub رمز GITHUB_TOKEN للمصادقة في سير العمل وفق النطاق والعمر الموثقين. وقد يصل الإجراء إلى الرمز من github.token حتى إذا لم يمرره الكاتب صراحة كمدخل. لذلك لا يثبت غياب وسيط token أن الإجراء بلا سلطة على المستودع. لا يحتاج فحص منسق Parcel إنشاء قضية أو نشر إصدار. أعلن أقل أذونات تلزم للمهمة، وراجع افتراضات المؤسسة الفعلية. تذكر أيضاً أن القيود الخاصة بالحدث قد تخفض الأذونات المتاحة أكثر، وأن صلاحية الإجراء لقراءة المصدر لا تعني حاجته إلى تعديل محتوى المستودع.
استخدم افتراضاً مقيداً واستثناء المهمة
يقدم تصريح أذونات مقيد على مستوى السير نقطة بداية واضحة، ثم تعلن كل مهمة القدرات المحددة اللازمة لمسؤوليتها. عند ذكر أسماء الأذونات تصبح غير المذكورة عادة none وفق القواعد والاستثناءات الموثقة، ومنها سلوك بيانات metadata. لا تعالج كل رفض API بإضافة write-all. حدد أولاً العملية والمورد ونوع الرمز وسياسة الحدث الفعلية. قراءة محتوى المستودع ليست نشر حزمة أو تعديل طلب دمج أو طلب رمز هوية OIDC. يساعد هذا التفصيل على إسناد السلطة للمهمة الصحيحة بدلاً من توسيعها لكل خطوات التحقق.
permissions:
contents: read
jobs:
inspect:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- run: printf "%s\n" "read-only fixture review"
لا يمنح المقطع كتابة في تصريحه ولا يستدعي API. يعتمد الفعلي على السياسة والحدث. لا يُفعل ولا يُحصل على رمز.
يحدد موضع السر توفره
تختلف قواعد الوصول إلى أسرار المستودع والمؤسسة والبيئة. ترتبط أسرار البيئة بالمهام التي تشير إليها وبالحماية المضبوطة لها. وقد تحجب أحداث النسخ المتفرعة وغيرها من السياقات قليلة الثقة الأسرار، بينما تحتاج إعادة استخدام السير إلى تمرير مقصود وفق قواعدها. قد ينتج مرجع السر الغائب نصاً فارغاً، فتحقق من وجوده دون طباعة قيمته. لا تنقل السر إلى مستوى أوسع لمجرد إنجاح مهمة قبل فهم سبب حجبه في النطاق الأصلي. فقد يكون المنع دليلاً على حد ثقة صحيح، لا عطلاً في إدارة الأسرار.
التنقيح طبقة رؤية أخيرة
تحاول الأقنعة إخفاء قيم أسرار معروفة في السجلات، لكن التحويل والترميز والتقسيم أو إدراج القيمة في ناتج قد يتجاوز حماية العرض. تجنب طباعة البيئة والسياقات كاملة وكتابة الاعتمادات داخل ملفات التقارير. يبقى تمثيل base64 مادة حساسة؛ فهو ترميز وليس تشفيراً يضمن السرية. إذا انكشفت قيمة فعلى صاحب الاعتماد إلغاؤها أو تدويرها بالمسار المعتمد. لا يبطل تعديل سطر سجل رمزاً نُسخ بالفعل، ولا يعكس فعلاً خارجياً أنجزه حامل الرمز. ينبغي أن تقلل الوقاية فرص التعرض قبل الاعتماد على تنقيح المخرجات.
افحص المتطلبات محلياً
يقارن البرنامج المحلي الكامل متطلبات مهمة بمجموعة قدرات معلنة، فيوضح مراجعة أقل صلاحية دون قراءة رمز حقيقي أو استدعاء API. يعتمد تفويض GitHub الفعلي أيضاً على ملكية المورد ونوع الرمز وقيود الحدث وإعداد المستودع وسياسة المؤسسة، لذلك لا يتنبأ حساب المجموعات بكل نتيجة. استخدم الرفض للتحقيق في هذه الطبقات بدلاً من توسيع الأذونات عشوائياً. وافصل فشل نشر تقرير عن فشل اختبار التطبيق، كي لا يؤدي منح سلطة التقرير إلى توسيع سلطة مهمة التحقق كلها أو إخفاء النتيجة الأصلية للاختبارات.
granted = {"contents:read"}
tasks = {"inspect-source": {"contents:read"}, "publish-release": {"contents:write"}}
for task, required in tasks.items():
print(task, required <= granted)
inspect-source True
publish-release False
النصوص أسماء قدرات افتراضية لا نتيجة فحص رمز. لا يُنشأ سر ولا يطبع أو يسترجع أو يستخدم.
الأخطاء الشائعة وإصلاحها
يُعد الإجراء بلا رمز لغياب المدخل.
- لماذا يحدث؟
- أُهمل مسار github.token.
- كيف تصلحه؟
- راجع الثقة والأذونات الفعلية.
- كيف تتجنب تكراره؟
- قلل سلطة الرمز قبل الاعتماد.
يؤدي رفض API إلى write-all للجميع.
- لماذا يحدث؟
- لم تحدد العملية والمورد.
- كيف تصلحه؟
- امنح أصغر قدرة للمهمة الموثوقة المسؤولة.
- كيف تتجنب تكراره؟
- وثق مبرر كل قدرة مميزة.
تُرفع قيمة base64 كتشخيص غير حساس.
- لماذا يحدث؟
- اختلط الترميز بالسرية.
- كيف تصلحه؟
- أزل التعرض ونسق التدوير مع المالك.
- كيف تتجنب تكراره؟
- أبعد القيم عن السجلات والنواتج بكل تمثيل.
اختبر فهمك
1. يقرأ المنسق وينشر آخر الإصدار. هل يحتاج الاثنان كتابة؟
اعرض الحل المشروح
لا. قلل سلطة التحقق وامنح النشر للمهمة الموثوقة بعد أدلتها وحمايتها. راجع أيضاً تنفيذها مصدراً أو اعتماداً غير موثوق.
2. يرى اختبار متفرع سراً فارغاً. هل نوسع النطاق أولاً؟
اعرض الحل المشروح
لا. حدد الثقة والتوفر الموثق؛ قد يكون المنع صحيحاً. استخدم تجهيزاً مضبوطاً أو مساراً موثوقاً منفصلاً بدل عبور الحد للراحة.
أهم ما تعلمته
- لا يعني غياب المدخل غياب السلطة.
- النطاق والأذونات والثقة والإخفاء ضوابط مستقلة.