5.4 أمن الشبكات
السبب الرئيسي للخروقات الأمنية للحواسيب كما حددته
مؤسسة إدارة نظم الشبكات والأمن System Administration Network and Security Institute
(انظر www.sans.org)
هو "تكليف أشخاص غير مدربين للقوامة على الأمن وعدم تزويدهم بالتدريب
ولا الوقت ليقوموا بعملهم." هذا الفصل يهدف لتقديم معلومات
أساسية في أمن الشبكات ووضعك في بداية الطريق لتأمين نظامك.
اقتباسات هذا الفصل:
- "حتى البرنامج الكامل به عثرات bugs."
-- Geoffrey James في طاو البرمجة
- "لا يوجد شيء اسمه برنامج كامل، هناك دائماً مجال للمزيد من التنقية."
-- دليل ريدهات الأمني الرسمي
- "لا يوجد أمان على الأرض. هناك فرص."
-- General Douglas MacArthur
- "تأمين نظامك يستلزم أكثر من مجرد تركيب حزمة."
-- جزء من وصف حزمة harden، كيفية تأمين ديبيان. Securing Debian HOWTO.
محتويات هذا الفصل:
5.3.1 هل أنا بحاجة للحماية؟
الخطأ الذي كنت أقع فيه (عندما كنت أعيش في عقلية ما قبل لينكس) وأظن أنك قد
تهمل قراءة هذا الفصل لأجله هو عدم الإكتراث للحماية
تقول لنفسك أني لست بحاجة لأي نوع من الحماية
فأنا لست ناسا ولا وكالة الأمن القومي! ليس لدي أرقام بطاقات إئتمان مخزنة على الحاسوب
وبريدي مجاني ولن أحزن لو تسربت أي كلمة سر ،
وحتى جهازي في حال تدميره بفيروس فإن كل ما قد يكلفني القليل من الساعات
والكثير من الأسبرين لإعادة تركيب ويندوز.
تلميح
البعض يفضل فيروس لا يعيق سرعة الجهاز على مضاد فيروس
يقلل من سرعة الجهاز!
ليس فقط لأن الوقت مال! وتضيعه في إعادة تصليح الجهاز هدر له.
فبعد أن ولت تلك الأيام الغابرة وقرأت الكثير من الوثائق
من مشروع توثيق لينكس، وشربت روح لينكس علمت أن المخربين
يبحثون عن أهداف سلهة، ضحايا بالعقلية السابقة ليس بالضرورة لمكسب مباشر
بل ربما لاستغلال جهازك في تمويه هجماتهم على أهداف أكبر
وطبعاً لا تحب أن يظهر عنوانك IP في ملفات التقرير عن الهجوم!
كما أن بعض الفيروسات تكون مضبوطة على وقت محدد تبدأ التخريب
عنده (لو قام الفيروس مباشرة بالتخريب لما انتشر) ، هذا التخريب قد يكون
مجرد حذف ملفات (أعرف ستقول لي ليس لديك ملفات مهمة
لماذا اشتريت حاسوب المرة القادمة اشتري playstation)
وقد يصل لحد تخريب فيزيائي مثل حرق دارة التزمن في الشاشة!
طرق الحماية المذكورة هنا تجعل جهازك يعمل بطريقة أسرع!
على عكس ما تتوقع لأنها لا تحمل جهازك أي عبئ إضافي
فقد صمم غنو/لينكس من الأساس والأمن في البال.
بل ستلحظ زيادة في السرعة (سرعة الإتصال) لأن النشاطات المشبوهة يتم حجبها!
5.3.2 الأخطار المتوقعة
بالنسبة للشركات قد يبدو خيار شراء جهاز عملاق
مرتفع الثمن خياراً جذاباً مقابل شراء عدد من الأجهزة الشخصية لعدة أسباب
منها الإقتصادية ومنها الكِبْر (إلى زبائننا الكرام نحن لدينا سوبر كمبيوتر!) ،
ولكن هذه العقلية هي أول خطر وهو يسمى One point of failer
وهي تعني لب المثل "لا تضع كل البيض في سلة واحدة" ،
كلما اشتركت الأجهزة لديك في ما يلي
مصدر الكهرباء ، خط الهاتف ، مزود الإنترنت ، وسائط التخزين ، ...
فإن أي فشل سيكون كارثياً وشاملاً.
يفضل أن تكون الخادمات متعددة ويتم توزيع الخدمات عليها
(خدمة على كل جهاز أو عبر العناقيد)
يفضل أن تكون من مصنعين مختلفين وأن لا تكون "أحدث ما توصلت إليه
التكنولوجيا" نعم، أن تكون أرخص بقليل وذات سوق مستقر
(في أول ظهور للبنتيوم من إنتل كان به خلل سمي FDEV_BUG)
وربما تكون القطع المتوافقة مع كذا أفضل من كذا ليس في السعر فقط.
ولا تصدق الإعلانات لا تبحث على المعالج الأسرع! وتذكر التخزين الاحتياطي
وخذ في حسابك أن أي قطعة ستتلف إن عاجلاً أو آجلاً.
الخطر التالي هو خطر حجب الخدمة DoS - Denaial of Service
أو الفيض لإغراق الخادم بالطلبات بأن يرسل المهاجم
الكثير من الطلبات الجديدة ويظل يرسلها دون أن يرسل إشعار بأنه إستلمها
مما يؤدي بالخادم إلى إعادة إرسال ما أرسله لأنه يظن أنها لم تصل
إضافة إلى إرسال الطلب الجديد
فإذا علمنا أن كل شيء يرسله يوضع في الذاكرة من أجل إعادة إرسالة في حال لم يستلم
فإننا سنصل إلى مرحلة تنتهي الذاكرة المتاحة
ويعلق الخادم كاملاً (إذا لم يوفر النظام وقاية لمثل هذه الحالات)
من الأمثلة على DoS هي ping flood (الخيار f في أمر ping)
في هذا المثال نؤثر على عرض الحزمة(سرعة اللإتصال ) bandwidth
وفي مثال spam البريد يكون الهدف ملئ مساحة القرص.
وليس بالضرورة أن يقوم المخرب بها من جهازه ربما يستخدم حصان طرودة trojan
يضرب أجهزة شخصية في مختلف مناطق العالم
بالملايين مضبوطة كلها على وقت محدد لتبدأ
دون علم أصحابها بطلباتها التعجيزية.
فإذا كان خادم يستطيع أن يجيب مليون طلب
في ثانية كحد أقصى فإن كل من المليون جهاز المصاب تطلب ألف طلب
فيصبح لدينا مليار طلب مما يفوق قدرة الخادم فيموت (أو يقتله النظام).
وذلك بأن يهاجم ضحايا سهلة ثم يضبط أجهزتهم على مهاجمة الهدف
في وقت محدد. ومن الهجمات المتصلة بهذا النوع عملية spoofing.
يتم الحماية من هذا الخطر بجدر النار وذلك بإهمال الطلبات
ذات صفات معينة مثلاً أي طلب جاء دون أن نطلبه
أو جاء من نفس المصدر الذي طلب الطلب السابق قبل أن يرد بأنه
استلم الرد. أو تتم بوضع حد أعلى لكل طلب
مثلاً لا يجوز أن يطلب نفس الشخص أكثر من 100 طلب في الثانية
من الأخطار الأخرى هي عملية التجس بواسطة كلاب الأثر
sniffers وهي برامج متخصصة مثل
dsniff و sniffit و snort وحتى برنامج etherial الرسومي الذي يأتي مع فيدورا بل و airsnort للشبكات اللاسلكية.
وهي تستعمل لهدف نبيل (دراسة وتشخيص الشبكة) أو شرير (جمع كلمات السر وأرقام بطاقات الإتمان)،
تعتمد هذه البرامج على مبدأ أن الجهاز قد يستقبل ما ليس له
تذكر تبولوجيا البث العام broadcasting حيث ترتبط الأجهزة مع مفرع hub.
هذه البرامج يمكنها أن تبحث عن هيئة محددة (رقم من 14 منزلة) ويمكنها
أن تجمع كلمات سر البريد أو مواقع http أو FTP وقد يتمكن مخرب من معرفة حتى كلمات
السر المشفرة بواسطة crackers.
حل هذه المشكلة يكون باستعمال التشفير مثل ssh و GPG و https
وباستعمال switches مكان hups.
برامج crackers هي برامج تقوم بفك كلمات السر المشفرة hash
(حتى طرق تشفير ذات الإتجاه الواحد)
بواسطة التحزير والتجرير مع إعطاء أفضلية للكلمات القاموسية أو ذات الصلة.
انظر فصل 4.9 ادارة النظام
يتم تقليل خطرها بوضع كلمات سر قوية.
عملية spoofing هي بأن يأخذ شخص عنوان IP لشخص آخر.
وذلك بإخراج tcp pockets مع تعديل عنوانها بواسطة عملية nat
إذا كان هدفه من الهجوم هو حجب الخدمة DoS فإن هذا الإجراء
يضمن ليس فقط أن يموّه نفسه بل أن لا ينتظر
وصول الرد (الرد سيصل صاحب العنوان الحقيقي) ويتابع فيض الهجوم ،
ولكن إن كان الهدف هو إدعاء عنوان له
أفضلية (تذكر أن بعض طرق السماح تعتمد على العنوان) ،
فإن هجومه لن ينجح إذا كان صاحب العنوان الأصلي قيد العمل
لأنه يرد على الردود التي تصله بأنه لم يطلبها RST.
ولكن إذا كان معطل أو مغلق فإن المهاجم يمكنه ذلك.
من الطرق الأخرى هي الهجوم على خادم DNS فإذا تمكن منه المخرب
فإنه يتمكن من أن يدعي أنه أي جهاز آخر ليس عبر العنوان بل الاسم.
يتم كشف جميع ذلك من خلال قراءة عنوان MAC وهو عنوان بطاقة الإيثرنت (لا يمكن تغييره).
ليس بعيداً عن التجسس وإدعاء عنوان فإن هجوم رجل في الوسط man in the middle
حيث يجعل المهاجم جهازه بوابة وصل gateway بين جهازين
(إما فيزيائياً أو بمهاجمة الموجه router أو الجهاز البوابة وطلب منه التحويل إلى المهاجم)
فيعمل على استعمال sniffers.
أو يضع خادم الزائف fake server يقوم بالتجسس قبل التمرير
مثلاً إذا كان أ يتصل عبر ssh الآمن مع ب وكان جـ في الوسط
يشغل خادم ssh زائف يقول للجهاز أ "أنا ب أدخل كلمة السر".
يوجد برنامج يسمى 'hunt' يستطيع أن يعرض عناوين IP وما يقابلها
من MAC ويعرف إذا كان الجهاز يعمل أم لا، ويقوم بعملية spoofing سواء TCP
أو MAC كما يقوم بعمليات sniffing و إنهاء الاتصالات
resetting connections وخطفها hijack connections
ويقوم بعملية man in the middle وكل ذلك حتى عند استعمال switches.
تحذير
كنا قد ذكرنا أن المفرعات hubs تسمح بالتجسس sniffing ولكن switches تتجاوز هذه
المشكلة، ولكن كتيب استعمال hunt يشير إلى أن ذلك ممكن حتى مع switches
إذا لم تستتخدم مع إعدادات آمنة للشبكة، أولاً شغل مراقب ARP داخل hunt
ثم تستطيع عرض،ومراقبة،... وكل الأفعال الأخرى.
نعود للقصة الشهيرة حصان طروادة الخشبي trojan horse
وهو الطعم/الهدية الذي وُضع المهاجمون داخله ليدخلوا
المدينة ثم يفتحوا الباب لبقية للجيش!
عندما تنزل ملفات جاهزة عملها غيرك
قد يكون وضع لك بداخل هذا الطعم جنود ليفتحوا
له ثغره. إذا لم تحصل على الملف من مصدر موثوق
وكنت لا تمتلك كود المصدر لتراه بعينيك، فلا تلم
إلا نفسك! يتم تشغيل هذا النوع عبر فيروس أو عبر ثغرة
في برنامج (مثل explorer حيث يقوم احياناً بتنفيذ برامج دون إذن)
أو عن طريق ضعف في التصميم أو ما يسمى بالضعف الوراثي
حيث لم يكون الأمن في البال عند التصميم مثل البريد و
ActiveX التي تسمح
بتشغيل برنامج معين على جهازك (موجودة بكثرة في ال Messenger) بحجة
أنها قد تكون لنقل فيديو أو
ما شابه (فكرة/إدعاء مايكوسوفت أنه لفتح وثائق معينة لا داع لشراء
البرنامج الذي يشغلها بل يكون موجود على الشبكة ويتم تشغيله على جهازك )
ولكن المهاجم بدلا من استخدامه لهذا الغرض يقوم بتصميم
برنامج بهذه التقنية ليسرح ويمرح على حاسوبك
ويأخذ أرقام الحسابات وبطاقات الإئتمان وكلمات السر
و أي شيء آخر.
يمنكك أن تضع حرساً ليراقبوا لك البوابات والمنافذ
فإذا كان هناك ما يريب عرفت أنه فخ.
بعيداً عن القصة، راقب المنافذ ports فإذا كان هناك منفذ مفتوح
-هناك من يرسل/يستقبل عبره بيانات-
وكان هذا المنفذ ليس منفذاً لأحد البرامج القياسية
التي تعرفها (ليس apache وليس ssh)
فاعلم أن هناك اختراق. لهذا راقب المنافذ بأمر
nmap -sT -O SOMEWHERE.NET
ابدل SOMEWHERE.NET بالخادم الذي تريد أن تفحصه أو بجهازك localhost
سيظهر لك قائمة بالمنافذ المفتوحة
إذا وجدت خدمة غير معروفة unknown مثلاً على 731
ابحث عنها في cat /etc/services | grep 731
ابحث عن البرنامج الذي فتحها بتنفيذ ما يلي على الخادم
netstat -lnp | grep 731
سابرات المنافذ port scanners هي برامج ذات استخدام مزدوج
يستخدمها مدير النظام لتشخيص الشبكة ودراستها
أو يستخدمها المهاجم ليعرف أي الخادمات تستمع لأوامر خارجية
بحثاً عن خادم ضعيف. على الرغم من أن netstat و lsof تستطيع عرض المنافذ المفتوحة
إلا أنها لا تسبر المنافذ لأنها تعمل محلياً (على الجهاز نفسه فقط) وتعطي المعلومات
من النواة وليس من التجربة العملية. أشهر ماسحات المنافذ nmap
أعطه أي عنوان يستطيع فحصه مثلاً nmap yahoo.com
قد يمكن خداع هكذا برنامج بواسطة جدار النار.
برنامج nmap يمكنه أيضاً أن يبحث عن أجهزة مرتبطة بالإنترنت
ويخبرك معلومات عنها. راجع 5.2 العمل في الشبكات.
واعلم أنه يمكن تمويه عملية السبر بعدة طرق لهذا لا تأخذ ما تقوله ملفات log على أنه يقين، من هذه الطرق
أن تجعل السبر يبدو قادماً من عدة أجهزة يشترط فيها أن تكون تعمل وذلك بالخيار D متبوع بقائمة بالعناوين
حيث سيظهر عند من تسبر عنوانك إضافة لهذه العناوين.
يمكنك أن تجد عناوين لأجهزة عاملة كما قلنا بواسطة sL ووضع * و - في العنوان.
طريقة أخرى للتمويه بواسطة الخيار S ثم أي عنوان لجهاز يعمل.
ومن طرق التمويه الأخرى السبر بطريقة stealth idlescan وذلك بالخيار sI
التي تأخذ بعدها عنوان جهاز ليبدو السبر قادماً منه
(يجب أن يكون يعمل وبعض الشروط الأخرى).
تكنولوجيا أخرى هي بواسطة الخيار b متبوع برابط URL لحساب FTP.
عملية السبر تأخذ وقتاً يمكنك أن تحدده بالخيار T
ولكن إذا أسرعت سيظهر سلوك مريب في ملفات التقرير عند من تسبر
أما إذا كنت تسبر على أقل من مهلك مثلاً -T Polite
لكي لا يظهر أي سلوك مشبوه.
الطريقة السابقة في البحث عن منافذ مفتوحة تستخدم
هجوم من نوع آخر هو buffer overflow
يقوم المهاجم بالبحث عن ضحايا سهلة بسبر مجموعة من العناوين
حتى يجد من يستخدم نظاماً يعرف به بعض الثغرات
ثم يسبر المنافذ المفتوحة عليه فإذا ظهر له
أي خادم ضعيف (مثلاً FTP أو NFS ... إلخ) يقوم بتجريب ثغرات
فيه لإحداث خطأ buffer overflow. يحدث هذا الخطأ
عندما يستعمل الخادم وظائف غير آمنة لا تأخذ حجم الذاكرة في الحسبان
مثلاً وظيفة strcpy تأخذ معاملين هما المصدر والهدف لنسخ من الأول إلى الثاني حتى أول صفر ولكنها لا تأخذ الحجم
الأقصى فقد تأتي علامة النهاية (الصفر) بعد أن تمتلئ ذاكرة الهدف
ويتابع النسخ في مكان آخر (لأن مناطق الذاكرة متجاورة) ، الوظيفة strncpy
تعالج المشكلة السابقة فهي تنسخ إلى أول صفر دون n أيهما يأتي أولاً.
كذلك الوظائف التي تسأل المستخدم أن يدخل قيمة وتخزنها في الذاكرة
بعضها لا يأخذ حجم الذاكرة في الحسبان فيقوم المهاجم بإدخال
ما يتجاوز هذا الحد مما يسمح له أن يوقف الخادم عن العمل أو حتى يكتب
ما يريد في متغيرات مجاورة أو كود مجاور
تلميح
الملف التنفيذي جزئين الأول بيانات أو فراغ لتوضع فيه المتغيرات
يسمى .data يليه الكود بلغة الآلة
.code في نظام لينكس يتم تحميل كل جزء في مقطع ذاكرة منفصل
إذا حدث هذا الخطأ فإن
البرنامج الخادم(المراقب) سوف يغلق ويعطي محث لطباعة
الأوامر فإذا كان يعمل على منفذ أقل من 1024
فإنه يكون كما قلنا سابقاً باسم الجذر root وهذا
المحث يكون قد كسب قوة الجذر ويستطيع المخترق
تنفيذ ما يشاء وهو جذر! بالطريقة
السابقة للكشف عن المنافذ تستطيع إيجاد المنافذ
المفتوحة دون 1024 وتتأكد من أنها برامج
صلبة ومعروفة بتحملها فإذا لم تكن محتاج لأحد تلك الخدمات
أغلقها.أنا ليس لدي الكثر من المعلومات عن هذا النوع من الهجوم.
طريقة أخرى قد يتبعها المهاجم بأن يمرر للخادم (أو لما ينفذه الخادم مثل CGI)
قيم غير تقليدية تحتوي على رموز ذات معنى خاص
مثلاً لنفرض أن خادم apache ينفذ CGI بلغة php تعرض صفحة تسأل المستخدم عن اسمه
(كما في مواقع الإنترنت التفاعلية)
وبعد الضغط على Submit يتم توليد صفحة بها ذلك الاسم.
عند عمل هكذا برامج توقع أن يقوم المهاجم بإدخال ما يشبه $SOMEVAR
حيث الرمز $ له معنى خاص في لغة php فيحصل المهاجم على معلومات تفيده
في هذه الحالة قد تكون الأداتين uuencode و uudecode مفيدتين
أو أي أداة توفرها لغة CGI لعمل escaping لما يدخله المستخدم وفكه مثل urlencode و urldecode.
تخيل لو أن البرنامج يسأله عن شيء ليحدد ما ينفذه أو ليحدد أي
الملفات يعرض يجب أن يخطر ببالك أن المهاجم قد يكتب
../../../etc/passwd
أو رابط مثل http://securityfocus.com@182.20.50.1
فهذا الأخير يستغل الرمز الخاص @ وهو يعني أن اسم المستخدم قبله
والموقع بعده لهذا فهو ليس رابطاً لموقع securityfocus.com.
للحماية من هذان الخطران يمكنك نقل خدماتك الضعيفة لتكون
على منفذ أكبر من 1024 وتشغيلها باسم غير الجذر في بيئة محصورة chroot jail environment
حيث لا يمكن الوصول لملفات خارج هذا السجن.
الوقاية من هذ الخطر تكون بالمحافظة على
البرامج مرقوعة بأحدث الرقع (أقدم البرامج - أحدث الرقع) ، وليس
بتنزيل آخر الإصدارت. يمكنك أن تجد تحذيرات
على موقع www.CERT.org - Computer Emergency Response Team
و www.securityfocus.com
والموقع الخاص بتوزيعتك مثل errtta و rhn.redhat.com
يقوم المخرب بعد أن يتمكن من جهاز بالتنظيف وراءه
من خلال التعديل في ملفات التقارير log ليخفي هجومه
فإذا كنت تشك في أن هناك اختراق قد حدث فلا تأخذ ما تقوله
ملفات log للأجهزة المصابة على أنه يقين.
أيضا يمكنه أن يستعمل حيلة أدواة الجذر root kit
وهي الأدوات التي تنفذ للتشخيص فقد يضع المهاجم نسخته الخاصة منها
تخبرك أن "كل شيء بخير ويعمل كما يجب" أو تعمل هذه الأدوات
على جمع المزيد من المعلومات أو تساهم في إختراق أجهزة أخرى.
من الشائع لدى المخربين أنهم يقولون أنهم الأذكى
ويضعون مواقع تقدم للمخربين الصغار أدوات تساعدهم
على الإختراق ولكن حقيقة ما يقدمونه
هو أنهم يقدمون للمتلقي طعماً مثلاً لنفرض أنك حصلت
على ملفين أحدهما اسمه foohack والآخر more الأول يشبه
#! /bin/bash
# script that uses undocmented features of dd
# to get the root password of your neighbour machine
# usage: foohack HOST
# where HOST is your neighbour IP
# run it as root
PATH=.:/bin:/sbin:/usr/bin:/usr/sbin
echo "foohack"
more ./$$
#...
dd if=/dev/urandom bs=10 count=512 2>/dev/null | chksum
هذا البرنامج ينفذ more ولكن ليس البرنامج الشهير بل نسخته الخاصة
لأن أولوية PATH هي الدليل الحالي. قد يكون هذا برنامج يعمل على إرسال ملف /etc/shadow
إلى المخرب الكبير.
5.3.3 نصائح وقائية
أولاً تابع آخر الأخبار واطلب مساعدة عبر USENET مثل comp.os.linux.sercurity
إذا لم تكن تملك برامج إخبارية استعمل موقع
www.deja.com
للوصول إليها.
أيضاً مجموعات مستخدمي لينكس يمكنها أن تساعدك.
واشترك في بعض مواقع الحماية لترسل لك رسائل دورية
أو تحذيرية والقوائم البريدية الخاصة بتوزيعتك
والخاصة بالخادمات التي تشغلها والتحديثات التي تصدرها توزيعتك
مثل erreta أو rhn.redhat.com (ليست مجانية)
وتعلم استعمال up2date في ريدهات وفيدورا أو apt في ديبيان لتقوم بالتحديثات.
:من أهم المواقع
تجنب تشغيل خادمات ضعيفة مثل rsh و عائلتها rlogin و rcp
أيضاً telnet و ftp و nis و nfs وإذا أمكن حتى البريد الإلكتروني!
استعمل البرامج التي صممت لتكون آمنة مثل ssh ولكن تذكر أن
وجود كلمة secure في اسمها ليس هو ما يجعلها آمنة.
عند استعمال webmin أو swat أو cups-lpd أو أي برنامج إدارة تأكد
من أنه يعمل وراء xinetd و أنه يستمع فقط للعنوان 127.0.0.1.
حاول أن تشغل أقل عدد ممكن من الخدمات على الجهاز الواحد.
خدمة rsync إذا استعملت يجب أن تتذكر خطر sniffers
لهذا استعملها عبر ssh بالخيار -e ssh
ثم لماذا تجعله خادماً! أظن أن وجوده ولكن ليس كخادم يكفي باستعمال
عناوين على صورة HOST:DIR.
5.4.4 مقدمة عن جدار النار firewall
جدر النار من أقوى تقنيات الحماية وأكثرها فعالية، في الأنظمة الأخرى
مثل ويندوز حيث عليك شراؤها من شركات مثل Norton Symantec
كما تشتري مضاد الفيروسات ،
ولكن إذا كنت تستخدم لينكس فاعلم أن لديك جدر نار
مبنية في نواة لينكس !! نعم داخل نواة لينكس الصغيرة!!
وكل ما عليك هو تعلم كيفية استعمالها.
وقد يقول قائل أنا أستخدم برامج لينكس الموثوقة
التي رأى الجميع ملفها المصدري ويعرف أنها لا تفعل سوى مايطلب منها
فلم أشغل رأسي بهذا الكلام؟ وأن كل ملفاتي السرية موضوعة
باسم مستخدم آخر غير الذي أستعمله لتصفح الشبكة.
الجواب أنك قد تستعمل أحد برامج
ويندوز غير المضمونة عن طريق wine أو قد يكون الخادم لديك
عليه لينكس ولكن أحد الطرفيات أو الذين ليست لك عليهم سلطة
يستخدمون ويندوز أو قد ينصبون برنامج دون علمك مما قد يسبب لك الكوابيس.
إذا كنت في شركة بها 100 موظف -غير مختصصين بالحاسوب مثلاً مدخلي بيانات- لا يعقل أن تعمل لهم دورة
في أمن الشبكات وتخبرهم ما هو آمن وما يفتح الثغرات.
وجود جدر ناري يسرع إتصالك بالشبكة فهو يوفر مساحات
البث التي تحجزها الاتصالات المحجوبة.
وهو يحميك من هجمات حصان طروادة أو من خداعك برسائل مضللة
تعمل على تثبيت خادمات تستمع لأوامر عن بعد.
كما أن وجوده داخل النواة بعمليات ذرية atomic يجعلك لا تشعر بوجوده
الحالة الوحيدة التي قد لا ترغب بجدر نار هي أن تكون وحيداً.
حتى الشبكة الداخلية غير الموصولة بالإنترنت تحتاج جدار نار.
ولكن أولاً ما هي جدر النار؟
يظن الناس أن جدر النار تشبه المصهر fuse جهاز رخيص
مهمته أن يستقبل الهجمات فيتعطل ليحمي الشبكة الداخلية وهذا الكلام خطأ.
، جدر النار لغوياً هي تلك الجدر التي توضع لحجب النار ومنع إنتشارها،
وهي اصطلاحاً هي طرق لحماية الشبكة
تعمل بطريقتين أولاً التصفية وثانياً تعديل العناوين
ويمكن أن نضع جدار نار حول كل جهاز و/أو نخصص الجهاز البوابة الذي يربط باقي الأجهزة
بالإنترنت ليكون جدار النار .
التصفية/الترشيح/الفلترة هي تحديد قوانين لما
يسمح له بالعبور ولحجب الدخول غير المرغوب أو المشبوه.
أما تعديل العناوين nat لتتمكن الأجهزة ذات العناوين الداخلية
في الشبكة LAN من الإتصال بالإنترنت عبر جدار النار
من خلال تعديل عنوان الطرود pockets لتبدو وكأنها قادمة منه
(حيث يكون الجهاز الذي عليه جدار النار مرتبط بالإنترنت وله عنوان مرئي من خارج الشبكة)
وهناك أكثر من طريقة وقبل أن نتعرف عليها نتعرف على بعض المصطلحات.
- IPv4
-
طريقة للعنونة يكون العنوان فيها من 32-بت ويمثل على صورة w.x.y.z
حيث w و x و y و z أرقام عشرية
- IPv6
-
طريقة أحدث للعنونة يكون العنوان فيها من 128-بت ويمثل كل 2 بايت على صورة
4 منازل ست-عشرية تفصل بينها : وتعتبر غير الموجودة بأصفر.
- pocket
-
طرد: طريقة ارسال البيانات داخل تركيب معين يحدده البرتوكول.
- tcp
-
هي المستخدمة في بروتوكول الويب ومعظم البروتوكولات،
تتبع طريقة stream أي لا يرسل التالي حتى يصل الأول.
تأخذ عنوان (مثلاً IPv4 فتسمى tcp/ip) وتأخذ منفذ.
إرسال كل واحدة يتم على 3 مراحل
إرسال الطرد جديد يحمل علامة syn ثم عندما يستلمها المستقبل يبعث اشعار إلى المرسل
بأنها وصلت سليمة syn/ack فيقوم المرسل بإرسال إشعار بأنه استلم الإشعار ack
فإذا لم يصل أي من الإشعارات أعيد أرسال الطرد. فيبدأ الإتصال من هنا
ويبقى مستمراً (عبر نفس الثلاث خطوات syn ثم syn/ack ثم ack) ،
حتى يبعث أحدهما طلب إنهاء fin ويرد الآخر ب ack ثم fin/ack
فيرد عليه ب ack وينتهي الإتصال.
- udp
-
بروتوكول يتبع طريقة datagram أي ليس بالضرورة أن تصل
pockets بنفس الترتيب الذي أرسلت فيه كما أنها لا تنشئ اتصال 'no estsblished connection'.
تأخذ عنوان (مثلاً IPv4 فتسمى udp/ip) وتأخذ منفذ.
- icmp
-
بروتوكول يتبع طريقة datagram كسابقه
يستعمل في عملية ping. يأخذ عنوان فقط دون منفذ.
- new connection
-
إتصال يطلب فيه المخدوم من الخادم إنشاء/فتح قناة إتصال جديد.
- estsblished connection
-
تفتح قناة لإتصال بعد هذه ويبدأ بالإرسال الحقيقي وما قبلها كله مصافحة.
- related connection
-
هو الردود المتعلقة بالجديد
أي الإتصال بين قبول وفتح القناة أو رفضها. أو أنه طلب فتح إتصال جديد
ولكن سببه هو اتصال تم فتحه من قبل estsblished
- Danger Zone
-
منطقة الخطر هي الإنترنت والأجهزة المرتبطة بها دون جدار النار أو قبل جدار النار
- DMZ - De-Militarized Zone
-
المنطقة منزوعة السلاح، أي تلك الموجودة على الحدود بين منطقة الأمان
والخطر وذلك لأنها تحتوي خادمات تستمع لطلبات
من خارج الشبكة الداخلية حيث يحول جدار النار العناوين
الخاصة بها لتبدو عامة ومرئية للإنترنت.
- Private Zone
-
المنطقة الآمنة - تلك التي لا يمكن الوصول لها من خارج الشبكة الداخلية
فهي تصل للإنترنت عبر خادم وكيل proxy server وتكون قواعد جدار النار بإتجاه واحد مثلاً تستطيع
هذه الأجهزة أن ترسل طلبات وتستقبل ردود (تتصفح الإنترنت) ولكنها لا تستقبل طلبات.
- NAT - Network Address Translation
-
عملية تعديل العنوان وهي نوعين: العنوان الهدف DNAT وتتم قبل التوجيه pre-routing
والعنوان المصدر SNAT وتتم بعد التوجيه post-routing
قلنا أن جدار النار مبني في النواة منذ زمن
فأولاً استعار لينكس جزء من كود freeBSD المسمى ipfw وأدواتها ipfwadm
ثم أعيد كتابتها من الصفر وتطويرها إلى ipchains ثم وفي نواة 2.4 ظهرت iptables المطورة
ثم ظهر ip6tables ولتستعمل أحدها يجب أن تغلق الآخر.
في معظم التوزيعات هناك أداة خاصة لضبط جدار النار لن نتحدث عنها
مثلاً Mandrake CC -> Network/Security -> Firewall
وفي ريدهات redhat-config-securitylevel ثم في فيدورا أصبح system-config-securitylevel
ويوجد أدوات مستقلة مثل Gnome Lokkit
و Kmyfirewall و firewall builder و Easy Firewall Generator و Guard-dog
و Shorewall وغيرها. ولكنا ستحدث عن سطر الأوامر
كل ما عليك هو استعمال الأداة iptables لإعدادها
ولكن أولاً تأكد من الإصدارات السابقة من هذه الخدمة مثبطة
service ipchains stop وأنها غير موجودة في أي مستوى تشغيل
chkconfig --level 0123456 ipchains off
وأن iptables هي المفعّلة
chkconfig --devel 345 iptables on و
service iptables start
أو /etc/init.d/iptables start
(الإصدار الأحدث الخاص بعناوين IPv6 يجب أن يكون مثبطاً أيضاً)
يمكنك ذلك من أداة التوزيعة في إدارة الخدمات services من قائمة settings.
هذه الخدمة مجرد نص يعمل على إعداد وتحميل ال modules الخاصة بها إلى النواة.
(لا تشغل نفسك بها حيث تقوم بها /etc/init.d/iptables)
depmod -a
modprobe ip_tables
modprobe iptable_filter
modprobe ip_conntrack
modprobe ip_conntrack_ftp
#modprobe ip_conntrack_irc
modprobe ipt_LOG
modprobe ipt_REJECT
modprobe ipt_limit
modprobe ipt_state
modtrobe ipt_owner
وإذا كنت تستخدم تعديل العنوان nat أيضاً.
modprobe iptable_nat
modprobe iptable_mangle
modprobe ipt_MASQUERADE
#modprobe ip_nat_ftp
#modprobe ip_nat_irc
# WARNING: put those after setting rules or at least after ploicy
echo "1" > /proc/sys/net/ipv4/ip_forward
#echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
#echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp
#echo "1" > /proc/sys/net/ipv4/ip_dynaddr
السطر الأخير لتُعلم النواة بأنك تريد تفعيل التمرير.
ثم تُحمل جدول القواعد المخزن مسبقاً بواسطة iptables-restore.
مرة أخرى لا تشغل نفسك بها.
5.4.5 أدوات جدار النار
قلنا أن جدار النار هو مجموعة من قواعد المطابقة
وماذا يفعل بما ينطبق على كل قاعدة
من خلال 3 جداول: جدول التصفية filter وهو التلقائي
ويستخدم للترشيح تبعاً للقواعد التي نحددها
وجدول تعديل العناوين nat أي Network Address Translation
والجدول الأخير والأقل استعمالاً mangle.
في كل جدول سلاسل من القواعد chains منها ما هو موجود أصلاً يتم تصنيف الطرود pockets فيها تلقائياً
مثل سلسلة الدخل INPUT والخرج OUTPUT والتمرير FORWARD
وما قبل التوجيه PREROUTING وما بعده POSTROUTING ،
ويمكنك إن تضيف سلاسل جديدة وترسل الطرود إليها.
بإمكنك عرض list قواعد سلسلة معينة باستعمل iptables -L INPUT
و iptables -L OUTPUT و iptables -L FORWARD
وعرضهم جميعاً بالأمر iptables -L.
بإمكانك حذف delete القاعدة رقم 1 من سلسلة الدخل مثلاً بالأمر التالي
iptables -D INPUT 1
يمكن إضافة قاعدة مطابقة THE-NEW-RULE (سنتعلم لاحقاً كيف نكتب قاعدة)
إلى نهاية سلسلة INPUT على سبيل المثال بالأمر
iptables -A INPUT THE-NEW-RULE
أو بإمكانك وضع قاعدة أخرى مكانها replace كما في
iptables -R INPUT 1 THE-NEW-RULE
أو حشرها insert قبل القاعدة رقم 1 بالأمر
iptables -I INPUT 1 THE-NEW-RULE
بإمكانك حدف كل القواعد من سلسلة معين flush (الدخل مثلاً)
iptables -F INPUT وإفراغ كل السلاسل يكون بالأمر
iptables -F.
لإضافة سلسلة نستعمل
iptables -N MY-CHAIN
ولحذفها iptables -X MY-CHAIN
يجب أن نميّز بين الخدمة iptables تلك التي هي
/etc/init.d/iptables متبوعة بأحد الخيارات
start أو stop أو restart أو status أو save
والأداة iptables أي /sbin/iptables
بعد أن تدخل بالمستخدم الجذر su -
وتشغل الخدمة /etc/init.d/iptables start
تستطيع أن تعرض الجدول الحالي بالأمر
/sbin/iptables -L
أو
/etc/init.d/iptables status
الذان يعرضان صيغة متشابهة ويمكن عرض القواعد الحالية بالأمر
/sbin/iptables-save | less
الذي يعرض صيغة قريبة من المعاملات التي تمررها للأداة iptables.
بعد ذلك قد نرغب في أن نفرغ كل الجداول القديمة بالخيار F
ونغيّر السياسة التلقائية P أو نضيف A ...
تعمل التغييرات مباشرة ولكن
وبعد أن ننهي ذلك نخزن ما وصلنا إليه ليعمل تلقائياً في المرات القادمة
بالأمر /etc/init.d/iptables save
قلنا نحدد شروط/قواعد مطابقة معينة فإذا انطبقت فإننا نتخذ أجراء معين
مثلاً إسقاط/إهمال(يظن المتصل أي طلبه لم يصل) DROP أو
رفض (يعلم المتصل أن طلبه رفض) REJECT أو
قبول ACCEPT أو إظهار في ملف log التقرير LOG أو
تنكر عند التمرير MASQUERADE
أي أن يغيّر العنوان ليبدو وكأنه قدم من/إلى جدار النار،
أو يغيّر المنفذ REDIRECT --to-port X أو
أو يغيّر العنوان المصدر إلى عنوان معطى
SNAT --to-source IP أو الهدف
DNAT --to-destination IP
أو نرسلها إلى سلسلة (التي أضفناها بالخيار N) من الشروط لفحصها
بذكر اسم السلسلة عندها ستفحص شروط تلك السلسلة ثم يعود ليفحص الشروط الباقية.
نضيف هذه القواعد باستعمال -A
ثم نحدد ماذا يفعل إذا انطبق الشرط بالخيار -j
بإمكانك تحديد قواعد السياسة التلقائية default policy
أي ما لا ينطبق عليه قاعدة ماذا تفعل به
وذلك بواسطة الخيار
-P
وسواء وضعتها في البداية أو النهاية فإنها ستطبق بعد كل القواعد الأخرى.
مثلاً سياسة متحفظة (وهذا ما يجب أن يكون)
بأن يرفض كل شيء كما يلي (لاحظ لا نستعمل -j مع -P)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
بعد الخيار A نحدد ماذا نريد أن نطابق (نستعمل ! للنفي) مثلاً
- -p
-
لتحديد البرتوكول مثل tcp أو udp أو icmp
هناك بعض الخيارات الخاصة بروتوكول محدد مثلاً tcp يقبل --syn
استعمل iptables -p tcp -h لرؤيتها.
- -s
-
العنوان المصدر source (أي الذي قدمت منه) مثلاً IP 192.168.1.12
أو IP/Netmask مثل192.168.10.0/24
(بالنسبة لسلسلة الخرج فإن هذا يكون غالباً عنوانك فهي خرجت من جهازك فهو مصدرها)
- -d
-
العنوان الهدف destination أي المتوجهة إليه
(بالنسبة لسلسلة الدخل فإن هذا يكون غالباً عنوانك فهي دخلت جهازك لأنها متوجهة له)
وصيغته كما -s
- -i
-
الجهاز الذي دخلت منه in-interface مثل eth0 أو ppp+ أو lo
- -o
-
الجهاز الذي ستخرج منه out-interface مثل eth0 أو ppp+ أو lo
- --sport
-
المنفذ المصدر أي الذي قدمت منه source-port
(بالنسبة لسلسلة الخرج فإن هذا يكون غالباً منفذ الخادم على جهازك)
مثل 80 أو 20:80
كل الأرقام 20-80 ومثل 20: أي فوق 20
وحتى تعمل يجب أن تحدد البرتوكول ب-p
ليكون tcp أو udp.
ويمكنك أن تحدد أكثر من منفذ بأن تسبقها بالخيار
-m multiport
وتضع قائمة بالمنافذ تفصلها فاصلة كما
-m multiport --sport 21,22,80,135:139
ولكن لا يجوز أن تجمع بين تلك ب multiport ودونها.
- --dport
-
المنفذ المتوجهة إليه destination-port
(بالنسبة لسلاسل الدخل فإن هذا يكون غالباً منفذ الخادم على جهازك)
وصيغته كما sport
- -m state --state NEW,RELATED,ESTABLISHED
-
وضع قاعدة بحسب نوع الطرد هل هو جديد (لا يتعلق بما قبله)
أم أنه رد أم أنه اتصال جري مسبقاً.
يمكن وضع أكثر من واحد يفصل بينها فواصل.
- -m owner --uid-owner=500 --gid-owner=400 --pid-owner=60
-
الحكم عليها من خلال رقم المستخدم مثلاً 500 و رقم المجموعة 400 مثلاً
أو رقم البرنامج 60
- -m limit --limit M/T --limit-burst N
-
تحديد الحد الأعلى حيث M هو عدد الطرود pockets في وحدة الزمن T التي هي
second أو minute أو hour أو day ،
ويطابق بواسطة -j على تلك التي لا تخرق هذا الحد، لمطابقة
تلك التي تخرق الحد نستعمل '!' قبل '--limit' ،
وهناك ما لا يطابق ولا يخرق بل يفيض ليتابع إلى الشروط التالية أو السياسة
التلقائية، N هي المجموع الكلي للتي تطابق الحد '--limit' والتي
تتجاوزه (أي '! --limit') ، كل ما يزيد عن N في وحدة الزمن فإنه يتابع للشروط التالية،
إذا كانت N تساوي M فإن هذه الحالة لا تكون موجودة.
- --tcp-flags FLAGS_MASK ON_FLAGS
-
تستعمل مع -p tcp
حيث تأخذ أي مجموعتي جزئيتين من {SYN,FIN,ACK,RST,URG,PSH}
ويجوز استعمال ALL و NONE.
المعامل الأول FLAGS_MASK هو العلامات التي تريد فحصها
(ما لا يكون هنا لا يفحص)
والثاني هو تلك التي يجب أن تكون مفعّلة (1) ،
مثلاً -p tcp --tcp-flags SYN,FIN,ACK SYN,ACK
تعني SYN و ACK مفعّلتان و FIN مثبطة و الباقيات بأي قيمة.
- --syn
-
تستعمل مع -p tcp وتعني
--tcp-flags SYN,ACK,RST SYN
ويجب أن يكون أي NEW connection يحمل هذه العلامة
وإلا فإنه ربما port scan! أي ربما مقدمة لهجمة.
مثلاً إذا كنت تريد أن تمنع الجذر من الإتصال
iptables -A OUTPUT -m owner --uid-owner=0 -j REJECT
أو فقط التحذير منه في ملف التقرير /var/log/messages وذلك ب
iptables -A OUTPUT -m owner --uid-owner=0 -j LOG --log-prefix "FIREWALL:WARNING user is root."
تلميح
لعرض التقرير ابحث عن السابقة التي تضعها بواسطة
log-prefix ، للمثال السابق يمكنك استعمال grep "FIREWALL:" /var/log/messages
أو الأمر tail لرؤية آخر كذا سطر.
يجب أن يكون شرط التقرير LOG قبل شرط الإسقاط/الرفض DROP/REJECT إذا أردته أن يظهر في التقرير
ويمكنك عكس المطابقة ب! مثلاً
لإهمال كل ما هو قادم من خارج الشبكة 192.168.1.x
iptables -A INPUT -s! 192.168.1.0/24 -j DROP
لنقم ببعض التجارب؛ بعد أن تشغل خدمة iptables احذف كل القواعد بواسطة
iptables -F
و عدل السياسية التلقائية لتصبح متحفّظة كما ذكرنا بواسطة
iptables -P INPUT DROP
وكذلك للخرج والتمرير OUTPUT و FORWARD.
جرب أن تعمل ping على جهازك من جهاز آخر ومن جهازك لجهاز آخر. سوف لن تنجح
الآن غيّرها إلى السماح iptables -P INPUT ACCEPT
وكذلك للخرج والتمرير OUTPUT و FORWARD وجرب مرة أخرى. ستنجح بالتأكيد.
الآن لنعد للسياسة المتحفظة (التي لم تنجح فيها عملية ping)
ثم (نضيف) نسمح بكل الإتصلات عبر بروتوكول icmp
iptables -A INPUT -p icmp -j ACCEPT
ونفس الأمر لسلسلة الخرج OUTPUT. الآن نستطيع عمل ping من وإلى هذا الجهاز
ولكننا لا نستطيع تصفح الإنترنت من هذا الجهاز أو الدخول على خادم ويب على هذا الجهاز من جهاز آخر.
الآن لنسمح بتصفح الإنترنت مثلاً لماذا لا نسمح للجهاز بإرسال
أي شيء iptables -A OUTPUT ACCEPT ولكن
لا نريده أن يستمع ويستقبل كل شيء iptables -P INPUT DROP
(حتى الآن لا ننجح بالتصفح لأننا لا نسمح بالاستقبال فكيف ستصل الصفحات)
الآن لنسمح باستقبال ويب (ما قدم من منفذ 80) عبر البروتوكول tcp
ببساطة iptables -A INPUT -p tcp --sport 80 -j ACCEPT
لعلك تسأل لماذا sport وليس dport ؟ نعلم أن المنافذ برقم أقل 1024 فقط
يمكن للجذر فتحها ويمكن لغير الجذر التصفح لهذا نتأكد من أن منفذ 80
الخاص بالإنترنت ليس عند من يتصفح. أرقام المنافذ للخادم
في الغالب تكون ثابتة ومعروفة ومحددة مسبقاً أما المخدوم
فيتصل من أي منفذ عنده إليها. لهذا فإن المخدوم الذي يتصفح
الإنترنت يرسل من أي منفذ عنده إلى منفذ 80 على الخادم ويستقبل من منفذ 80 على الخادم
إلى نفس المنفذ الذي جاءت منه على المخدوم.
لهذا فهي تستقبل من منفذ 80 أي أنه مصدرها.
حسناً الأمر ليس بهذه البساطة ربما نحتاج منفذ 8080 و 3128 في حالة الخادم الوكيل
proxy، لنجرب الآن. أيضاً لم تنجح! لماذا؟
لنتتبع العملية.
لابد أنك جربت تصفح موقع مثل www.googl.com هنا يرسل جهازك إلى DNS
يسأل عن حل عنوانه إلى IP رقم؛ لحظة ! هل سمحنا بالاستقبال من DNS من منفذ 53 ؟
هل يعمل وفق tcp و udp ؟ حسناً لنسمح للإثنين
iptables -A INPUT -p tcp --sport 53 -j ACCEPT و
iptables -A INPUT -p udp --sport 53 -j ACCEPT
الآن أصبح للتصفح طعم آخر!
إذا كنا نعد خادم ويب وليس مخدوم فإن الأمر لن يختلف غير أن
الدخل في سلسلة INPUT سيكون قادم إلى المنفذ!80 في الخادم أي dport
في المثال السابق (خادم ويب) ، كانت سياسية الخرج التلقائية هي السماح
(بغض النظر عن المنفذ)
iptables -A OUTPUT ACCEPT
وهذا غير حكيم فنحن نريد أن نقلص الخطر إلى أضيق الحدود
يمكن تغييره إلى الحجب ولكن مع إضافة
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
هذه تقبل إرسل فقط كل ما هو رد على ما قبلنا دخوله
بهذا لا يمكن لهذا الخادم أن يكون مخدوم كأن يتصفح الإنترنت
ولكنه إذا أصيب بفيروس أو trojan فإنه لن يتمكن من إزعاج غيره
وتقليل عرض الحزمة bandwidth.
فإذا أردنا له التصفح أضفنا قاعدة سمحنا له بها بالمنفذ 80 ... إلخ.
فبذلك نضيق الشروط إلى الحد الأدنى. ولكن بالنسبة لجهاز مخدوم
(انظر البند التالي)
قد يكون التضيق إلى هذه لدرجة مزعج والأجدى التضيق من جهة الدخل
تلميح
تضيق الدخل يحمي من خطر الهجوم الخارجي
وتضيق الخرج يفترض أن يقلل من خطر trojan داخلي ولكن إذا كان هناك trojan
داخلي فإننا قد نكون وصلنا إلى نقطة لا تنفع فيها الندامة
راجع هجمات root kit في البند الأول.
يجب أن نتذكر أن الإتصال يتم بين طرفين يرسل ويستقبل كل منهما معاً
وليس يرسل أحدهما والآخر يسمع (لا تناقض مع مفهوم أن الخادم يستمع listen
لإنه بعد استقبال/سماع الأمر فإنه يرسل الجواب السماع الأول NEW وبعد الموافقة
ESTABLISHED )
كما ويجب أن تنتبه إلى السماح للخادم بالقيام
بالخدمة التي صمم من أجلها فمثلاً لا يجوز أن تمنع الإتصال القادم دون
طلب من الخادم إذا كان خادم ويب apache لأنه يقدم
الخدمة لمن يطلب (من متصفحين) وليس العكس كما لا يجوز أن تمنع منفذ DHCP
(في حال استعماله) وإلا لن يأخذ الجهاز عنواناً
.
قد يسهل عليك (ويقوي الشبكة لأن البسيط أقوى) أن
تجعل كل خادم مستقل (خادم apache على جهاز وخادم DNS على آخر وهكذا)
وتسمح بالتواصل من الجدار الناري إلى ذلك الخادم عبر عدد محدد من المنافذ.
لا يكفي أن تعرف الأدوات والمعاملات لتنجح
لهذا انظر للبندين التاليين.
5.4.6 جدار النار لجهاز مخدوم client
الشروط التي نريدها كلاماً هي
- السماح بإرسال أي شيء
- إذا كنت طلبت إتصال معين السماح لكل ما يتعلق به،
فقط نحتاج أن نسمح له أن يدخل لأننا سمحنا لكل خرج في البند السابق
- منع كل ما هو غير ذلك (مثل استقبال بيانات لم تطلبها تحمل علامة NEW)
ويكون ذلك بعد أن تحذف كل القواعد القديمة iptables -F
بالأوامر التالية (لا تجزع معظم الأسطر تعليقات) :
# from 'http://beyond.linuxfromscratch.org/blfs' with modifications
# free output on any interface to any ip for any service
iptables -A OUTPUT -j ACCEPT
# permit answers on already established connections
# and permit new connections related to established ones (eg active-ftp)
# output is not mentioned here because we allow it above
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Log everything else: What's Windows latest exploitable vulnerability
# It will be a new non-requisted input,
# maybe from your neighbour trojan
iptables -A INPUT -j LOG --log-prefix "FIREWALL:INPUT"
# set a default policy: everything not accepted > /dev/null
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
الآن يمكنك التصفح واستعمال ftp و ssh وأي مخدوم client.
ولكن ماذا ينقصنا لتكتمل الصورة ؟ لو كتبنا الأمر
ping 127.0.0.1 فإن طرد يحمل علامة NEW
سيخرج من الجهاز الوهمي lo ولكن لن يسمح له أن يدخل!
لنضيف شرط (في البداية حتى لا يضاف لتقرير log) يسمح توصل الجهاز مع نفسه
# allow loopback device(lo) input connections
# so ping 127.0.0.1 will work
iptables -I INPUT 1 -i lo -j ACCEPT
هناك فائدة أخرى لهذا الشرط، لنفرض أنك شغلت خادم apache
على سبيل التجربة لتعلم CGI مثلاً ، أو أي خادم آخر
ولكن لن يراه أحد من خارج جهازك، هذا السطر سيفي بالغرض.
كما أن أي محاولة لإختراق جهازك أثناء اتصالك بالإنترنت
من خلال المسح عن منافذ port scanner لمعرفة ما لديك من خادمات ومنافذ مفتوحة وتجربة
الثغرات الخاصة بها ستفشل من الأساس لأن عملية المسح
ستدخل في سلسلة INPUT وهي تحمل العلامة NEW
وليس ESTABLISHED أو RELATED لهذا سوف لن تنطبق عليها قواعد القبول بل قاعدة
التقرير/التحذير LOG ثم السياسة العامة DROP الإسقاط/الإهمال/الحذف
أي لن تدخل. فإذا تحزر أنك تشغل apache فإن تطبيق الهجوم أيضاً سيمر بنفس
المسار إلى الإسقاط لأنه يدخل بالعلامة NEW.
إذا كنت في شبكة محلية وتثق بهم قد تريد أن تسمح لهم بالإتصال معك
في أشياء لم تطلبها (جديد NEW وفي سلسلة الدخل INPUT)
مثلاً أن يتمكنوا من عمل ping يمكنك إضافة
iptables -I INPUT 2 -s 192.168.0.0/16 -j ACCEPT
ولكن هذا سيسمح لهم بالدخول على الخادمات على جهازك وهذا ليس ما نريد
(انظر عنوان البند ثم انتقل للبند التالي)
بل فقط نريد أن نسمح بعملة ping وذلك بالسماح لبروتوكول icmp
بل فقط نوعين منه 8 و 11 وهما طلب الصدى وأحد الأخطاء
iptables -R INPUT 2 -s 192.168.0.0/16 -p icmp --icmp-type 8,11 -j ACCEPT
لمزيد من التفاصيل عنه اكتب iptables -p icmp -h.
الآن هم لا يستطيعون الدخول إلى ملفات عندك share ولا عمل ssh انظر البند التالي
لأن هذه خادمات
5.4.7 جدار النار لجهاز خادم server
لدينا عدة أنواع مختلفة من الخادمات يتطلب كل منها
إعدادات منفصلة ومنها
- جدار النار لنفس الجهاز يسمح لخدمات محددة (ssh و web)
- جدار النار للشبكة كاملة (البوابة) يقوم بالتنكر
- كسابقه ويقوم بتعديل العناوين من أجل المنطقة منزوعة السلاح DMZ
لنفرض أن لدينا خادم معين يقدم خدمة ويب
(أي خدمة أخرى أضفها بتغيير رقم منفذ ويب 80 إلى رقم تلك الخدمة)
فإننا غالباً نريد أن نسمح إضافة لذلك بالوصول إليه عن بعد
ولكن ليس عبر telnet (منفذ 23) أو rsh بل ssh لأنه آمن ومشفر
يعمل ssh على منفذ 22 ونريد السماح بالتشارك مع شبكات ويندوز SMB
وطبعاً بتحويل الأسم إلى عنوان DNS منفذ 53.
لن يكون علينا تعديل الكثير
# By Moayyad al-Sadi (compound of several resources)
# free output on any interface to any ip for any service
iptables -A OUTPUT -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
# permit answers on already established connections
# and permit new connections related to established ones (eg active-ftp)
# output is not mentioned here because we allow it above
ipta`les -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# allow open ports for ssh(22),dns(53),www(80),smb(135:139)
iptables -A INPUT -p tcp -m multiport --dport 22,53,80,135:139 -j ACCEPT
iptables -A INPUT -p udp -m multiport --dporp 53,135:139 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8,11 -j ACCEPT
# Log everything else: What's Windows latest exploitable vulnerability
# It will be a new non-requisted input,
# maybe from your neighbour trojan
iptables -A INPUT -j LOG --log-prefix "FIREWALL:INPUT"
# set a default policy: everything not accepted > /dev/null
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
قد تحب السماح بمنافذ tcp رقم 113 قد يحتاجه IRC
كما ومنافذ udp رقم 123 (الزمن عبر الشبكة) و 2074 لبعض برامج الوسائط المتعددة و 4000 من أجل ICQ
للقائمة الكاملة انظر ملحق المنافذ.
تذكر إذا قمت بعمل شروط في سلسلة الخرج أن تسمح بنفس المنافذ
التي سمحت بها في سلسلة الدخل،
كما تسمح إضافة لذلك DHCP من منفذ 67 إلى 68 إذا كنت تستعمله.
لتفادي بعض الهجمات يمكنا أن نضيف في البداية
# from Oskar Andreasson's iptables tutorial
iptables -I INPUT 1 -p tcp --tcp-flags SYN,ACK SYN,ACK \
-m state --state NEW -j REJECT --reject-with tcp-reset
iptables -I INPUT 2 -p tcp ! --syn -m state --state NEW -j LOG \
--log-prefix "FIREWALL: New not syn:"
iptables -I INPUT 3 -p tcp ! --syn -m state --state NEW -j DROP
إذ من غير المنطقي أن يأتي طرد بعلامتي SYN/ACK معاً ويكون تابع لإتصال جديد
(المنطقي أن يكون RELATED أو ESTABLISHED)
كما من غير المنطقي أن يأتي طرد جديد لا يحمل علامة SYN.
هاتان الحالتان قد تكونا نوع من port-scan أو spoofing.
قد تحب أن ترى تقرير عن كل ما لم يطابق شروط السماح
وقبل أن يتم إرساله إلى السياسة التلقائية (المتحفظة بالرفض)
انظر إلى آخر شرط في سلسلة INPUT فقد كان بأن
يكتب تقرير بها ولكن لتلافي طول وازدحام في التقارير
(إذا كان التقرير طويلاً فإنك لن تقرأه!)
لهذا نضع شرط زمني (3 في الدقيقة مثلاً)
ونجعلها آخر القواعد في كل سلسلة كما يلي
# from Oskar Andreasson's iptables tutorial
iptables -A INPUT -m limit --limit 3/minute --limit-burst 6 -j LOG \
--log-level DEBUG --log-prefix "FIREWALL: INPUT packet died: "
iptables -A OUTPUT -m limit --limit 3/minute --limit-burst 6 -j LOG \
--log-level DEBUG --log-prefix "FIREWALL: OUTPUT packet died: "
طبعاً هذا الشرط الآخير في سلسلة الخرج ليس له أي قيمة
لأن الشرط الذي قبله كان السماح بكل شيء ولكن لندعه
إذا أحببت أن تضيف قيود على الخرج في المستقبل.
لاحظ أن الشروط الأخيرة هي نفسها للدخل والخرج والتمرير ... لهذا قد نفضل أن
نضعها لوحدها في سلسلة وعند اللزوم نرسلهم لهذه المجموعة من الشروط.
# By Moayyad al-Sadi (compound of several resources)
# set a default policy: everything not accepted > /dev/null
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# set a precheck
iptables -N prechk
# log and drop strange non SYN new connections
iptables -A prechk -p tcp --tcp-flags SYN,ACK SYN,ACK \
-m state --state NEW -j REJECT --reject-with tcp-reset
iptables -A prechk -p tcp ! --syn -m state --state NEW -j LOG \
--log-prefix "FIREWALL: New not syn:"
iptables -A prechk -p tcp ! --syn -m state --state NEW -j DROP
# add more pre-checked roules here
# set a postcheck
iptables -N postchk
# just log non matching pockets
iptables -A postchk -m limit --limit 3/minute --limit-burst 6 -j LOG \
--log-level DEBUG --log-prefix "FIREWALL: INPUT packet died: "
# add more post-checked roules here
# do the precheck
iptables -A INPUT -j prechk
iptables -A OUTPUT -j prechk
iptables -A FORWARD -j prechk
# free output on any interface to any ip for any service
iptables -A OUTPUT -j ACCEPT
# free input from THIS machine '127.0.0.1'
iptables -A INPUT -i lo -j ACCEPT
# permit answers on already established connections
# and permit new connections related to established ones (eg active-ftp)
# output is not mentioned here because we allow it above
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# allow open ports for ssh(22),dns(53),www(80),smb(135:139)
iptables -A INPUT -p tcp -m multiport --dport 22,53,80,135:139 -j ACCEPT
iptables -A INPUT -p udp -m multiport --dport 53,135:139 -j ACCEPT
# add more TCP/UDP ports here
# allow ping
iptables -A INPUT -p icmp --icmp-type 8,11 -j ACCEPT
# do the postcheck
iptables -A INPUT -j postchk
iptables -A OUTPUT -j postchk
iptables -A FORWARD -j postchk
وإذا كنا نعد الجدار الناري الخاص بخادم squid proxy أولاً نضيف المنفذ 8080 أو 3128
ونلاحظ أننا لا نريد له أن يستقبل أي شيء قادم إلى المنفذ 80 لهذا يمكننا أن
(لأنه يتجاوز بذلك الخادم الوكيل - مما يعني أنه قد يحصل على سرعة أكثر/أقل من غيره
أو يدخل للمواقع التي لا نريد أن نسمح له بها )
أن نحجب REJECT الطلبات القادمة إليه. ولكن هناك خيار أفضل من ذلك هو أن نحولها
إلى المنفذ 8080 وذلك بواسطة
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 8080
يحتال البعض للدخول إلى المواقع الممنوعة وذلك عبر خادم وكيل
آخر غير خادمنا ليقوم بإحضارها له بإمكاننا أن نمنع ذلك من خلال.
الشرطين
iptables -A INPUT -d ! $PROXY_IP -p tcp -m multiport --dport 3128,8080 \
-j LOG --log-prefix "FIREWALL: a trial to skip proxy: "
iptables -A INPUT -d ! $PROXY_IP -p tcp -m multiport --dport 3128,8080 \
-j REJECT
نضعهما قبل الشرط الذي به المنافذ المسموحة، حيث
PROXY_IP هو عنوان الخادم الوكيل proxy الوحيد الذي نريد أن نسمح به.
النوع الآخر من جدر النار هو جدار النار للشبكة كاملة (البوابة) يقوم بالتنكر
وهو جهاز يتصل بطرف من الإنترنت عبر مودم أو إيثرنت ...إلخ، و بطرف آخر
مع الشبكة الداخلية عبر بطاقة أخرى.
مهمته أن يجعل الإنترنت مرئية للشبكة الداخلية
ويجعل الشبكة الداخلية غير مرئية للإنترنت إلا كرد لما طلبته الشبكة الداخلية
(أي الخادمات الموجودة بها غير مرئية) .
ونتذكر أن عناوين الشبكة الداخلية غير صالحة في الإنترنت
وهنا تأتي مهمة التنكر
أي أن يضع عنوانه مكان عناوين الشبكة الداخلية
فتبدو الطرود الصادرة وكأنه خارجة منه.
لعمل هكذا خادم نجعله البوابة gateway لكل المخدومات وذلك بأمر route
(على كل واحد منها)
وعلى الخادم نسمح له بالتمرير
FORWARD ولكن ليس بشكل عام iptables -A FORWARD -j ACCEPT
بل ضع شروط بحسب واجهة الشبكة (البطاقة) أو بحسب العنوان.

بالكلام الشروط هي
(على فرض أنه يرتبط على مع الشبكة الداخلية بواسطة eth1 و الإنترنت eth0)
- السماح بإرسال أي شيء من وإلى نفس الجهاز (عبر lo)
- تمرير اتصالات جديدة فقط من الشبكة الداخلية إلى الإنترنت
أي تلك التي مصدرها in-interface ليس eth0 في المثال وليس بالإتجاه الآخر
- السماح بالتمرير للإتصالات التي سمحنا بإنشائها أي ESTABLISHED و RELATED
- التنكر لتتمكن الأجهزة الداخلية من الإتصال بالإنترنت وذلك بتعديل العنوان nat
بعد تحديد وجهتها Post-routing
الأوامر هي كما يلي (غيّر INET_NIC إلى "ppp+" إذا كنت تستعمل مودم وهكذا)
# modified version of blfs
# set internet network interface card
INET_NIC="eth0"
# set default policy
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# allow self local-only connections on 127.0.0.1
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# allow forwarding
iptables -A FORWARD -m state --state NEW -i ! $INET_NIC -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# do masquerading
iptables -t nat -A POSTROUTING -o $INET_NIC -j MASQUERADE
ويمكن استعمال العناوين بدل الواجهات/البطاقات ولكن
هذا غير عملي لأن العناوين كثيرة وقد تتغير (تعتمد على مزود الخدمة)،
تأكد أن الملف /etc/init.d/iptables يقوم
بعمليات modprobe و echo التي ذكرناها في البند 5.4.4.
يمكنك أن تضيف الشروط المسبقة واللاحقة التي عملناها سابقاً ليصبح
# By Moayyad al-Sadi (compound of several resources)
# set internet network interface card
INET_NIC="eth0"
# set a default policy: everything not accepted > /dev/null
iptables -P INPUT DROP
iptajles -P FORWARD DROP
iptables -P OUTPUT DROP
# set a precheck
iptables -N prechk
# log and drop strange non SYN new connections
iptables -A prechk -p tcp --tcp-flags SYN,ACK SYN,ACK \
-m state --state NEW -j REJECT --reject-with tcp-reset
iptables -A prechk -p tcp ! --syn -m state --state NEW -j LOG \
--log-prefix "FIREWALL: New not syn:"
iptables -A prechk -p tcp ! --syn -m state --state NEW -j DROP
# add more pre-checked roules here
# set a postcheck
iptables -N postchk
# just log non matching pockets
iptables -A postchk -m limit --limit 3/minute --limit-burst 6 -j LOG \
--log-level DEBUG --log-prefix "FIREWALL: INPUT packet died: "
# add more post-checked roules here
# do the precheck
iptables -A INPUT -j prechk
iptables -A OUTPUT -j prechk
iptables -A FORWARD -j prechk
# allow self local-only connections on 127.0.0.1
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# allow ping from LAN
iptables -A INPUT -i ! $INET_NIC -p icmp --icmp-type 8,11 -j ACCEPT
# allow forwarding
iptables -A FORWARD -m state --state NEW -i ! $INET_NIC -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
# do masquerading
iptables -t nat -A POSTROUTING -o $INET_NIC -j MASQUERADE
# do the postcheck
iptables -A INPUT -j postchk
iptables -A OUTPUT -j postchk
iptables -A FORWARD -j postchk
المشكلة الأساسية هي أن بعض البروتوكولات مثل ftp و irc
تضع العناوين والمنافذ ليس فقط داخل tcp بل وداخل تركيب في البروتوكول ftp و irc
الذي لا تصله عملية nat لهذا نقوم بتحميل modules تقوم بهذا التعديل هي
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
modprobe ip_nat_ftp
modprobe ip_nat_irc
إذا كان هذا الخادم يستعمل لأغراض أخرى قد ترغب أن تسمح له بالتصفح
وبأن يدخل عليه عبر ssh وفي هذه الحالة يسمى Busy box firewall.
النوع الأخير من جدر النار هو الذي يسمح بالمنطقة منزوعة السلاح DMZ firewall
حيث يسمح بتشغيل خادمات داخل الشبكة الداخلية
تحمل عناوين محجوزة خارج الإنترنت من أن
تتصل مع الإنترنت بإعطائها عنوان عام (مرئي في الإنترنت) بعملية nat
وهذا طبعاً أفضل من أن نربط الخادم مباشرة مع الإنترنت.
الشرط سيكون بكل بساطة كل ما جاء من الواجهة المتصلة بالإنترنت إلى منفذ 80
(أو إلى العنوان العام الخاص بخادم ويب إن كان هناك عنوان عام له غير عنوان
البوابة )
عدل عنوانه في مرحلة ما قبل التوجيه PREROUTING ليصبح عنوان
خادم ويب في الشبكة الداخلية. كما يلي
iptables -t nat -A PREROUTING -p tcp -i $INET_NIC -d $INET_IP --dport 80 \
-j DNAT --to-destination $DMZ_HTTP_IP
وفي مرحلة ما بعد التوجيه كل ما يتوجه خارجاً إلى الإنترنت
نعيد العنوان فيه ليكون صادراً عن العنوان العام
iptables -t nat -A POSTROUTING -o $INET_NIC -j SNAT --to-source $INET_IP
حيث INET_NIC هو الجهاز المتصل بالإنترنت مثل eth0 و
DMZ_HTTP_IP هو عنوان خادم ويب في الشبكة الداخلية
و INET_IP هو العنوان العام المرئي في الإنترنت الذي يعطيك إياه مزود الخدمة
لمزيد من التفاصيل انظر
5.4.8 اختبار جدار النار
في حالة الجدار الشخصي للجهاز المخدوم الذي لا يستقبل أي شيء
يفترض أن لا يستجيب عند طلب ping ولا يظهر عند السبر بالخيار sL
في nmap إذا ظهرت غيّر DROP إلى REJECT --reject-with tcp-reset
. أي أنك غير مرئي للمخترقين (على الأقل من خارج الشبكة المحلية)
بالمقابل يجب أن يستجيب الآخرون عند عمل إتصال من عنك إليهم
مثل تصفح الإنترنت وعمل ping أو عمل telnet على أي منفذ.
أما الجهاز المخدوم يجب أن لا يظهر منافذ مفتوحة أو مفلترة
حيث أننا موّهنا حتى المنافذ المفتوحة! حسناً هذه لن تنجح
مع nmap لأنه يقوم على عدة طرق بعضها مثل sT يقوم بإتصل عادي
(الخبر الجيد أن هذه الطرق تظهر في ملفات التقرير log الخاصة بالخادم على ذلك المنفذ)
المنافذ المفلترة يجب أن تظهر على أنها مفلترة أو مغلقة وهو الأفضل.
قم بسبر جهازك بواسطة nmap من داخل وخارج الشبكة
وتأكد من أن المنافذ المفتوحة هي فقط تلك التي تثق بالخادمات
التي تريدها. إذا كنت تعتمد سياسة تقوم على
فتح منافذ معينة أمام الشبكة المحلية أو بعض العناوين الموثوقة
وحجبها أمام عناوين أخرى (الإنترنت مثلاً) يمكنك
استعمال nmap لاختبار ذلك عبر جهاز واحد وذلك عبر السبر مع تمويه العنوان
بواسطة الخيار sI متبوع بالعنوان الذي تريد أن يبدو السبر منه
ثم العنوان الذي تريد فحص جداره الناري لترى المنافذ
المفتوحة أمام الأول عند الثاني من جهاز ثالث
(ذكرنا سابقاً خيارات أخرى مثل S أيضاً تصلح).
يمكن استعمال nc لتجربة جدار النار أيضاً وذلك بإغلاق الخادم على المنفذ
الذي تريد فحصه وتشغيل nc مكانه بالخيار l
ومن جهاز آخر تجرب nc للدخول على ذلك المنفذ ولكني أجد nmap أفضل لأنه
لا يتطلب إغلاق الخادم كما يمكنه دراسة علاقات الثقة بين
الأجهزة.
5.4.9 كلمة أخيرة
هناك خيارات قد تفضلها للجهاز الخادم منها:
أن لا يتم إغلاقه إلا من قبل المستخدم الجذر عدّل خيارات gdm
و PAM على هذا الأساس. وأن يعيد تشغيل الجهاز تلقائياً في حالة
الخلل الذي يحدث داخل النواة panic بعد فترة معينة وذلك بتمرير عدد الثواني
للنواة مثلاً 15 ثانية panic=15
عبر kernel في grub أو عبر append في lilo أيضاً اجعل برنامج الإقلاع يدخل لينكس تلقائياً.
بقي أن تتأكد من أن خيار إعادة التشغيل تلقائياً بعد عودة التيار الكهربائي
من الإنقطاع مفعّل في BIOS.
على الرغم من وجود كلمات سر مصنعية لإعداد أغلب أنواع BIOS
(انظر فصل إدارة النظام)
ولكن لا ننصح بالتكلف بالحصول على BIOS خاصة ليس لها
كلمات مصنعية إذا كان هناك كلفة إضافية لأنه يمكن تجاوزها بنزع البطارية.
ضع كلمة سر بسيطة(مختلفة عن أي كلمة سر مهمة) على الدخول إلى إعداد BIOS
ولكن كن مستعداً على خسارتها لهذا قلنا بسيطة، واجعل أولوية
الإقلاع من القرص الصلب واحذف خيار قائمة الإقلاع من BIOS تلك التي تعرض ما يشبه
F12 Boot menu.
إعتمد على الأمان
الفيزيائي للجهاز مثل حرس وكاميرات مراقبة وغرف زجاجية خلف حماية معدنية
وأقفال على الأبواب وأقفال على صندوق الجهاز لمنع فتحه
ومرابط على الأسلاك لمنع توصيل أو فك توصيل أي قطعة بالجهاز.
ويجب أن يتناسب ذلك مع أهمية الجهاز (توقع أن تزيد مزانية المخرب
ومهارته كلما زادت أهمية البيانات والجهاز الذي تحميه)
ولكن هذا لا يعني أن تجعل هناك فرق ظاهر بأن الجهاز/الغرفة
الفلانية هي المهمة كأنك تقول له
"أخي المخرب، الجهاز الخادم في هذه الغرفة".
ضع كلمة سر في برنامج الإقلاع واجعل ملف إعداده مملوك ومرئي للجذر فقط
chown root.root grub.lst && chmod 600 grub.lst
كذلك الحال لملف shadow و ملف sudoers. أما المفاتيح الخاصة العائدة بكل
مستخدم ل ssh فيجب أن تكون مملوكة للمستخدم ومجموعة الجذر
(ليس ضروري أن تكون مجموعة الجذر ولكن هذا أحوط)
chown ali.root rsa_key && chmod 600 rsa_key.
ويفضل أن تمنع الدخول عن بعد باسم الجذر!
وتمنع الدخول باسم الجذر بعد الإنتهاء من إعداد الجهاز
وذلك على الأجهزة التي توكل عليها مسؤولاً أقل خبرة منك
حتى لا يستغل جذرهم في الدخول على بقية الشبكة
أو الذي يخاف أن ينقلها لشركات منافسة والاستعاضة عن الجذر
بمستخدم من مجموعة wheel وأدوات consolhelper .
إجعل القرص الصلب كله مشفر أو قسمي الجذر والتبديل swap،
إضافة للقسم الذي يحتوي البيانات المهمة، وذلك عبر loopback device
أو فقط الذي يحتوي البيانات الحساسة (تذكر القسم الجذر يحتوي الإعادات وكلمات السر)
من خلال عمل initrd يستدع losetup
انظر فصل نظرة تشريحية و
فصل إدارة الأقراص.
أو لا تشفر شيء! وذلك حسب مقدار حساسية البيانات التي تستعملها.
تأكد من قائمة sudoers من خلال visudo
حيث يجب أن تحتوي الحد الأدنى. راقب الملفات ذات الأذونات/الصلاحيات
suid و sgid أي 2XYZ و 4XYZ
من خلال الخيار -perm في أداة find
خزن هذا التقرير وضع في اسمه تاريخاً لأغراض الأرشفة والتوثيق، كما الأمر التالي:
bash# find / -perm -6000 > ~/perm$(date '+%Y-%m-%d')
راقب أي تغيّر بين أي تاريخين - يمكنك ذلك بواسطة أداة diff. في توزيعة ديبيان هناك cron يقوم بذلك.
راقب ملفات التقرير log في كل توزيعة أداة لذلك أو باستعمال less و grep.
عند كتابة نصوص تنفيذية script أو برامج CGI
تأخذ معاملات من المستخدم أو تسأله عنها تأكد
قبل أن تتابع أنه أدخل شيئاً منطقياً وأنه يخلو من الرموز الخاصة
أو قم بعملية escaping لها.
تأكد من تغيير كلمات السر التلقائية (التي تأتي من المصنّع أو التوزيعة) ،
وتأكد من تفعيل pam_cracklib.so في ملفات إعداد pam
في توزيعة ريدهات وفيدورا يكفي إضافتها في بداية /etc/pam.d/system-password.
ضع مدة صلاحية للمستخدمين وكلمات سرهم بواسطة chage.
تأكد من تقليل عضوية المستخدمين في مجموعات لها صلاحيات عالية
مثل مجموعة wheel و admin و root.
عند تشغيل خادمات مرئية للأنترنت (عبر DMZ مثلاً) تأكد من أنها
تعمل بغير اسم الجذر وتعمل داخل قفص تغيير الدليل الجذر chroot jail.
لا تبالغ في كل تلك الخطوات إذا كان جهازاً منزلياً
ولكن مهما كنت مستهتراً لا تنس جدار النار.
|