الأمان
وضعية الأمان في Apothem — هدف OpenSSF Scorecard، والإبلاغ عن الثغرات، وأسطح التقوية.
تقوم وضعية الأمان في Apothem على خمس ركائز: تقوية سلسلة التوريد، والاستجابة للثغرات، وحماية الفرع، وتوقيع الإصدارات، والتحليل الأمني المستمر. يوثّق هذا القسم كل سطح.
نموذج التهديد
Apothem مُجسِّد إعدادات. يقرأ ملفًا تعريفيًا مشتركًا ويكتب ملفات إعداد أصلية لأُطُر العمل في الأدلة التي يقرأها كل إطار عمل. وتلك الوظيفة الواحدة تحدّد ما يثق به وما لا يثق به.
- ما يثق به Apothem. الملف التعريفي المشترك الذي تؤلّفه، وشجرة المصدر المُضمَّنة التي يضعها المُثبِّت. الملف التعريفي هو نيّتك المُعلَنة؛ ويعامله المحرّك بوصفه مُدخَلًا مرجعيًا بعد التحقّق منه عبر المخطط.
- ما لا يثق به Apothem. لا يصل محتوى الملف التعريفي إلى نظام الملفات إلا بعد التحقّق: إخفاقات المخطط، ومُعرِّفات أُطُر العمل غير المعروفة، ومسارات المشروع غير الآمنة، ومصادر البيان المفقودة، واجتياز مسار الهدف، وعبور الروابط الرمزية، كلّها تتوقّف قبل أي كتابة وتُعيد تشخيصات مُهيكَلة مع
files_written: []. - ما لا يحمله الخرج المُجسَّد أبدًا. لا أسرار. تُنقّح تشخيصات الملف التعريفي المفاتيحَ الشبيهة بالأسرار والقيمَ ذات هيئة الرموز المميّزة قبل أن تصل إلى الخرج النصّي العادي، أو JSON، أو السجلات، أو مقتطفات الوثائق، أو الاختبارات؛ وتستخدم الأمثلة العامة هويات ونطاقات نائبة زائفة. والإعداد المُجسَّد مُعدّ لكي يُودَع في المستودع ويُشارَك؛ ولا يحمل أي بيانات اعتماد.
- أرضية الرفض الشاملة. يحمل ملف
settings.jsonالخاص بـClaude Code الذي يُجسِّده Apothem أرضيةَ رفض غير قابلة للتفاوض بصرف النظر عن أي قائمة سماح خاصة بإطار عمل؛ وفي أُطُر العمل الأخرى تكون الأرضية نفسها نصَّ سياسة في القواعد المُجسَّدة، لا قائمة رفض على مستوى الإعدادات. وهي: مسارات الأسرار (.env*، و~/.ssh/**، ومخازن بيانات الاعتماد)، وعمليات الصدفة التدميرية (rm -rf، وsudo، والدفع بالقوة إلى الفروع المحمية)، وتنفيذ المُدخَلات غير الموثوقة. ولا توسّع أي قائمة سماح هذه الأرضية بصمت. - نطاق الأثر. تُحصَر عمليات الكتابة في أدلة أُطُر العمل وأشجار الدعم الفرعية التي يملكها Apothem. وتُنسَخ الأهداف المُدارة الموجودة احتياطيًّا قبل استبدالها، وتُدمَج أدلة الاكتشاف المشتركة عنصرًا فرعيًّا تلو الآخر، فتبقى الملفات غير ذات الصلة التي ألّفها المُشغِّل في مكانها.
وضعية الأمان في وقت التشغيل
تتحقّق أوامر دورة حياة أُطُر العمل وكتابة الملف التعريفي قبل الكتابة. وتتوقّف
إخفاقات مخطط الملف التعريفي، ومُعرِّفات أُطُر العمل غير المعروفة، ومسارات المشروع
غير الآمنة، ومصادر البيان المفقودة، واجتياز مسار الهدف، وعبور الروابط الرمزية قبل
الكتابة إلى نظام الملفات، وتُعيد تشخيصات مُهيكَلة مع files_written: [].
تحافظ عمليات التثبيت والتحديث على الأهداف المُدارة الموجودة بنسخها احتياطيًا قبل
استبدالها. وتُدمَج أدلة الاكتشاف المشتركة عنصرًا فرعيًا تلو الآخر بحيث تبقى الملفات
غير ذات الصلة التي ألّفها المُشغِّل في مكانها. ويُجري --dry-run التحقّق
نفسه ويُبلِغ عن النتائج المُخطَّطة دون إنشاء أدلة أو ملفات.
تُنقّح تشخيصات الملف التعريفي المفاتيح الشبيهة بالأسرار والقيم ذات هيئة الرموز المميّزة قبل أن تصل إلى الخرج النصّي العادي، أو خرج JSON، أو السجلات، أو مقتطفات الوثائق، أو الاختبارات. وتستخدم الأمثلة العامة هويات ونطاقات نائبة زائفة.
روابط سريعة
- وضعية OpenSSF Scorecard — أدلّة لكل فحص وحدود المنصّة المعروفة
- تدقيق webhooks — أدلّة على سلامة أسرار webhook
- حماية الفرع — اشتراط طلب السحب، وفحوص الحالة المطلوبة، وحظر الدفع بالقوة والحذف
- مسح المُنتَجات الثنائية — أدلّة على أن شجرة المصدر لا تحتوي على ملفات ثنائية
- سياسة الأمان — الإبلاغ عن الثغرات والنسخ المدعومة
- شارة OpenSSF Scorecard — الدرجة الحيّة
الإبلاغ عن ثغرة
استخدم الإبلاغ الخاص عن الثغرات في تبويب Security في المستودع. تجد السياسة الكاملة، ومصفوفة النسخ المدعومة، والجداول الزمنية للاستجابة في SECURITY.md.
أدلّة الإصدار لسلسلة التوريد
يُشحَن كل مُنتَج إصدار مع:
- منشأ البناء SLSA-3 عبر
slsa-framework/slsa-github-generator - تواقيع Sigstore عبر
sigstore/cosign-installer - CycloneDX SBOM للـ wheel والـ sdist المشحونين، يكتبه
scripts/release/generate_sbom.py: حزمة apothem، وكل حزمة مُضمَّنة تحتapothem/_vendorمع رخصتها، ومتطلّبات بيئة التشغيل المُعلَنة، وقيمة SHA-256 لكل توزيعة. الـ SBOM موقَّع ومشمول بمنشأ البناء مثل التوزيعات - بيانات المنشأ في npm عبر Trusted Publishing OIDC على
@ahmed-g-gad/apothem - وسوم git موقَّعة بـ GPG (مفتاح EDDSA
70396FED9C634163)
التحقّق من إصدار
نزِّل كل أصول إصدارٍ ما إلى دليل فارغ، ثم افحص التواقيع ومنشأ البناء. استبدل
vX.Y.Z وX.Y.Z بالإصدار الذي نزّلته.
gh release download vX.Y.Z --repo ahmed-g-gad/apothem
cosign verify-blob \
--bundle apothem-X.Y.Z-py3-none-any.whl.cosign.bundle \
--certificate-identity https://github.com/Ahmed-G-Gad/apothem/.github/workflows/release.yml@refs/tags/vX.Y.Z \
--certificate-oidc-issuer https://token.actions.githubusercontent.com \
apothem-X.Y.Z-py3-none-any.whl
slsa-verifier verify-artifact \
--provenance-path provenance.intoto.jsonl \
--source-uri github.com/Ahmed-G-Gad/apothem \
--source-tag vX.Y.Z \
apothem-X.Y.Z-py3-none-any.whl apothem-X.Y.Z.tar.gzيطبع cosign النص Verified OK، ويطبع slsa-verifier
النص PASSED: SLSA verification passed. كرّر أمر cosign لأي
أصل آخر مع ملف <asset>.cosign.bundle الخاص به (تُسمّي الإصدارات السابقة
حِزم أرشيفات المنصّات وSHA256SUMS بالاسم <asset>.sig).
أرشيفا darwin وlinux هما البايتات نفسها تحت اسمين، لذا يسرد
SHA256SUMS بصمةً واحدة مرّتين. ومن نسخة مُستنسَخة من المستودع، يُشغِّل
bash scripts/release/verify-provenance.sh <download-dir> الفحوص الثلاثة
كلها، بما فيها بيان SHA256SUMS، في تمريرة واحدة.
تفصيلان يحدّدان ما إذا كان للتحقّق أي معنى:
-
حالة أحرف اسم المالك. فحوص الهوية حسّاسة لحالة الأحرف، وتحمل الشهادات اسم المالك كما يُبلغ عنه GitHub:
Ahmed-G-Gad. يفشل اسم المالك المكتوب بأحرف صغيرة في الأداتين كلتيهما. -
الهوية الدقيقة. فضِّل
--certificate-identityمع الموضوع الكامل أعلاه. ولقبول أي وسم إصدار، اربط النمط بمرساة عند طرفيه كليهما:--certificate-identity-regexp '^https://github\.com/Ahmed-G-Gad/apothem/\.github/workflows/release\.yml@refs/tags/v[0-9]+\.[0-9]+\.[0-9]+$'النمط غير المربوط بمرساة، مثل
github.com/Ahmed-G-Gad/apothem، يطابق أيضًا موضوعًا مُزوَّرًا لا يفعل سوى احتواء ذلك النص، على سبيل المثال سير عمل في مستودع آخر على فرع مُسمّى باسم هذا المستودع.
يُسجّل دليل تشغيل دورة الإصدار الأوامر نفسها بوصفها فحص المشرف بعد الإصدار.
إعادة بناء إصدار ومقارنته
الـ wheel والـ sdist قابلان لإعادة الإنتاج: إعادة بناء الوسم بسلسلة أدوات الإصدار تُعطي بصمات SHA-256 المنشورة. استخدم Python 3.12 على Linux، كما يفعل الإصدار:
git clone https://github.com/ahmed-g-gad/apothem && cd apothem
git checkout vX.Y.Z
python3.12 -m venv .build && . .build/bin/activate
pip install --require-hashes -r scripts/release/requirements-build-linux.txt
export SOURCE_DATE_EPOCH="$(git log -1 --pretty=%ct)"
python -m build --no-isolation
python scripts/release/normalize_sdist.py dist/*.tar.gz
sha256sum dist/*قارِن البصمات بالـ wheel والـ sdist المنشورين. يستخدم البناء
setuptools المقفولة بالبصمات التي يُحدِّد pyproject.toml
نسختها بدقّة، ويُزيل normalize_sdist.py وقت البناء ومالكي الملفات
والطوابع الزمنية للنسخة المسحوبة من الـ sdist.