يتضمن توفير الخدمات للعموم عبر شبكة الإنترنت خطر التعرض لهجمات، إلا أن عرض الخدمات هو الغرض الأساسي - غالبا - لتجهيز خادوم. يمكن لأي منفَذ Port أو خدمة أن تكون عُرضة لأنواع كثيرة من التجسس ومحاولات الوصول من طرف مستخدمين سيئي النوايا أو سكربتات تعمل تلقائيا.
في حين أن بعض الخدمات يجب أن تبقى متاحة نظرا لأنها موجهة للاستخدام من الجميع (خادوم ويب يستضيف موقعا على سبيل المثال)، إلا أن أخرى لا ينبغي لها ذلك، إذ يجب الاستيثاق من مستخدميها ومنع من لايُرخص له الدخول من الولوج إلى الخدمة (خدمة SSH على سبيل المثال). الوضعية المُثلى هي أن تكون هذه الخدمات مؤمنة جدا ولا يتاح الوصول إليها إلا لمن نرغب في منحه هذه الصلاحية.
يتيح الاستيثاق فريد الحزمة Single Packet Authentication وسيلة تسمح للجدار الناري Firewall الإبقاء على حظر خدمة إلى حين إرسال حزمة خاصة مُعمَّاة Encrypted إلى خدمة في الاستماع. إذا صادقت خدمة الاستماع على الحزمة فإنها تغير فورا قواعد الجدار الناري من أجل عرض المنفذ المطلوب.
توجد أداة اسمها fwknop
(اختصار ل Firewall Knock Operator وتعني عامل الطرق على الجدار الناري) تستخدم لاعتراض الحزم المخصصة ثم تغيير قواعد الجدار الناري حسب المطلوب.
سنعد في هذا الدليل خادوما لأداة fwknop
وعميلا لها على جهازين يعملان بتوزيعة أوبنتو 14.04. يمكّننا هذا الإعداد من حماية خادوم SSH وحظر الدخول إليه ما لم تطلب إتاحته.
تثبيت fwknop على خادوم أوبنتو الأول
سنفترض في إعداداتنا وجود خادوميْ أوبنتو 14.04 وتوفر اسم نطاق لكل واحد من الخادومين؛ مع أن استخدام عناوين IP لن يمثل عائقا. نفترض أيضا تثبيت خدمة SSH.
تثبت الأوامر التالية خادوم fwknop
على الجهاز الأول والذي سيكون بمثابة خادوم للثاني:
sudo apt-get update sudo apt-get install fwknop-server
تثبيت عميل fwknop على خادوم أوبنتو الثاني
سنجعل من الخادوم الثاني عميلا؛ لذا سنحتاج لتثبيت عميل fwknop عليه. يتكفل هذا العنصر بإنشاء الحزمة المعماة لإرسالها إلى الخادوم الآخر.
sudo apt-get update sudo apt-get install fwknop-client
إعداد مفاتيح GPG
سنستخدم مفاتيح GPG لتوفير الاستيثاق أثناء نقل الحزم. نحتاج لتنفيذ الإجراءات التالية على كل من الجهاز الخادوم والجهاز العميل. تأتي أداة GPG مثبتة افتراضيا.
ولِّد مفاتيح على كل من الجهازيْن:
gpg --gen-key
ستسأل بضعة أسئلة يكفي - في الغالب - اختيار الإجابات الافتراضية بالضغط على زر Enter
. سيطلب منك أيضا إدخال ثم تأكيد عبارة سر Passphrase. سيأخذ إنشاء مفتاح عشوائي بعض الوقت؛ من الأفضل تنفيذ بعض الإجراءات على الخادوم للتسريع من العملية (مثلا افتح نافذة Shell جديدة ونفذ فيها الأمر التالي find / > /dev/null
إضافة إلى أوامر أخرى).
نحتاج بعد انتهاء توليد مفاتيح GPG إلى كتابة أو نسخ معرفات المفاتيح العمومية. لذا ننفذ الأمر التالي على كل من الجهازين (الخادوم والعميل)
gpg --list-keys /home/zeine77/.gnupg/pubring.gpg ------------------------------- pub 1024D/FFEDEE15 2015-07-21 uid Mohamed Ahmed Eyil (Comment) <Email> sub 1024g/95B798A4 2015-07-21
الجزء المعلَّم هو الذي نحتاجه هنا (مفتاح عمومي). انسخ المفتاح العمومي لكل من الجهازين واحتفظ به مع تعليمِه (خادوم SERVER أو عميل CLIENT للتفريق بينهما) على النحو التالي:
SERVER: FFEDEE15 CLIENT: 1E6E6DC4
نفذ الأمر التالي على الجهاز العميل لإنشاء نسخة client.asc
من المفتاح عبر تصديرها إلى ملف. ستحتاج لكتابة معرف مفتاح العميل الذي نسخته للتو:
gpg -a --export 1E6E6DC4 > client.asc
نفس الشيء على الجهاز الخادوم مع استخدام المفتاح العمومي للخادوم وتسمية المف بserver.asc
:
gpg -a --export FFEDEE15 > server.asc
1- نقل المفاتيح بين الأجهزة
نحتاج الآن لنقل المفاتيح بين الجهازين بحيث يكون لدى كل منهما نسخة من الاثنين. نستخدم أداة scp
لنسخ ملف client.asc
من العميل إلى الخادوم. نفذ الأمر التالي على العميل
scp client.asc server_domain_or_ip:/path/to/user/home/directory
حيث server_domain_or_ip
اسم نطاق أو عنوان IP الخادوم و/path/to/user/home/directory
المسار الذي سيُنقل إليه الملف (المجلد الشخصي للمستخدم). سيطلب منك بعد تنفيذ الأمر معلومات الدخول إلى الخادوم.
ثم نكرر نفس الشيء مع ملف server.asc
لنقله من الخادوم إلى العميل (تنفيذ الأمر يكون على العميل):
scp server_domain_or_ip:/path/to/user/home/directory/server.asc .
توجد الآن نسخة من كل ملف على الخادوم وعلى العميل.
2- استيراد وتوثيق المفاتيح
يوجد الآن المفتاح العمومي لكل واحد من الجهازين على الآخر (المفتاح العمومي للخادوم على العميل، والمفتاح العمومي للعميل على الخادوم) مما يعني أنه يمكننا استيراد المفتاح العمومي إلى قاعدة بيانات GPG المحلية.
نفذ الأمر التالي على الخادوم:
gpg --import client.asc
ثم نفذ التالي على العميل:
gpg --import server.asc
يوجد لدى كل من الجهازين الآن مفتاح الآخر في قاعدة بياناته؛ ننتقل إلى توثيق المفاتيح.
نفذ الأمر التالي عل كل من الجهازين، مع استخدام معرفات المفاتيح المناسبة. في المثال لدينا سننفذ ما يلي على العميل (نوثق المفتاح العمومي للخادوم):
gpg --edit-key FFEDEE15
وعلى الخادوم (نوثق المفتاح العمومي للعميل)
gpg --edit-key 1E6E6DC4
سيظهر سطر أوامر gpg
؛ نطلب توثيق المفتاح عبر الأمر:
sign
سيطلب منك التأكيد على اختيارك، اضغط زر y
ثم Enter
. ثم الخطوة قبل الأخيرة وهي كتابة عبارة السر (نفس عبارة السر التي أدخلتها عند توليد المفتاح). وأخيرا أمر save
لحفظ الإعدادات والخروج من سطر أوامر gpg
.
نحصل باكتمال هذه الخطوات على نسخة موثَّقة لمفتاح gpg
الخاص بكل جهاز على الآخر، مما يعني أننا نثق من صحة المفاتيح.
إعداد الوصول في خادوم fwknop
يجب علينا إعداد خدمة fwknop
لاستخدام مفاتيح GPG والسماح للعميل بالاتصال بالخادوم والاستيثاق لديه.
افتح ملف إعداد الأداة على الخادوم بصلاحيات إدارية:
sudo nano /etc/fwknop/access.conf
توجد افتراضيا بضعة أسطر نشطة، البقية تعليقات وشروح.
SOURCE: ANY; KEY_BASE64 __CHANGEME__ HMAC_KEY_BASE64 __CHANGEME__
سنضبط ملف الإعداد لاستخدام الاستيثاق عبر مفاتيح GPG التي أعددناها سابقا. لذا سنضيف تعليمات لإعطاء معلومات لخدمة fwknop
عن المفاتيح التي نستخدمها. توجد هذه التعليمات ضمن ملف الإعداد، احذف علامة التعليق (#
) ثم أعط القيم المناسبة للتعليمات. عدل الملف لتصبح الأسطر النشطة على النحو التالي:
SOURCE: ANY; OPEN_PORTS: tcp/22; ## SSH لتمكين الاتصال عن طريق FW_ACCESS_TIMEOUT: 30; ## مدة بقاء الاتصال مفتوحا REQUIRE_SOURCE_ADDRESS: Y; ## طلب عنوان المصدَر GPG_REMOTE_ID: FFEDEE15; ## المفتاح العمومي للعميل GPG_DECRYPT_ID: 1E6E6DC4; ## المفتاح العمومي للخادوم GPG_DECRYPT_PW: your_GPG_passphrase_here; ## عبارة سر الخاصة بالخادوم GPG_HOME_DIR: /home/test/.gnupg; ## gunpg مسار مجلد ## يوجد عادة في المجلد الشخصي للمستخدِم
تأكد من إعطاء معرف مفتاح العميل ضمن تعليمة GPG_REMOTE_ID
ومعرف مفتاح الخادوم ضمن تعليمة GPG_DECRYPT_ID
. يجب كذلك إدخال عبارة السر لمفتاح الخادوم ضمن التعليمة GPG_DECRYPT_PW
ومسار مجلد gnupg.
ضمن تعليمة GPG_HOME_DIR
.
احفظ (CTRL+O
) الملف ثم أغلقه (CTRL+X
).
اضبط قواعد IPTables
ننتقل الآن، بعد أن أنهينا إعداد خادوم fwknop
، إلى ضبط قواعد IPTables. ستعدل خدمة fwknop
هذه القواعد حسب الحاجة؛ ولكن قبل ذلك نحتاج إلى إغلاق المنفذ.
نحتاج أولا إلى السماح للاتصال الجاري بالمتابعة قبل غلق المنفذ. تسمح القاعدة التالية للاتصال الموجودة بالمواصلة:
sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
ملحوظة: هذا الإجراء مهم جدا في حال كنت تعد خادوما بعيد تتصل به عن طريق SSH.
ثم نقيّد مباشرة بعد تنفيذ الأمر أعلاه الولوجَ عبر منفذ SSH بمنع بقية الاتصالات كلها:
sudo iptables -A INPUT -i eth0 -p tcp --dport 22 -j DROP
يوجد لدينا الآن جدار ناري مبدئي لمنع الاتصال عبر المنفذ 22 ويمكن بالتالي تنفيذ إعدادات fwknop
؛ لذا نعيد تشغيل خادوم fwknop
:
sudo service fwknop-server restart
ستبدأ خدمة fwknop
بمراقبة الخادوم بحثا عن حزم بيانات توافق القواعد التي أعددناها.
الاتصال بالخادوم من العميل
سنجرب الآن الاتصال بالخادوم من العميل. إن جرى كل شيء على ما يرام فلن يمكننا الاتصال بسبب انتهاء مهلة الاتصال (Time out).
ssh root@server_domain_or_ip
سيحاول العميل الاتصال بالخادوم وبعد انتهاء مهلة الاتصال تظهر الرسالة التالية:
ssh: connect to host server_domain_or_ip port 22: Connection timed out
إن لم ترغب في انتظار اكتمال المهلة - التي قد تطول - يمكنك الضغط على مفتاحي CTRL
وC
معا.
يمكننا الآن إرسال حزمة معماة للاستيثاق لدى الخادوم. نستخدم عميل fwknop
لهذا الغرض؛ ونمرر له المعطيات التالية:
A tcp/22-: يحدد هذا الخيار البروتوكول والمنفذ الذي نطلب فتحه.
gpg-recip--: معرف مفتاح GPG الخاص بالخادوم.
gpg-sign--: معرف مفتاح GPG الخاص بالعميل.
a-: يخبر
fwknop
بعنوان IP الذي يسمح بالوصول منه؛ أي عنوان الجهاز العميل.D-: يخبر الأمر بوجهة الطلب. نحدد هنا عنوان IP الخاص بالخادوم أو نطاقه.
ننشئ ثم نرسل الأمر انطلاقا من هذه المعطيات والمعطيات السابقة (مفاتيح GPG):
fwknop -A tcp/22 --gpg-recip FFEDEE15 --gpg-sign 1E6E6DC4 -a client_ip_address -D server_domain_or_ip
سيطالب منك إدخال عبارة سر العميل لفك تعمية المفاتيح ثم ترسل الحزمة المعماة إلى الخادوم.
لديك الآن ثلاثون ثانية لمحاولة الاتصال عبر SSH.
ملحوظة: لتغيير هذه المدة فعّل تعليمة FW_ACCESS_TIMEOUT
في ملف إعداد خادوم fwknop
ثم أعطها القيمة المرادة.
ssh root@server_domain_or_ip
إن جرت الأمور على النحو المخطط لها فسيمكنك الاتصال بنجاح. سيُغلق المنفذ المفتوح بعد ثلاثين ثانية غير أن الاتصال سيبقى نشطا.
تستطيع رؤية قواعد IPTables المضافة على الجهاز الخادوم بعد تنفيذ أمر إنشاء الحزمة المعماة وإرسالها على العميل (وقبل انقضاء مهلة الثلاثين ثانية). استخدم الأمر التالي لهذا الغرض:
sudo iptables -S
النتيجة
-P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -N FWKNOP_INPUT -A INPUT -j FWKNOP_INPUT -A INPUT -i eth0 -p tcp -m tcp --dport 22 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j DROP -A FWKNOP_INPUT -s client_ip_address/32 -p tcp -m tcp --dport 22 -j ACCEPT
لاحظ إضافة سطر جديد إلى IPTables. يطبق القاعدة المضافة على جميع طلبات الاتصال، إن وافق عنوان مصدر الطلب الجهاز الذي أرسل الحزمة المعماة فإنه يسمح له بالوصول عبر المنفذ 22 وإلا يرفض الطلب.
خاتمة
يمكّن إعداد آلية للاستيثاق فريد الحزمة من إضافة طبقة أمان عند الاتصال بين الأجهزة. يوفر هذا الإجراء علاوة على حماية الخواديم من هجمات القوة القاسية Brute force والهجمات العشوائية، المساعدة في حال اكتشاف ثغرات أمنية ضمن الخدمات المحمية مما يتيح لك في وضعية آمنة إلى أن ترقع الثغرة.
قد تمثل آلية الاستيثاق فريد الحزمة إزعاجا للمستخدمين؛ إلا أنها مفيدة أمنيا ويمكن استخدامها مع إجراءات أمنية أخرى للمزيد من الأمان.
ترجمة -بتصرف- لمقال How To Use fwknop to Enable Single Packet Authentication on Ubuntu 12.04.
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.