انتقل إلى المحتوى الرئيسي

المجموعات الأمنية مقابل NACL

مقدمة​

تقدم AWS مستويين من الجدران النارية لحماية مواردك:

  • المجموعات الأمنية: على مستوى المثيل
  • NACL (قائمة التحكم في الوصول إلى الشبكة): على مستوى الشبكة الفرعية
┌─────────────────────────────────────────────────────────────┐
│ مستويان من الأمان │
├─────────────────────────────────────────────────────────────┤
│ │
│ الإنترنت │
│ │ │
│ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ الشبكة الفرعية │ │
│ │ ┌────────────────────────────────────────────────┐ │ │
│ │ │ NACL (المستوى الأول) │ │ │
│ │ │ يقوم بتصفية جميع حركة المرور الواردة/الصادرة │ │ │
│ │ │ من الشبكة الفرعية │ │ │
│ │ └───────────────────┬────────────────────────────┘ │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌────────────────────────────────────────────────┐ │ │
│ │ │ مثيل EC2 │ │ │
│ │ │ ┌──────────────────────────────────────────┐ │ │ │
│ │ │ │ المجموعة الأمنية (المستوى الثاني) │ │ │ │
│ │ │ │ يقوم بتصفية حركة المرور إلى/من المثيل │ │ │ │
│ │ │ └──────────────────────────────────────────┘ │ │ │
│ │ │ │ │ │ │
│ │ │ ┌─────▼─────┐ │ │ │
│ │ │ │ التطبيق │ │ │ │
│ │ │ └───────────┘ │ │ │
│ │ └────────────────────────────────────────────────┘ │ │
│ └──────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

المجموعات الأمنية​

الخصائص​

┌─────────────────────────────────────────────────────────────┐
│ المجموعات الأمنية │
├─────────────────────────────────────────────────────────────┤
│ │
│ النوع: جدار ناري ذو حالة (stateful) │
│ │
│ stateful يعني: │
│ • إذا تم السماح لحركة المرور الواردة │
│ • فإن الاستجابة الصادرة مسموح بها تلقائيًا │
│ • لا حاجة لقواعد صريحة للاستجابة │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ العميل ──── طلب ────► مثيل │ │
│ │ (مسموح به بواسطة قاعدة واردة) │ │
│ │ │ │
│ │ العميل ◄─── استجابة ──── مثيل │ │
│ │ (مسموح به تلقائيًا - stateful) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ التشغيل │
│ • افتراضيًا: كل شيء محظور في الدخول │
│ • افتراضيًا: كل شيء مسموح في الخروج │
│ • قواعد السماح فقط (لا يوجد حظر) │
│ • يتم تقييمها جميعًا معًا (لا يوجد ترتيب) │
│ │
└─────────────────────────────────────────────────────────────┘

تشريح قاعدة SG​

┌─────────────────────────────────────────────────────────────┐
│ قاعدة المجموعة الأمنية │
├─────────────────────────────────────────────────────────────┤
│ │
│ النوع : SSH │
│ البروتوكول : TCP │
│ نطاق المنافذ: 22 │
│ المصدر : 203.0.113.0/24 │
│ الوصف : وصول إداري من المكتب │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ المعنى: │ │
│ │ │ │
│ │ "السماح لحركة مرور TCP على المنفذ 22 (SSH) │ │
│ │ من عناوين IP 203.0.113.0 إلى 203.0.113.255" │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ المصادر الممكنة: │
│ • IP فريد : 203.0.113.45/32 │
│ • نطاق CIDR : 203.0.113.0/24 │
│ • مجموعة أخرى : sg-0123456789 │
│ • قائمة البادئات: pl-xxx │
│ • في كل مكان : 0.0.0.0/0 (⚠️ انتبه!) │
│ │
└─────────────────────────────────────────────────────────────┘

أمثلة على المجموعات الأمنية​

┌─────────────────────────────────────────────────────────────┐
│ المجموعة الأمنية - خادم الويب │
├─────────────────────────────────────────────────────────────┤
│ │
│ الاسم: sg-web-server │
│ │
│ القواعد الواردة (Inbound) │
│ ┌───────┬──────────┬───────┬─────────────────────────┐ │
│ │ النوع │ البروتوكول│ المنفذ│ المصدر │ │
│ ├───────┼──────────┼───────┼─────────────────────────┤ │
│ │ HTTP │ TCP │ 80 │ 0.0.0.0/0 │ │
│ │ HTTPS │ TCP │ 443 │ 0.0.0.0/0 │ │
│ │ SSH │ TCP │ 22 │ 10.0.0.0/16 (VPC only) │ │
│ └───────┴──────────┴───────┴─────────────────────────┘ │
│ │
│ القواعد الصادرة (Outbound) │
│ ┌───────┬──────────┬───────┬─────────────────────────┐ │
│ │ النوع │ البروتوكول│ المنفذ│ الوجهة │ │
│ ├───────┼──────────┼───────┼─────────────────────────┤ │
│ │ All │ All │ All │ 0.0.0.0/0 │ │
│ └───────┴──────────┴───────┴─────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│ المجموعة الأمنية - قاعدة البيانات │
├─────────────────────────────────────────────────────────────┤
│ │
│ الاسم: sg-database │
│ │
│ القواعد الواردة (Inbound) │
│ ┌────────┬──────────┬───────┬────────────────────────┐ │
│ │ النوع │ البروتوكول│ المنفذ│ المصدر │ │
│ ├────────┼──────────┼───────┼────────────────────────┤ │
│ │ MySQL │ TCP │ 3306 │ sg-web-server ✓ │ │
│ │ MySQL │ TCP │ 3306 │ sg-app-server ✓ │ │
│ └────────┴──────────┴───────┴────────────────────────┘ │
│ │
│ ✓ الإشارة إلى مجموعة أخرى = ممارسة جيدة │
│ فقط المثيلات في هذه المجموعة يمكنها الوصول │
│ │
│ القواعد الصادرة (Outbound) │
│ ┌───────┬──────────┬───────┬─────────────────────────┐ │
│ │ النوع │ البروتوكول│ المنفذ│ الوجهة │ │
│ ├───────┼──────────┼───────┼─────────────────────────┤ │
│ │ All │ All │ All │ 0.0.0.0/0 │ │
│ └───────┴──────────┴───────┴─────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘

قائمة التحكم في الوصول إلى الشبكة (NACL)​

الخصائص​

┌─────────────────────────────────────────────────────────────┐
│ قائمة التحكم في الوصول إلى الشبكة (NACL) │
├─────────────────────────────────────────────────────────────┤
│ │
│ النوع: جدار ناري بدون حالة (stateless) │
│ │
│ stateless يعني: │
│ • يجب السماح بكل اتجاه بشكل صريح │
│ • إذا تم السماح بالدخول، يجب أيضًا تكوين الخروج │
│ • قواعد منفصلة للوارد والصادر │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ العميل ──── طلب ────► الشبكة الفرعية │ │
│ │ (يحتاج إلى قاعدة واردة) │ │
│ │ │ │
│ │ العميل ◄─── استجابة ──── الشبكة الفرعية │ │
│ │ (يحتاج إلى قاعدة صادرة منفصلة!) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ التشغيل │
│ • افتراضيًا: كل شيء مسموح (NACL الافتراضي) │
│ • قواعد السماح والحظر │
│ • يتم تقييمها بترتيب الأرقام (الأولوية) │
│ • أول قاعدة تطابق = القرار النهائي │
│ • ينطبق على كل الشبكة الفرعية │
│ │
└─────────────────────────────────────────────────────────────┘

تشريح قاعدة NACL​

┌─────────────────────────────────────────────────────────────┐
│ قاعدة NACL │
├─────────────────────────────────────────────────────────────┤
│ │
│ رقم القاعدة : 100 │
│ النوع : HTTP (80) │
│ البروتوكول : TCP (6) │
│ نطاق المنافذ: 80 │
│ المصدر : 0.0.0.0/0 │
│ السماح/الحظر: ALLOW │
│ │
│ ترتيب التقييم: │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ القاعدة 100: السماح لـ HTTP من 0.0.0.0/0 │ │
│ │ القاعدة 200: حظر HTTP من 192.168.1.0/24 │ │
│ │ القاعدة * : حظر الكل │ │
│ │ │ │
│ │ حزمة HTTP من 192.168.1.50؟ │ │
│ │ → يتم تقييمها بواسطة القاعدة 100 أولاً │ │
│ │ → 192.168.1.50 تطابق 0.0.0.0/0 │ │
│ │ → السماح! (القاعدة 200 لم يتم الوصول إليها) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ ⚠️ ترتيب القواعد حاسم في NACL │
│ │
└─────────────────────────────────────────────────────────────┘

المنافذ المؤقتة​

┌─────────────────────────────────────────────────────────────┐
│ المنافذ المؤقتة (مهم لـ NACL) │
├─────────────────────────────────────────────────────────────┤
│ │
│ مشكلة NACL: كيف نسمح بالاستجابات؟ │
│ │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ العميل (المنفذ 54321) ──HTTP:80──► الخادم │ │
│ │ العميل (المنفذ 54321) ◄──TCP:54321── الخادم │ │
│ │ │ │
│ │ الخادم يرد على منفذ المصدر للعميل │ │
│ │ هذا المنفذ "مؤقت" (عشوائي، مؤقت) │ │
│ │ │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ نطاقات المنافذ المؤقتة: │
│ • Linux : 32768 - 60999 │
│ • Windows : 49152 - 65535 │
│ • NAT Gateway : 1024 - 65535 │
│ │
│ الحل: السماح بالمنافذ المؤقتة في الصادر │
│ │
│ قاعدة NACL الصادرة: │
│ القاعدة 100: السماح لـ TCP 1024-65535 إلى 0.0.0.0/0 │
│ │
└─────────────────────────────────────────────────────────────┘

مقارنة SG مقابل NACL​

┌─────────────────────────────────────────────────────────────┐
│ المجموعة الأمنية مقابل NACL │
├─────────────────────────────────────────────────────────────┤
│ │
│ الخاصية │ المجموعة الأمنية │ NACL │
│ ───────────────────┼──────────────────┼───────────────────│
│ المستوى │ مثيل │ الشبكة الفرعية │
│ النوع │ Stateful │ Stateless │
│ القواعد │ ALLOW فقط │ ALLOW & DENY │
│ التقييم │ جميعها معًا │ حسب الترتيب │
│ المنافذ المؤقتة │ تلقائي │ يدوي │
│ الافتراضي │ Deny in/Allow out│ Allow all │
│ قابل للتعديل في الوقت الفعلي │ نعم │ نعم │
│ │
│ متى تستخدم ماذا؟ │
│ ───────────────────── │
│ │
│ المجموعة الأمنية: │
│ ✅ الاستخدام الرئيسي │
│ ✅ التحكم بواسطة التطبيق/الدور │
│ ✅ أسهل في الإدارة │
│ │
│ NACL: │
│ ✅ حظر IPs الضارة (قاعدة DENY) │
│ ✅ خط دفاع إضافي │
│ ✅ الامتثال (الدفاع في العمق) │
│ │
└─────────────────────────────────────────────────────────────┘

أمثلة عملية​

إنشاء مجموعة أمنية (CLI)​

# إنشاء المجموعة الأمنية
aws ec2 create-security-group \
--group-name sg-web-server \
--description "Security group for web servers" \
--vpc-id vpc-xxx

# إضافة قاعدة HTTP
aws ec2 authorize-security-group-ingress \
--group-id sg-xxx \
--protocol tcp \
--port 80 \
--cidr 0.0.0.0/0

# إضافة قاعدة SSH (مقيدة)
aws ec2 authorize-security-group-ingress \
--group-id sg-xxx \
--protocol tcp \
--port 22 \
--cidr 10.0.0.0/16

# السماح من مجموعة أخرى
aws ec2 authorize-security-group-ingress \
--group-id sg-database \
--protocol tcp \
--port 3306 \
--source-group sg-web-server

إنشاء NACL (CLI)​

# إنشاء NACL
aws ec2 create-network-acl \
--vpc-id vpc-xxx \
--tag-specifications 'ResourceType=network-acl,Tags=[{Key=Name,Value=nacl-public}]'

# إضافة قاعدة واردة لـ HTTP
aws ec2 create-network-acl-entry \
--network-acl-id acl-xxx \
--rule-number 100 \
--protocol tcp \
--port-range From=80,To=80 \
--cidr-block 0.0.0.0/0 \
--rule-action allow \
--ingress

# إضافة قاعدة صادرة للاستجابات (المنافذ المؤقتة)
aws ec2 create-network-acl-entry \
--network-acl-id acl-xxx \
--rule-number 100 \
--protocol tcp \
--port-range From=1024,To=65535 \
--cidr-block 0.0.0.0/0 \
--rule-action allow \
--egress

أفضل الممارسات​

┌─────────────────────────────────────────────────────────────┐
│ أفضل الممارسات الأمنية │
├─────────────────────────────────────────────────────────────┤
│ │
│ المجموعات الأمنية │
│ ✅ مبدأ الأقل امتيازًا │
│ ✅ مجموعة واحدة لكل دور/وظيفة │
│ ✅ الإشارة إلى المجموعات الأمنية بين بعضها (ليس IPs) │
│ ✅ تجنب 0.0.0.0/0 لـ SSH/RDP │
│ ✅ توثيق كل قاعدة (الوصف) │
│ │
│ NACL │
│ ✅ الاحتفاظ بـ NACL الافتراضي (Allow all) │
│ ✅ استخدام NACL لحظر IPs الضارة │
│ ✅ ترك مسافات بين أرقام القواعد (100، 200، 300...) │
│ ✅ عدم نسيان المنافذ المؤقتة │
│ │
│ ⚠️ الأخطاء الشائعة │
│ ❌ SSH مفتوح لـ 0.0.0.0/0 │
│ ❌ فتح جميع المنافذ "للاختبار" │
│ ❌ نسيان القواعد الصادرة لـ NACL │
│ ❌ قواعد مفرطة في السماح في الإنتاج │
│ │
└─────────────────────────────────────────────────────────────┘

اختبار التحقق​

  1. ما الفرق بين stateful و stateless؟
  2. لماذا يجب تكوين المنافذ المؤقتة في NACL؟
  3. كيف يمكن السماح لخادم تطبيق بالوصول إلى قاعدة بيانات عبر SG؟
  4. بأي ترتيب يتم تقييم قواعد NACL؟
  5. أي جدار ناري يجب استخدامه لحظر IP ضار؟

القسم التالي: استكشاف الأخطاء وإصلاحها في الشبكة