الأمان والأداء
أمان التبعيات
فهم أمان التبعيات
تعتمد التطبيقات الحديثة على مئات أو آلاف التبعيات. تمثل كل تبعية ثغرة أمنية محتملة. إدارة أمان التبعيات أمر بالغ الأهمية للحفاظ على تطبيق آمن.
هجوم سلسلة التوريد: هجوم يستهدف الثغرات في تبعياتك بدلاً من الكود الخاص بك. يمكن أن تؤثر هذه الهجمات على ملايين التطبيقات في وقت واحد.
فحص ثغرات الحزم
استخدم أدوات آلية لفحص التبعيات بحثاً عن الثغرات المعروفة:
# تدقيق أمان NPM
npm audit
npm audit --production # فقط تبعيات الإنتاج
npm audit fix # إصلاح الثغرات تلقائياً
npm audit fix --force # فرض تحديثات الإصدارات الرئيسية
# فحص حزمة محددة
npm audit --package=lodash
# عرض تقرير التدقيق بصيغة JSON
npm audit --json > audit-report.json
npm audit
npm audit --production # فقط تبعيات الإنتاج
npm audit fix # إصلاح الثغرات تلقائياً
npm audit fix --force # فرض تحديثات الإصدارات الرئيسية
# فحص حزمة محددة
npm audit --package=lodash
# عرض تقرير التدقيق بصيغة JSON
npm audit --json > audit-report.json
نصيحة: قم بتشغيل
npm audit في خط أنابيب CI/CD الخاص بك وافشل البناء إذا تم العثور على ثغرات حرجة. حدد عتبة تناسب مشروعك.استخدام Snyk لأمان التبعيات
يوفر Snyk فحص شامل للثغرات ونصائح للإصلاح:
# تثبيت Snyk CLI
npm install -g snyk
# المصادقة
snyk auth
# اختبار المشروع للثغرات
snyk test
# مراقبة المشروع بشكل مستمر
snyk monitor
# اختبار وإصلاح الثغرات
snyk test --severity-threshold=high
snyk fix
# اختبار صور Docker
snyk container test node:18-alpine
# اختبار البنية التحتية كرمز
snyk iac test ./terraform/
npm install -g snyk
# المصادقة
snyk auth
# اختبار المشروع للثغرات
snyk test
# مراقبة المشروع بشكل مستمر
snyk monitor
# اختبار وإصلاح الثغرات
snyk test --severity-threshold=high
snyk fix
# اختبار صور Docker
snyk container test node:18-alpine
# اختبار البنية التحتية كرمز
snyk iac test ./terraform/
ميزات Snyk: يفحص Snyk الثغرات في التبعيات وصور الحاويات والبنية التحتية كرمز، ويوفر طلبات سحب آلية مع الإصلاحات.
تكوين GitHub Dependabot
ينشئ Dependabot تلقائياً طلبات سحب لتحديث التبعيات المعرضة للخطر:
# .github/dependabot.yml
version: 2
updates:
# تفعيل تحديثات الإصدار لـ npm
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
time: "09:00"
open-pull-requests-limit: 10
reviewers:
- "security-team"
labels:
- "dependencies"
- "security"
# تجميع التحديثات معاً
groups:
development-dependencies:
dependency-type: "development"
production-dependencies:
dependency-type: "production"
# تفعيل تحديثات الأمان لـ Docker
- package-ecosystem: "docker"
directory: "/"
schedule:
interval: "weekly"
version: 2
updates:
# تفعيل تحديثات الإصدار لـ npm
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
time: "09:00"
open-pull-requests-limit: 10
reviewers:
- "security-team"
labels:
- "dependencies"
- "security"
# تجميع التحديثات معاً
groups:
development-dependencies:
dependency-type: "development"
production-dependencies:
dependency-type: "production"
# تفعيل تحديثات الأمان لـ Docker
- package-ecosystem: "docker"
directory: "/"
schedule:
interval: "weekly"
أمان ملف القفل
تضمن ملفات القفل بناءً قابلاً لإعادة الإنتاج ولكن يمكن أن تخفي الثغرات:
# أفضل ممارسات أمان package-lock.json
# 1. قم دائماً بالتزام ملفات القفل
git add package-lock.json
# 2. تحقق من سلامة ملف القفل
npm ci # يستخدم الإصدارات الدقيقة من ملف القفل
# 3. تدقيق ملف القفل للثغرات
npm audit
# 4. تحديث ملف القفل عند الترقيع
npm update --package-lock-only
# 5. التحقق من الحزم المخترقة
npm audit signatures
# 1. قم دائماً بالتزام ملفات القفل
git add package-lock.json
# 2. تحقق من سلامة ملف القفل
npm ci # يستخدم الإصدارات الدقيقة من ملف القفل
# 3. تدقيق ملف القفل للثغرات
npm audit
# 4. تحديث ملف القفل عند الترقيع
npm update --package-lock-only
# 5. التحقق من الحزم المخترقة
npm audit signatures
تحذير: استخدام
npm install يمكن أن يحدث التبعيات بما يتجاوز ما هو موجود في ملف القفل. في CI/CD، استخدم دائماً npm ci لضمان تثبيت الإصدارات الدقيقة.منع هجمات سلسلة التوريد
تستغل هجمات سلسلة التوريد الثقة في حزم الطرف الثالث:
# 1. تحقق من سلامة الحزمة
npm config set package-lock true
npm config set audit true
# 2. استخدم توقيعات الحزمة (npm 9+)
npm install --signature-check
# 3. تحقق من سمعة الحزمة قبل التثبيت
# - تحقق من تنزيلات npm
# - راجع نجوم/مشاكل GitHub
# - تحقق من سمعة المشرف
# - راجع الالتزامات الأخيرة
# 4. ثبّت إصدارات دقيقة في package.json
{
"dependencies": {
"express": "4.18.2", // جيد: إصدار دقيق
"lodash": "^4.17.21", // سيئ: يسمح بالتحديثات الثانوية
"axios": "~1.4.0" // سيئ: يسمح بتحديثات الترقيع
}
}
# 5. استخدم سجل خاص للمشاريع الحساسة
npm config set registry https://registry.company.com
npm config set package-lock true
npm config set audit true
# 2. استخدم توقيعات الحزمة (npm 9+)
npm install --signature-check
# 3. تحقق من سمعة الحزمة قبل التثبيت
# - تحقق من تنزيلات npm
# - راجع نجوم/مشاكل GitHub
# - تحقق من سمعة المشرف
# - راجع الالتزامات الأخيرة
# 4. ثبّت إصدارات دقيقة في package.json
{
"dependencies": {
"express": "4.18.2", // جيد: إصدار دقيق
"lodash": "^4.17.21", // سيئ: يسمح بالتحديثات الثانوية
"axios": "~1.4.0" // سيئ: يسمح بتحديثات الترقيع
}
}
# 5. استخدم سجل خاص للمشاريع الحساسة
npm config set registry https://registry.company.com
عملية مراجعة التبعيات
نفذ عملية مراجعة يدوية للتبعيات الجديدة:
قائمة مراجعة الأمان:
- الشعبية: هل يستخدم على نطاق واسع؟ (تنزيلات npm الأسبوعية)
- الصيانة: تم تحديثه مؤخراً؟ مشرف نشط؟
- الترخيص: متوافق مع مشروعك؟
- التبعيات: كم عدد التبعيات الانتقالية؟
- تاريخ الأمان: أي ثغرات سابقة؟
- جودة الكود: TypeScript؟ اختبارات؟ توثيق؟
- حجم الحزمة: التأثير على حجم التطبيق؟
- البدائل: هل يمكنك تنفيذه بنفسك؟
تحديثات التبعيات الآلية
# تكوين Renovate Bot (renovate.json)
{
"extends": ["config:base"],
"schedule": ["before 9am on Monday"],
"labels": ["dependencies"],
"vulnerabilityAlerts": {
"enabled": true,
"labels": ["security"],
"assignees": ["@security-team"]
},
"packageRules": [
{
"matchUpdateTypes": ["major"],
"automerge": false,
"labels": ["breaking-change"]
},
{
"matchUpdateTypes": ["minor", "patch"],
"matchCurrentVersion": "<1.0.0",
"automerge": false
},
{
"matchDepTypes": ["devDependencies"],
"automerge": true,
"automergeType": "pr"
}
]
}
{
"extends": ["config:base"],
"schedule": ["before 9am on Monday"],
"labels": ["dependencies"],
"vulnerabilityAlerts": {
"enabled": true,
"labels": ["security"],
"assignees": ["@security-team"]
},
"packageRules": [
{
"matchUpdateTypes": ["major"],
"automerge": false,
"labels": ["breaking-change"]
},
{
"matchUpdateTypes": ["minor", "patch"],
"matchCurrentVersion": "<1.0.0",
"automerge": false
},
{
"matchDepTypes": ["devDependencies"],
"automerge": true,
"automergeType": "pr"
}
]
}
أفضل ممارسة: أتمتة تحديثات الترقيع والإصدارات الثانوية لتبعيات التطوير، ولكن اطلب مراجعة يدوية لتبعيات الإنتاج وتحديثات الإصدارات الرئيسية.
حماية التبعيات في وقت التشغيل
// مراقبة التبعيات في وقت التشغيل
const depcheck = require('depcheck');
const options = {
ignoreBinPackage: false,
skipMissing: false,
ignorePatterns: ['dist', 'build']
};
depcheck('/path/to/project', options, (unused) => {
console.log('التبعيات غير المستخدمة:', unused.dependencies);
console.log('التبعيات المفقودة:', unused.missing);
});
// سلامة الموارد الفرعية (SRI) لموارد CDN
<script
src="https://cdn.example.com/library.js"
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/ux..."
crossorigin="anonymous"
></script>
const depcheck = require('depcheck');
const options = {
ignoreBinPackage: false,
skipMissing: false,
ignorePatterns: ['dist', 'build']
};
depcheck('/path/to/project', options, (unused) => {
console.log('التبعيات غير المستخدمة:', unused.dependencies);
console.log('التبعيات المفقودة:', unused.missing);
});
// سلامة الموارد الفرعية (SRI) لموارد CDN
<script
src="https://cdn.example.com/library.js"
integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/ux..."
crossorigin="anonymous"
></script>
تمرين: قم بتدقيق تبعيات مشروعك:
- قم بتشغيل
npm auditوراجع جميع الثغرات - قم بتثبيت Snyk وتشغيل
snyk test - قم بتكوين Dependabot لمستودعك
- أنشئ وثيقة قائمة مراجعة التبعيات
- قم بإعداد طلبات سحب تحديث التبعيات الآلية