[{"data":1,"prerenderedAt":128},["ShallowReactive",2],{"seo-verification":3,"blog-securiser-chaine-approvisionnement-npm-ci-ar":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"id":7,"slug":8,"title":9,"excerpt":10,"readTime":11,"views":12,"isPinned":13,"publishedAt":14,"category":15,"categories":21,"featuredImage":23,"bgImage":24,"posterImage":25,"relatedSolution":23,"intro":26,"sections":27,"ctaTitle":73,"ctaBody":74,"ctaButton":75,"ctaUrl":76,"relatedPosts":77},202,"securiser-chaine-approvisionnement-npm-ci","تأمين سلسلة توريد npm في CI بعد حادثة AsyncAPI","سياسة lockfile والتحقق من الهاشات وإثبات SLSA وفحص SCA التلقائي: كيف تقوّي خط CI بعد حادثة AsyncAPI في يوليو 2026.",7,0,false,"2026-08-01T00:00:00+00:00",{"id":16,"name":17,"slug":18,"color":19,"icon":20},4,"التطوير","developpement","bg-warning\u002F10 text-warning","dev",[22],{"id":16,"name":17,"slug":18,"color":19,"icon":20},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fsecuriser-chaine-approvisionnement-npm-ci-poster.svg","في يوليو 2026، نُشرت عدة حزم من مشروع AsyncAPI على npm بتوقيعات OIDC صالحة دون أن ترصد أدوات الكشف المعتادة أي شيء. كشف هذا الحادث أن خط CI الذي يكتفي بالتحقق من lockfile أو التوقيع يظل عرضة للاختراق من الجانب الأعلى.",[28,32,42,45,67,70],{"type":29,"title":30,"body":31},"h2","ما الذي غيّرته حادثة AsyncAPI","خلال أسبوعين في يوليو 2026، تداولت خمس إصدارات من حزم AsyncAPI مع إثبات منشأ OIDC موقَّع. كان المهاجمون قد اخترقوا خط النشر، لا مفتاح التوقيع. النتيجة: أعادت `npm audit signatures` نتيجة نظيفة.",{"type":33,"title":34,"items":35},"ul","إجراءات ملموسة لتطبيقها",[36,37,38,39,40,41],"**سياسة --frozen-lockfile** — منع أي تعديل صامت على ‎package-lock‎.json‎ في CI.","**التحقق من الهاشات في CI** — إضافة وظيفة تقارن هاشات SHA-512 من lockfile بسجل npm.","**فحص SCA التلقائي** — دمج ماسح تحليل تركيبة البرمجيات كخطوة حاجبة في الخط.","**إثبات منشأ SLSA بالمستوى 2 كحد أدنى** — عند النشر أنشئ شهادات SLSA؛ وعند الاستهلاك تحقّق منها.","**تثبيت صور CI على digest sha256** — أرسخ كل صورة Docker بدلاً من وسم متحرك.","**تنبيهات عند إصدارات غير مجدوَلة** — هيّئ Dependabot أو Renovate للإشعار بأي إصدار جديد.",{"type":29,"title":43,"body":44},"ما يضمنه lockfile وما لا يضمنه","يسجّل ‎package-lock‎.json‎ الإصدار الدقيق وهاش كل تبعية. لكنه لا يتحقق من أن محتوى الحزمة لم يتغيّر في السجل بعد حله الأولي، ولا من أن الخط الذي أنتجها كان سليمًا.",{"type":46,"title":47,"steps":48},"steps","تصليب خط CI خطوة بخطوة",[49,52,55,58,61,64],{"title":50,"body":51},"الانتقال إلى `npm ci` وحظر `npm install` في CI","استبدل كل `npm install` بـ`npm ci`. يرفض الأمر التنفيذ إذا كان ‎package-lock‎.json‎ غائبًا أو يتباين.",{"title":53,"body":54},"تفعيل `npm audit` في الوضع الحاجب","أضف `npm audit --audit-level=high` بعد `npm ci` وقبل البناء. فرّق تبعيات التطوير بـ`--omit=dev`.",{"title":56,"body":57},"التحقق من الهاشات بـ`npm audit signatures`","منذ npm 8‎.8، تتحقق `npm audit signatures` من صحة توقيع كل حزمة مثبّتة. شغّلها بعد `npm ci`.",{"title":59,"body":60},"دمج ماسح SCA (Trivy أو OWASP Dependency-Check)","أضف وظيفة SCA مستقلة. يحلّل Trivy ‎package-lock‎.json‎ مباشرةً (`trivy fs --scanners vuln .`).",{"title":62,"body":63},"استهلاك شهادات SLSA وإصدارها","لحزمك المنشورة فعّل إثبات منشأ SLSA في سير عمل النشر. للتبعيات الخارجية تحقّق من شهادات الحزم الحرجة.",{"title":65,"body":66},"تثبيت إجراءات CI والصور على digest sha256","في ملفات ‎.github\u002Fworkflows\u002F*‎.yml‎ أو ‎.gitlab-ci‎.yml‎ استبدل الوسوم المتحركة بـ sha256.",{"type":68,"body":69},"tip","لا تُرقّع أبدًا تبعية في الإنتاج بتعديل ‎node_modules‎ يدويًا: سيتباين lockfile وسيعيد النشر التالي من CI إدخال الحزمة الأصلية.",{"type":29,"title":71,"body":72},"الدمج في سير عمل Git المستضاف","هذه الضوابط خطوات خط أنابيب تنتمي إلى ‎ci‎.yml‎ أو ‎.gitlab-ci‎.yml‎، تشتغل عند كل push وطلب سحب. على المستودع المستضاف ذاتيًا (Gitea أو GitLab CE)، تنطبق الوصفات ذاتها.","بيئات CI معزولة لخطوط البناء","انشر مشغّلات CI على VPS سحابي مخصّص: عزل شبكي وتحكم كامل في التبعيات.","حلول للمطوّرين","\u002Fsolutions\u002Fdeveloppeurs",[78,97,115],{"id":79,"slug":80,"title":81,"excerpt":82,"readTime":83,"views":84,"isPinned":13,"publishedAt":85,"category":86,"categories":91,"featuredImage":23,"bgImage":24,"posterImage":93,"relatedSolution":94},99,"gitea-vs-gitlab","Gitea مقابل GitLab: أي منصة Git مستضافة ذاتيًا على VPS؟","Gitea مقابل GitLab المستضاف ذاتيًا: مقارنة بصمة الذاكرة وCI\u002FCD والسجلّات وقابلية التوسّع لاختيار منصة Git على VPS.",8,263,"2026-03-13T00:00:00+00:00",{"id":87,"name":88,"slug":89,"color":90,"icon":89},5,"مقارنات","comparatif","bg-info\u002F10 text-info",[92],{"id":87,"name":88,"slug":89,"color":90,"icon":89},"\u002Fblog\u002Fcovers\u002Fgitea-vs-gitlab-poster.svg",{"categorySlug":95,"appSlug":96},"self-hosting","gitea",{"id":98,"slug":99,"title":100,"excerpt":101,"readTime":83,"views":102,"isPinned":13,"publishedAt":103,"category":104,"categories":109,"featuredImage":23,"bgImage":24,"posterImage":111,"relatedSolution":112},108,"securiser-vps-crowdsec","تأمين خادمك الافتراضي VPS باستخدام CrowdSec","انشر CrowdSec على خادمك الافتراضي VPS لحجب الهجمات بفضل الكشف السلوكي وقائمة حظر مجتمعية مشتركة.",596,"2026-03-04T00:00:00+00:00",{"id":83,"name":105,"slug":106,"color":107,"icon":108},"الأمان والمراقبة","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[110],{"id":83,"name":105,"slug":106,"color":107,"icon":108},"\u002Fblog\u002Fcovers\u002Fsecuriser-vps-crowdsec-poster.svg",{"categorySlug":113,"appSlug":114},"securite","crowdsec",{"id":116,"slug":117,"title":118,"excerpt":119,"readTime":83,"views":120,"isPinned":13,"publishedAt":121,"category":122,"categories":123,"featuredImage":23,"bgImage":24,"posterImage":125,"relatedSolution":126},43,"deployer-nodejs-vps","نشر تطبيق Node.js على VPS","انشر تطبيق Node.js في بيئة الإنتاج على VPS: PM2 وبروكسي عكسي Nginx وشهادة SSL من Let's Encrypt وبدء تشغيل تلقائي عند الإقلاع.",591,"2026-05-08T00:00:00+00:00",{"id":16,"name":17,"slug":18,"color":19,"icon":20},[124],{"id":16,"name":17,"slug":18,"color":19,"icon":20},"\u002Fblog\u002Fcovers\u002Fdeployer-nodejs-vps-poster.svg",{"categorySlug":18,"appSlug":127},"nodejs",1785606655186]