5.4 أمن الشبكات | كتاب لينكس الشامل | >> |
الخطأ الذي كنت أقع فيه (عندما كنت أعيش في عقلية ما قبل لينكس) وأظن أنك قد تهمل قراءة هذا الفصل لأجله هو عدم الإكتراث للحماية تقول لنفسك أني لست بحاجة لأي نوع من الحماية فأنا لست ناسا ولا وكالة الأمن القومي! ليس لدي أرقام بطاقات إئتمان مخزنة على الحاسوب وبريدي مجاني ولن أحزن لو تسربت أي كلمة سر ، وحتى جهازي في حال تدميره بفيروس فإن كل ما قد يكلفني القليل من الساعات والكثير من الأسبرين لإعادة تركيب ويندوز.
البعض يفضل فيروس لا يعيق سرعة الجهاز على مضاد فيروس يقلل من سرعة الجهاز!
طرق الحماية المذكورة هنا تجعل جهازك يعمل بطريقة أسرع! على عكس ما تتوقع لأنها لا تحمل جهازك أي عبئ إضافي فقد صمم جنو/لينكس من الأساس والأمن في البال. بل ستلحظ زيادة في السرعة (سرعة الإتصال) لأن النشاطات المشبوهة يتم حجبها!
بالنسبة للشركات قد يبدو خيار شراء جهاز عملاق مرتفع الثمن خياراً جذاباً مقابل شراء عدد من الأجهزة الشخصية لعدة أسباب منها الإقتصادية ومنها الكِبْر (إلى زبائننا الكرام نحن لدينا سوبر كمبيوتر!) ، ولكن هذه العقلية هي أول خطر وهو يسمى 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 الرسومي الذي يأتي مع فيدورا. وهي تستعمل لهدف نبيل (دراسة وتشخيص الشبكة) أو شرير (جمع كلمات السر وأرقام بطاقات الإتمان)، تعتمد هذه البرامج على مبدأ أن الجهاز قد يستقبل ما ليس له تذكر تبولوجيا البث العام 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 زائف يقول للجهاز أ "أنا ب أدخل كلمة السر".
نعود للقصة الشهيرة حصان طروادة الخشبي 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
في نظام لينكس يتم تحميل كل جزء في مقطع ذاكرة منفصل
طريقة أخرى قد يتبعها المهاجم بأن يمرر للخادم (أو لما ينفذه الخادم مثل 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
/etc/shadow
إلى المخرب الكبير.
أولاً تابع آخر الأخبار واطلب مساعدة عبر 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
.
جدر النار من أقوى تقنيات الحماية وأكثرها فعالية، في الأنظمة الأخرى مثل ويندوز حيث عليك شراؤها من شركات مثل Norton Symantec كما تشتري مضاد الفيروسات ، ولكن إذا كنت تستخدم لينكس فاعلم أن لديك جدر نار مبنية في نواة لينكس !! نعم داخل نواة لينكس الصغيرة!! وكل ما عليك هو تعلم كيفية استعمالها. وقد يقول قائل أنا أستخدم برامج لينكس الموثوقة التي رأى الجميع ملفها المصدري ويعرف أنها لا تفعل سوى مايطلب منها فلم أشغل رأسي بهذا الكلام؟ وأن كل ملفاتي السرية موضوعة باسم مستخدم آخر غير الذي أستعمله لتصفح الشبكة. الجواب أنك قد تستعمل أحد برامج ويندوز غير المضمونة عن طريق wine أو قد يكون الخادم لديك عليه لينكس ولكن أحد الطرفيات أو الذين ليست لك عليهم سلطة يستخدمون ويندوز أو قد ينصبون برنامج دون علمك مما قد يسبب لك الكوابيس. إذا كنت في شركة بها 100 موظف -غير مختصصين بالحاسوب مثلاً مدخلي بيانات- لا يعقل أن تعمل لهم دورة في أمن الشبكات وتخبرهم ما هو آمن وما يفتح الثغرات. وجود جدر ناري يسرع إتصالك بالشبكة فهو يوفر مساحات البث التي تحجزها الاتصالات المحجوبة. وهو يحميك من هجمات حصان طروادة أو من خداعك برسائل مضللة تعمل على تثبيت خادمات تستمع لأوامر عن بعد. كما أن وجوده داخل النواة بعمليات ذرية atomic يجعلك لا تشعر بوجوده الحالة الوحيدة التي قد لا ترغب بجدر نار هي أن تكون وحيداً. حتى الشبكة الداخلية غير الموصولة بالإنترنت تحتاج جدار نار. ولكن أولاً ما هي جدر النار؟ يظن الناس أن جدر النار تشبه المصهر fuse جهاز رخيص مهمته أن يستقبل الهجمات فيتعطل ليحمي الشبكة الداخلية وهذا الكلام خطأ. ، جدر النار لغوياً هي تلك الجدر التي توضع لحجب النار ومنع إنتشارها، وهي اصطلاحاً هي طرق لحماية الشبكة تعمل بطريقتين أولاً التصفية وثانياً تعديل العناوين ويمكن أن نضع جدار نار حول كل جهاز و/أو نخصص الجهاز البوابة الذي يربط باقي الأجهزة بالإنترنت ليكون جدار النار . التصفية/الترشيح/الفلترة هي تحديد قوانين لما يسمح له بالعبور ولحجب الدخول غير المرغوب أو المشبوه. أما تعديل العناوين nat لتتمكن الأجهزة ذات العناوين الداخلية في الشبكة LAN من الإتصال بالإنترنت عبر جدار النار من خلال تعديل عنوان الطرود pockets لتبدو وكأنها قادمة منه (حيث يكون الجهاز الذي عليه جدار النار مرتبط بالإنترنت وله عنوان مرئي من خارج الشبكة) وهناك أكثر من طريقة وقبل أن نتعرف عليها نتعرف على بعض المصطلحات.
IPv4
w.x.y.z
حيث w و x و y و z أرقام عشرية
IPv6
pocket
tcp
udp
icmp
new connection
estsblished connection
related connection
Danger Zone
DMZ - De-Militarized Zone
Private Zone
NAT - Network Address Translation
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
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
.
مرة أخرى لا تشغل نفسك بها.
قلنا أن جدار النار هو مجموعة من قواعد المطابقة
وماذا يفعل بما ينطبق على كل قاعدة
من خلال 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
قلنا نحدد شروط/قواعد مطابقة معينة فإذا انطبقت فإننا نتخذ أجراء معين
مثلاً إسقاط/إهمال(يظن المتصل أي طلبه لم يصل)
لعرض التقرير ابحث عن السابقة التي تضعها بواسطة
log-prefix ، للمثال السابق يمكنك استعمال DROP
أو
رفض (يعلم المتصل أن طلبه رفض) REJCET
أو
قبول ACCEPT
أو إظهار في ملف log التقرير LOG
أو
تنكر عند التمرير MASQUERADE
أي أن يغيّر العنوان ليبدو وكأنه قدم من/إلى جدار النار،
أو يغيّر المنفذ 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
مثلاً إذا كنت تريد أن تمنع الجذر من الإتصال-p
--syn
استعمل iptables -p tcp -h
لرؤيتها.
-s
192.168.1.12
أو IP/Netmask مثل192.168.10.0/24
(بالنسبة لسلسلة الخرج فإن هذا يكون غالباً عنوانك فهي خرجت من جهازك فهو مصدرها)
-d
-s
-i
-o
--sport
20:80
كل الأرقام 20-80 ومثل 20:
أي فوق 20
وحتى تعمل يجب أن تحدد البرتوكول ب-p
ليكون tcp أو udp.
ويمكنك أن تحدد أكثر من منفذ بأن تسبقها بالخيار
-m multiport
وتضع قائمة بالمنافذ تفصلها فاصلة كما
-m multiport --sport 21,22,80,135:139
ولكن لا يجوز أن تجمع بين تلك ب multiport ودونها.
-m state --state NEW,RELATED,ESTABLISHED
-m owner --uid-owner=500 --gid-owner=400 --pid-owner=60
-m limit --limit M/T --limit-brust N
--limit
--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."
تلميح
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 ucp --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 وبعد الموافقة ESTABLESHED ) كما ويجب أن تنتبه إلى السماح للخادم بالقيام بالخدمة التي صمم من أجلها فمثلاً لا يجوز أن تمنع الإتصال القادم دون طلب من الخادم إذا كان خادم ويب apache لأنه يقدم الخدمة لمن يطلب (من متصفحين) وليس العكس كما لا يجوز أن تمنع منفذ DHCP (في حال استعماله) وإلا لن يأخذ الجهاز عنواناً . قد يسهل عليك (ويقوي الشبكة لأن البسيط أقوى) أن تجعل كل خادم مستقل (خادم apache على جهاز وخادم DNS على آخر وهكذا) وتسمح بالتواصل من الجدار الناري إلى ذلك الخادم عبر عدد محدد من المنافذ. لا يكفي أن تعرف الأدوات والمعاملات لتنجح لهذا انظر للبندين التاليين.
الشروط التي نريدها كلاماً هي
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
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
إذا كنت في شبكة محلية وتثق بهم قد تريد أن تسمح لهم بالإتصال معك في أشياء لم تطلبها (جديد NEW وفي سلسلة الدخل INPUT) مثلاً أن يتمكنوا من عمل ping يمكنك إضافة
iptables -I INPUT 2 -s 192.168.0.0/16 -j ACCEPT
iptables -I INPUT 2 -s 192.168.0.0/16 -p icmp --icmp-type 8,11 -j ACCEPT
iptables -p icmp -h
.
الآن هم لا يستطيعون الدخول إلى ملفات عندك share ولا عمل ssh انظر البند التالي
لأن هذه خادمات
لدينا عدة أنواع مختلفة من الخادمات يتطلب كل منها إعدادات منفصلة ومنها
لنفرض أن لدينا خادم معين يقدم خدمة ويب (أي خدمة أخرى أضفها بتغيير رقم منفذ ويب 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
# 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
# from Oskar Andreasson's iptables tutorial iptables -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG \ --log-level DEBUG --log-prefix "FIREWALL: INPUT packet died: " iptables -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -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 3 -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
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
النوع الآخر من جدر النار هو جدار النار للشبكة كاملة (البوابة) يقوم بالتنكر
وهو جهاز يتصل بطرف من الإنترنت عبر مودم أو إيثرنت ...إلخ، و بطرف آخر
مع الشبكة الداخلية عبر بطاقة أخرى.
مهمته أن يجعل الإنترنت مرئية للشبكة الداخلية
ويجعل الشبكة الداخلية غير مرئية للإنترنت إلا كرد لما طلبته الشبكة الداخلية
(أي الخادمات الموجودة بها غير مرئية) .
ونتذكر أن عناوين الشبكة الداخلية غير صالحة في الإنترنت
وهنا تأتي مهمة التنكر
أي أن يضع عنوانه مكان عناوين الشبكة الداخلية
فتبدو الطرود الصادرة وكأنه خارجة منه.
لعمل هكذا خادم نجعله البوابة gateway لكل المخدومات وذلك بأمر route
(على كل واحد منها)
وعلى الخادم نسمح له بالتمرير
FORWARD ولكن ليس بشكل عام iptables -A FORWARD -j ACCEPT
بل ضع شروط بحسب واجهة الشبكة (البطاقة) أو بحسب العنوان.
"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 3 -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
modprobe ip_conntrack_ftp modprobe ip_conntrack_irc modprobe ip_nat_ftp modprobe ip_nat_irc
النوع الأخير من جدر النار هو الذي يسمح بالمنطقة منزوعة السلاح 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
لمزيد من التفاصيل انظر
في حالة الجدار الشخصي للجهاز المخدوم الذي لا يستقبل أي شيء
يفترض أن لا يستجيب عند طلب ping ولا يظهر عند السبر بالخيار sL
في nmap إذا ظهرت غيّر DROP إلى REJECT --reject-with tcp-reset
. أي أنك غير مرئي للمخترقين (على الأقل من خارج الشبكة المحلية)
بالمقابل يجب أن يستجيب الآخرون عند عمل إتصال من عنك إليهم
مثل تصفح الإنترنت وعمل ping أو عمل telnet على أي منفذ.
أما الجهاز المخدوم يجب أن لا يظهر منافذ مفتوحة أو مفلترة
حيث أننا موّهنا حتى المنافذ المفتوحة! حسناً هذه لن تنجح
مع nmap لأنه يقوم على عدة طرق بعضها مثل sT يقوم بإتصل عادي
(الخبر الجيد أن هذه الطرق تظهر في ملفات التقرير log الخاصة بالخادم على ذلك المنفذ)
المنافذ المفلترة يجب أن تظهر على أنها مفلترة أو مغلقة وهو الأفضل.
قم بسبر جهازك بواسطة nmap من داخل وخارج الشبكة
وتأكد من أن المنافذ المفتوحة هي فقط تلك التي تثق بالخادمات
التي تريدها. إذا كنت تعتمد سياسة تقوم على
فتح منافذ معينة أمام الشبكة المحلية أو بعض العناوين الموثوقة
وحجبها أمام عناوين أخرى (الإنترنت مثلاً) يمكنك
استعمال nmap لاختبار ذلك عبر جهاز واحد وذلك عبر السبر مع تمويه العنوان
بواسطة الخيار sI متبوع بالعنوان الذي تريد أن يبدو السبر منه
ثم العنوان الذي تريد فحص جداره الناري لترى المنافذ
المفتوحة أمام الأول عند الثاني من جهاز ثالث
(ذكرنا سابقاً خيارات أخرى مثل S أيضاً تصلح).
يمكن استعمال nc لتجربة جدار النار أيضاً وذلك بإغلاق الخادم على المنفذ الذي تريد فحصه وتشغيل nc مكانه بالخيار l ومن جهاز آخر تجرب nc للدخول على ذلك المنفذ ولكني أجد nmap أفضل لأنه لا يتطلب إغلاق الخادم كما يمكنه دراة علاقات الثقة بين الأجهزة.
هناك خيارات قد تفضلها للجهاز الخادم منها:
أن لا يتم إغلاقه إلا من قبل المستخدم الجذر عدّل خيارات gdm
و PAM على هذا الأساس. وأن يعيد تشغيل الجهاز تلقائياً في حالة
الخلل الذي يحدث داخل النواة panic بعد فترة معينة وذلك بتمرير عدد الثواني
للنواة مثلاً 15 ثانية panic=5
عبر 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 و sguid أي 2XYZ
و 4XYZ
من خلال الخيار -perm
في أداة find
خزن هذا التقرير وضع في اسمه تاريخاً لأغراض الأرشفة والتوثيق، كما الأمر التالي:
bash# find / -perm -6000 > ~/perm$(date '+%Y-%m-%d')
عند كتابة نصوص تنفيذية script أو برامج CGI تأخذ معاملات من المستخدم أو تسأله عنها تأكد قبل أن تتابع أنه أدخل شيئاً منطقياً وأنه يخلو من الرموز الخاصة أو قم بعملية escaping لها.
تأكد من تغيير كلمات السر التلقائية (التي تأتي من المصنّع أو التوزيعة) ،
وتأكد من تفعيل pam_cracklib.so في ملفات إعداد pam
في توزيعة ريدهات وفيدورا يكفي إضافتها في بداية /etc/pam.d/system-password
.
ضع مدة صلاحية للمستخدمين وكلمات سرهم بواسطة chage.
تأكد من تقليل عضوية المستخدمين في مجموعات لها صلاحيات عالية
مثل مجموعة wheel و admin و root.
عند تشغيل خادمات مرئية للأنترنت (عبر DMZ مثلاً) تأكد من أنها تعمل بغير اسم الجذر وتعمل داخل قفص تغيير الدليل الجذر chroot jail. لا تبالغ في كل تلك الخطوات إذا كان جهازاً منزلياً ولكن مهما كنت مستهتراً لا تنس جدار النار.
<< السابق | كتاب لينكس الشامل | التالي >> |