المجموعات الأمنية مقابل 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 │
│ ❌ قواعد مفرطة في السماح في الإنتاج │
│ │
└─────────────────────────────────────────────────────────────┘
اختبار التحقق
- ما الفرق بين stateful و stateless؟
- لماذا يجب تكوين المنافذ المؤقتة في NACL؟
- كيف يمكن السماح لخادم تطبيق بالوصول إلى قاعدة بيانات عبر SG؟
- بأي ترتيب يتم تقييم قواعد NACL؟
- أي جدار ناري يجب استخدامه لحظر IP ضار؟
القسم التالي: استكشاف الأخطاء وإصلاحها في الشبكة