اختبار الأمان والخطوات التالية

قوائم فحص الأمان

2 دقيقة للقراءة

قوائم الفحص تضمن عدم تفويت أي شيء في عجلة النشر. يوفر هذا الدرس قوائم فحص أمان شاملة لمرحلة التطوير والتحقق قبل النشر.

قائمة فحص مرحلة التطوير

┌─────────────────────────────────────────────────────────────┐
│                 قائمة فحص أمان التطوير                      │
│                                                             │
│ ☐ التحقق من المدخلات                                        │
│   ☐ حدود الطول مُطبقة                                       │
│   ☐ كشف الأنماط لمحاولات الحقن                              │
│   ☐ تصنيف المحتوى مُفعل                                     │
│   ☐ تحديد المعدل مُنفذ                                      │
│                                                             │
│ ☐ معالجة المخرجات                                          │
│   ☐ تطهير HTML/XSS                                         │
│   ☐ كشف وتنقيح PII                                         │
│   ☐ إشراف المحتوى نشط                                       │
│   ☐ حدود طول الاستجابة                                     │
│                                                             │
│ ☐ حماية محث النظام                                         │
│   ☐ لا بيانات حساسة في المحثات                             │
│   ☐ كشف التسريب مُنفذ                                       │
│   ☐ حدود المحث محددة بوضوح                                 │
└─────────────────────────────────────────────────────────────┘

التحقق الآلي من قائمة الفحص

from dataclasses import dataclass
from typing import List, Optional, Callable
from enum import Enum

class CheckStatus(Enum):
    PASS = "pass"
    FAIL = "fail"
    WARN = "warn"
    SKIP = "skip"

@dataclass
class CheckItem:
    id: str
    name: str
    description: str
    category: str
    check_function: Optional[Callable[[], bool]] = None
    severity: str = "high"  # high, medium, low

@dataclass
class CheckResult:
    item: CheckItem
    status: CheckStatus
    message: str

class SecurityChecklist:
    """التحقق الآلي من قائمة فحص الأمان."""

    def __init__(self):
        self.items: List[CheckItem] = []
        self.results: List[CheckResult] = []

    def add_item(self, item: CheckItem):
        """إضافة عنصر فحص للقائمة."""
        self.items.append(item)

    def run_all_checks(self) -> List[CheckResult]:
        """تشغيل جميع فحوصات الأمان."""
        self.results = []

        for item in self.items:
            result = self._run_check(item)
            self.results.append(result)

        return self.results

    def _run_check(self, item: CheckItem) -> CheckResult:
        """تشغيل فحص واحد."""
        if item.check_function is None:
            return CheckResult(
                item=item,
                status=CheckStatus.SKIP,
                message="لا يوجد فحص آلي متاح"
            )

        try:
            passed = item.check_function()
            return CheckResult(
                item=item,
                status=CheckStatus.PASS if passed else CheckStatus.FAIL,
                message="نجح الفحص" if passed else "فشل الفحص"
            )
        except Exception as e:
            return CheckResult(
                item=item,
                status=CheckStatus.FAIL,
                message=f"خطأ أثناء الفحص: {str(e)}"
            )

    def get_summary(self) -> dict:
        """الحصول على ملخص نتائج الفحص."""
        return {
            "total": len(self.results),
            "passed": sum(1 for r in self.results if r.status == CheckStatus.PASS),
            "failed": sum(1 for r in self.results if r.status == CheckStatus.FAIL),
            "warnings": sum(1 for r in self.results if r.status == CheckStatus.WARN),
            "skipped": sum(1 for r in self.results if r.status == CheckStatus.SKIP),
        }

    def generate_report(self) -> str:
        """توليد تقرير markdown."""
        lines = ["# تقرير قائمة فحص الأمان\n"]

        # تجميع حسب الفئة
        by_category = {}
        for result in self.results:
            cat = result.item.category
            if cat not in by_category:
                by_category[cat] = []
            by_category[cat].append(result)

        for category, results in by_category.items():
            lines.append(f"\n## {category}\n")
            for result in results:
                icon = {
                    CheckStatus.PASS: "✅",
                    CheckStatus.FAIL: "❌",
                    CheckStatus.WARN: "⚠️",
                    CheckStatus.SKIP: "⏭️",
                }[result.status]

                lines.append(f"- {icon} **{result.item.name}**")
                lines.append(f"  - {result.message}")

        # الملخص
        summary = self.get_summary()
        lines.append(f"\n## الملخص\n")
        lines.append(f"- الإجمالي: {summary['total']}")
        lines.append(f"- ناجح: {summary['passed']}")
        lines.append(f"- فاشل: {summary['failed']}")
        lines.append(f"- تحذيرات: {summary['warnings']}")

        return "\n".join(lines)

قائمة فحص ما قبل النشر

def create_pre_deployment_checklist(config: dict) -> SecurityChecklist:
    """إنشاء قائمة فحص أمان ما قبل النشر."""
    checklist = SecurityChecklist()

    # فحوصات التحقق من المدخلات
    checklist.add_item(CheckItem(
        id="input-001",
        name="حدود طول المدخلات",
        description="الحد الأقصى لطول المدخلات مُطبق",
        category="التحقق من المدخلات",
        check_function=lambda: config.get("max_input_length", 0) > 0,
        severity="high"
    ))

    checklist.add_item(CheckItem(
        id="input-002",
        name="كشف أنماط الحقن",
        description="أنماط كشف محاولات الحقن مكونة",
        category="التحقق من المدخلات",
        check_function=lambda: len(config.get("injection_patterns", [])) > 0,
        severity="high"
    ))

    checklist.add_item(CheckItem(
        id="input-003",
        name="تحديد المعدل",
        description="تحديد المعدل مُفعل ومكون",
        category="التحقق من المدخلات",
        check_function=lambda: config.get("rate_limit_enabled", False),
        severity="high"
    ))

    # فحوصات أمان المخرجات
    checklist.add_item(CheckItem(
        id="output-001",
        name="تطهير XSS",
        description="المخرجات مطهرة لسياقات HTML",
        category="أمان المخرجات",
        check_function=lambda: config.get("sanitize_html", False),
        severity="high"
    ))

    checklist.add_item(CheckItem(
        id="output-002",
        name="تنقيح PII",
        description="أنماط PII تُكتشف وتُنقح",
        category="أمان المخرجات",
        check_function=lambda: config.get("pii_redaction", False),
        severity="high"
    ))

    checklist.add_item(CheckItem(
        id="output-003",
        name="إشراف المحتوى",
        description="إشراف المحتوى نشط",
        category="أمان المخرجات",
        check_function=lambda: config.get("content_moderation", False),
        severity="medium"
    ))

    # فحوصات الحواجز
    checklist.add_item(CheckItem(
        id="guard-001",
        name="NeMo Guardrails مكون",
        description="ملفات تكوين الحواجز موجودة وصالحة",
        category="الحواجز",
        severity="high"
    ))

    checklist.add_item(CheckItem(
        id="guard-002",
        name="مصنف السلامة مُفعل",
        description="LLaMA Guard أو مصنف مشابه نشط",
        category="الحواجز",
        check_function=lambda: config.get("safety_classifier", False),
        severity="high"
    ))

    # فحوصات المراقبة
    checklist.add_item(CheckItem(
        id="monitor-001",
        name="التسجيل مُفعل",
        description="أحداث الأمان يتم تسجيلها",
        category="المراقبة",
        check_function=lambda: config.get("logging_enabled", False),
        severity="high"
    ))

    checklist.add_item(CheckItem(
        id="monitor-002",
        name="التنبيهات مكونة",
        description="التنبيهات مكونة لأحداث الأمان",
        category="المراقبة",
        check_function=lambda: config.get("alerting_enabled", False),
        severity="medium"
    ))

    # فحوصات المصادقة
    checklist.add_item(CheckItem(
        id="auth-001",
        name="مصادقة API",
        description="نقاط نهاية API تتطلب مصادقة",
        category="المصادقة",
        check_function=lambda: config.get("require_auth", False),
        severity="high"
    ))

    checklist.add_item(CheckItem(
        id="auth-002",
        name="مفاتيح API مؤمنة",
        description="مفاتيح API مخزنة بأمان (ليست في الكود)",
        category="المصادقة",
        severity="high"
    ))

    return checklist

# الاستخدام
app_config = {
    "max_input_length": 4000,
    "injection_patterns": ["ignore.*instructions", "you are now"],
    "rate_limit_enabled": True,
    "sanitize_html": True,
    "pii_redaction": True,
    "content_moderation": True,
    "safety_classifier": True,
    "logging_enabled": True,
    "alerting_enabled": True,
    "require_auth": True,
}

checklist = create_pre_deployment_checklist(app_config)
results = checklist.run_all_checks()
report = checklist.generate_report()
print(report)

قائمة فحص مرجعية سريعة

الفئة الفحص الأولوية
المدخلات حدود الطول مُطبقة عالية
المدخلات أنماط الحقن محظورة عالية
المدخلات تحديد المعدل نشط عالية
المخرجات تطهير HTML عالية
المخرجات تنقيح PII مُفعل عالية
المخرجات إشراف المحتوى متوسطة
الحواجز NeMo/LLaMA Guard نشط عالية
الحواجز قواعد الموضوع مكونة متوسطة
المراقبة تسجيل الأمان عالية
المراقبة التنبيهات مكونة متوسطة
المصادقة مصادقة API مطلوبة عالية
المصادقة إدارة الأسرار عالية
الوكيل أذونات الحد الأدنى عالية
الوكيل عزل الأدوات عالية
الوكيل موافقة بشرية للإجراءات متوسطة

النقطة الرئيسية: استخدم قوائم الفحص قبل كل نشر. أتمت الفحوصات حيث أمكن، لكن راجع العناصر الحرجة يدوياً دائماً. :::

اختبار

الوحدة 6: اختبار الأمان والخطوات التالية

خذ الاختبار