وضعية OpenSSF Scorecard
هدف Apothem في OpenSSF Scorecard وأسطح الأدلّة المُستخدَمة لإبقاء الدرجة في تحسّن.
يستهدف Apothem أعلى درجة في OpenSSF Scorecard مع إبقاء الواجهة العامة صادقة بشأن ما يستطيع Scorecard استنتاجه وما لا يستطيع من مستودع جديد بمشرف واحد. يُعدّد هذا المستند كل فحص، وسطح الأدلّة الذي يسنده، والضابط الذي يُبقي الوضعية محدّثة.
الدرجة الحيّة موجودة في عارض Scorecard؛ والشارة موجودة في ترويسة README.
مصفوفة الأدلّة لكل فحص
| الفحص | سطح الأدلّة | ملاحظات |
|---|---|---|
| Binary-Artifacts | binary-artifacts-sweep.md | لا يُتتبَّع أي ملف ثنائي قابل للتنفيذ في المصدر؛ وتبقى أرشيفات التوزيع المُولَّدة في dist/. |
| Branch-Protection | branch-protection-ruleset.md | يكون main محميًّا قبل الترقية إلى إصدار عام؛ وتُحظَر عمليات الدفع بالقوة والحذف بعد وصول كوميت الإصدار الجديد. |
| CI-Tests | .github/workflows/ci.yml | مصفوفة Pytest، وruff، وmypy، وTrivy، وبناء الوثائق، وفحوص دخان التحزيم. |
| CII-Best-Practices | التسجيل في OpenSSF Best Practices | يتطلّب تسجيلًا من جانب المُشرِف على موقع OpenSSF Best Practices؛ ولا يمكن إتمام ذلك بملفات المستودع وحدها. |
| Code-Review | حماية الفرع + CODEOWNERS | طلبات السحب مطلوبة لـ main للجميع باستثناء مسؤولي المستودع، وتشترط حماية الفرع 0 مراجعات موافِقة ما دام للمشروع مُشرِف واحد (راجع branch-protection-ruleset.md)؛ ويبقى سجلّ Scorecard محدودًا إلى أن توجد طلبات سحب مُراجَعة. |
| Contributors | AUTHORS | لا يستطيع مشروع جديد بمُشرِف منفرد اصطناع سجلّ مساهمات من عدّة مؤسسات؛ ويتحسّن هذا طبيعيًا مع انضمام المساهمين. |
| Dangerous-Workflow | تدقيق سِيَر العمل | لا يوجد pull_request_target؛ وActions مُثبَّتة ببصمات SHA ومحصورة بصلاحيات صريحة. |
| Dependency-Update-Tool | .github/dependabot.yml | يقترح Dependabot تحديثات أسبوعية مُجمَّعة لتثبيتات GitHub Actions، والموقع الإلكتروني، وملف القفل الخاص بمُحزِّم vsce، وpip المقفول بالبصمات في CI، وخطّافات pre-commit، وتحديثات شهرية لملف القفل الخاص بـ channel-smoke؛ وتغطّي تحديثات الأمان في Dependabot كل ملف بيان مُكتشَف، باستثناء المجموعات الكاملة المقفولة من اعتماديات CI وأدواتها في scripts/ci/، والتي يُعيد scripts/dev/refresh_ci_locks.py توليدها عندما يُسمّي تنبيهٌ حزمةً مقفولة. ويُبقي .gitattributes هذا الملف وحده في أرشيفات المصدر على GitHub، وهي الأرشيفات التي يقرؤها أي فحص يعمل في وضع الأرشيف الافتراضي لإجراء Scorecard؛ أمّا سير عمل Scorecard فيعمل في وضع git ويقرأ الملف من النسخة المستنسخة. |
| Fuzzing | tests/property/ | تختبر اختبارات الخصائص في Hypothesis ثوابت المُحلِّل وfrontmatter؛ وقد لا يحتسب Scorecard في المنبع Hypothesis بوصفه تكاملًا لأداة التشويش (fuzzer). |
| License | LICENSE | رخصة MIT في جذر المستودع. |
| Maintained | تاريخ Git | يُظهِر كوميت الإصدار الحالي ووتيرة سِيَر العمل النشطة الصيانةَ؛ وقد تتلقّى المستودعات الحديثة جدًا تحذيرًا بشأن العمر. |
| Packaging | .github/workflows/ | سِيَر عمل الإصدار وPages وnpmjs.com التي تُنتِج sdist وwheel وSBOM ومنشأ SLSA وتواقيع Sigstore. |
| Pinned-Dependencies | تدقيق سِيَر العمل + متطلّبات مقفولة بالبصمات | Actions مُثبَّتة ببصمات SHA؛ ويجري تثبيت أدوات الإصدار، وترقية pip في CI، واعتماديات المشروع والاختبارات في CI، وأدوات CI (ruff، وbandit، وpip-audit، وpip-licenses، وpre-commit) باستخدام --require-hashes. وتقرأ عمليات تثبيت المشروع والاختبارات والأدوات ملفات القفل التسعة في scripts/ci/؛ وتقرأ ترقية pip وأدوات الإصدار كلٌّ منهما ملف قفل خاصًّا به، وتُثبَّت الحزمة نفسها عبر --no-deps -e .. |
| SAST | .github/workflows/codeql.yml | استعلامات security-extended في CodeQL عبر Python وActions. |
| Security-Policy | SECURITY.md | سياسة الإفصاح المنسّق، ومصفوفة النسخ المدعومة، والجدول الزمني للاستجابة. |
| Signed-Releases | .github/workflows/release.yml | تواقيع Sigstore بلا مفاتيح، ومنشأ SLSA، وSBOM، ومجاميع التحقّق، ومُنتَجات الإصدار. |
| Token-Permissions | تدقيق سِيَر العمل | تعتمد سِيَر العمل افتراضيًا صلاحيات القراءة فقط؛ ونطاقات الكتابة محلّية للمهمّة ومرتبطة بعمليات النشر والتحزيم. |
| Vulnerabilities | .github/workflows/pip-audit.yml + .github/workflows/dependency-review.yml | فحص أسبوعي للثغرات وفحص في CI مع رفع SARIF؛ وتحجب بوابة dependency-review طلبات السحب التي تُدخِل اعتماديات معرّضة للثغرات أو ذات تراخيص غير مسموح بها. ويبحث الفحص نفسه في OSV عن الاعتماديات التي يجدها في ملفات البيان في المستودع، لذا يستعلم pip-audit.yml من OSV أيضًا (pip-audit -s osv)، فتطابق كل نتيجة هناك نتيجةً في الفحص. |
تفسير الدرجة
يمنح Scorecard كل فحص درجة على مقياس من 0 إلى 10، والدرجة الإجمالية متوسط مرجَّح. تُتتبَّع الضوابط التي تعتمد على تاريخ المستودع أو التسجيل لدى طرف ثالث أو تنوّع المساهمين تتبّعًا صريحًا بدلًا من المبالغة في ادّعائها. ويُطلِق الانحراف في أي فحص خاضع للتحكّم عبر الملفات معالجةً فورية.
يُشغّل سير عمل Scorecard الإجراءَ مع file_mode: git، فيقرأ Scorecard نسخة مستنسخة من المستودع. وتستبعد أرشيفات المصدر المجلد .github/ (export-ignore في .gitattributes)، لذا كان وضع الأرشيف الافتراضي للإجراء سيُخفي سِيَر العمل عن Dangerous-Workflow، وToken-Permissions، وPinned-Dependencies، وPackaging.
يبقى Pinned-Dependencies دون 10 عن قصد، لسببين. يُشار إلى مُولِّد SLSA بوسم إصداره، وهو الاستثناء الوحيد من التثبيت ببصمات SHA، لأن منشأه مربوط بذلك الوسم. ويُثبِّت سير عمل evals أداة Claude Code CLI باستخدام npm install --global بإصدار يُختار في كل تشغيل. أمّا عمليات تثبيت Python التي يفحصها Scorecard في سِيَر العمل، فهي إمّا مقفولة بالبصمات، وإمّا تثبيتات محلّية للحزمة نفسها أو لحزم wheel مبنيّة في التشغيل نفسه.
وتيرة التحديث
- مع كل دفع: يُعاد تشغيل سير عمل Scorecard مع كل دفع إلى
main. - أسبوعيًا: أيام الاثنين الساعة 02:30 UTC — يلتقط التغييرات في منهجية التقييم لدى المصدر الأصلي + الثغرات الجديدة المُفصَح عنها في الاعتماديات المُثبَّتة الحالية.
- مع كل إصدار: قبل الترقية العامة، يتحقّق المشرف من سطح عارض Scorecard الحيّ ويُسجّل أي حدود لحالة المنصّة.
المراجع
- OpenSSF Scorecard — المشروع الأصلي
- مرجع فحوص Scorecard — دلالات كل فحص
ossf/scorecard-action— غلاف GitHub Actions- إطار SLSA — مستويات سلسلة التوريد (يُشحَن apothem عند المستوى SLSA-3)