محمد هاني صباغ

الأعضاء
  • المساهمات

    78
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • Days Won

    2

كل منشورات العضو محمد هاني صباغ

  1. تحدثنا في السابق عن بضع خطوات يمكنك تطبيقها لزيادة أمان وحماية موقعك العامل بسكربت ووردبريس الشهير. صحيحٌ أنّ نواة ووردبريس آمنة للغاية، ولكن يجب عليك تثبيت عدّة إضافات وملحقات إضافية لزيادة مستوى أمان موقعك. سنتحدّث في هذا الدرس عن أهم إضافات الأمان والنسخ الاحتياطي التي يمكنك تثبيتها وتفعيلها على سكربت ووردبريس الشهير. لماذا قد أحتاج إضافة للحماية؟ بشكلٍ عام، تقوم إضافات الحماية والأمان بتوفير طبقة إضافية من الحماية ضدّ هجمات Bruteforce والهجمات الأخرى والبرمجيات الخبيثة التي قد تصيب موقعك، يمكنها أيضًا أن توفّر لك عدّة أدوات يمكنك استخدامها لتقليل المخاطر الأمنية المحيطة بك، كما توفّر بعض الأدوات للمراجعات اليدوية الدورية أيضًا. هناك إضافات أخرى للنسخ الاحتياطي تمكّنك من استرجاع موقعك بسرعة في حال ما إذا تمّ اختراقه. لهذا، سنتطرّق الآن إلى أهم الإضافات للحماية والأمان والنسخ الاحتياطي التي يمكنك استخدامها. iThemes Security تعتبر هذه الإضافة شهيرةً جدًا عندما يتعلّق الأمر بمجال أمان ووردبريس. كانت هذه الإضافة تدعى بالسابق "WP Security" ولكن تمّ تغيير اسمها. توفّر لك هذه الإضافة عدّة طرق لحماية موقعك. في الواقع، تقوم إضافة iThemes Security بالعديد من الأمور التي ذكرناها بالدروس السابقة تلقائيًا، مثل تغيير اسم المستخدم الرئيسي ورابط صفحة تسجيل الدخول، إزالة وسم generator والمزيد. كما تعرض عدّة أدوات للحماية مثل فحوصاتٍ دورية لملفّات موقعك للبحث عن الثغرات الأمنية والملفّات الخبيثة إن وجدت، مما يحسّن من أمان موقعك، كما أنّها تقوم بحظر المستخدمين الذين يفشلون بتسجيل الدخول لأكثر من مرّة عن طريق الـIP، وتحظر ربوتات الاختراق الشهيرة، وتفرض على المستخدمين اختيار كلمات مرورٍ قويّة.. والمزيد. توفّر إضافة iThemes Security ميزات التنبيه، حيث يمكنها أن تقوم بتنبيهك عندما يتم إجراء تغييراتٍ ما دون صلاحيات. يمكنها أن تلتقط الروبوتات التي تحاول اختراقك ويمكنها أن ترسل رسالة بريدٍ إلكتروني في حال التقطت أيًّا منها. توفّر الإضافة ميّزة النسخ الاحتياطي كذلك، حيث أنّها قادرة على أخذ نسخة احتياطية من جميع ملفّات موقعك وتدويناتك التي نشرتها، ويمكنها استعادتها في أيّ وقتٍ تريده. هناك إصدارٌ مدفوع من الإضافة كذلك ويوفّر ميّزاتٍ أكثر. All in One WP Security & Firewall خيارٌ آخر متوفّر أمامك هو إضافة All in One WP Security & Firewall، تتميز هذه الإضافة بسهولة تثبيتها وإعدادها مما يجعلها خيارًا جيَدًا للمدونين الجدد. تتضمن أيضًا نظام تقييم للحماية يحدد لك مدى أمان موقعك بوضعه الحالي. يمكنك من هناك تفعيل أو تعطيل مميزاتٍ معيّنة للأمان والحماية في موقعك حسبما تريده. تسمح لك هذه الإضافة المجانية كذلك بإعداد العديد من إجراءات الحماية بمجرّد بضع ضغطات، مثل تغيير اسم المستخدم "admin"، التعرّف على المستخدمين الذين يمتلكون أكثر من حساب وتفعيل أداة تقوية كلمات المرور. كما تحتوي الإضافة على ميزة تمنع هجمات Bruteforce على موقعك عبر حظر محاولات تسجيل الدخول الفاشلة لأكثر من مرّة. يمكنك أيضًا فرض تسجيل الخروج على حسابٍ معيّن، تتبع سجل النشاط الخاصّ به والمزيد. تتضمن الإضافة أيضًا مزايا حماية قواعد البيانات والملفّات، بالإضافة إلى إمكانية إنشاء ملفّ htaccess. عبرها وعمل النسخ الاحتياطية لملفّ wp-config.php. هناك ميزة أخرى مهمّة بهذه الإضافة وهي ميّزة الجدار الناري، حيث تسمح لك بتعديل ملفّ htaccess. لتمنع المخترقين حتّى من الوصول إلى الشفرة الخاصّة بموقعك. كما أنّها تحتوي على فاحص ملفّات، الحماية من نسخ النصوص، حماية ضد هجمات السخام (Spam)، تحديثات تلقائية والمزيد. Sucuri Security Sucuri Security هي إضافة أخرى شائعة لحماية ووردبريس. تسمح لك ميزة SiteCheck المُضمّنة بالتحقق من حالة موقعك الحالية وفحصه لإيجاد الثغرات الموجودة به بالإضافة للبحث عن البرمجيات الخبيثة إن وجدت. تمكّنك الميزة كذلك من البحث عن جميع أنواع الثغرات، مثل ثغرات حقن قواعد البيانات، محاولات التصيّد الاحتيالي، إعادة التوجيه المشبوهة.. إلخ، كما يمكنها أن تلتقط أكواد جافاسكربت وPHP الخبيثة إن وجدت. تستخدم الإضافة أكثر من واجهة تطبيق برمجية واحدة (API) لفحص موقعك، أيّ أنّها تستخدم أكثر من قاعدة بيانات للشفرات الضارّة والخبيثة الموجودة على الإنترنت للتأكد من أنّ موقعك لا يحتوي على أحدها، مما يوفّر فحصًا شاملًا لموقعك، تتضمن هذه المصادر الخارجية أسماءً عريقة مثل Norton, McAfee.. إلخ. هناك بعض المزايا الموجودة بالإضافة والتي توفّر الحماية لمسار رفع ملفّات الوسائط الخاصّ بموقعك، حيث تقيّد الوصول إلى مجلّديّ wp-content وwp-includes، تتحقق من إصدارات PHP ووردبريس وتعطّل محرر الإضافات والقوالب من لوحة التحكم. Wordfence Security تحدّثنا من قبل عن إضافة Wordfence Security، وقلنا أنّها من أهم إضافات الحماية لسكربت ووردبريس. بمجرّد تثبيتها على موقعك فإنّها ستقوم بعملية فحصٍ شامل للشفرة المصدرية للتأكّد من أنّها مطابقة للشفرة المصدرية الخامّة المنشورة من موقع ووردبريس الرئيسي، إذا اكتمل الفحص بنجاح، فإنّ الإضافة تقوم بعدها تلقائيا بتفعيل خيارات الحماية لزيادة أمان موقعك. هناك إصدار مدفوع ومجاني من الإضافة، كلاهما يعتمدان على منصّة "Wordfence Cloud"، مما يعني أنّ عملية الفحص وتفعيل الجدار الناري بالواقع تجريان على خواديم الشركة المطوّرة للاستضافة وليس على خادومك مما يقلل من الحمل الموجود عليه. توفّر هذه الإضافة دعمًا لأكثر من موقع ووردبريس في آنٍ واحد، تسجيل الدخول عبر الهاتف المحمول، دعم للإضافات الشهيرة مثل WooCommerce، الاستيثاق الثنائي، فرض كلمات المرور القوية، فحص الملفّات والمزيد. تتضمن الإضافة أيضًا جدارًا ناريًا لحماية موقعك من الروبوتات، البرمجيات الخبيثة وهجمات Bruteforce. بمجرّد تثبيتها فإنك ستكون قادرًا على حظر المهاجمين واتصالات الشبكات المشبوهة، وكلّه في الوقت الحقيقي (Real time). BruteProtect تمّ شراؤها مؤخرًا من قبل شركة Automattic (الشركة المطوّرة لووردبريس)، إضافة BruteProtect هي أحد الحلول الأمنية التي يمكنك استخدامها لصدّ هجمات Bruteforce بالتحديد. توفّر الإضافة أدواتٍ لمراقبة الهجمات الحالية على موقعك في حال حصولها بالوقت الحقيقي بالإضافة إلى التحديث التلقائي لنواة ووردبريس في موقعك. الإضافة ليست مجهّزة لحمايتك ضد الهجمات الأخرى، بل فقط ضدّ هجمات Bruteforce فلا تعتمد عليها لوحدها. Acunetix WP Security Acunetix WP Security هي إضافةٌ أخرى مجانية لفحص موقعك بسهولةٍ ويسر. تمكّنك من إعداد صلاحيات الملفّات، تأمين قاعدة البيانات، إخفاء إصدار ووردبريس الحالي الذي تستخدمه عن أعين المخترقين، تغيير اسم المستخدم admin والمزيد. تتوافق الإضافة مع مواقع ووردبريس المتعددة (multisite) وعمليات النسخ الاحتياطي، كما تتضمّن أداةً تعمل بالوقت الحقيقي لعرض من يتصفّح موقعك حاليًا وماذا يتصفّحون. Bulletproof Security آخر إضافة ووردبريس سنتحدث عنها هي إضافة Bulletproof Security. توفّر هذه الإضافة العديد من المزايا التي توفّرها الإضافات الأخرى مثل ملفّات htaccess. ، حفظ نسخة احتياطية من قاعدة البيانات، سمات مختلفة لواجهة الإضافة والمزيد. يتضمّن الإصدار المدفوع منها المزيد من المميزات مثل التثبيت بنقرة واحدة، الاستعادة التلقائية، جدار ناري يتعامل مع عناوين الـIP للمستخدمين، مسجّل للأخطاء، حامٍ من هجمات Bruteforce، حظر عناوين IP معيّنة والمزيد. أهمّية إضافات النسخ الاحتياطي بجانب إضافة قويّة للحماية والأمان، فإنّه يجب عليك استخدام إضافةٍ أخرى لعمليات النسخ الاحتياطي، معظم هذه الإضافات السابق ذكرها يتضمّن الميّزتين بالواقع مما يسهّل عليك الأمر، ولكن لا تنسى بتاتًا استخدام النسخ الاحتياطي. القيام دوريًا بعمل نُسخ احتياطية من موقعك هو أمرٌ مهم لخطّة أمان كاملة، وإلّا فكيف تتوقع أن تقوم باسترجاع موقعك في حال تمّ اختراقه مثلًا؟ هناك العديد من الإضافات الجيّدة للنسخ الاحتياطي مثل VaultPress ،WordPress Backup to Dropbox و BackupBuddy. تتنوّع هذه الإضافات ما بين المدفوعة والمجانية، ولكنّها مفيدة لضمان عدم فقدان أيّ شيء مهم يتعلّق بموقعك. الخاتمة صحيحٌ أنّه يمكنك القيام بالعديد من الأمور يدويًا لتحسين حماية ووردبريس، ولكن استخدام الإضافات قد يوفّر عليك الكثير من الوقت ويوفّر لك الكثير من المميزات، خاصةً لو كنتَ تمتلك أكثر من موقع ووردبريس واحد. الإضافات السابق ذكرها يجب أن تؤدّي المهمّة المطلوبة بالنسبة لك ويمكنك تجريبها جميعًا لتصل إلى أفضلٍ واحدةٍ منها بالنسبة لك. في الدرس الأخير من هذه السلسلة سنتحدث عن أهمية تحديث ووردبريس وإضافاته لزيادة أمان موقعك. ترجمة -وبتصرف- للمقال The WordPress Developer’s Guide to Security: Security & Backup Plugins لصاحبته Brenda Barron.
  2. في الدرس السابق تحدثنا عن طرق تثبيت ووردبريس لأول مرة بأمان. في هذا الدرس، سنتحدّث عن كيفية تأمين موقع ووردبريس بعد تثبيته، سنتحدّث عن أساليب أفضل للحماية فوق مستوى نصائح "اختر كلمة مرور أكثر تعقيدًا" وسنحاول الغوص قليلًا في موضوع أمان ووردبريس. تقييد عمليات تسجيل الدخول واحدٌ من أول الأشياء التي يجب عليك فعلها لتأمين موقع ووردبريس الخاصّ بك هو تقييد عدد المرّات التي يمكن لشخصٍ ما أن يحاول تسجيل الدخول بها إلى الموقع. يحاول العديد من المخترقين القيام بهجمات التخمين أو ما يعرف بـ Bruteforce لمحاولة كسر اسم المستخدم / كلمة المرور الخاصّيَن بك، وحتّى لو لم تنجح هذه الهجمات في اختراق موقعك، فإنّه ستقوم باستهلاك جزء كبير من موارد خادومك وستقوم بوضع حملٍ عليه. عبر تقييد عمليات تسجيل الدخول، يمكنك منع المخترقين من محاولة القيام بهجمات Bruteforce. بمجرّد أن يقوم بمحاولة تخمين كلمة المرور مرتين أو ثلاث، فسيتم حظر عنوان الـIP الخاصّ به. يمكنك القيام بهذا الأمر بسهولة عبر تثبيت إصافة Limit Login Attempts، صحيحٌ أنّه لم يتم تحديثها منذ سنتين ولكنّها تمتلك مميزاتٍ رائعة، ولكن ربّما تودّ تجاهلها حاليًا بسبب انقطاع دعمها عن التحديثات الأمنية. عوضًا عن هذا، فإننا ننصح بإضافة Login Lockdown، تسمح لك هذه الإضافة أيضًا بتقييد عدد مرّات تسجيل الدخول الفاشلة قبل أن يتم حظر عنوان الـIP الخاصّ بالمستخدم الذي يحاول الدخول، كما يمكنك اختيار المدّة التي تريد حظر عنوان الـIP خلالها، ستصبح هجمات Bruteforce أصعب بكثير بعد تثبيت هذه الإضافة وضبطها، لأنّه سيجب على المخترقين استخدام وسيط (Proxy) بعد كلّ 3 محاولات فاشلة لتسجيل الدخول، وسيجب عليهم تغيير ذلك الوسيط آلاف المرّات ليتمكّنوا من تحقيق الهجوم، وهو الأمر الذي لا يتوفّر لديهم غالبًا. حظر المستخدمين الذين يحاولون تسجيل الدخول باسم Admin من المهم ألّا تستخدم اسم "admin" كاسم مدير الموقع على موقعك، ومن المهم أيضًا أن تقوم بحظر كلّ من يحاول الدخول إلى ذلك المستخدم (طالما أنتَ لستَ المدير، والحساب غير موجود، فلماذا تحاول الدخول؟ إذن فأنتَ مُخترِق)، يمكنك القيام بهذا عن طريق إضافة Wordfence. تسمح لك هذه الإضافة بإعداد ميزة الحظر التلقائي هذه، بالطبع، هناك العديد من المميزات الأخرى في هذه الإضافة التي يمكنك استخدامها من أجل الحماية، مثل الاستيثاق الثنائي (two-factor authentication)، حظر الهجمات الشائعة والمزيد. ضبط صلاحيات الملفّات الصحيحة شيءٌ آخر يمكنك فعله هو ضبط صلاحياتٍ مناسبة للملفّات على موقعك. وفقًا لـ WordPress.org، فإنّ استخدام صلاحيات 777 للملفّات / المجلّدات هو أمرٌ خطير للغاية ويسمح للجميع أن يقوموا بتعديل ملفّات موقعك وإضافة أكواد خبيثة أو حتّى حذف الموقع بالكامل. يجب عليك أن تقوم بوضع صلاحيات 600 لملفّ wp-config.php، بينما يجب عليك أن تقوم بتعيين ملفّاتك الأخرى إلى وضع صلاحيات 640 أو 644، كما يجب أن تكون المجلّدات الموجودة على موقعك بالصلاحيات 750 أو 755. يمكنك تعلّم المزيد عن الصلاحيات عبر دليل ووردبريس الرسمي لتغيير الصلاحيات. إنشاء ملف htaccess. إذا كنتَ تريد تركيبة روابط دائمة (permalinks) جميلة لموقعك فإنّك ستحتاج ملفّ htaccess. عبر إضافة واحدٍ إلى موقعك فإنّك ستقوم بتحسين مستوى الحماية قليلًا، صحيحٌ أنّه ليس حلًا كاملًا ولا يمكنه فعل شيء جوهري لوحده ولكنّه إضافة جيّدة. هناك شرح شامل منشور على الويب حول إنشاء ملفّ htaccess. ، لن نقوم بشرح تلك العملية بالكامل هنا لأنّ العملية مشروحة بذاك الدليل بشكلٍ شامل. بمجرّد أن تقوم باتّباع ذاك الشرح فإنّه سيصبح بإمكانك منع الوصول إلى ملفّات معيّنة على موقع ووردبريس الخاصّ بك. إذا لم يكن الناس قادرين على الوصول إلى تلك الملفّات التي تريدها فلن يكونوا قادرين على العبث بها. لزيادة صعوبة اختراق موقع ووردبريس الخاصّ بك ستحتاج إلى إضافة بضع سطور من الأكواد لحظر الوصول إلى ملفّات معينة مثل: wp-config.php readme.html license.txt wp-includes directory يمكنك أيضًا منع الوصول إلى امتدادات معيّنة للملفّات، مثل ملفّات النسخ الاحتياطي، الإعدادات، السجلات المحفوظة على الخادوم.. إلخ. بشكلٍ عام، يجب حظر الوصول إلى أيّ شيء يتعلّق بالتصميم والتطوير والتوثيق الخاصّ بخلفيّة الموقع (back-end). إذا كنتَ تريد حظر الوصول إلى مجلّد إضافة أو قالب معيّن أو مسارٍ آخر على موقعك، فيمكنك حظر المجلّد بأكمله إن أردت. هذه حركة جيّدة للقيام بها في كلّ مجلّد لا يمتلك بداخله ملفّ index. حيث أنّ المجلّدات التي لا تحتوي على ملفّات index ستقوم بعرض كلّ الملفّات الموجودة بداخل ذاك المجلّد، مما يعطي معلوماتٍ هامّة يمكن استغلالها من طرف المخترقين، لذا يجب عليك إخفاؤها. إخفاء صفحة تسجيل الدخول هذا تعديلٌ آخر يمكن القيام به عن طريق htaccess. ولكن مختلف قليلًا عن التعديلات الأخرى ولذلك سنذكره هنا. يمكنك حظر وصول أيّ شخص إلى صفحة تسجيل الدخول الخاصّة بموقعك ومنح حقّ الوصول فقط إلى عنوان الـIP الخاصّ بك، وطبعًا، يجب أن يكون هناك مستخدمٌ واحد فقط للموقع بأكمله، وبالتالي فتلك ليست طريقة عملية حقًا لاستخدامها. إذا كنتَ تريد إبقاء خيارٍ مفتوح لإضافة كتّابٍ ومستخدمين آخرين إلى موقعك لاحقًا، فيمكنك استخدام إضافة Secure Hidden Login. تسمح لك هذه الإضافة بإخفاء حقول الإدخال من صفحة تسجيل الدخول الخاصّة بموقعك، ويتم إظهار حقول الإدخال لاسم المستخدم وكلمة المرور فقط عند الضغط على اختصاراتٍ معيّنة على لوحة المفاتيح، فإن حاول أحدهم فتح صفحة تسجيل الدخول، فلن يتمكّن من ذلك دون أن يعرف ما هي اختصارات لوحة المفاتيح التي تقوم بعرض صفحة تسجيل الدخول. إزالة وسم Generator يقوم المخترقون بكلّ شيءٍ قد يمكّنهم من اختراق موقعك، واحدٌ من هذه الأشياء هو سكربتٌ شهير يستخدمه المخترقون لالتقاط المواقع التي تعمل بإصدارات معيّنة من ووردبريس عبر بصمات الأقدام (Footprints)، بصمات الأقدام هي عبارة عن سطور متعددة من الأكواد يمكن استخدامها للتعرّف على هوية موقع ويب ما، لسوء الحظّ فإن ووردبريس يستخدم هذه البصمات مما يجعل مواقع ووردبريس الموجودة على الشبكة قابلة للاكتشاف بسهولة. قد تبدو بصمة القدم الخاصّة بموقع ووردبريس كشيءٍ مثل: <meta name="generator" content="WordPress 3.8.4" /> يمكنك إزالة هذا الوسم إن أردت من الشفرة المصدرية الخاصّة بموقعك، ولكن ما يزال عليك إضافة الشفرة التالية إلى ملفّ functions.php الخاصّ بقالبك: remove_action('wp_head', 'wp_generator'); بعد هذا، لن يقوم موقع ووردبريس الخاصّ بك بتعريف نفسه على أنّه موقعٌ يعمل بسكربت ووردبريس، مما يصعّب المهمّة على المُخترقِين. تفعيل الاستيثاق الثنائي Two-Step Authentication شيءٌ آخر يمكنك فعله لتأمين موقعك هو تفعيل الاستيثاق الثنائي أو ما يدعى بـ Two-Step Authentication. عندما تقوم بطلب خطوتين للاستيثاق من مستخدمي موقعك عوضًا عن خطوة واحدة فإنّك تصعّب الأمر جدًا على المُخترقِين. هناك عدّة إضافات موجودة لتفعيل الاستيثاق الثنائي على ووردبريس ومن بينها: Clef: بمجرّد تثبيت هذه الإضافة، فإنّ كل ما سيجب عليك فعله هو فتح تطبيق Clef على هاتفك المحمول وتركيز كاميرا الهاتف على شاشة الحاسوب الخاصّة بك، بعدها سيتم فتح القفل الموجود على موقعك وتتمكن من الدخول. Duo Two-Factor Authentication: بعد أن تقوم بإدخال كلمة المرور الخاصّة بك في مربّع الإدخال التقليدي، سيجب عليك إكمال خطوةٍ أخرى لإتمام عملية تسجيل الدخول، مثل تأكيد تسجيل الدخول من على هاتفك الذكي عبر رسالة SMS وغيرها من الطرق. الخاتمة إدارة الحماية على موقع ووردبريس الخاصّ وإعداد عمليات تسجيل الدخول ليتم تقييدها قدر المستطاع هو أمرٌ قد يستغرق منك بعض الوقت، ولكن بمجرّد أن تكتمل هذه الأمور، فإنّ موقعك سيكون أكثر أمانًا لمستخدميه. ترجمة -وبتصرف- للمقال The WordPress Developer’s Guide to Security: Management & Logins لصاحبته Brenda Barron.
  3. سنناقش في هذا الدرس أهمّية تحديث كلّ شيءٍ متعلّق بموقع ووردبريس الخاصّ بك إلى آخر الإصدارات المتوفّرة وأهميّة التحديثات بشكلٍ عام، وهو من أهمّ الأمور التي يمكنك القيام بها لزيادة حماية وأمان موقعك. لماذا نقوم بالتحديث؟ السؤال الحقيقي يجب أن يكون "ولما لا"؟ يقوم مطوروا ووردبريس بإرسال التحديثات إلى المستخدمين لسببٍ معيّن في النهاية، حيث أنّ هذه التحديثات تحتوي على إصلاحاتٍ لثغراتٍ خطيرة يمكن أن يستغلها المهاجمون لمهاجمة موقعك، مما يجعل التحديث ضرورة لا مفرّ منها. أنواع التحديثات قبل أن نتابع، من المهمّ أن نفهم أنواع التحديثات المختلفة المتوفّرة في سكربت ووردبريس. يشير Tony Perez في تدوينة حديثة إلى أنّه هناك 3 أنواع مختلفة من التحديثات: تحديثات الأمان، الترقيعات والإصدارات الرئيسية. تحديثات الأمان هي بالضبط كما تبدو عليه من اسمها. يتم إصدارها بسرعة وتحتوي فقط على بضع إصلاحاتٍ لثغراتٍ موجودة تم اكتشافها مؤخرًا. تكون هذه التحديثات عادةً على شاكلة أرقام الإصدارات مثل 4.2.1. تحديثات الترقيعات أكبر قليلًا، لا تحتوي هي الأخرى على مميزاتٍ جديدة، ولكنّها تقوم بتحديث النظام وعادةً ما تتضمن تحديثاتٍ أمنية كذلك، كما أنّه يتم إصدارها بصفة دورية ومن الممكن توقّع وقت صدور الترقيع الجديد. وأمّا عن التحديثات الرئيسية من الانتقال من الإصدار 3.9 إلى الإصدار 4.0 فهذا تحديثٌ جوهري، يحتوي مميزاتٍ جديدة وإصلاحاتٍ للمشاكل الأمنية المعروفة بالإضافة لأمورٍ أخرى، كما أنّه يتم التدوين عنها في مدونة ووردبريس وفي العديد من المواقع الإخبارية الأخرى، حيث أنّها تحديثات كبيرة ويجب على الجميع معرفتها. قد تقوم هذه التحديثات أحيانًا بتحطيم شكل موقعك بسبب عدم توافقية مع القالب الذي تستخدمه مثلًا، ولكن مع وجود نسخة احتياطية من موقعك، فيجب ألّا تكون مشكلةً بالنسبة لك. الفشل بالتحديث يعني مشكلة أعظم كما ذكرنا سابقًا، عدم قيامك / فشلك بتحديث أيّ إضافات أو قوالب ووردبريس مثبّتة على موقعك قد يعرّضك لخطرٍ كبير، وما قد لا تفهمه هو "لماذا"؟ يمكن قول نفس الأمر بخصوص القوالب والإضافات، صحيحٌ أنّها ليست جزءً من لبّ نواة ووردبريس، ولكنّها أيضًا قد تحتوي على ثغرات تمكّن المخترقين من استغلالها لاختراق موقعك، وأيضًا يتم اكتشاف هذه الثغرات كلّ فترة وتصدر تحديثات لترقيعها كلّ فترة، وعليك تثبيتها بمجرّد توفّرها. بعض السمات والقوالب تكون مبرمجة بصورة سيئة ويكون بها العديد من الثغرات ويجب عليك الانتباه إلى ذلك، كما يجب عليك تثبيت واستخدام القوالب والإضافات التي تستعملها فقط وحذف كلّ شيء لا تستعمله. إدارة تحديثات ووردبريس أفضل طريقة للتأكّد من أنّ كلّ شيء على موقعك محدّث هو جعل عملية التحقق من وجود تحديثات متوفّرة هي مهمّة روتينية أخرى على جدولك (لو لم تكن تقنيًا، فيجب عليك البحث عن استضافة تقوم تلقائيًا بتحديث جميع القوالب والإضافات والنواة الخاصّة بووردبريس)، يجب عليك التحقق من توفّر التحديثات بنفسك كلّ يوم لتجنّب أي مشاكل أمنية قد تحصل. منذ الإصدار 3.7 من ووردبريس فإنّ المنصة تسمح بالتحديث التلقائي بسهولة، بمجرّد تفعيل هذا الخيار، فإنّه هذا يعني أنّ نواة موقعك ستقوم بالتحديث تلقائيًا عند توفّر تحديثات جديدة بدون أيّ تدخّل منك. طبعًا لا يمكن فعل نفس الشيء بالنسبة للقوالب والإضافات، حيث يجب عليك القيام بتحديثها يدويًا. الخاتمة تحديثات ووردبريس مهمّة للغاية، بل ومهمّة جدًا، ومن واجبك الاهتمام بتحديث كلّ شيءٍ موجود على موقعك إلى الإصدارات الأخيرة المتوفّرة، وإلّا فإنك تترك بابك مفتوحًا للمخترقين ليخترقوك، إنّها مسألة وقت. ترجمة -وبتصرف- للمقال: The WordPress Developer’s Guide to Security: Updates لصاحبه: Brenda Barron.
  4. من المهم لمطورّي ووردبريس أن يكونوا على اطّلاعٍ على تقنيات الحماية والأمان عند تطوير مواقع تعمل بسكربت ووردبريس أو تصميم قوالب جاهزة له، سنبدأ سلسلة من 4 دروس حول هذا الموضوع وسيكون درسنا اليوم عن "التثبيت". هناك عدّة أمور مهمّة لتأخذها بعين الاعتبار لضمان أمانٍ أعلى لموقعك ومن بينها: اختيار الاستضافة المناسبة يبدأ موقع ووردبريس المؤمّن بشكلٍ مثالي من اختيار استضافة مناسبة لموقعك، فمن دون استضافة آمنة وجيّدة السمعة عالميًا، فإنّ جهودك في مجال تأمين موقعك العامِل بووردبريس قد تذهب أدراج الرياح. على الجانب التقني، بِما أنّ ووردبريس يستخدم PHP وMySQL، فإنّ أيّ استضافة تعمل بنظام لينكس ستكون مناسبة، ولكن من المنصوح أن تبتعد عن استضافة GoDaddy و Yahoo! ومثيلاتها حيث أنّ هذه الاستضافات مصممة لتكون بسيطة للغاية مما يجعلها مُقيّدة في بعض الأحيان، وهو ما يعني أنّه غير مجهّزة لأيّ شيء أكثر من موقع ووردبريس عادي بسيط. إذا كنتَ تريد القيام بتعديل بعض الإعدادات على الخادوم لتحسين إعدادات الأمان، فإنّ القيام بهذا قد يكون صعبًا على تلك الاستضافات المقيّدة. ينصح معظم خبراء الحماية باستخدام استضافاتٍ توفّر خواديمًا افتراضية خاصّة (VPS). وهو ما يستخدمه Tony Perez المدير التنفيذي لـSucuri: يستخدم Tony العديد من الأدوات على خادومه للحماية والأمان، هذه الأدوات تريه من يقوم بتسجيل الدخول إلى خادومه، من يقوم بالتعديل على المواضيع.. وهكذا، كما أنّ هذه الأدوات تقوم بعرض WHOIS، الـDNS ونشاط البرمجيات الخبيثة إن كانت موجودة، كلّ واحدٍ من هذه الأدوات مصمم ليراقب جزءًا معيّنا من جزئيات الحماية على الخادوم، بالإضافة إلى أمورٍ قد لا تخطر على بال المستخدمين العاديين. ينصح Tony باستخدام إضافة Sucuri Scanner لفحص مواقع الووردبريس للتأكّد من حمايتها، كما ينوّه إلى أنّه هناك العديد من الإضافات الأخرى التي يمكنك البحث عنها من على مخزن إضافات ووردبريس. مشكلة سكربتات التثبيت بنقرة واحدة توفّر العديد من شركات الاستضافة الآن القيام بعملية تثبيت ووردبريس "بنقرة واحدة"، وهو ما يسمح للمستخدمين العاديين أن يمتلكوا موقع ووردبريس بسرعة أكثر من السابق، ولكن بالطبّع، السرعة لها تكلفة. يمكنك في الواقع تغيير هذه البيانات بسهولة إن أردت -وهو ما سنتحدّث عنه لاحقًا- ولكن المشكلة هنا هي في الافتراضات التي يظنّها الناس عن عمليات التثبيت بنقرة واحدة بسبب شركات الاستضافة، فهم يظنون أنّها آمنة ومحميّة، لسوء الحظّ، فهي ليست كذلك، مما يجعل طريق التثبيت اليدوي أفضل بكثيرٍ للحماية. كيفية تثبيت ووردبريس إذا كنتَ لا تستخدم عملية التثبيت بنقرة واحدة، فإنّ القيام بتثبيت ووردبريس بالطريقة اليدوية على خادومك يجب أن يستغرق حوالي 10 دقائق. ستحتاج إلى فهم أساسيات عمل بروتوكول نقل الملفّات FTP وقواعد البيانات. هناك عدّة دروس على الويب حول هذا الموضوع من البداية إلى النهاية، ولكننا لن نذكر تفاصيلها الآن في هذا المقال. بمجرّد أن تقوم برفع كلّ ملفّاتك إلى موقعك وبمجرّد أن تقوم بإعداد قاعدة البيانات، سيتم توجيهك إلى إعداد اسم المستخدم وكلمة المرور الخاصّيَن بووردبريس، من المستحسن أن تقوم باختيار اسم مستخدمٍ معقّد ومن الصعب أن يتم تخمينه من قبل المخترقين لحمايةٍ أعلى. نفس الشيء بالنسبة لكلمة المرور الخاصّة بك، اجعلها معقّدة قدر الإمكان وأضف إليها الأرقام والرموز والأحرف الكبيرة، لا تتركها بسيطة فتصبح عُرضةً لهجمات التخمين بسهولة، كلّما كانت كلمة المرور أكثر تعقيدًا وطولًا، كلّما صعب تخمينها وكسرها. تغيير اسم المستخدم "Admin" تحدّثنا بالفعل عن أهميّة تجنّب اسم المستخدم "admin" ولماذا يجب عليك أن تختارَ اسمًا معقدًا، ولكن لنفرض أنّك قمتَ بالفعل بتثبيت موقع ووردبريس جديد منذ فترة واستخدمت اسم المستخدم "admin" فيه، فستحتاج تغييره يدويًا من phpMyAdmin. افتراضيًا، لا يسمح لك ووردبريس بتغيير اسم المستخدم، ولكن يمكنك إنشاء مستخدمٍ جديد إن أردت وإعطاؤه صلاحياتٍ إدارية كاملة وحذف المستخدم "admin" وإسناد الصفحات والمقالات التي أنشئتها بالمستخدم القديم إلى المستخدم الجديد، ولكن إذا كنتَ تمتلك الكثير من الصفحات والمقالات فربّما تريد القيام بالأمر يدويًا. للقيام بذلك، قم بالدخول إلى لوحة cPanel الخاصّة بك (على افتراض أنّك تمتلك واحدة!) ثمّ ابحث عن phpMyAdmin وقم بفتحها، بعد هذا، ابحث عن قاعدة البيانات الخاصّة بموقعك وابحث عن جدول wp_users ضمنها. ابحث عن المستخدم "admin" واصغط على زر "Edit" أو تحرير بجانبه لتعديل اسم المستخدم، قم بتبديل الاسم واحفظه. بعد هذا، سيتم تلقائيًا تغيير اسم المستخدم في جميع أنحاء موقعك إلى الاسم الجديد ولن تحتاج إلى حذف شيء. الخاتمة في معظم الأحيان، يعتقد الناس أنّ أمان ووردبريس هو مسألة يمكن حلّها عبر إضافة ووردبريس، صحيحٌ أنّ هذا جزءٌ مهم من المعادلة ولكنّه ليس كلّ شيء، حيث أنّك تحتاج تأمين كلّ شيء منذ البداية. في الدرس القادم سنتطرق إلى كيفية تأمين ووردبريس بعد تثبيته عبر تأمين تسجيل الدخول إلى المنصة. ترجمة -وبتصرف- للمقال The WordPress Developer’s Guide to Security: Installation لصاحبته Brenda Barron.
  5. إعداد جدارٍ ناريّ قوي هو خطوةٌ أساسية يجب فعلها بهدف تأمين أيّ نظام تشغيلٍ حديث. تأتي معظم توزيعات لينكس بأدواتٍ مختلفة يمكننا استخدامها لضبط جداراتنا الناريّة. في هذا الدرس، سنتحدّث عن جدار iptables الناريّ. Iptables هو عبارة عن جدارٍ ناريّ عادي موجود في معظم توزيعات لينكس افتراضيًا (برنامجٌ آخر يدعى nftables سيبدأ قريبًا باستبداله). هو في الواقع عبارة عن واجهةٍ أمامية لخطّافات netfilter على مستوى النواة (kernel-level netfilter hooks) يمكنه التعامل مع مكدّس شبكة لينكس (Linux network stack). يعمل iptables عن طريق مطابقة كلّ حزمة (packet) تمرّ عبر الشبكة بمجموعة من القواعد (rules) التي تجعله يقرر ما يجب فعله. ملاحظة: يغطّي هذا الدرس أساسيات الحماية لـIPv4. في نظام لينكس، هناك فرق بين طرق الحماية لـIPv4 و IPv6. كمثال فإنّ iptables يقوم فقط بالتحكّم في قواعد جدار الحماية لعناوين IPv4 إلّا أنّه يمتلك برنامجًا خارجيًا يدعى ip6tables يمكن استخدامه للتحكّم في قواعد جدار الحماية لعناوين IPv6. إذا كان خادومك الافتراضي الخاصّ مُعدًّا ليستخدم IPv6، فرجاءً تذكّر حماية كلّ من واجهتيّ الشبكة IPv4 و IPv6 باستخدام الأدوات المناسبة. للمزيد من المعلومات عن أدوات IPv6، راجع هذا الدرس: كيفية ضبط بعض الأدوات لاستخدام IPv6 على نظام لينكس. أوامر iptables الأساسية الآن وبعد أن صار لديك المفاهيم الأساسية حول iptables، فإنّه يجب علينا تغطية الأوامر الأساسية التي سيتم استعمالها لتشكيل مجموعات قواعد iptables أكبر بالإضافة إلى إدارة واجهة iptables بشكلٍ عام. أولًا، يجب عليك أن تنتبه إلى أنّ أوامر iptables يجب أن يتم تشغيلها بصلاحيات الجذر (root privileges). هذا يعني أنّه يجب عليك الولوج إلى النظام باسم المستخدم root، استخدم su أو sudo -i للولوج إلى صدفة المستخدم الجذر، أو يمكنك ببساطة وضع sudo قبل جميع الأوامر التي ستطبّقها. سنستخدم sudo في هذا الدرس بما أنّها طريقة شائعة الاستخدام على نظام Ubuntu. نقطة جيدة للبداية بها هي كيفية سرد قواعد iptables المُستخدمة حاليًا. يمكنك فعل هذا باستخدام الخيار -L : $ sudo iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination كما يمكنك أن ترى، لدينا ثلاث سلاسل (chains) هنا. يمكننا أيضًا أن نرى السياسة المتّبعة في كلّ سلسلة (كل سلسلة افتراضيًا تمتلك سياسة ACCEPT للاتصالات المارّة منها). يمكننا أيضًا رؤية بعض ترويسات العواميد في ناتج الأمر السابق، إلّا أنّنا فعليًا لا نرى أيّ قواعد مطبّقة. هذا بسبب أنّ Ubuntu لا تأتي مع مجموعةٍ افتراضية من قواعد iptables. يمكننا رؤية الخرج بصيغةٍ تعكس الأوامر الضرورية لتفعيل كلّ قاعدة وسياستها عبر استخدام الخيار -S : $ sudo iptables -S -P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT لإعادة إنتاج الإعدادات وتطبيقها من جديد، سيجب علينا فقط كتابة الأمر sudo iptables متبوعًا بكلّ واحدٍ من السطور الظاهرة في الخرج. (اعتمادًا على الإعدادات، قد يكون الأمر أكثر تعقيدًا في حال كنّا متّصلين عن بعد إلى الخادوم حيث أننا لا نريد إضافة قواعد iptables معيّنة تمنع جميع الاتصالات الواردة إليها مثلًا دون استثناء اتّصالنا الحالي لكي لا ينقطع فجأة ولكي يبقى متّصلًا). إذا كان لديك قواعد بالفعل لديك في iptables وكنتَ ترغب بإتلافها والبدء من جديد، فيمكنك فعل ذلك عبر تطبيق: $ sudo iptables -F مرةً أخرى، سياسة قبول الاتصالات أو رفضها مهمّة هنا، لأنّه وبينما يتم حذف جميع القواعد الأخرى من السلاسل الخاصّة بك، فإنّ السياسة الافتراضية لن تتغيّر باستخدام هذا الأمر. هذا يعني أنّه في حال كنت متّصلًا عن بعد بخادومك، فإنّه يجب عليك التأكّد من أنّ السياسة الافتراضية لسلسلتيّ INPUT و OUTPUT هي ACCEPT بالتزامن مع قيامك بإتلاف قواعدك السابقة. يمكنك فعل ذلك عبر تطبيق الأوامر التاليّة: $ sudo iptables -P INPUT ACCEPT $ sudo iptables -P OUTPUT ACCEPT $ sudo iptables -F يمكنك تغيير سياسة الحظر أو الترك (drop) مجددًا إلى DROP بعد أن تقوم بإعداد القواعد التي تسمح ببقاء اتّصالك الحالي. سنفصّل كيفيّة ذلك بعد قليل. إنشاء قاعدتك الأولى سنبدأ ببناء سياسة جدار الحماية الخاصّ بن حول قبول أو رفض الاتصالات. كما قلنا أعلاه، فإنّنا سنعمل مع سلسلة INPUT بما أنّها المصدر الرئيسي لتدفّق الزوار القادم إلى خادومنا. سنبدأ مع القاعدة التي تحدّثنا عنها مسبقًا من قبل بالأعلى: القاعدة التي تسمح لنا بشكل خاص بمتابعة اتّصال SSH الحالي. القاعدة الكاملة التي نحتاج إليها هي هذه: $ sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT قد يبدو هذا معقّدا للغاية لك في الوهلة الأولى، إلّا أنّ معظم مكوّنات الأمر السابق ستكون ذات معنى بالنسبة لك عندما تفهمها: -A INPUT: يقوم الخيار -A بإضافة قاعدةٍ ما إلى نهاية السلسلة المطلوبة. هذا هو الجزء الذي يقوم بإخبار iptables بأنّنا نريد إضافة قاعدةٍ جديدة إلى سلسلة معيّنة، والسلسلة التي نريدها في مثالنا حاليًا هي سلسلة INPUT. -m conntrack: يمتلك iptables عدّة وظائف داخليّة، ولكنّه أيضًا يمتلك مجموعةً من الامتدادات والوحدات التي تقوم بتوفير مزايا إضافيّة. إنّنا نقوم في هذا الجزء من الأمر بإخبار iptables بأنّنا نريد الحصول على إذن بالوصول إلى الوظيفة التي يتم توفيرها عبر الوحدة المسماة "conntrack”. تعطينا هذه الوحدة وصولًا إلى الأوامر التي يمكن أن يتم استخدامها بناءً على علاقة حزمة البيانات الداخلة بالاتّصال السابق. --ctstate: هذا واحدٌ من الأوامر التي أصبحت متوفّرة بعد أن تم استدعاء وحدة "conntrack”. يسمح لنا هذا الأمر بمطابقة حزم البيانات بناءً على ماهيّة ارتباطها بحزم البيانات التي رأيناها من قبل. إننا نقوم بتمرير قيمة ESTABLISHED للسماح بمرور حزم البيانات الداخلة التي هي جزء من اتّصالٍ عاملٍ حاليًا فقط. ونقوم بتمرير قيمة RELATED للسماح بمرور حزم البيانات المرتبطة باتّصالٍ مُنشَئٍ بالفعل. هذا الجزء من القاعدة هو الجزء الذي يتطابق مع جلسة SSH الحالية الخاصّة بنا. -j ACCEPT: يقوم هذا الخيار بتحديد هدف مطابقة حزم البيانات. هنا، نقوم بإخبار iptables أنّ حزم البيانات التي تطابق القاعدة السابقة يجب أن يتم السماح لها بالمرور. قمنا بوضع هذه القاعدة في البداية لأننا أردنا أن نتأكّد أنّ اتصالنا الحالي مطابق، مقبول وخارج إطار السلسلة قبل تنفيذ أيّ قواعد DROP. يمكننا الآن رؤية حالة التغييرات التي قمنا بها عن طريق: $ sudo iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination الآن وبعد أن صرتَ تعرف الصياغة العامّة لقواعد iptables، فلنتابع عبر استعراض المزيد من الحالات التي سنحتاج فيها إلى قبول الاتّصالات. قبول الاتّصالات المهمّة الأخرى أخبرنا iptables أن يبقي أيّ اتصالاتٍ مفتوحة على وضعها الحالي بالإضافة إلى السماح بالاتصالات الجديدة المرتبطة بتلك الاتصالات. على كلّ حال، نحتاج إلى إنشاء بعض القواعد الضرورية لتحديد متى نريد قبول اتّصالاتٍ جديدة لا تطابق هذه المعايير التي طبّقناها. نريد إبقاء منفذين اثنين مفتوحين بالتحديد. نريد إبقاء منفذ اتّصال SSH الخاصّ بنا مفتوحًا (سنفترض في هذا الدرس أنّ المنفذ الافتراضي له هو المنفذ 22. إذا كنتَ غيّرت هذا المنفذ على خادومك من إعدادات SSH فقم بتعديل قيمته هنا). سنقوم أيضًا بافتراض أنّ هذا الحاسوب يقوم أيضًا بتشغيل خادوم ويب يعمل على المنفذ 80. إذا لم يكن هذا هو نفس الوضع بالنسبة لك فلن تحتاج تطبيق القاعدة التالية. السطران اللذان سنستعملهما لتطبيق هذه القواعد هما: sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT كما يمكنك أن ترى، هذه القواعد مشابهة جدًا لقاعدتنا الأولى التي كتبناها، ولكنها ربما تكون أكثر بساطةً. الخيارات الجديدة هي: -p tcp: يقوم هذا الخيار بمطابقة حزم البيانات في حال كان البروتوكول المستخدم هو TCP. هذا البروتوكول هو بروتوكولٌ مستخدم بواسطة معظم التطبيقات لأنّه يسمح بتواصلٌ مرن وقوي بين المستخدم والتطبيق. --dport: يكون هذا الخيار متوفّرًا للاستخدام فقط في حال كان الخيار -p tcp موجودًا في الأمر. إنّه يقوم أيضًا بتحديد رقم المنفذ الذي يجب مطابقة حزم البيانات عبره. تقوم القاعدة الأولى بمطابقة حزم البيانات المارّة عبر بروتوكول TCP بالمنفذ 22، بينما تقوم الثانية بمطابقتها عبر المنفذ 80. هناك قاعدة ACCEPT أخرى يجب علينا التأكّد من أنّ خادومنا يقبلها بشكل صحيح. غالبًا، تتواصل الخدمات (services) مع بعضها البعض على الحاسوب عبر إرسال حزم بياناتٍ فيما بينها، وهي تقوم بذلك عبر الاستفادة من واجهة شبكةٍ زائفة تدعى loopback device ، والتي تقوم بتوجيه التدفّق إلى نفسها عوضًا عن الأجهزة الأخرى. لذا إذا كانت واحدة من الخدمات تريد التواصل مع خدمةٍ أخرى تستمع إلى المنفذ 4555، فإنّه بمقدورها إرسال حزمة بيانات إلى المنفذ 4555 على الشبكة الزائفة loopback device. نريد أن يتم السماح بهذا النوع من السلوك بين الخدمات لأنّه ضروري للعديد من برامج نظام التشغيل. القاعدة التي نحتاج تطبيقها هي هذه: $ sudo iptables -I INPUT 1 -i lo -j ACCEPT يبدو هذا الأمر مختلفًا قليلًا عن الأوامر السابقة. فلنشرح ما يفعله: -I INPUT 1: يقوم الخيار -I بإخبار iptables بإدراج قاعدةٍ جديدة. هذا الخيار مختلف عن الخيار -A والذي يقوم بإضافة القاعدة الجديدة إلى نهاية قواعد iptables. يحتاج الخيار -I إلى اسم السلسلة والمكان الذي تريد إدراج القاعدة الجديدة فيه. في حالتنا، فإننا نقوم بإضافة هذه القاعدة كأول قاعدة في سلسلة INPUT. هذا سيدفع بقية القواعد إلى الأسفل بدرجةٍ واحدة تلقائيًا. نحتاج لهذه القاعدة أن تكون بالأعلى لأنّها أساسية ولا يجب أن يتم التأثير عليها عبر قواعد فرعيّة أخرى. -i lo: يقوم هذا المكوّن من القاعدة بمطابقة ما إذا كانت الواجهة التي تستخدمها حزمة البيانات هي واجهة "lo”. واجهة "lo” هي عبارة عن اسمٍ آخر لـloopback device. هذا يعني أنّ أيّ حزمةِ بياناتٍ تستعمل تلك الواجهة الشبكيّة للتواصل (حزم البيانات الناتجة في خادومنا، إلى خادومنا) يجب أن يتم قبولها من طرف iptables. لرؤية قواعدنا الحاليّة، يجب أن نستخدم الخيار -a . هذا بسبب أنّ الخيار -L لا يتضمّن بعض المعلومات، مثل اسم الواجهة المرتبطة بالقواعد، والذي يعتبر جزءًا مهمًّا في القاعدة التي قمنا بإضافتها: $ sudo iptables -S -P INPUT ACCEPT -P FORWARD ACCEPT -P OUTPUT ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT تضمين قاعدة حظر (Drop) نمتلك الآن 4 قواعد منفصلة تقبل الاتصالات بناءً على معايير معيّنة. وبالرغم من ذلك، فإنّا خادومنا حاليًا لا يحظر وصول أيّ شيء إليه. إذا دخلت حزمة بياناتٍ إلى سلسلة INPUT ولم تكن مطابقة لأيٍّ من القواعد الأربعة التي أدخلناها، فإنّه سيتم تحويلها إلى السياسة الافتراضية للتعامل مع حزم البيانات، والتي هي حاليًا "قبول حزم البيانات جميعها"، ونحتاج لتغيير هذا الأمر. هناك طريقتان يمكننا فعل ذلك بهما، مع بعض الاختلافات الجوهرية. الطريقة الأولى التي يمكننا من خلالها القيام بهذا هي عن طريق تعديل السياسة الافتراضية لسلسلة INPUT. يمكننا القيام بذلك عبر كتابة: $ sudo iptables -P INPUT DROP ستقوم القاعدة السابقة بالتقاط أيّ حزم بياناتٍ تفشل بالمرور عبر سلسلة INPUT الخاصّة بنا ويمنع وصولها إلى الخادوم. هذا ما ندعوه بسياسة المنع الافتراضيّة (default drop policy)، من مساوئ هذه الطريقة هي أنّ قاعدة الـDROP هذه يتم إلغاؤها في حال تم مسح قواعد iptables (حيث أنّها قاعدة هي الأخرى وبالتالي سيتم مسحها معها). قد تكون هذه الطريقة أكثر أمنًا، ولكنك قد تواجه عواقب وخيمة في حال لم يكن لديك طريقةٌ أخرى للوصول إلى خادومك. في DigitalOcean، يمكنك الولوج عبر لوحة التحكّم إلى خادومك والوصول إلى طرفيّة ويب تمكّنك من التحكّم به إذا حصل هذا. طرفيّة الويب هذه تعرّف نفسها على أنّها اتصال وهمي محلّي ولذلك فإنّ قواعد iptables لا تؤثّر عليها. قد تودّ لخادومك أن يقوم بحظر جميع الاتصالات في حال مسح جميع القواعد. قد يمنع هذا من ترك خادومك مفتوحًا للجميع. وهذا يعني أيضًا أنّه بمقدورك بسهولة إضافة القواعد إلى نهاية أيّ سلسلة تريدها بينما تحظر حزم البيانات التي لا تريدها بسهولة. إذا قمتَ بتغيير السياسة الافتراضيّة لسلسلة INPUT، فإنّه يمكنك إرجاعها عبر تطبيق: $ sudo iptables -P INPUT ACCEPT الآن، يمكنك إضافة قاعدة إلى نهاية السلسلة والتي ستقوم بحظر أيّ حزم بياناتٍ متبقية: $ sudo iptables -A INPUT -j DROP النتائج تحت شروطٍ تشغيلية عادية ستكون بالضبط هي نفس سياسة الحظر الافتراضيّة. تعمل هذه القاعدة عبر مطابقة كلّ حزمة بياناتٍ متبقية تصل إليها. يمنع هذا حزمةَ البيانات من الوصول إلى الخادوم في حال فشلت بتجاوز القواعد السابقة التي قمنا بإنشائها. بشكلٍ عام، يتم استخدام هذه القاعدة لجعل السياسة الافتراضيّة في التعامل مع الاتصالات تقبل التدفّق الواصل إليها. بهذه الطريقة، في حال كان هناك أيّ مشاكل وتم مسح جميع القواعد، فإنّك ستبقى قادرًا على الوصول إلى الآلة عبر الشبكة. بالطبع، هذا يعني أيضًا أنّ أيّ قاعدةٍ إضافية تودّ إضافتها إلى نهاية السلسلة يجب أن تكون قبل قاعدة الحظر أو الـdrop. يمكنك فعل هذا عبر حذف قاعدة الحظر مؤقتًا عبر: $ sudo iptables -D INPUT -j DROP $ sudo iptables -A INPUT new_rule_here $ sudo iptables -A INPUT -j DROP أو، يمكنك إدراج القواعد التي تحتاجها في نهاية السلسلة (ولكن قبل قاعدة الـdrop) عبر تحديد رقم السطر. لإدراج قاعدةٍ في السطر رقم 4، يمكنك كتابة: $ sudo iptables -I INPUT 4 new_rule_here إذا كنتَ تواجه مشاكل في معرفة إلى أيّ سطرٍ تنتمي أيّ قاعدة، فيمكنك إخبار iptables بأن يقوم بسرد السطور المتوفّرة عبر: $ sudo iptables -L –line-numbers Chain INPUT (policy DROP) num target prot opt source destination 1 ACCEPT all -- anywhere anywhere 2 ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED 3 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh 4 ACCEPT tcp -- anywhere anywhere tcp dpt:http Chain FORWARD (policy ACCEPT) num target prot opt source destination Chain OUTPUT (policy ACCEPT) num target prot opt source destination يمكن لهذا أن يكون مفيدًا للتأكّد من أنّك تضيف القاعدة إلى مكانها الصحيح. حفظ إعدادات iptables الخاصّة بك افتراضيًا، تكون القواعد التي تضيفها إلى iptables غير دائمة. هذا يعني أنّك عندما تقوم بإعادة تشغيل خادومك، فإنّ جميع قواعد iptables ستختفي. هذه المشكلة في الواقع هي ميّزة لبعض المستخدمين لأنّها تعطيهم فرصةً للعودة إلى التحكّم بالخادوم في حال قاموا بحبس أنفسهم خارجها عن طريق الخطأ في تطبيق القواعد. وعلى كلّ حال، معظم المستخدمين سيودّون أن يكون هناك طريقة تلقائية لحفظ القواعد التي أنشؤوها وتحميلها تلقائيًا عند إقلاع الخادوم. هناك عدّة طرق لفعل هذا، لكنّ أسهلها هو باستخدام حزمة iptables-presistent، يمكنك تحميل هذه الحزمة من مستودعات Ubuntu الافتراضيّة: $ sudo apt-get update $ sudo apt-get install iptables-persistent أثناء التثبيت، سيتم سؤالك عمّا إذا كنتَ تحبّ حفظ قواعد iptables الحاليّة ليتم تحميلها تلقائيًا. إذا كنتَ مسرورًا مع إعداداتك الحاليّة (واختبرت قدرتك على الوصول إلى اتصالات SSH جديدة مستقلة) فإنّه يمكنك الموافقة على ذلك. سيتم سؤالك أيضًا عمّا إذا كنتَ تريد حفظ قواعد IPv6 التي قمتَ بإعدادها، يتم إعداد هذه القواعد عبر أداة منفصلة تدعى ip6tables والتي تتحكم بحزم بيانات IPv6 بنفس الطريقة. بمجرّد اكتمال التثبيت، ستتوفر خدمة جديدة لديك تدعى iptables-presistent وهي مُعدّة ليتم تشغيلها عند الإقلاع. ستقوم هذه الخدمة بتحميل قواعد iptables الحاليّة وتطبيقها من جديد في كلّ مرّة يتم إعادة تشغيل النظام فيها. الخاتمة يجب أن تكون الآن قد امتلكت نقطة بداية جيّدة للبدء في تطوير جدارٍ ناري يلبي احتياجاتك. هناك العديد من أدوات الجدران الناريّة الأخرى التي يمكنك استخدامها والتي قد تكون أسهل، ولكن iptables أداةٌ جيّدة لتعلّمها، ذلك لأنّها توفّر بنية netfilter تحتية جيّدة للاستعمال ولأنّها متوفّرة افتراضيًا في العديد من أنظمة التشغيل. ترجمة -وبتصرّف- للمقال: How To Set Up a Firewall Using IPTables on Ubuntu 14.04.
  6. قدرات إعادة التوجيه (redirection) في لينكس توفّر لك العديد من الأدوات القوية التي يُمكن استخدامها لجعل جميع أنواع المهام أسهل للتنفيذ. سواءٌ كنتَ تكتبُ برمجياتٍ معقّدة أو كنتَ تقوم بإدارة الملفّات عبر سطر الأوامر، فإنّ معرفة كيفية التلاعب بتدفّقات (streams) الإدخال/الإخراج (input/output) على بيئتك الشخصية سيزيدُ من إنتاجيّتك بشكلٍ ملحوظ. التدفقات يتم توزيع الإدخال والإخراج في بيئة لينكس عبر ثلاث تدفّقات (streams) أساسية: إدخال معياري (stdin). إخراج معياري (stdout). خطأ معياري (stderr). هذه التدفّقات أيضًا مرقّمة وفق التالي: (stdin (0. (stdout (1. (stderr (2. أثناء التفاعلات المعيارية (standard interactions) بين المستخدم والطرفيّة (terminal)، فإنّه يتم نقل الإدخال المعياري عبر لوحة مفاتيح المستخدم. يتم عرض الإدخال المعياري و الخطأ المعياري على طرفية المستخدم كنصّ. بشكلٍ عام، جميع هذه التدفّقات الثلاثة يتم الإشارة إليها بـ"التدفّقات المعيارية". الإدخال المعياري تدفّق الإدخال المعياري عادةً ما يحمل البيانات من المستخدم إلى البرنامج. البرامج التي تتوقع إدخالًا معيّنًا من المستخدم تستقبل الإدخال عادةً من جهازٍ ما، مثل لوحة المفاتيح، الإدخال المعياري ينتهي عند وصوله نهاية الملف (EOF – End Of File). كما يتم وصفه بواسطة اسمه، فإنّ نهاية الملف أو "EOF" تُعلِم الحاسوب أنه لا يوجد هناك المزيد من البيانات ليتم قراءتُها. لرؤية الإدخال المعياري بصورةٍ حيّةَ، شغّل برنامج cat. كلمة Cat ترمز لـ"concatenate” أو "سَلسَلة الأشياء"، والتي تعني ربط الأشياء مع بعضها البعض على شكل سلسلة. يتم استخدام Cat بشكلٍ شائع لدمج محتويات ملفّّين. عندما يتم تشغيله لوحده فإنّ cat يقوم بفتح طرفيّته الخاصّة. cat بعد فتح cat، قم بإدخال مجموعة من الأرقام كالتالي: 1 2 3 ثم اضغط Ctrl+D. عندما تقوم بكتابة رقم والضغط على زرّ Enter، فإنّك تقوم بإرسال إدخال معياري (standard input) إلى برنامج cat الذي يعمل حاليًا، والذي هو بدوره يتوقّع وصول الإدخال إليه. يقوم برنامج cat بإرسال الإدخال الذي تُدخله إليه مرةً أخرى إلى الطرفية حيث يتم عرضه كإخراج معياري (standard output). إشارة EOF (أو نهاية مدّة حياة العملية الحالية – End of File) يُمكن أن يتم إرسالها إلى البرنامج بواسطة المستخدم عبر الضغط على مفاتحيّ Ctrl+D. بعد أن يتسلّم برنامج cat إشارة EOF فإنّ البرنامج يتوقف. الإخراج المعياري يقوم الإخراج المعياري (standard output) بكتابة البيانات التي يتم إنشاءها بواسطة البرامج. عندما لا يتم إعادة توجيه تدفّق الإخراج المعياري، فإنّه سيتم إخراج النصّ إلى الطرفية. جرّب المثال التالي: echo Sent to the terminal through standard output الخطأ المعياري يقوم الخطأ المعياري (standard error) بكتابة الأخطاء التي يتم إنشاؤها بواسطة البرامج التي فشلت في أن يتم تنفيذها في مرحلةٍ ما. تمامًا مثل الإدخال المعياري فإنّ الوجهة الافتراضية لهذا التدفّق هي شاشة الطرفيّة. عندما يتم إرسال تدفّقِ خَطَأٍ معياريٍ لبرنامجٍ إلى برنامجٍ آخر، فإنّ البيانات المُرسلة (المتكوّنة من أخطاء البرنامج) يتم إرسالها بشكلٍ موازي إلى الطرفية كذلك. فلنرى مثالًا بسيطًا عن الخطأ المعياري باستخدام ls. يقوم الأمر ls بسرد محتويات المجلّدات أو المسارات. عندما يتم تنفيذه بدون أيّ معطيات، فإنَّ أمر ls يقوم بسرد محتويات المسار الحالي. إذا تمّ تشغيله مع مسارٍ معيّن كمُعطَى، فإنّه سيقوم بسرد محتويات المسار المطلوب. ls % بما أنّ % ليس مسارًا موجودًا، فإنّه سيتم إرسال النصّ التالي كخطأٍ معياري: ls: cannot access %: No such file or directory إعادة توجيه التدفق يمتلك نظام لينكس أوامرًا مُضمّنة لإعادة توجيه كلّ تدفّق. تقوم هذه الأوامر بطباعة إخراجٍ معياري إلى ملفٍّ ما. إذا تم استهداف ملفٍّ غير موجود، فإنّه سيتم إنشاء ملفٍّ جديد باسم ذاك الملفّ ليتم الكتابة عليه. الأوامر التي يأتي معها قوسٌ واحد (إشارة >) تقوم بالكتابة فوق ملفّ الوجهة الموجود. بالأسفل تجد بعض الإشارات الشائع استخدامها مع الأوامر عند التعامل معها بالطرفية لإعادة توجيه التدفّقات: 1. الكتابة فوق الملفات > إخراج معياري. < إدخال معياري. 2> خطأ معياري. 2. الإضافة إلى الملفات الأوامر التي يتم استخدامها مع قوسين اثنين لا تقوم بالكتابة فوق الملفّّات، بل تقوم بالكتابة إلى نهاية الملفّّات: >> إخراج معياري. << إدخال معياري. 2>> خطأ معياري. فلنأخذ المثال التالي: $ cat > write_to_me.txt a b c > ctrl-d يتم استخدام cat هنا لتتم عملية الكتابة إلى أحد الملفّّات، والذي يتم إنشاؤه تلقائيًا بسبب عدم وجوده ولأن الأمر الأول يحتاجه. لطباعة محتويات الملفّ write_to_me.txt باستخدام cat: $ cat write_to_me.txt يجب أن ترى أنّ الملفّ يحتوي على التالي: a b c الآن قم بإعادة توجيه cat إلى write_to_me.txt مجددًا وقم بإدخال الأرقام التالية: $ cat > write_to_me.txt 1 2 3 > ctrl-d عندما تستعمل cat لعرض محتويات write_to_me.txt، يجب أن ترى التالي: 1 2 3 أخيرًا، قم بعمل إعادة توجيه أخرى لـ cat ولكن هذه المرّة باستخدام قوسين عوضًا عن قوسٍ واحد: cat >> write_to_me.txt a b c ctrl-d وافتح ملفّ write_to_me.txt مجددًا، وسترى التالي: 1 2 3 a b c يحتوي الملفّّ الآن على النصّ من المرّة الأخيرة لاستخدام الأمر cat والتي قبلها، لأنّ الثانية لم تقم بالكتابة فوق الأولى. الأنابيب يتم استخدام الأنابيب (Pipes) لإعادة توجيه تدفّقٍ من برنامجٍ إلى آخر. عندما يتم إرسال الإخراج المعياري الخاص بأحد البرامج إلى برنامجٍ آخر عبر أنبوب (pipe) فإنّ بيانات البرنامج الأول والتي تمّ تلقّيها من طرف البرنامج الثاني سوف لن تظهر في الطرفية. فقط البيانات المُرشّحة عبر البرنامج الثاني سوف يتم عرضها. الأنبوب في نظام لينكس يتم تمثيله بإشارة شريطٍ عمودي: *|* وكمثالٍ على أمرٍ يستخدم أنبوبًا: ls | less هذا الأمر يقوم بأخذ ناتج الأمر ls (والذي يقوم بعرض محتويات المسار الحالي الذي أنت فيه) ويقوم بتمريره عبر أنبوبٍ إلى برنامج less. يقوم less بعرض البيانات المُرسلة إليه سطرًا سطرًا بدلًا من عرضها كاملة. بشكلٍ عام، يقوم ls بعرض محتويات المسار المطلوب عبر عرض الخرج بأكمله دفعةً واحدة. عندما تقوم بتشغيل ls عبر less فإنّ كلّ مُدخَلة يتم عرضها في سطرٍ واحد فقط خاصٍ بها ولا يتم عرض الخرج كله دفعةً واحدة، بل واحدة واحدة. على الرغم من أنّ وظيفة الأنابيب قد تبدو مشابهةً لإشارات الأقوس < و << (إعادة توجيه الإخراج المعياري)، فإنّ الفرق هو أنّ الأنابيب تقوم بتوجيه الخرج من أمرٍ إلى آخر، بينما تقوم إشارات الأقواس مثل < و << بتوجيه الخرج حصرًا إلى الملفّات فقط. المرشحات المرشّحات (filters) هي عبارة عن أوامر تعدّل على أنابيب إعادة التوجيه والإخراج. لاحظ أيضًا أنّه يمكن استخدام أوامر المرشّحات وأوامر لينكس العادية دون الحاجة لاستخدام الأنابيب. find: يقوم برنامج find بعرض الملفّات التي يتطابق اسمها مع المعطيات المُمررة له. grep: يقوم برنامج grep بعرض النصّ الذي يتطابق مع النصّ المُمرر إليه. tee: مهمّة برنامج tee هي إعادة توجيه الإدخال المعياري إلى كلٍ من الإخراج المعياري وملفٍّ واحد أو أكثر. tr: يقوم برنامج tr بالبحث عن سلسلة (string) واستبدالها بواحدة أخرى. wc: عدّاد للمحارف، السطور والكلمات. أمثلة قد تعرّفت الآن على إعادة التوجيه، استخدام الأنابيب والمرشّحات الأساسية، فلنلقي نظرةً على بعض أنماط إعادة التوجيه الأساسية والأمثلة. الأمر > الملف يقوم هذا النمط بإعادة توجيه ناتج أمرٍ معين إلى ملفّ، مثال: ls ~ > root_dir_contents.txt سيقوم الأمر السابق بتمرير محتويات مجلد الجذر (root directory) وكتابتها إلى ملفٍّ يدعى root_dir_contents.txt. سيقوم أيضًا بالكتابة فوق أيّ بيانات موجودة في ذاك الملفّ كوننا نستخدم قوسًا واحدًا فقط (>). الأمر > dev/null/ dev/null/ هو ملفٌّ خاص يتم استعماله لحذف أيّ بياناتٍ يتم توجيهها له. يتم استخدامه للتخلص من الخرج الذي لا نحتاجه والذي يُمكن أن يتعارض أحيانًا مع وظيفة أمرٍ آخر أو سكربت (script). يتم إهمال أي خرجٍ يتم إرساله إلى dev/null/. في المستقبل، ربّما تقوم باستخدام إعادة توجيه الخرج الناتج عن الأوامر والأخطاء إلى dev/null/ عند كتابة سكربتات الشلّ (shell scripts). ls > /dev/null سيقوم الأمر السابق بإهمال تدفّق الإخراج المعياري (standard output stream) العائد من الأمر ls عبر تمريره إلى الملفّ dev/null/ الذي سيتخلص منه. الأمر 2> الملف يقوم هذا النمط بتوجيه تدفّق الخطأ المعياري لأمرٍ ما إلى ملفّ، حيث يقوم بالكتابة فوق محتوياته الموجودة. كمثال: mkdir '' 2> mkdir_log.txt هذا الأمر سيوجّه رسالة الخطأ الصادرة عن "اسم المسار الخاطئ" ويكتبها إلى ملفّ mkdir_log.txt. لاحظ أنّه سوف يتم إرسال رسالة الخطأ أيضًا إلى الطرفية ليتمّ عرضها كنص. الأمر >> الملف يقوم هذا النمط بتوجيه ناتج أمرٍ ما إلى ملفّ دون الكتابة فوق محتويات الملفّ الحالية. مثال: echo Written to a new file > data.txt echo Appended to an existing file's contents >> data.txt هذان الأمران سيقومان أولًا بالكتابة فوق محتويات data.txt، ومن ثمّ سيتم الكتابة أسفل المحتويات الحالية لملفّ data.txt بواسطة الأمر الثاني، محتويات الملفّ يجب أن تبدو هكذا: Written to a new file Appended to an existing file's contents الأمر 2>> الملف يقوم النمط السابق بتوجيه تدفّق خطأٍ معياري لأمرٍ ما إلى ملفّ دون الكتابة فوق محتوياته الحالية. هذا النمط مفيد لإنشاء ملفّّات السجل (log files) لبرنامجٍ أو خدمة، حيث أنّه لن يتم محو محتويات الملفّ السابقة في كلِّ مرةٍ يتم الكتابة فيها إلى الملفّ. find '' 2> stderr_log.txt wc '' 2>> stderr_log.txt يوجّه الأمر أعلاه رسالة الخطأ الصادرة عن معطىٍ خاطئ للأمر find إلى ملفٍّ يُدعى stderr_log.txt. ومن ثمّ يقوم بتوجيه رسالة الخطأ الصادرة عن استخدامٍ خاطئ للأمر wc إلى نفس الملفّ. الأمر | الأمر يقوم بتوجيه خَرْجِ الأمر الأول إلى دَخْلِ الأمر الثاني. find /var lib | grep deb هذا الأمر يبحث عبر مجلّد var/ ومجلّداته الفرعية عن الملفّات والامتدادات المُطابقة للسلسلة "deb"، ويُرجِع مسارات تلك الملفّات مع تمييز الجزء المطابق من أسماء تلك بالملفّات بالسلسلة المبحوث عنها. الأمر | tee الملف هذا النمط (والذي يتضمّن أمر tee) يقوم بتوجيه ناتج أمرٍ معيّن إلى ملفّ والكتابة فوق محتوياته ومن ثمّ يقوم بعرض الناتج المُوجّه بالطرفية. حيثُ ينشئ ملفًّّا جديدًا في حال كان الملفّ غير موجود. في سياق هذا النمط، يتم استخدام الأمر tee عادةً لعرض ناتج أمرٍ معين بينما يتمّ أيضًا حفظه إلى ملفّ. كمثال: wc /etc/magic | tee magic_count.txt هذا الأمر يقوم باستخدام الأنابيب لنقل عدد المحارف، السطور والكلمات في ملفّ etc/magic/ (الذي يتم استخدامه بواسطة صدفة لينكس لتحديد نوع الملفّّات) إلى الأمر tee، والذي بدوره يقوم بفصل ناتج الأمر wc إلى اتّجاهين، ويقوم بإرساله إلى شاشة الطرفية وملفّ magic_counts.txt. بالحديث عن الأمر tee، فتخيّل الحرف T، نهاية هذا الحرف هي البيانات الكاملة، وقمّة هذا الحرف هو البيانات عندما يتم فصلها إلى اتّجاهين (الإخراج المعياري لملفٍّ ما وشاشة الطرفية). أمر | أمر | أمر >> ملف يقوم هذا النمط بتوجيه ناتج الأمر الأوّل وترشيحه عبر الأمرين الثانيين. ومن ثمَّ يقوم بطباعة الناتج إلى ملفّ. مثال: ls ~ | grep *tar | tr e E >> ls_log.txt الخاتمة تعلّم كيفية استخدام قدرات إعادة التوجيه في لينكس عند التعامل مع الأوامر قد يكون شاقًا قليلًا، ولكنك في طريقك بالفعل لاحتراف هذه المهارات بعد إكمالك لهذا الدليل. الآن وبعد أن شاهدت أساسيات كيفية عمل إعادة التوجيه والأنابيب، فستكون قادرًا على بدء رحلتك إلى عالم برمجة سكربتات الشلّ، والذي يستخدم بشكلٍ شائع غالب البرامج والأنماط المُغطّاة في هذا الدليل. إذا كنتَ تحبّ الغوص أكثر في الأوامر التي قدّمناها في هذا الدليل، فيُمكنك ذلك باستخدام الأمر man command | less. كمثال: man tee | less هذا الأمر سيُريك قائمةً كاملة بالأوامر المتوفّرة لبرنامج tee. يمكنك استخدام هذا النمط لعرض المعلومات وخيارات الاستخدام لأيّ أمرٍ أو برنامج في نظام لينكس. ترجمة -وبتصرّف- للمقال: An Introduction to Linux I/O Redirection لصاحبه David Collazo.
  7. لينكس هو نظام تشغيلٍ متعدد المستخدمين مبني على مفاهيم يونكس (Unix) لملكيّة الملفّّات والأذونات (permissions) بهدفِ توفير حمايةٍ أفضل. إذا كنتَ تخطط لتحسين مهاراتك بلينكس فيجب عليك أن تمتلك فهمًا جيدًا لكيفية عمل ملكية الملفّّات والأذونات في لينكس. هناك العديد من التعقيدات عند التعامل مع ملكية الملفّّات والأذونات، لكننا سنحاول جهدنا لاستخلاص المفاهيم الأساسية المهمّة لفهم كيفية عملها سنتطرّق إلى كيفية عرض وفهم ملكية الملفّّات والأذونات في لينكس. إذا كنتَ تبحث عن دليلٍ حول كيفية تعديل الأذونات، فاطّلع على هذا الدّرس: مبادئ أذونات الملفات (File permissions) على لينكس. المتطلبات تأكّد من أنّك تفهم المفاهيم التي تم تغطيتها بالدروس السابقة في هذه السلسلة: مقدّمة إلى طرفية لينكس. أساسيات التصفّح في لينكس وإدارة الملفّّات. حول المستخدمين كما ذكرنا في المقدّمة، لينكس هو نظام متعدد المستخدمين. يجب علينا أن نفهم أساسيات مستخدمي ومجموعات نظام لينكس قبل الحديث عن ملكية الملفّّات والأذونات، لأنهما الكيانان اللذان ينطبق عليهما ملكية الملفّّات والأذونات. فلنبدأ بالحديث عن أساسيات ماهيّة المستخدمين أولًا. في لينكس، هناك نوعان من المستخدمين: مستخدمو النظام (system users) والمستخدمون العاديون (regular users)، بشكلٍ عام، مستخدمو النظام يتم استخدامهم لتشغيل العمليات غير التفاعلية (non-interactive processes) والعمليات التي تعمل بالخلفية (background processes) على النظام، بينما يتم استخدام المستخدمين العاديين لتسجيل الدخول إلى النظام وتشغيل العمليات التفاعلية. عندما تقوم بالولوج لأول مرّة إلى أيّ نظام لينكس، قد تلاحظ أن النظام يبدأ مع عدّة مستخدمين للنظام حيث يقوم هؤلاء المستخدمون بتشغيل الخدمات التي يعتمد عليها نظام التشغيل، وهذا الأمر طبيعي تمامًا. من الطرق السهلة لعرض جميع المستخدمين المتوفّرين على النظام هي عرض محتويات ملفّّ etc/passwd/. كلّ سطر في هذا الملفّّ يحتوي معلوماتٍ حول مستخدمٍ واحد، بدءً باسم المستخدم الخاص به (الاسم قبل إشارة ":” الأولى). يمكنك طباعة محتويات ملفّّ passwd عن طريق الأمر التالي: cat /etc/passwd المستخدم الجذر بالإضافة إلى النوعين السابقين للمستخدمين، هناك "المستخدم الجذر" أو ما يعرف بـSuperuser أو root user، وهو يمتلك القدرة على الكتابة فوق أي تقييدات لأذونات ملكية الملفّّات أو تعديلها. بشكلٍ آخر، هذا يعني أن المستخدم الجذر يمتلك القدرة على الوصول إلى أيّ شيءٍ على خادومه الخاص. حيث يتم استخدام هذا المستخدم لتطبيق التغييرات المتعلقة بالنظام بأكمله، ويجب إبقاء هذا المستخدم آمنًا. من الممكن أيضًا أن يتم إعداد حسابات مستخدمين آخرين تمتلك صلاحيات "المستخدم الجذر". في الواقع، من أفضل التدربيات الممكن القيام بها هو إنشاء مستخدمٍ عادي يمتلك صلاحيات sudo لإدارة مهام النظام. حول المجموعات المجموعات هي تجميعات لـ0 مستخدمين أو أكثر. ينتمي المستخدم عادةً إلى المجموعة الافتراضية ويمكن أيضًا أن يكون عضوًا في أيٍّ من المجموعات الأخرى على الخادوم. من الطرق السهلة لعرض جميع المجموعات المتوفّرة على الخادوم والأعضاء بداخلها هي الاطّلاع على ملفّّ etc/group/. لن نغطّي أساسيات إدارة المجموعات في هذا المقال، ولكن يمكنك تطبيق هذا الأمر في حال كنتَ فضوليًا عن مجموعاتك: cat /etc/group الآن صرتَ تعرف ماهيةَ المستخدمين والمجموعات، فلنتحدّث عن ملكية الملفّّات والأذونات. عرض ملكية الملفات والأذونات في لينكس، كلّ الملفّّات تعتبر مملوكة من طرف مستخدمٍ واحد ومجموعةٍ واحدة، وكلّ ملفٍّّ يمتلك أذونات الوصول الخاصة به. فلنأخذ لمحة على كيفية عرض أذونات الملفّّات وملكيّتها. الطريقة الأكثر شيوعًا لعرض أذونات ملفٍّّ ما هي باستخدام الأمر ls مع خيار السرد الطويل (long listing option)، كمثال: ls -l myfile . إذا كنتَ تريد عرض أذونات جميع الملفّّات الموجودة في مسارك الحالي، فقم باستخدام الأمر بدون أيّ معامِلات مثل: ls -l تلميح: إذا كنتَ في مسار المنزل الخاص بك وكان فارغًا، ولم تقم بإنشاء أي ملفّّات لعرضها بعد، فيمكنك متابعة العملية عن طريق سرد محتويات المسار etc/ باستخدام هذا الأمر: ls -l /etc بالأسفل تجدُ مثالًا على لقطة شاشة لِمَا يُمكن للخرج أن يكون، مع تسميات كلِّ عمودٍ من الخرج: لاحظ أنّه يتم سرد وضع كلّ ملفّّ، المالك، المجموعة والاسم الخاصّين به. باستثناء عمود وضع الملفّّ (file's mode) فإنّه من السهل فهم جميع أجزاء الخرج. للمساعدة في شرح جميع هذه الحروف والرموز، فلنقم بتقسيم عمود الوضع (Mode column) إلى مكوناته الأساسية. فهم وضع الملفات للمساعدة في فهم ما تعنيه تلك الحروف والرموز، ألقِ نظرة على هذه الصورة التوضيحية التي تشرح ماهية "الوضع" أو الـ"mode” الخاص بأول ملفٍّّ من المثال أعلاه: نوع الملفات في لينكس، هناك نوعان أساسيان من الملفّّات: عادي وخاص. يتم تحديد نوع الملفّّ عن طريق أول حرفٍ من الوضع الخاص به. في هذا الدليل سنشير إلى هذا عن طريق استخدام مصطلح "حقل نوع الملفّّ". يُمكن أن يتم التعرف على الملفّّات العادية عن طريق شَرْطَة hyphen ( - ) في حقل نوع الملفّّ الخاص بها. الملفَّّات العادية هي مجرد ملفَّّات صرّفَة تحتوي على بيانات. يتم تسميتها بالملفّّات "العادية" لتمييزها عن الملفّّات الخاصة. الملفّاّت الخاصّة هي الملفّات التي تمتلك محرف غير شَرْطَي (non-hyphen character) مثل الحروف العادية في حقل نوع الملفّ الخاصة بها، ويتم معاملتها من جانب نظام التشغيل بطريقةٍ مختلفة عن الملفّاّت المحلّية. المحرف الذي يظهر في حقل نوع الملفّ يحدّد نوع الملفّ الخاص. مثل المجلّدات (folders)، وهي الملفّاّت الخاصة الأكثر شيوعًا من بين الملفّاّت الخاصّة. يتم التعرّف على المجلّدات عن طريق محرف d الذي يظهر في حقل نوع الملفّ الخاصّ بالمجلّد (مثل لقطة الشاشة السابقة). هناك أنواعٌ أخرى من الملفّاّت الخاصّة ولكنّها ليست أساسية لِمَا سنتعلّمه هنا. أصناف الأذونات نعلمُ من الرسم البياني السابق أنّ عمود الوضع يحدد نوع الملفّّ، متبوعًا بثلاثة أصناف (classes) من الأذونات: المستخدم (المالك)، المجموعة والآخرون. ترتيب هذه الأصناف ثابت على جميع توزيعات لينكس. فلنلقِ نظرة على الأصناف التي ينتمي إليها كلّ نوعٍ من المستخدمين: المستخدم (User): مالك الملفّ (owner) ينتمي إلى هذا الصنف. المجموعة (Group): أعضاء مجموعة الملفّ ينتمون إلى هذا الصنف. الآخرون (Other): أيُّ مستخدمين آخرين ليسوا جزءًا من صنفيّ المستخدم أو المجموعة فهم ينتمون إلى هذا الصنف. قراءة الأذونات الرمزية الشيء التالي الذي من الواجب الاهتمام به هو تشكيلة المحارف الثلاثة الخاصّة بوضع الملفّ، لأنها هي التي تقوم بتحديد الأذونات الخاصّة بالملفّ، بشكلٍ رمزي (symbolic) يمتلكها كل ملفّ. يتم تمثيل أذونات الكتابة، القراءة والتنفيذ في كلِّ تشكيلةٍ ثلاثية (triad) على النحو التالي: القراءة: يتم تمثيلها بحرف r بالموقع الأول. الكتابة: يتم تمثيلها بحرف w بالموقع الثاني. التنفيذ: يتم تمثيله بحرف x بالموقع الثالث. في بعض الحالات الخاصّة، يمكن أن يكون هناك حرفٌ آخر هنا. عندما يتم وضع شَرْطَة ( - ) في أي موقعٍ من هذه المواقع، فهذا يعني الإذن المعين ذاك ليس متوفرًا لهذا الصنف. كمثال: إذا كانت التشكيلة الثلاثية للمجموعة المالكة لملفٍّ معين هي: --r ، فهذا يعني أن الملفّ هو قابل للقراءة فقط لتلك المجموعة المتصلة بالملفّ. فهم قراءة، كتابة وتنفيذ الملفات الآن صرتَ قادرًا على قراءة الأذونات الخاصّة بكلّ ملفّّ، وعلى الأرجح فإنّك الآن تريد معرفة مالذي يسمح كلّ نوعٍ من أنواع الأذونات للمستخدمين أن يفعلوا. سوف سنشرح كلّ إذنٍ بشكلٍ منفصل، ولكن عليك أن تتذكر أنّه غالبًا ما يتمُ استخدام خليط من هذه الأذونات مع بعضها البعض للسماح بوصولٍ معين إلى هذه الملفّات والمسارات من قبل المستخدمين. إليك شرحًا بسيطًا إلى نوع الوصول الذي يمنحه كلٌّ نوعٍ من الأذونات للمستخدمين. 1- القراءة يسمحُ إذن القراءة لملفٍّ عادي أن يتم عرضه من قبل المستخدم لمشاهدة محتويات الملفّ. لمجلد أو مسار، يسمح إذن القراءة لمستخدمٍ أن يقوم بعرض أسماء الملفّات الموجودة بتلك المجلدات أو المسارات. 2- الكتابة يسمحُ إذن الكتابة لملفٍّ عادي أن يتم تعديله أو حذفه من قبل المستخدم. لمجلدٍ أو مسار، يسمح إذن الكتابة بأن يتم حذف المجلد أو المسار وتعديل محتوياته (إنشاء، حذف وإعادة تسمية الملفّات الموجودة بداخله) وتعديل محتويات الملفّات التي يمكن قراءتها من قبل المستخدم. 3- التنفيذ يسمح إذن الكتابة بأن يتم تنفيذ ملفٍّ من قبل المستخدم (يجب على المستخدم أن يمتلك إذن القراءة أيضًا). أذونات التنفيذ يجب أن يتم إعطاؤها للبرامج التنفيذية وسكربتات الشلّ (shell scripts) قبل أن يتمكّن المستخدم من تشغيلها. لمجلدٍ أو لمسار، يسمح إذن التنفيذ بالوصول إلى البيانات الوصفية (metadata) الخاصة بالملفّات الموجودة بداخله (مثل الأمر cd أو ls -l). أمثلة على أوضاع الملفّات والأذونات الآن وبعدما صرتَ قادرًا على قراءة وضع الملفّات وفهم معنى إذنِ كلِ واحدٍ منها، فسوف نتطرّق إلى بضعة أمثلة لأوضاعٍ شائعة للملفّات مع شرحٍ بسيط حولها: -rw-------: تمثّل ملفًّا قابلًا للوصول فقط من قبل مالكه. -rwxr-xr-x: تمثّل ملفًّا قابلًا للتنفيذ من قبل جميع المستخدمين على النظام. -rw-rw-rw-: تمثّل ملفًّا قابلًا للتعديل من قبل جميع المستخدمين على النظام. drwxr-xr-x: تمثّل مسارًا يمكن لجميع المستخدمين على النظام الوصول إليه وقراءته. drwxrwx---: تمثّل مسارًا قابلًا للتعديل (بالإضافة إلى محتوياته) من قبل مالكه والمجموعة التي ينتمي إليها. drwxr-x---: تمثّل مسارًا يمكن الوصول إليه من قبل مجموعته. كما تلاحظ، عادةً، مالك الملفّ يتمتّع بغالب الأذونات الخاصة بالملفّ مقارنةً مع الصنفين الآخرين. عادةً، سترى أنّ صنفيّ "المجموعة" و "الآخرون" يمتلكان أذونات فرعية فقط من أذونات مالك الملفّ (مساوية لها أو أقل). هذا أمرٌ منطقي لأن الملفّات يجب أن تكون قابلة للوصول فقط من طرف المستخدمين الذين يحتاجون الوصول إليه لسببٍ معيّن. شيءٌ آخر لملاحظته هو أنّه وعلى الرغم من أنّه هناك العديد من تشكيلات الأذونات الممكنة، فإنّ عددًا محدودًا منها فقط قد يكون استخدامها منطقيًا في حالاتٍ معيّنة. كمثال فإنّ أُذنيّ الكتابة والتنفيذ غالبًا ما يتم إلحاقهما بإذن القراءة، لأنّه سيكون من الصعب تعديل، ومن المستحيل تنفيذ ملفٍّ لا تستطيع قراءته. تعديل ملكية الملفات والأذونات للإبقاء على هذا الدليل بأبسط ما يمكن، لن نتطرف إلى كيفية تعديل ملكيّة الملفّات والأذونات هنا. الخاتمة يجب أن تكون الآن قد امتلكت معرفة جيّدة حول كيفية عمل ملكيّة الملفّات والأذونات في نظام لينكس. إذا كنتَ تحبّ تعلم المزيد عن أساسيات لينكس، فمن المستحسن بشدّة أن تقوم بقراءة الدّرس القادم من هذه السّلسلة والذي سيكون حول إعادة توجيه الإدخال/الإخراج في لينكس. ترجمة -وبتصرّف- للمقال: An Introduction to Linux Permissions.
  8. استخدام الجدار الناري (firewall) يعتمد كثيرًا على السياسة (policy) التي ستتبعها في تصفية تدفّقات البيانات (data traffics) بنفس درجة اعتماده على تعلّمك للأوامر الأساسية وطريقة الاستخدام. بعض الجدران النارية مثل ـiptables تمتلك القدرة على فرض سياسات معيّنة يتم تحديدها من قبل مدير النظام، ولكن كواحدٍ من هؤلاء، يجب أن تعرف أفضل السياسات المناسبة لتطبيقها على البيئة الخاصّة بك. بينما تركّز دروسٌ أخرى على الأوامر اللازمة للحصول على جدار ناري فعّال، في هذا الدرس، سنناقش بعض الأمور التي يجب عليك فعلها عندما تقوم بتشغيل جدار ناري. ستؤثّر هذه الخيارات على الطريقة التي يتصرّف بها جدارك الناري، وعلى المدى الذي يجب إحكام إقفال خادومك إليه، بالإضافة إلى طريقة استجابته لمختلف الشروط التي قد تطرأ من حينٍ إلى آخر. سنستخدم iptables في درس اليوم، إلّا أنّ معظم ما سنتكلّم عنه سينطبق على أيّ أداة بغضّ النظر عن نوعها. اختيار السياسة الافتراضية عند بناء جدارٍ ناريّ فإن السياسة الافتراضية هي واحدة من الأشياء الأساسية التي يجب عليك التفكير فيها. تحدد السياسة الافتراضية ما يجب أن يحصل لتدفّقات البيانات في حال عدم مطابقتها لأيّ قاعدة (rule). يمكن افتراضيًا للجدار الناري أن يقبل أيّ تدفّق لا يطابق القواعد المعيّنة أو أن يرفضه. القبول افتراضيا مقابل الرفض افتراضيا سياسة "Accept" (قبول) الإفتراضية تعني أنّه سيتم السماح لأيّ تدفّق غير مطابق للقواعد المعيّنة مسبقًا بالمرور إلى الخادوم. لا ينصح باستخدام هذه السياسة افتراضيًا لأنّ هذا يعني أنّك ستقوم بعمل قائمة سوداء لمنع ما تريد منعه من الوصول إلى خادومك. القوائم السوداء صعبة الإدارة لأنّه يجب عليك متابعة وحظر جميع أنواع التدفّقات التي لا تريدها في خادومك. يمكن أن يؤدي هذا إلى الكثير من وجع الرأس بالإضافة إلى مشاكل تقنية في حال حصول غلطة بسيطة في القائمة السوداء مثلًا، لذلك هو أمرٌ غير مستحسن. الحلّ البديل هو "drop" (ترك) التدفّق افتراضيًا. هذا يعني أنّه لن يتم السماح لأيّ تدفّق لا يطابق القواعد المعيّنة مسبقًا بالوصول إلى الخادوم (أو الخروج منه)، وهو أمرٌ مشابه للقوائم البيضاء وقوائم تحكّم الوصول (Access Control List) حيث يجب السماح بشكلٍ استثنائي وخاصّ بأن يتم تشغيل وتنفيذ كلّ خدمة متوفّرة على حدى، والذي قد يحتاج الكثير من الوقت والجهد في البداية، ولكنّ هذا يعني أنّ السياسة الافتراضية الخاصّة بك ستكون أكثر أمانًا وستعرف بالضبط نوع تدفّق البيانات الداخل إلى خادومك. عليك الاختيار بين التوجّه نحو الخيار الأكثر أمانًا أو السماح للخدمات بالتحرّك بشكلٍ أكثر حرّية خارج الصندوق. صحيحٌ أنّ خيار استخدام سياسة "Accept" (قبول) افتراضيًا مع الجدار الناري قد يكون أفضل ما تفكّر به للوهلة الأولى، ولكن - في غالب الأحيان - من الأفضل في الواقع أن تستخدم سياسة "منع" افتراضيًا للجدار الناري. سياسة "drop" افتراضيا مقابل قاعدة "drop" نهائية الخيار السابق باستخدام سياسة "drop" (ترك) افتراضيًا يقود إلى قرارٍ مهم آخر. في iptables والجدران النارية المشابهة الأخرى، يمكن أن يتم تعيين السياسة الافتراضية باستخدام خصائص داخلية للجدار الناري، أو تضمينها عبر إضافة قاعدة "drop" (ترك) شاملة في نهاية قائمة قواعد الجدار الناري. الفرق بين هذين الطريقتين هو فيما سيحصل في حال تمّ مسح (flush) قواعد الجدار الناري. إذا كانت السياسة الافتراضية الداخلية في الجدار الناري الخاصّ بك معيّنة على "drop" (ترك) التدفّق وحصل يومًا ما وأن تمّ مسح قواعد الجدار الناري أو حذف بعضٍ منها عن طريق الخطأ مثلًا، فإنّ جميع الخدمات التي تشغّلها على الخادوم ستصبح غير قابلة للوصول. هذه غالبًا فكرة جيّدة عند ضبط الخدمات غير الحساسة على خادومك لكي لا يتم السماح للبرامج والأدوات الخبيثة بالمرور إذا اختفت القواعد فجأة. لكنّ الجانب المظلم في هذا التوجّه هو أنّ خدماتك ستصبح فورًا غير متوفّرة لمستخدميك إلى حين أن تقوم بإعادة تعيين قواعد الوصول مجددًا. يمكن أحيانًا أن تقوم بقفل الباب على نفسك وأنت في خارج الخادوم، الأمر سيّئ خاصّة إذا لم تكن تقدر على الوصول "فيزيائيا" إلى الخادوم أو وسيلةً أخرى للاتصال به (خواديم DigitalOcean قابلة للوصول دومًا بغضّ النظر عن إعدادات الشبكة عبر استخدام زرّ "Console Access" الموجود في قسم "Access" من لوحة التحكّم الخاصّة بالخادوم). إذا كنت أنت من يريد إعادة تعيين القواعد ومسحها بشكلٍ مقصود، فيمكنك ببساطة تجنّب هذه المشكلة عبر تغيير السياسة الافتراضية إلى "Accept" (قبول) مباشرةً قبل إعادة تعيين ومسح القواعد. الخيار البديل لما سبق هو تعيين السياسة الافتراضية الخاصّة بك إلى "Accept" (قبول) مع تضمين قاعدة "drop" (ترك) في النهاية مع القواعد الأخرى. يمكنك إضافة قاعدة عادية في نهاية قائمة القواعد الخاصّة بك تقوم بمطابقة ومنع كلّ التدفّق الباقي الغير مُطابق. في هذه الحالة، إذا تمّ إعادة تعيين قواعد الجدار الناري الخاصّة بك، فإنّ خدماتك ستكون قابلة الوصول ولكن غير محمية. اعتمادًا على خياراتك للوصول المحلّي أو البديل، يمكن أن يكون هذا شرًّا ضروريًا لكي تضمن أنّك قادر على الوصول إلى خادومك مجددًا في حال مُسحت قواعد الجدار الناري. إذا قررت استخدام هذا الخيار، فيجب أن تضمن أنّ قاعدة "drop" (ترك) التدفّق الغير مطابق هي دومًا آخر قاعدة في قائمة قواعد الجدار الناري. ترك التدفق مقابل رفضه هناك بضع طرق مختلفة لمنع حزمة بيانات (packet) من المرور إلى الوجهة التي تريدها. الاختيار المختلف لواحدٍ من هذه الطرق سيؤثر على الطريقة التي يقوم المستخدمون من خلالها بمحاولة الاتصال بالخادوم وسرعة إدراكهم أنّه لن يتم خدمة طلبهم الذي أرسلوه مسبقًا. الطريقة الأولى التي يمكن من خلالها منع حِزَم البيانات هي عبر "drop" (ترك) التدفّق. يمكن أن يتم استخدام الـ "ترك (drop)" كسياسة افتراضية أو ضمن قواعد الجدار الناري. عندما يتم ترك حزمة بيانات، يقوم iptables ببساطة برميها بعيدًا، حيث لا يقوم بإرسال أيّ رد إلى العميل الذي يحاول الاتصال ولا يقوم حتّى بإرجاع ردّ أنّه قد استلم الطلب بنجاح أم لا. هذا يعني أنّ العملاء لن يعرفوا ما إذا كان الخادوم قد وصله طلبهم أساسًا أم لا. لمحاولات الاتصال عبر بروتوكول TCP، سيتم الحفاظ على الاتصال إلى حين انقضاء مهلته (timeout). بما أنّ بروتوكول UDP هو بروتوكول غير اعتمادي على الاتصال (connectionless)، فإنّ عدم توفّر الردّ للعملاء يصبح أكثر إيهامًا. في الواقع، غالبًا ما يكون عدم تلقّي ردّ في هذه الحالة دليلًا على أنّ حزمة البيانات قد قُبلت. إذا كان عميل UDP يهتم بالجهة التي يرسل الحِزَم إليها، فسيقوم بإرسالها مجددًا لكي يتحقق مما إذا تمّ قبولها أو فقدانها أو رفضها. قد يزيد هذا من الوقت الذي يجب على البرمجيات والشفرات الخبيثة استغراقه للحصول على معلوماتٍ صحيحة عن حالة المنافذ في خادومك، لكنّه قد يسبب أيضًا مشكلة للتدفّق العادي. الخيار البديل هنا هو ببساطة رفض حزم البيانات التي لا تريدها بشكلٍ استثنائي. ICMP أو بروتوكول رسائل التحكّم بالإنترنت (Internet Control Message Protocol) هو عبارة عن بروتوكول وصفي (meta-protocol) يستعمل عبر الإنترنت لإرسال الحالة ومعلومات مواجهة الأعطال ورسائل الخطأ بين المضيفين (hosts) ضمن قناة لا تعتمد على اتصالات البروتوكولات التقليدية مثل TCP وUDP. عندما تقوم بـ "رفض" شيءٍ ما، فإنّ التدفّق سيتم منعه وسيتم إعادة حزمة ICMP إلى المُرسِل لإعلامه أنّ البيانات التي أرسلها قد تمّ استلامها إلّا أنّه قد تمّ رفضها. يمكن لرسالة الحالة أن تشير إلى السبب أيضًا. توجد العديد من العواقب لهذا، بافتراض أنّ تدفّق ICMP قادر على الرجوع إلى العميل، فإنّه سيتم إخطاره مباشرةً أنّ التدفّق الخاص به محظور. للعملاء العاديين، سيعني هذا أنّه يجب عليهم الاتصال بمدير الخادوم للاستفسار عن السبب أو التحقق من خيارات اتصالاتهم للتأكّد من أنّهم يتصلون عبر المنفذ الصحيح. أمّا بالنسبة للمستخدمين السيئين والذين يحاولون اختراق الخادوم، فإنّ هذا يعني أنّه يمكنهم إكمال عمليات بحثهم عن المنافذ المفتوحة والمغلقة والمُرشّحة في وقتٍ أقصر. هناك الكثير من الأمور التي يجب أخذها بعين الاعتبار عندما تقرر قبول أو رفض تدفّق البيانات. من بينها معرفة أنّ غالب تدفّق البيانات الخبيث الذي يتم إرساله بواسطة المخترقين يتم إرساله في الواقع عبر سكربتات وبرامج مؤتمتة، وبما أنّها ليست حساسة للوقت، فإنّ ترك التدفّق العادي لن يكون مفضلًا حيث أنّه سيؤثر على المستخدمين العاديين للخادوم. يمكنك قراءة المزيد عن هذا من هنا. جدول المقارنة بين ترك الطلب ورفضه يظهر الجدول أدناه كيفية حماية خادوم بواسطة جدارٍ ناريّ، حيث سيقوم بالاستجابة إلى طلباتٍ مختلفة بناءًا على السياسة التي يتم تطبيقها على منافذ معيّنة. يحدد العمود الأول نوع حزمة البيانات التي يتم إرسالها بواسطة العميل، بينما في الثاني، نقوم بذكر أمر nmap الذي سنستخدمه لاختبار كلّ سيناريو. يحدد العمود الثالث سياسة المنفذ المتبّعة على المنفذ، بينما الرابع يحدد الرد الذي سيتم إرجاعه إلى من طرف الخادوم. والخامس، هو ما يمكن للعميل أن يفهمه بناءًا على الرد الذي تلقاه. ترجمة -وبتصرّف- لـلمقال: How To Choose an Effective Firewall Policy to Secure your Servers لصاحبه Justin Ellingwood.
  9. من المهم لمطورّي ووردبريس أن يكونوا على اطّلاعٍ على تقنيات الحماية والأمان عند تطوير مواقع تعمل بسكربت ووردبريس أو تصميم قوالب جاهزة له، سنبدأ سلسلة من 4 دروس حول هذا الموضوع وسيكون درسنا اليوم عن "التثبيت". هناك عدّة أمور مهمّة لتأخذها بعين الاعتبار لضمان أمانٍ أعلى لموقعك ومن بينها: اختيار الاستضافة المناسبةيبدأ موقع ووردبريس المؤمّن بشكلٍ مثالي من اختيار استضافة مناسبة لموقعك، فمن دون استضافة آمنة وجيّدة السمعة عالميًا، فإنّ جهودك في مجال تأمين موقعك العامِل بووردبريس قد تذهب أدراج الرياح. على الجانب التقني، بِما أنّ ووردبريس يستخدم PHP وMySQL، فإنّ أيّ استضافة تعمل بنظام لينكس ستكون مناسبة، ولكن من المنصوح أن تبتعد عن استضافة GoDaddy و Yahoo! ومثيلاتها حيث أنّ هذه الاستضافات مصممة لتكون بسيطة للغاية مما يجعلها مُقيّدة في بعض الأحيان، وهو ما يعني أنّه غير مجهّزة لأيّ شيء أكثر من موقع ووردبريس عادي بسيط. إذا كنتَ تريد القيام بتعديل بعض الإعدادات على الخادوم لتحسين إعدادات الأمان، فإنّ القيام بهذا قد يكون صعبًا على تلك الاستضافات المقيّدة. ينصح معظم خبراء الحماية باستخدام استضافاتٍ توفّر خواديمًا افتراضية خاصّة (VPS). وهو ما يستخدمه Tony Perez المدير التنفيذي لـSucuri: يستخدم Tony العديد من الأدوات على خادومه للحماية والأمان، هذه الأدوات تريه من يقوم بتسجيل الدخول إلى خادومه، من يقوم بالتعديل على المواضيع.. وهكذا، كما أنّ هذه الأدوات تقوم بعرض WHOIS، الـDNS ونشاط البرمجيات الخبيثة إن كانت موجودة، كلّ واحدٍ من هذه الأدوات مصمم ليراقب جزءًا معيّنا من جزئيات الحماية على الخادوم، بالإضافة إلى أمورٍ قد لا تخطر على بال المستخدمين العاديين. ينصح Tony باستخدام إضافة Sucuri Scanner لفحص مواقع الووردبريس للتأكّد من حمايتها، كما ينوّه إلى أنّه هناك العديد من الإضافات الأخرى التي يمكنك البحث عنها من على مخزن إضافات ووردبريس. مشكلة سكربتات التثبيت بنقرة واحدةتوفّر العديد من شركات الاستضافة الآن القيام بعملية تثبيت ووردبريس "بنقرة واحدة"، وهو ما يسمح للمستخدمين العاديين أن يمتلكوا موقع ووردبريس بسرعة أكثر من السابق، ولكن بالطبّع، السرعة لها تكلفة. يمكنك في الواقع تغيير هذه البيانات بسهولة إن أردت -وهو ما سنتحدّث عنه لاحقًا- ولكن المشكلة هنا هي في الافتراضات التي يظنّها الناس عن عمليات التثبيت بنقرة واحدة بسبب شركات الاستضافة، فهم يظنون أنّها آمنة ومحميّة، لسوء الحظّ، فهي ليست كذلك، مما يجعل طريق التثبيت اليدوي أفضل بكثيرٍ للحماية. كيفية تثبيت ووردبريسإذا كنتَ لا تستخدم عملية التثبيت بنقرة واحدة، فإنّ القيام بتثبيت ووردبريس بالطريقة اليدوية على خادومك يجب أن يستغرق حوالي 10 دقائق. ستحتاج إلى فهم أساسيات عمل بروتوكول نقل الملفّات FTP وقواعد البيانات. هناك عدّة دروس على الويب حول هذا الموضوع من البداية إلى النهاية، ولكننا لن نذكر تفاصيلها الآن في هذا المقال. بمجرّد أن تقوم برفع كلّ ملفّاتك إلى موقعك وبمجرّد أن تقوم بإعداد قاعدة البيانات، سيتم توجيهك إلى إعداد اسم المستخدم وكلمة المرور الخاصّيَن بووردبريس، من المستحسن أن تقوم باختيار اسم مستخدمٍ معقّد ومن الصعب أن يتم تخمينه من قبل المخترقين لحمايةٍ أعلى. نفس الشيء بالنسبة لكلمة المرور الخاصّة بك، اجعلها معقّدة قدر الإمكان وأضف إليها الأرقام والرموز والأحرف الكبيرة، لا تتركها بسيطة فتصبح عُرضةً لهجمات التخمين بسهولة، كلّما كانت كلمة المرور أكثر تعقيدًا وطولًا، كلّما صعب تخمينها وكسرها. تغيير اسم المستخدم "Admin"تحدّثنا بالفعل عن أهميّة تجنّب اسم المستخدم "admin" ولماذا يجب عليك أن تختارَ اسمًا معقدًا، ولكن لنفرض أنّك قمتَ بالفعل بتثبيت موقع ووردبريس جديد منذ فترة واستخدمت اسم المستخدم "admin" فيه، فستحتاج تغييره يدويًا من phpMyAdmin. افتراضيًا، لا يسمح لك ووردبريس بتغيير اسم المستخدم، ولكن يمكنك إنشاء مستخدمٍ جديد إن أردت وإعطاؤه صلاحياتٍ إدارية كاملة وحذف المستخدم "admin" وإسناد الصفحات والمقالات التي أنشئتها بالمستخدم القديم إلى المستخدم الجديد، ولكن إذا كنتَ تمتلك الكثير من الصفحات والمقالات فربّما تريد القيام بالأمر يدويًا. للقيام بذلك، قم بالدخول إلى لوحة cPanel الخاصّة بك (على افتراض أنّك تمتلك واحدة!) ثمّ ابحث عن phpMyAdmin وقم بفتحها، بعد هذا، ابحث عن قاعدة البيانات الخاصّة بموقعك وابحث عن جدول wp_users ضمنها. ابحث عن المستخدم "admin" واصغط على زر "Edit" أو تحرير بجانبه لتعديل اسم المستخدم، قم بتبديل الاسم واحفظه. بعد هذا، سيتم تلقائيًا تغيير اسم المستخدم في جميع أنحاء موقعك إلى الاسم الجديد ولن تحتاج إلى حذف شيء. الخاتمةفي معظم الأحيان، يعتقد الناس أنّ أمان ووردبريس هو مسألة يمكن حلّها عبر إضافة ووردبريس، صحيحٌ أنّ هذا جزءٌ مهم من المعادلة ولكنّه ليس كلّ شيء، حيث أنّك تحتاج تأمين كلّ شيء منذ البداية. في الدرس القادم سنتطرق إلى كيفية تأمين ووردبريس بعد تثبيته عبر تأمين تسجيل الدخول إلى المنصة. ترجمة -وبتصرف- للمقال The WordPress Developer’s Guide to Security: Installation لصاحبته Brenda Barron.
  10. تحدثنا في السابق عن بضع خطوات يمكنك تطبيقها لزيادة أمان وحماية موقعك العامل بسكربت ووردبريس الشهير. صحيحٌ أنّ نواة ووردبريس آمنة للغاية، ولكن يجب عليك تثبيت عدّة إضافات وملحقات إضافية لزيادة مستوى أمان موقعك. سنتحدّث في هذا الدرس عن أهم إضافات الأمان والنسخ الاحتياطي التي يمكنك تثبيتها وتفعيلها على سكربت ووردبريس الشهير. لماذا قد أحتاج إضافة للحماية؟بشكلٍ عام، تقوم إضافات الحماية والأمان بتوفير طبقة إضافية من الحماية ضدّ هجمات Bruteforce والهجمات الأخرى والبرمجيات الخبيثة التي قد تصيب موقعك، يمكنها أيضًا أن توفّر لك عدّة أدوات يمكنك استخدامها لتقليل المخاطر الأمنية المحيطة بك، كما توفّر بعض الأدوات للمراجعات اليدوية الدورية أيضًا. هناك إضافات أخرى للنسخ الاحتياطي تمكّنك من استرجاع موقعك بسرعة في حال ما إذا تمّ اختراقه. لهذا، سنتطرّق الآن إلى أهم الإضافات للحماية والأمان والنسخ الاحتياطي التي يمكنك استخدامها. iThemes Security تعتبر هذه الإضافة شهيرةً جدًا عندما يتعلّق الأمر بمجال أمان ووردبريس. كانت هذه الإضافة تدعى بالسابق "WP Security" ولكن تمّ تغيير اسمها. توفّر لك هذه الإضافة عدّة طرق لحماية موقعك. في الواقع، تقوم إضافة iThemes Security بالعديد من الأمور التي ذكرناها بالدروس السابقة تلقائيًا، مثل تغيير اسم المستخدم الرئيسي ورابط صفحة تسجيل الدخول، إزالة وسم generator والمزيد. كما تعرض عدّة أدوات للحماية مثل فحوصاتٍ دورية لملفّات موقعك للبحث عن الثغرات الأمنية والملفّات الخبيثة إن وجدت، مما يحسّن من أمان موقعك، كما أنّها تقوم بحظر المستخدمين الذين يفشلون بتسجيل الدخول لأكثر من مرّة عن طريق الـIP، وتحظر ربوتات الاختراق الشهيرة، وتفرض على المستخدمين اختيار كلمات مرورٍ قويّة.. والمزيد. توفّر إضافة iThemes Security ميزات التنبيه، حيث يمكنها أن تقوم بتنبيهك عندما يتم إجراء تغييراتٍ ما دون صلاحيات. يمكنها أن تلتقط الروبوتات التي تحاول اختراقك ويمكنها أن ترسل رسالة بريدٍ إلكتروني في حال التقطت أيًّا منها. توفّر الإضافة ميّزة النسخ الاحتياطي كذلك، حيث أنّها قادرة على أخذ نسخة احتياطية من جميع ملفّات موقعك وتدويناتك التي نشرتها، ويمكنها استعادتها في أيّ وقتٍ تريده. هناك إصدارٌ مدفوع من الإضافة كذلك ويوفّر ميّزاتٍ أكثر. All in One WP Security & Firewall خيارٌ آخر متوفّر أمامك هو إضافة All in One WP Security & Firewall، تتميز هذه الإضافة بسهولة تثبيتها وإعدادها مما يجعلها خيارًا جيَدًا للمدونين الجدد. تتضمن أيضًا نظام تقييم للحماية يحدد لك مدى أمان موقعك بوضعه الحالي. يمكنك من هناك تفعيل أو تعطيل مميزاتٍ معيّنة للأمان والحماية في موقعك حسبما تريده. تسمح لك هذه الإضافة المجانية كذلك بإعداد العديد من إجراءات الحماية بمجرّد بضع ضغطات، مثل تغيير اسم المستخدم "admin"، التعرّف على المستخدمين الذين يمتلكون أكثر من حساب وتفعيل أداة تقوية كلمات المرور. كما تحتوي الإضافة على ميزة تمنع هجمات Bruteforce على موقعك عبر حظر محاولات تسجيل الدخول الفاشلة لأكثر من مرّة. يمكنك أيضًا فرض تسجيل الخروج على حسابٍ معيّن، تتبع سجل النشاط الخاصّ به والمزيد. تتضمن الإضافة أيضًا مزايا حماية قواعد البيانات والملفّات، بالإضافة إلى إمكانية إنشاء ملفّ htaccess. عبرها وعمل النسخ الاحتياطية لملفّ wp-config.php. هناك ميزة أخرى مهمّة بهذه الإضافة وهي ميّزة الجدار الناري، حيث تسمح لك بتعديل ملفّ htaccess. لتمنع المخترقين حتّى من الوصول إلى الشفرة الخاصّة بموقعك. كما أنّها تحتوي على فاحص ملفّات، الحماية من نسخ النصوص، حماية ضد هجمات السخام (Spam)، تحديثات تلقائية والمزيد. Sucuri Security Sucuri Security هي إضافة أخرى شائعة لحماية ووردبريس. تسمح لك ميزة SiteCheck المُضمّنة بالتحقق من حالة موقعك الحالية وفحصه لإيجاد الثغرات الموجودة به بالإضافة للبحث عن البرمجيات الخبيثة إن وجدت. تمكّنك الميزة كذلك من البحث عن جميع أنواع الثغرات، مثل ثغرات حقن قواعد البيانات، محاولات التصيّد الاحتيالي، إعادة التوجيه المشبوهة.. إلخ، كما يمكنها أن تلتقط أكواد جافاسكربت وPHP الخبيثة إن وجدت. تستخدم الإضافة أكثر من واجهة تطبيق برمجية واحدة (API) لفحص موقعك، أيّ أنّها تستخدم أكثر من قاعدة بيانات للشفرات الضارّة والخبيثة الموجودة على الإنترنت للتأكد من أنّ موقعك لا يحتوي على أحدها، مما يوفّر فحصًا شاملًا لموقعك، تتضمن هذه المصادر الخارجية أسماءً عريقة مثل Norton, McAfee.. إلخ. هناك بعض المزايا الموجودة بالإضافة والتي توفّر الحماية لمسار رفع ملفّات الوسائط الخاصّ بموقعك، حيث تقيّد الوصول إلى مجلّديّ wp-content وwp-includes، تتحقق من إصدارات PHP ووردبريس وتعطّل محرر الإضافات والقوالب من لوحة التحكم. Wordfence Security تحدّثنا من قبل عن إضافة Wordfence Security، وقلنا أنّها من أهم إضافات الحماية لسكربت ووردبريس. بمجرّد تثبيتها على موقعك فإنّها ستقوم بعملية فحصٍ شامل للشفرة المصدرية للتأكّد من أنّها مطابقة للشفرة المصدرية الخامّة المنشورة من موقع ووردبريس الرئيسي، إذا اكتمل الفحص بنجاح، فإنّ الإضافة تقوم بعدها تلقائيا بتفعيل خيارات الحماية لزيادة أمان موقعك. هناك إصدار مدفوع ومجاني من الإضافة، كلاهما يعتمدان على منصّة "Wordfence Cloud"، مما يعني أنّ عملية الفحص وتفعيل الجدار الناري بالواقع تجريان على خواديم الشركة المطوّرة للاستضافة وليس على خادومك مما يقلل من الحمل الموجود عليه. توفّر هذه الإضافة دعمًا لأكثر من موقع ووردبريس في آنٍ واحد، تسجيل الدخول عبر الهاتف المحمول، دعم للإضافات الشهيرة مثل WooCommerce، الاستيثاق الثنائي، فرض كلمات المرور القوية، فحص الملفّات والمزيد. تتضمن الإضافة أيضًا جدارًا ناريًا لحماية موقعك من الروبوتات، البرمجيات الخبيثة وهجمات Bruteforce. بمجرّد تثبيتها فإنك ستكون قادرًا على حظر المهاجمين واتصالات الشبكات المشبوهة، وكلّه في الوقت الحقيقي (Real time). BruteProtect تمّ شراؤها مؤخرًا من قبل شركة Automattic (الشركة المطوّرة لووردبريس)، إضافة BruteProtect هي أحد الحلول الأمنية التي يمكنك استخدامها لصدّ هجمات Bruteforce بالتحديد. توفّر الإضافة أدواتٍ لمراقبة الهجمات الحالية على موقعك في حال حصولها بالوقت الحقيقي بالإضافة إلى التحديث التلقائي لنواة ووردبريس في موقعك. الإضافة ليست مجهّزة لحمايتك ضد الهجمات الأخرى، بل فقط ضدّ هجمات Bruteforce فلا تعتمد عليها لوحدها. Acunetix WP Security Acunetix WP Security هي إضافةٌ أخرى مجانية لفحص موقعك بسهولةٍ ويسر. تمكّنك من إعداد صلاحيات الملفّات، تأمين قاعدة البيانات، إخفاء إصدار ووردبريس الحالي الذي تستخدمه عن أعين المخترقين، تغيير اسم المستخدم admin والمزيد. تتوافق الإضافة مع مواقع ووردبريس المتعددة (multisite) وعمليات النسخ الاحتياطي، كما تتضمّن أداةً تعمل بالوقت الحقيقي لعرض من يتصفّح موقعك حاليًا وماذا يتصفّحون. Bulletproof Security آخر إضافة ووردبريس سنتحدث عنها هي إضافة Bulletproof Security. توفّر هذه الإضافة العديد من المزايا التي توفّرها الإضافات الأخرى مثل ملفّات htaccess. ، حفظ نسخة احتياطية من قاعدة البيانات، سمات مختلفة لواجهة الإضافة والمزيد. يتضمّن الإصدار المدفوع منها المزيد من المميزات مثل التثبيت بنقرة واحدة، الاستعادة التلقائية، جدار ناري يتعامل مع عناوين الـIP للمستخدمين، مسجّل للأخطاء، حامٍ من هجمات Bruteforce، حظر عناوين IP معيّنة والمزيد. أهمّية إضافات النسخ الاحتياطيبجانب إضافة قويّة للحماية والأمان، فإنّه يجب عليك استخدام إضافةٍ أخرى لعمليات النسخ الاحتياطي، معظم هذه الإضافات السابق ذكرها يتضمّن الميّزتين بالواقع مما يسهّل عليك الأمر، ولكن لا تنسى بتاتًا استخدام النسخ الاحتياطي. القيام دوريًا بعمل نُسخ احتياطية من موقعك هو أمرٌ مهم لخطّة أمان كاملة، وإلّا فكيف تتوقع أن تقوم باسترجاع موقعك في حال تمّ اختراقه مثلًا؟ هناك العديد من الإضافات الجيّدة للنسخ الاحتياطي مثل VaultPress ،WordPress Backup to Dropbox و BackupBuddy. تتنوّع هذه الإضافات ما بين المدفوعة والمجانية، ولكنّها مفيدة لضمان عدم فقدان أيّ شيء مهم يتعلّق بموقعك. الخاتمةصحيحٌ أنّه يمكنك القيام بالعديد من الأمور يدويًا لتحسين حماية ووردبريس، ولكن استخدام الإضافات قد يوفّر عليك الكثير من الوقت ويوفّر لك الكثير من المميزات، خاصةً لو كنتَ تمتلك أكثر من موقع ووردبريس واحد. الإضافات السابق ذكرها يجب أن تؤدّي المهمّة المطلوبة بالنسبة لك ويمكنك تجريبها جميعًا لتصل إلى أفضلٍ واحدةٍ منها بالنسبة لك. في الدرس الأخير من هذه السلسلة سنتحدث عن أهمية تحديث ووردبريس وإضافاته لزيادة أمان موقعك. ترجمة -وبتصرف- للمقال The WordPress Developer’s Guide to Security: Security & Backup Plugins لصاحبته Brenda Barron.
  11. نعود إليكم في الجزء الثاني من درس "كيف تختار سياسة فعّالة للجدار الناري لتأمين خواديمك" لنتحدث عن المزيد من الأمور والنصائح التي يجب أخذها بعين الاعتبار عند إعداد الجدار الناري الخاصّ بخادومك لأوّل مرّة. سياسات ICMP هناك آراءٌ مختلفة حول ما إذا كان يجب قبول حِزَم بيانات ICMP القادمة إلى خادومك أم لا. ICMP هو بروتوكول يستعمل لعدة أشياء، وغالبًا ما يتم إرساله مجددًا، كما رأينا سابقًا، لإعطاء معلومات عن حالة الطلبات التي تستخدم بروتوكولات أخرى. ربّما أبرز مهامه هو إرسال واستقبال نبضات الشبكة (network pings) لفحص قابلية الاتصال بالأجهزة المضيفة البعيدة. هناك عدة استخدامات غير شائغة أخرى لبروتوكول ICMP ولكنها ما تزال مفيدة. يتم تمييز حزم ICMP عبر "النوع (type)" وبعدها عبر "الشفرة (code)"، حيث يقوم النوع بتحديد معنى الرسالة العام، كمثال، Type 3 يعني أنّ الوجهة غير قابلة للوصول، بينما يتم استخدام "الشفرة" لإعطاء المزيد من المعلومات عن “النوع”. كمثال، "ICMP Type 3 Code 3" يعني أنّ المنفذ الذي تحاول الاتصال من خلاله بوجهتك غير متوفّر، بينما "ICMP Type 3 Code 0" تعني أنّ شبكة الوجهة التي تحاول الاتصال بها غير متوفّرة بالمرّة. الأنواع التي يمكن دوما حجبها هناك بعض الأنواع (Types) لبروتوكول ICMP تكون مهملة طوال الوقت، لذا يجب غالبًا حجبها. من بين هذه الأنواع: ICMP source quench (النوع 4 و code 0) Alternate host (النوع 6) الأنواع 1, 2, 7 و 15 محفوظة للاستخدام المستقبلي أو المتقدّم وليست مهمّة. الأنواع التي يمكن حجبها اعتمادا على إعدادات الشبكة تكون بعض أنواع ICMP مفيدة في إعدادات شبكةٍ معيّنة، ولكن يجب حجبها في بيئةٍ أخرى. كمثال، رسائل إعادة توجيه ICMP (النوع 5 أو type 5) يمكن أن تكون مفيدة في التقاط تصميم الشبكات السيء. يتم إرسال إعادة توجيه ICMP عندما يكون هناك طريقٌ أفضل متوفّر أمام العميل. لذا إذا استقبل الموجّه (router) حزمة بيانات يجب توجيهها إلى مضيفٍ آخر على نفس الشبكة، فإنّه يقوم بإرسال رسالة إعادة توجيه عبر بروتوكول ICMP لإخبار العميل بأن يقوم بإرسال الحِزَم إلى المضيف الآخر في المستقبل. سيفيدك هذا إذا كنت تثق بشبكتك المحلية وكنت تريد التقاط أماكن عدم الكفاءة (inefficiencies) في جداول التوجيه (routing tables) أثناء الإعداد الأوّلي (إصلاح التوجيه الخاصّ بك هو حلٌّ أفضل على المستوى البعيد). لكن على شبكة غير موثوقة، يمكن لمستخدم سيء أن يقوم بإرسال رسائل إعادة التوجيه عبر برتوكول ICMP للتلاعب بجداول التوجيه الموجودة على أجهزة المضيفين (hosts). من أنواع ICMP الأخرى المفيدة في بعض الشبكات والمؤذية في أخرى هي حِزَم ما يعرف بـICMP router advertisement (النوع 9 أو type 9) وrouter solicitation (النوع 10 أو type 10). يتم استخدام حزم الإعلان (advertisement) والحثّ (solicitation) كجزء من IRDP (ICMP Internet Router Discovery Protocol)، وهو نظام يسمح للمضيفين - بعد الإقلاع أو الانضمام لشبكة ما - بأن بكتشفوا تلقائيًا الموجّهات (routers) المتوفّرة. من الأفضل في معظم الحالات للمضيف أن يمتلك طرق (routes) ثابتة مُعدّة خصيصًا للبوابات التي سيستعملها. يجب أن يتم قبول هذه الحزم في نفس حالات حزم التوجيه من ICMP. في الواقع، بما أنّ المضيف لن يعرف الطرق الأكثر تفضيلًا لنقل التدفّق من بين جميع الطرق المكتشفة، فإنّ رسائل إعادة التوجيه غالبًا ما تكون مطلوبة مباشرةً بعد الاكتشاف. إذا كنت لا تشغل خدمة تقوم بإرسال حزم حثّ التوجيه (router solicitation) أو خدمة تقوم بتعديل الطرق بناءًا على حزم الإعلان (advertisement packets) مثل rdisc، فيمكنك حظر هذه الحزم بأمان. الأنواع التي من الآمن السماح لها ستجد أنواع ICMP الآمنة عادةً أدناه، لكن ربّما تريد تعطيلها إذا كنت تريد أن تكون في أمانٍ أكثر. Type 8 — Echo request: هذه هي طلبات النبضات (ping requests) الموجّهة إلى خادومك. من الآمن السماح لها بالعمل على خادومك عادةً (منع هذه الحزم لن يخفي خادومك، هناك عدة طرق أخرى أمام المستخدمين ليعرفوا ما إذا كان خادومك يعمل حاليًا أم لا)، ولكن يمكنك منعها أو تحديد عناوين مصدر هذه الحزم وتقليلها إذا كنت تريد ذلك. Type 13 — Timestamp request: يمكن استخدام هذه الحزم بواسطة العملاء لجمع معلومات مواجهة الأعطال. يمكن استخدامها أيضًا في بعض تقنيات التقاط بصمات نظام التشغيل، لذا يمكنك منعها إن أردت. يمكن السماح للأنواع التالية عمومًا دون الحاجة إلى قواعد (rules) خاصّة عبر إعداد جدارك الناري ليسمح بالردود على الطلبات التي قام بإرسالها (عبر استخدام وحدة conntrack للسماح بتدفّق ESATABLISHED وRELATED). Type 0 — Echo replies: وهي عبارة عن الردود على طلبات النبضات (pings requests). Type 3 — Destination Unreachable: حِزَم بيانات الوجهة الغير متوفّرة العادية هي عبارة عن ردود طلبات تمّ إنشاؤها بواسطة خادومك، وهي تعني أنّه لم يتم توصيل حِزَم البيانات بشكلٍ صحيح. Type 11 — Time exceeded: هذا عبارة عن خطأ يتم إرجاعه في حال موت الحِزَم المُنشأة بواسطة خادومك قبل وصولها وجهتها بسبب تعدّيها لقيمة TTL الخاصّة بها. Type 12 — Parameter problem: يعني هذا أنّ حزمةً صادرة من خادومك قد تعرضت للتلف في طريقها. Type 14 — Timestamp responses: هي عبارة عن الردود على عمليات الاستعلام عن المنطقة الزمنية التي يتم تنفيذها بواسطة خادومك. حجب تدفّق ICMP بأكمله ما يزال أمرًا مستحسنًا من قبل العديد من خبراء الحماية، ولكن العديد من الناس الآن ينصحون باستخدام سياسات ICMP ذكية بدلًا من منعه بالكامل. تحديد الاتصال وتحديد التردد في بعض الخدمات وأنماط التدفّقات (traffic patterns)، ربّما تود السماح بالوصول من قبل جهاز العميل طالما أنّه لا يسيء استخدام هذا الوصول. هناك طريقتان لتقييد استخدام الموارد: تقييد الاتصال (connection limiting) وتقييد التردد أو المعدل (rate limiting). تقييد الاتصال يمكن أن يتم تفعيل تقييد الاتصال عبر استخدام امتدادات مثل connlimit للتحقق من عدد الاتصالات النشطة التي قام جهاز العميل بفتحها. يمكن أن يتم استخدام هذا لتقييد عدد الاتصالات المسموحة في وقتٍ واحد. إذا كنت تخطط لاستخدام تقييد الاتصال، فيجب عليك اتخاذ بعض القرارات بخصوص هذا بغض النظر عن طريقة تطبيقك له. هذه القرارات هي: هل سيكون التقييد بناءًا على العنوان، الشبكة أم على أمورٍ عامّة أخرى؟ هل سيكون التقييد لخدمة معينة فقط أم على الخادوم بأكمله؟ يمكن تقييد الاتصالات بناءًا على أجهزة الاستضافة أو شبكة معيّنة عبر استخدام بادئة شبكة ما (network prefix). يمكنك أيضًا تعيين حدٍّ أقصى لعدد الاتصالات المسموح بها لخدمة معيّنة أو للخادوم بأكمله. لا تنسى أيضًا أنّه بمقدورك استخدام جميع هذه الطرق أو بعضٍ منها لتحصل على خليط معقّد من السياسات المستعملة للتحكم في الاتصالات التي تريدها. تقييد التردد يسمح لك تحديد التردد أو تحديد المعدل (rate limiting) بإنشاء قواعد (rules) تقوم بإدارة تردد أو معدل التدفّق الذي سيقبله خادومك. هناك عدد من الامتدادات المختلفة التي يمكن استخدامها لتقييد التردد مثل limit، hashlimit وrecent. اختيار الأنسبة من هذه الامتدادات يعتمد على الطريقة التي تريد تقييد التردد خلالها. سيتسبب الامتداد limit للقاعدة في السؤال بأن يتم مطابقتها إلى حين الوصول إلى الحد الأقصى، بعدها سيتم ترك أيّ حزم بيانات إضافية أخرى. إذا قمت باستخدام حد مثل “5/ثانية/، فإنّ القاعدة ستقوم بالسماح بمطابقة 5 حزم في الثانية الواحدة، بعدها، لن تسمح لأيّ حزم بأن تقوم بعملية المطابقة. هذا جيّد لتحديد الحدّ الأعلى العام لخدمة معيّنة من الحزم. لكنّ امتداد hashlimit يعتبر أكثر مرونةً، حيث يسمح لك بتحديد بعض القيم التي سيستخدمها iptables لتحقيق عملية المطابقة كذلك. مثلًا، يمكن لـhashlimit أن يتحقق من عنوان المصدر ومنفذه، عنوان الوجهة ومنفذها أو حتّى تشكيلة من هذه القيم الأربعة لمطابقة كل مُدخَلة (entry). يمكنه أيضًا أن يقوم بالتحديد بناءًا على عدد الحزم أو البايتات المتلقاة، وهو ما يوفّر تحديدًا أكثر مرونة على مستتوى العميل أو مستوى الخدمات. يقوم امتداد recent ديناميكيًا بإضافة عنوان IP العميل إلى قائمة بيضاء أو يتحقق من وجوده في قائمة سوداء عند مطابقة القاعدة. يسمح لك هذا باستخدام منطق أكثر تعقيدًا لإنشاء قواعد متعددة للحصول على نتيجة مبهرة. يمتلك أيضًا القدرة على تحديد العدد والوقت كالامتدادات الأخرى، ولكنه قادر أيضًا على إعادة تعيين مدى الوقت (timerange) في حال رؤية المزيد من تدفّق البيانات، حيث يجبر العميل على وقف التدفّق في حال وصوله إلى الحد الأقصى. اختيار واحدٍ من هؤلاء لتستعمله على خادومك يعتمد بشكلٍ كامل على السياسة التي تريد تطبيقها في خادومك. الإدارة كوحدة متكاملة مقابل الإدارة كسلسلة جميع سياسة iptables مرسّخة في توسيع السلاسل المبنية فيه أساسًا (built-in chains). في الجدران النارية البسيطة، يكون هذا على شكل تغيير السياسة الافتراضية للسلاسل وإضافة القواعد. في الجدران النارية الأكثر تعقيدًا، غالبًا ما يكون من الجيد توسيع إطار عمل الإدارة عبر إضافة المزيد من السلاسل. السلاسل المكوّنة من طرف المستخدمين (User-created chains) مقيّدة بطبيعتها إلى السلسلة التي تستدعيها. السلاسل المكوّنة من طرف المستخدمين لا تملك أيّ سياسة افتراضية، لذا إذا لم تنجح حزمة بيانات ما في المرور عبر سلسلة مكوّنة من طرف المستخدم، فإنّها ستعود إلى السلسلة وتتابع المطابقة. مع أخذ هذا في عين الاعتبار، تصبح السلاسل المكوّنة بواسطة المستخدم مفيدة جدًا في الأغراض التنظيمية، جعل شروط مطابقة القواعد أكثر وضوحًا ولتحسين قابلية القراءة عبر تقسيم شروط المطابقة. إذا كنت تكرر عمليّة معينة لعددٍ كبير من القواعد، فحينها قد يكون من المفيد إنشاء "jump rule" مع العملية أو المطابقة والشروط المطلوبة المشتركة في سلسلة جديدة، يمكنك إضافة مجموعة من القواعد دون المطابقة المشتركة ضمن تلك السلسلة. بغضّ النظر عن التنظيم البسيط، يمكن لهذا أن يفيدك بشكلٍ أكبر. مثلًا، الاستخدام الذكي للسلاسل لمجموعات متشابهة من القواعد يعني أنّ إضافة القواعد في الموقع الصحيح سيكون أسهل وأقل تعرّضًا للأخطاء. ويمكن أن يكون أسهل كذلك في عرض وفهم أجزاء السياسة التي تهتم بها عبر تحديد السلسلة. الاختيار ما بين تضمين جميع قواعدك في واحدةٍ من السلاسل الموجودة بالفعل في الجدار الناري أو عبر إنشاء وتعديل سلاسل جديدة يعتمد بشكلٍ رئيسي لمدى التعقيد والبساطة والأهداف التي تسعى إلى تحقيقها على خادومك. خاتمة الآن، يفترض أنك تمتلك معرفة جيدة حول بعض القرارات التي يجب عليك اتخاذها عند تصميم سياسات الجدار الناري لخواديمك. بشكلٍ عام، الوقت الذي ستستغرقه في إعداد الجدار الناري لأوّل مرّة سيسهل مهام الإدارة عليك لاحقًا. صحيحٌ أنّ العملية ستحتاج الكثير من الوقت والخبرة والتجارب للحصول على أفضل سياسة تلائم خواديمك، ولكن القيام بهذا سيوفّر لك تحكمًا أكبر في حمايتها. إذا كنت تريد معرفة المزيد عن الجدران النارية و iptables بالتحديد، فيمكنك التحقق من المقالات التالية: كيف يعمل جدار iptables الناري. إعداد جدار ناري باستخدام iptables على Ubuntu 14.04. إعداد جدار ناري باستخدام UFW على Ubuntu 14.04. ترجمة -وبتصرّف- لـلمقال: How To Choose an Effective Firewall Policy to Secure your Servers لصاحبه Justin Ellingwood.
  12. واحدة من أسهل الطرق لزيادة استجابة خادومك وجعله قويًا ضدّ أخطاء الذاكرة التي قد تطرأ على تطبيقاتك التي تشغّلها عليه هي عبر إضافة مساحة Swap. Swap هي مساحة من القرص الصلب يتم تعريفها على أنّها مكان يمكن لنظام التشغيل تخزين البيانات فيها مؤقتًا في حال عدم توفّر مكان لذلك على الذاكرة العشوائية (RAM). يعطيك هذا القدرة على زيادة كميّة المعلومات التي يمكن لخادومك الاحتفاظ بها في "ذاكرته" ريثما يعمل. سيتم استخدام المساحة من على القرص الصلب مؤقتًا عندما لا يكون هناك مساحة كافية في الذاكرة العشوائية لحفظ البيانات. المعلومات التي يتم كتابتها على القرص الصلب ستكون أبطء في الاستجابة من تلك الموجودة في الذاكرة العشوائية، ولكنّ نظام التشغيل سيفضّل الإبقاء على بيانات التطبيق العامِلة حاليًا في الذاكرة العشوائية مع استخدام قرص Swap للبيانات الأقدم. بشكلٍ عام، يعتبر امتلاك قرص Swap صمّام أمانٍ فاصل يتم استعماله تلقائيًا عند نضوب الذاكرة العشوائية من خادومك. في هذا الدرس، سنشرح كيفية إنشاء وتمكين ملفّ swap على توزيعة Ubuntu 14.04. ملاحظة: على الرغم من أنّ قرص Swap مستحسن للأنظمة التي تستخدم الأقراص الصلبة التقليدية، إلّا أنّ استخدام Swap مع أقراص SSD يمكن أن يسبب مشاكل وتهتّكًا للعتاد مع مرور الوقت. القيام بذلك قد يؤثر على بنية العتاد التحتية التي توفّر الخدمة لك ولجيرانك. إذا كنت تحتاج تحسين أداء خادومك، فإننا ننصحك بترقيته. سيوفّر لك هذا نتائج أفضل بما يتعلّق بالأداء وسيقلّص من احتمالية حصول مشاكل مع العتاد. التحقق من معلومات Swap على النظام قبل أن نبدأ، سنأخذ جولةً على نظام التشغيل الخاصّ بنا لنرى ما إذا كنّا نمتلك بالفعل قرص Swap أم لا. يمكننا امتلاك أكثر من قرص أو ملفّ Swap واحد، ولكن بشكلٍ عام، يجب أن يكون واحد منها كافيًا فقط. يمكننا رؤية ما إذا كان النظام يمتلك أيّ ملفّات Swap مُعدّة مسبقًا عبر كتابة: sudo swapon -s Filename Type Size Used Priority إذا رأيت فقط ترويسة الجدول، كما رأينا أعلاه، فهذا يعني أنّك لا تمتلك حاليًا أيّ قرص Swap على النظام. طريقة أخرى للتحقق من مساحة swap هي عبر استخدام الأداة free، والتي تقوم بإظهار استخدام الذاكرة الحالي لنا. يمكننا رؤية نسبة استخدام الذاكرة الحالية و swap محسوبةً بالميغابايت عبر كتابة: free -m total used free shared buffers cached Mem: 3953 154 3799 0 8 83 -/+ buffers/cache: 62 3890 Swap: 0 0 0 كما يمكنك أن ترى، مساحة Swap على نظامنا هي 0. وهذا مطابقٌ لما رأيناه في الأمر السابق. التحقق من المساحة المتوفرة على القرص الصلب الطريقة النموذجية لتخصيص المساحة لـ Swap هي عبر استخدام (partition) قسم من القرص الصلب له، ولكنّ التعديل على التقسيم الافتراضي للقرص الصلب ليس دومًا ممكنًا. يمكننا ببساطة إنشاء ملفّ swap عادي ليعمل على قسمٍ موجودٍ بالفعل. قبل أن نقوم بهذا، يجب أن نعرف حجم المساحة الحرّة المتوفّرة على القرص الصلب. يمكننا الحصول على هذه المعلومات عبر كتابة: df -h Filesystem Size Used Avail Use% Mounted on /dev/vda 59G 1.3G 55G 3% / none 4.0K 0 4.0K 0% /sys/fs/cgroup udev 2.0G 12K 2.0G 1% /dev tmpfs 396M 312K 396M 1% /run none 5.0M 0 5.0M 0% /run/lock none 2.0G 0 2.0G 0% /run/shm none 100M 0 100M 0% /run/user كما يمكنك أن ترى في السطر الأول، يمتلك القرص الصلب الخاصّ بنا حوالي 55 جيجابايت من المساحة المتوفّرة، لذا فإنّه يوجد لدينا مساحة كبيرة لاستغلالها. هذا طبعًا على خادوم افتراضي خاصّ جديد بحجمٍ متوسّط، قد يكون خادومك مختلفًا تبعًا لاستخداماتك. على الرغم من أنّه يوجد العديد من الآراء حول الحجم المناسب لملفّ swap، إلّا أنّه يعتمد في الواقع على رغبتك واحتياجات تطبيقاتك. بشكلٍ عام، من المنصوح أن تجعل حجم swap مساويًا أو مضاعفًا لحجم الذاكرة العشوائية (RAM) المتوفّرة على خادومك. بما أنّ خادومنا يحتوي 4 جيجابايت من الذاكرة العشوائية هنا، وبما أنّ ضعف هذا الرقم سيعطينا ملفّ swap كبير جدًا لن نحتاج بتاتًا لاستخدامه كلّه أو حتّى نصفه، فسنقوم فقط باستخدام 4 جيجابايت من المساحة لملفّ swap. إنشاء ملف Swap الآن وبعد أن عرفنا المساحة المتوفّرة على القرص الصلب الخاصّ بنا، يمكننا المضي قدمًا في إنشاء ملفّ swap على نظام الملفّات الخاصّ بنا. سنقوم بإنشاء ملفّ يدعى swapfile ضمن المسار الجذر (/). يجب أن يكون حجم الملفّ مساويًا لحجم المساحة التي نريد تخصيصها لـ Swap، وهناك طريقتان للقيام بالعملية: الطريقة التقليدية البطيئة يمكننا إنشاء ملفّ جديد بحجمٍ معيّن عبر استخدام الأمر dd. تقوم هذه الأداة متعددة الاستخدامات بكتابة البيانات من موقعٍ إلى آخر. يمكننا أن نستعمل هذه الأداة للقيام بكتابة أصفار إلى ملفّ من جهازٍ خاص في أنظمة لينكس موجود في المسار dev/zero/، يقوم هذا الجهاز فقط بطباعة عددٍ من الأصفار حسب ما يُطلبُ منه. نقوم بتحديد حجم الملفّ عبر استخدام bs لحجم الكتلة الواحدة (block size) وcount لعدد الكتل (blocks) التي نريد إنشاءها. يمكننا إسناد أيّ قيمة إلى كِلا المُعامِلين، ولكن ما يهم حقًا هو نتيجتهما معًا. كمثال، في حالتنا نريد إنشاء ملف بحجم 4 جيجابايت. يمكننا القيام بهذا عبر تحديد حجم الكتلة الواحدة بـ 1 جيجابايت وبتحديد عدد الكتل إلى 4: sudo dd if=/dev/zero of=/swapfile bs=1G count=4 4+0 records in 4+0 records out 4294967296 bytes (4.3 GB) copied, 18.6227 s, 231 MB/s تحقق من الأمر الذي تريد إدخاله قبل الضغط على زرّ Enter، لأنّ هذا الأمر يمكن أن يقوم بمسح بياناتك في حال قمت بتوجيه of (والذي يرمز إلى output file أو ملف الخرج) إلى المسار الخاطئ. يمكننا أن نرى أنّه قد تمّ إنشاء الملفّ بحجم 4 جيجابايت عبر كتابة: ls -lh /swapfile -rw-r--r-- 1 root root 4.0G Apr 28 17:15 /swapfile إذا قمت بتنفيذ الأمر السابق لإنشاء ملف swap بنجاح، فقد تكون قد لاحظت أنّه أخذ وقتًا ليكتمل، في خادومنا التجريبي، سترى أنّ النظام استغرق 18 ثانية ليقوم بإنشاء الملفّ، لأنّه يجب عليه كتابة 4 جيجابايت من الأصفار إلى ملفّ على القرص الصلب. إذا كنت تريد معرفة كيفيّة إنشاء الملفّ بشكلٍ أسرع، فقم بحذف الملفّ عبر الأمر أدناه وطبّق الخطوة التالية: sudo rm /swapfile الطريقة السريعة الطريقة الأسرع لإنشاء نفس الملفّ هي عبر استخدام برنامج fallocate. يقوم هذا الأمر بإنشاء ملفّ بحجمٍ معيّن، دون الحاجة إلى كتابة أصفار مثلًا أو محتوىً آخر إليه. يمكننا إنشاء ملفّ بحجم 4 جيجابايت عبر كتابة: sudo fallocate -l 4G /swapfile ستقوم الطرفية بالرجوع إليك في نفس اللحظة تقريبًا. يمكننا التحقق مما إذا كان حجم الملفّ صحيحًا أم لا عبر كتابة الأمر: ls -lh /swapfile -rw-r--r-- 1 root root 4.0G Apr 28 17:19 /swapfile وكما ترى، تمّ إنشاء ملفّ Swap الخاصّ بنا بالمساحة المطلوبة بشكلٍ صحيح. تفعيل ملف Swap الآن تمّ إنشاء الملفّ، ولكنّ النظام لا يعرف أنّه من المفترض به أن يستخدمه بعد. يجب أن نقوم بإخبار النظام بأن يقوم بتهيئة هذا الملفّ كقرص Swap ومن ثمّ تفعيله. ولكن قبل أن نقوم بهذا، علينا ضبط صلاحيات الملفّ بحيث لا يكون قابلًا للقراءة لأيّ أحد باستثناء المستخدم الجذر (root). السماح للمستخدمين الآخرين بقراءة أو كتابة محتويات هذا الملفّ قد يكون خطرًا أمنيًا كبيرًا. يمكننا قفل هذه الصلاحيات عبر كتابة: sudo chmod 600 /swapfile تحقق الآن من أنّ الملفّ يمتلك الصلاحيات الصحيحة عبر تطبيق: ls -lh /swapfile -rw------- 1 root root 4.0G Apr 28 17:19 /swapfile كما نرى، فقط المستخدم الجذر يمتلك صلاحيات الكتابة والقراءة حاليًا. الآن وبعد أن أصبح ملفّنا أكثر أمانًا، يمكننا أن نخبر نظامنا بأن يقوم بتهيئته كملفّ swap عبر تنفيذ: sudo mkswap /swapfile Setting up swapspace version 1, size = 4194300 KiB no label, UUID=e2f1e9cf-c0a9-4ed4-b8ab-714b8a7d6944 أصبح الملفّ الآن جاهزًا ليتم استخدامه كمساحة Swap. يمكننا تفعيله عبر الأمر: sudo swapon /swapfile يمكننا كذلك اختبار نجاح العملية أو فشلها عبر سؤال النظام الآن عمّا إذا كان يتعرّف على مساحة Swap أم لا عبر كتابة: sudo swapon -s Filename Type Size Used Priority /swapfile file 4194300 0 -1 لدينا ملفّ swap جديد هنا. يمكننا أيضًا استخدام أداة free للتأكّد مما وجدناه: free -m total used free shared buffers cached Mem: 3953 101 3851 0 5 30 -/+ buffers/cache: 66 3887 Swap: 4095 0 4095 تمّ الآن إعداد swap بنجاح، وسيقوم النظام باستخدامه عندما يحتاجه فقط. استخدام ملف Swap بشكل دائم لقد قمنا بتفعيل ملفّ Swap الآن، ولكن عندما نقوم بإعادة التشغيل، فإنّ الخادوم لن يقوم تلقائيًا بإعادة تفعيل الملفّ. يمكننا تغيير هذا عبر تعديل ملفّ fstab. قم بتعديل الملفّ بصلاحيات الجذر باستخدام محرر نصوصك المفضّل: sudo nano /etc/fstab في نهاية ملفّك، تحتاج إلى إضافة سطرٍ يخبر نظام التشغيل أن يقوم باستخدام الملفّ الذي أنشأته تلقائيًا: /swapfile none swap sw 0 0 احفظ الملفّ واخرج عندما تنتهي. اضبط إعدادات Swap الخاصة بك هناك بعض الخيارات المؤثّرة على أداء خادومك التي يمكنك ضبطها وتعديلها للحصول على أداءٍ أفضل عند التعامل مع swap. يقوم مُعامِل swappiness بإعداد معدّل تكرار النظام للقيام بعملية نقل البيانات من الذاكرة العشوائية إلى ملفّ swap، وهذه القيمة محصورة بين الـ0 والـ100 وتمثّل نسبةً مئوية. عندما تكون القيمة أقرب إلى الصفر، فإنّ النظام لن يقوم بنقل أيّ بيانات من الذاكرة العشوائية إلى swap إلّا في حال الضرورة القصوى. تذكّر أنّ التعامل مع swap "مكلف" حيث أنّه بطيء بشكلٍ ملحوظ مقارنةً بالذاكرة العشوائية مما يسبب بطئًا في الأداء. لذا فإنّ إخبار النظام بألّا يقوم بالاعتماد على swap كثيرًا سيقوم بتسريع أداء نظامك بشكلٍ عام. إذا كانت القيمة أقرب إلى المئة، فإنّ النظام سيقوم بنقل المزيد من البيانات إلى swap بهدف حفظ المزيد من الذاكرة العشوائية. اعتمادًا على ماهيّة التطبيقات التي تقوم بتشغيلها على خادومك واحتياجاتك الشخصية، قد يكون هذا الخيار أفضل لك في بعض الحالات. يمكننا أن نرى قيمة مُعامِل swappiness الحالية عبر تطبيق: cat /proc/sys/vm/swappiness 60 بالنسبة لجهاز سطح مكتب (استخدام عادي)، فإنّ قيمة 60 ليست سيئة. ولكن بالنسبة إلى خادوم، فإننا قد نود تقريب القيمة إلى الصفر. يمكننا تغيير قيمة swappiness إلى قيمة أخرى عبر استخدام الأمر sysctl. كمثال، لتغيير قيمة swappiness إلى 10، يمكننا تنفيذ: sudo sysctl vm.swappiness=10 vm.swappiness = 10 سيستمر هذا التغيير إلى حين عملية إعادة التشغيل المقبلة. يمكننا جعل هذا التغيير دائمًا حتّى بعد إعادة التشغيل عبر إضافة سطرٍ معيّن إلى نهاية ملفّ etc/sysctl.conf/: sudo nano /etc/sysctl.conf في نهاية الملفّ أضف: vm.swappiness=10 احفظ الملفّ واخرج عندما تنتهي. قيمة أخرى مرتبطة قد تودّ تغييرها هي vfs_cache_pressure. يقوم هذا المُعامِل بتحديد إلى أيّ مدى سيقوم النظام بالاحتفاظ بالخبيئة (cache) للبيانات الأكثر تكرارًا في مقابل البيانات الأخرى. تكون هذه البيانات عادةً متعلقة بنظام الملفّات نفسه، وغالبًا ما يتكرر طلبها، لذلك فإنّه من الممتاز لنظامك أن يقوم بالاحتفاظ بهذه البيانات في ذاكرته المؤقتة. يمكنك رؤية قيمة هذا المُعامِل الحالية عبر الأمر: cat /proc/sys/vm/vfs_cache_pressure 100 حاليًا، يقوم نظامنا بحذف البيانات والمعلومات من الخبيئة (cache) بسرعة سريعة جدًا. يمكننا جعل هذه العملية أكثر بطئًا عبر استخدام قيمة كـ50: sudo sysctl vm.vfs_cache_pressure=50 vm.vfs_cache_pressure = 50 مرةً أخرى.. هذه القيمة ليست دائمة حاليًا وسيتم فقدانها عند إعادة التشغيل، يمكننا تغيير هذا الوضع عبر إضافتها إلى ملفّات إعداداتنا كما فعلنا مسبقًا: sudo nano /etc/sysctl.conf في نهاية الملفّ، أضف القيمة التي تريدها: vm.vfs_cache_pressure = 50 احفظ الملفّ واخرج عندما تنتهي. الخاتمة اتبّاع الخطوات في هذا الدرس سيعطيك بعض الهواء لتتنفسه عندما يتعلّق الأمر باستخدام الذاكرة العشوائية في نظامك. مساحة Swap مفيدة بشكلٍ لا يصدّق في تفادي بعض المشاكل الشائعة. إذا كنت تصادف أخطاء (OOM (Out of memory أو عدم توفّر الذاكرة بشكلٍ شائع، أو إذا كنت ترى أنّ نظامك غير قادر على استخدام التطبيقات التي تحتاجها، فإنّ الحلّ الأفضل لك هو في ضبط إعدادات تطبيقاتك أو في ترقية موارد خادومك، كما أنّ تفعيل مساحة Swap على خادومك سيعطيه المزيد من المرونة ويوفّر لك المزيد من الوقت على خادومٍ بمواصفاتٍ عادية. ترجمة -وبتصرف- للمقال How To Add Swap on Ubuntu 14.04 لصاحبه Justin Ellingwood.
  13. بعد إنشاء الإعدادات الدُنيا لخادومك الافتراضي الجديد واستخدامها، هناك بعض الخطوات الإضافيّة المستحسنة التي من المهمّ أن تطبّقها. في هذا الدرس، سنتابع إعداد خواديمنا عبر تنفيذ إجراءاتٍ إضافيّة مستحسنة عليها. الأهداف والمتطلبات قبل أن تبدأ بهذا الدرس، يجب أن تقرأ درس إعداد خادوم Ubuntu 14.04 من الصفر. قراءة ذلك الدرس أولًا هو أمرٌ مهمّ بهدف إعداد حسابات المستخدمين، إعداد وضبط الصلاحيّات المرتبطة بـsudo وقفل اتصالات SSH للحصول على المزيد من الحماية. بمجرّد أن تقرأ وتطبّق الدرس المذكور أعلاه، ستكون قادرًا على المتابعة مع هذه المقالة. في هذا الدرس، سنركّز على إعداد بعض المكوّنات الإضافية المستحسنة لخادومنا. سيتضمن هذا إعداد جدارٍ ناري، مزامنة بروتوكول وقت الشبكة وإعداد ملفّات الـSwap. إعداد جدار ناري بسيط تقوم جدران الحماية بتوفير درجة حمايةٍ بسيطة لخادومك. هذه التطبيقات مسؤولة عن منع وصول التدفّقات (traffics) إلى كلّ المنافذ الموجودة في خادومك باستثناء تلك المنافذ/الخدمات التي قمتَ بالسماح لها بالوصول. تأتي توزيعة Ubuntu مع اداة تدعى UFW يُمكن استخدامها لإعداد سياسات (policies) الجدار الناري الخاصّ بك. استراتيجيّتنا البسيطة ستكون قفلَ كلّ شيءٍ لا نرى أنّه من الصواب تركه مفتوحًا. قبل أن نقوم بتفعيل أو إعادة تحميل جدارنا الناريّ، سنقوم بإنشاء القواعد (rules) التي تعرّف تلك الاستثناءات التي نريدها من سياسة التعامل مع حزم البيانات الواردة. أولًا، سنحتاج إلى إنشاء استثناء لاتّصالات SSH لنتمكّن من الوصول إلى الصلاحيات الإدارية لخادومنا عن بعد. يعمل عفريت SSH (يدعى SSH daemon) على المنفذ 22 افتراضيًا. يمكن لـufw أن يقوم بتطبيق القواعد التي تريدها على SSH طالما أنّك لم تقم بتغيير ذاك المنفذ. لذا إذا لم تكن قد عدّلت المنفذ الافتراضي لـSSH، فيمكنك السماح باستثنائه عبر: sudo ufw allow ssh إذا قمتَ بتعديل المنفذ الافتراضي الذي يعمل عليه عفريت SSH، فسيجب عليك السماح له بالوصول إلى الخادوم عبر تحديد رقم المنفذ الجديد مع بروتوكول TCP: sudo ufw allow 4444/tcp هذا هو أبسط إعدادٍ متوفّر للجدار الناري. سيسمح فقط بالوصول إلى منفذ SSH الخاصّ بخادومك وسيقوم بحجب كلّ الخدمات الأخرى ومنعها من الوصول إلى الخادوم. إذا كنتَ تريد السماح بوصول المزيد من الخدمات، فسيجب عليك فتح الجدار الناري لكلٍّ منفذٍ تريده بالتحديد. إذا كنتَ تخطط لتشغيل خادوم ويب لبروتوكول HTTP، فستحتاج إلى السماح بالوصول للمنفذ 80: sudo ufw allow 80/tcp إذا كنتَ تريد تشغيل خادوم ويب مع تفعيل SSL/TLS، فيجب عليك السماح بمرور التدفّق عبر المنفذ 443 أيضًا: sudo ufw allow 443/tcp إذا كنتَ تحتاج إلى تفعيل بريد SMTP، فيجب أن يكون المنفذ 25 مفتوحًا أيضًا: sudo ufw allow 25/tcp بعد أن تنتهي من إضافة هذه الاستثناءات، يجب أن تقوم بمعاينة التغييرات التي قمتَ بها عن طريق: sudo ufw show added إذا كان كلّ شيءٍ يبدو جيّدًا، فيمكنك الآن تفعيل الجدار الناري عبر كتابة: sudo ufw enable سيتم سؤالك لتأكيد اختياراتك، لذا قد تكتب "y" إذا رغبتَ بالمتابعة. سيقوم هذا الأمر بتطبيق الاستثناءات التي قمتَ بإضافتها وحجب جميع أنواع التدفّقات الأخرى إلى خادومك، كما سيقوم بإعداد الجدار الناري الخاصّ بك ليبدأ تلقائيًا عند الإقلاع. تذكّر أنّه يجب عليك فتح أيّ منافذ إضافية لأيّ خدمات إضافية تحتاج الوصول عبر تلك المنافذ. للمزيد من المعلومات التفصيليّة، راجع مقالتنا حول إعداد جدار ufw الناري. إعداد المناطق الزمنية ومزامنة بروتوكول وقت الشبكة الخطوة التالية هي ضبط إعدادات التوطين (localization) لخادومك وإعداد مزامنة بروتوكول وقت الشبكة (NTP - Network Time Protocol). ستضمن الخطوة الأولى أنّ خادومك يعمل باستخدام المنطقة الزمنية الصحيحة، وستقوم الخطوة الثانية بإعداد نظامك لمزامنة ساعة النظام الخاصّة به تلقائيًا مع الساعة العالمية عبر الاتصال بخواديم NTP العالمية، وهذا لضمان عدم وجود فرق بين التوقيتين (توقيت الخادوم وتوقيت الوقت الحقيقي في المنطقة التي تعيش بها) ولجعل الوقت المضبوط على خادومك هو نفسه الوقت المضبوط على الخواديم الأخرى. إعداد المناطق الزمنية ستكون خطوتنا الأولى هي إعداد المنطقة الزمنيّة الخاصّة بخادومنا. هذا الأمر سهل للغاية ويمكن فعله عبر إعادة إعداد حزمة tzdata: sudo dpkg-reconfigure tzdata سيتم عرض قائمة لك تحتوي مناطق العالم المتوفّرة، اختر المنطقة التي تعيش بها: بعد اختيار منطقة معيّنة، ستكون قادرًا على اختيار منطقة زمنيّة معيّنة لضبطها في خادومك الشخصي عبر اختيار العاصمة أو المدينة التي تعيش بها: بعد هذا، سيتم تحديث نظامك ليستخدم المنطقة الزمنيّة الجديدة، وسيتم طباعة النتائج إلى الشاشة: Current default time zone: 'America/New_York' Local time is now: Mon Nov 3 17:00:11 EST 2014. Universal Time is now: Mon Nov 3 22:00:11 UTC 2014. إعداد مزامنة NTP الآن وبعد أن قمتَ بإعداد المنطقة الزمنيّة، يجب عليك إعداد NTP. ستسمح عمليّة مزامنة NTP لحاسوبك بالبقاء متزامنًا مع خواديم الويب الأخرى حيث سيتم توحيد الوقت الذي يستعمله خادومك مع الخواديم الأخرى حول العالم، وهو ما سيوفّر المزيد من الدقّة للعمليات التي تحتاج وقتًا دقيقًا لتتم بنجاح. لمزامنة NTP، سنستخدم خدمة تدعى ntp، والتي يمكننا تثبيتها من مستودعات Ubuntu الافتراضية: sudo apt-get update sudo apt-get install ntp هذا هو كلّ ما تحتاج فعله لإعداد مزامنة NTP على Ubuntu. سيبدأ عفريت ntp تلقائيًا بعد التثبيت وعند كلّ إقلاع وسيبقى طوال الوقت عاملًا على مزامنة وقت النظام مع خواديم NTP العالميّة لضمان التوافقية. اضغط هنا إذا أردت تعلّم المزيد عن خواديم NTP. إنشاء ملف Swap يسمح إنشاء ملفّ "Swap" على خادوم لينكس للنظام بنقل المعلومات والبرامج الأقل استعمالًا حاليًا من الذاكرة العشوائية RAM إلى موقعٍ معيّن على القرص الصلب. الوصول إلى البيانات الموجودة على القرص الصلب هو أبطئ بكثير من عملية الوصول إليها لو كانت على الذاكرة العشوائية RAM، ولكنّ توفير قرص Swap قد يكون الأمر الفاصل بين بقاء تطبيقاتك العاملة حاليًا على قيد الحياة وبين تحطّمها (crash). هذا الأمر مفيد للغاية خاصةً في حال كنتَ تنوي استضاف قواعد بيانات على خادومك. تختلف النصيحة عن الحجم الأفضل لقرص الـSwap اعتمادًا على ما تريد القيام به. ولكن بشكلٍ عام، فإنّ جعل حجمه بضعف حجم الذاكرة العشوائية RAM سيكون فكرةً جيّدة. قم باقتطاع المساحة التي تريد تخصيصها لقرص الـSwap من نظام الملفّات الكلّي باستخدام أداة fallocate. كمثال، إذا احتجنا إلى عمل قرص Swap حجمه 4 جيجابايت، فيمكننا إنشاء ملفّ Swap بالمسار /swapfile عن طريق كتابة: sudo fallocate -l 4G /swapfile بعد إنشاء الملفّ، سنحتاج إلى تقييد الوصول إليه لكي لا يتمكن المستخدمون الآخرون أو العمليّات الأخرى من رؤية البيانات المكتوبة عليه: sudo chmod 600 /swapfile نمتلكُ الآن ملفّ Swap مضبوطًا على الصلاحيّات الصحيحة. لإخبار نظامنا بتهيئة الملفّ وإعداده ليكون قرص Swap، فلنطبّق: sudo mkswap /swapfile يمكننا الآن أن نخبر نظامنا أن يستخدم الملفّ الجديد عن طريق تطبيق: sudo swapon /swapfile وسيبدأ النظام باستخدامه لجلستنا الحاليّة، هناك مشكلة وهي أنّ النظام لن يستخدمه سوى لجلستنا الحاليّة وليس طوال الوقت، ولذلك علينا تعديل ملفٍ في النظام لجعل خادومنا يقوم بالمهمّة تلقائيًا عند الإقلاع. يمكنك فعل ذلك عبر كتابة: sudo sh -c 'echo "/swapfile none swap sw 0 0" >> /etc/fstab' مع هذه الإضافة، يجب أن يكون نظامك قادرًا على استخدام ملفّ Swap تلقائيًا عند كل إقلاع. أين الطريق من هنا؟ بدأتَ الآن بداية جيّدة في إعداد خادومك العامل بنظام لينكس. من هنا، هناك العديد من الأماكن التي يمكنك التوجّه إليها الآن. أولًا، قد تودّ أخذَ لقطةٍ احتياطية (snapshot) من خادومك بإعداداته الحاليّة. خذّ لقطةٍ احتياطية من إعداداتك الحاليّة إذا كنتَ مرتاحًا مع إعداداتك الحاليّة وكنتَ تودُّ استخدامها كقاعدةٍ أساسية في خواديمك المستقبليّة، فيمكنك أخذ لقطةٍ احتياطيّة لخادومك عبر لوحة تحكّم DigitalOcean. للقيام بهذا، قم بإطفاء خادومك من سطر الأوامر عبر كتابة: sudo poweroff الآن، في لوحة تحكّم DigitalOcean، يمكنك أخذ لقطةٍ احتياطية عبر زيارة لسان "Snapshots" الموجود في صفحة خادومك: بعد أخذ اللقطة الاحتياطية التي تريدها، ستكون قادرًا على استعمال تلك الصورة كقاعدةٍ لعمليات تثبيت وإعداد خواديمك المستقبلية عبر اختيار تلك اللقطة الاحتياطية من لسان "My Snapshots" كنظام تشغيل أثناء عمليّة الإنشاء: مصادر إضافيّة وخطواتٌ أخرى من هنا، يعتمد مسارك بشكلٍ كامل على ما تودّ فعله بخادومك. قائمة الدروس أدناه مرهقة للتطبيق، ولكنّها تمثّل جزءًا مهمًا من الإعدادات التي يجب تنفيذها من قبل المستخدمين بالخطوة التاليّة: كيف تُثبّت حزم LEMP كـ: Linux, PHP, Nginx و MySQL على أوبونتو 14.04 كيف تُثبّت حزم LAMP كـ: Linux, PHP, Apache و MySQL على أوبونتو 14.04 تثبيت سكربت إدارة المحتوى ووردبريس على خادوم Apache تثبيت سكربت إدارة المحتوى ووردبريس على خادوم Nginx تثبيت سكربت إدارة المحتوى دروبال على خادوم Apache تثبيت Node.js تثبيت Ruby on Rails مع RVM تثبيت Laravel, إطار عمل PHP تثبيت Puppet لإدارة البنى التحتية الخاتمة بعد هذا الدرس، يجب أن تكون صرتَ تعرف كيفيّة إعداد بنيةٍ تحتية جيّدة لخواديمك الجديدة. لحسن الحظّ، لديك قائمة جيّدة بالأفكار التي يمكنك تطبيقها كخطوةٍ تالية. يمكنك تصفّح المقالات الموجودة بقسم DevOps بموقع أكاديمية حسوب لرؤية المزيد من الدروس التي يمكنك تطبيقها. ترجمة -وبتصرّف- للمقال: Additional Recommended Steps for New Ubuntu 14.04 Servers.
  14. الإعدادقبل أن تبدأ بالعملية، تحتاج امتلاك التالي: خادوم (خادوم افتراصي خاص - VPS) من DigitlOcean. إذا كنت لا تمتلك واحدًا، فيمكنك التسجيل وإعداد واحدٍ جديد في غضون دقائق. اسم نطاق (domain) مُسجّل بالفعل. حاليًا لا يمكنك تسجيل اسم نطاق عبر DigitalOcean، بل يجب عليك استخدام شركة أخرى.الخطوة الأولى - البحث عن المعلومات باستخدام WHOISأوّل شيء يجب عليك فعله لإعداد اسم المُضيف (hostname) الخاصّ بك هو تغيير خادوم أسماء النطاقات (domain name server) إلى خواديم أسماء النطاقات من DigitalOcean. يمكنك القيام بهذا عبر الموقع الذي قمتَ من خلاله بشراء النطاق الخاصّ بك. إذا كنت لا تتذكر من أين قمت بشرائه، فيمكنك البحث عنه عبر استخدام "WHOIS"، والذي هو عبارة عن بروتوكول يمكنه القيام بعرض معلومات موقعٍ ما، مثل عنوان الـIP وتفاصيل تسجيل النطاق. افتح سطر الأوامر واكتب: whois example.comسيقوم WHOIS بعرض جميع التفاصيل المرتبطة بالموقع، بما فيها بيانات الاتصال التقني التي تتضمن اسم الجهة التي قمت بتسجيل نطاقك عندها. الخطوة الثانية — غير خادوم أسماء النطاقات الخاص بكاذهب إلى لوحة التحكم الخاصّة بالجهة التي قمت بتسجيل النطاق عندها وابحث عن الحقول المُسماة "Domain Name Server". هذه الحقول بدت بالنسبة لي كالتالي: قم بتوجيه خادوم أسماء النطاقات الخاصّ بك إلى DigitalOcean واملأ الحقول الثّلاثة الخاصّة بخادوم أسماء النطاقات. عندما تنهي ذلك، احفظ تغييراتك واخرج. خواديم أسماء النطاقات الخاصّة بـDigitalOcean هي: ns1.digitalocean.comns2.digitalocean.comns3.digitalocean.comيمكنك أن تتحقق الآن أنّ خواديم أسماء النطاقات الجديدة قد تمّ تسجيلها عبر استخدام WHOIS مجددًا، يجب على الخرج (output) أن يتضمّن المعلومات المحدّثة: Domain Name: EXAMPLE.COM Registrar: ENOM, INC. Whois Server: whois.enom.com Referral URL: http://www.enom.com Name Server: NS1.DIGITALOCEAN.COM Name Server: NS2.DIGITALOCEAN.COM Name Server: NS3.DIGITALOCEAN.COM Status: okعلى الرغم من أنّ خواديم أسماء النطاقات مرئية عبر WHOIS، إلّا أنّ التغييرات قد تأخذ ساعة أو اثنتين ليتم تطبيقها. الخطوة الثالثة - اضبط نطاقكالآن، يجب علينا الانتقال إلى لوحة التحكّم في DigitalOcean. في قسم الشبكة أو "Networking"، انقر على "Add Domain"، وقم بإدخال اسم النطاق وعنوان IP الخادوم الذي تريد ربطه بالنطاق. ملاحظة: اسم النطاق لا يجب أن يحوي www في البداية. ستصل إلى صفحة يمكنك من خلالها إدخال جميع بيانات موقعك. لإنشاء اسم مُضيف جديد، تحتاج فقط إلى ملأ ما يُعرف بـ"A record". إذا كنت تستعمل عنوان IPv6، فيجب عليك أن تملأ حقل "AAAA record". A Records: استخدم هذا الحقل لإدخال عنوان IP الخادوم الذي تريد استضافة نطاقك عليه وعنوان اسم المُضيف نفسه، كاسمٍ مرتبط مُرافق لنطاقك الرئيسي، مثلًا: test.example.comلإتمام العملية، قم بإنشاء اسم مُضيف جديد عبر إدخال كلمة "test" في حقل "hostname". يجب أن تبدو شاشتك كالتالي: احفظ التغييرات عبر الضغط على "Add new A record". يمكنك أيضًا ربط عنوان الـIP الخاصّ بك باسم نطاق لا يحوي أيّ شيءٍ قبله (يجب أن تقوم بهذا افتراضيًا عندما تقوم بإضافة نطاق): http://example.comللحصول على هذا، أنشئ اسم مُضيف جديد مع إدخال الرمز "@" في حقل hostname. يجب أن تبدو شاشتك شيئًا كالتالي: يمكنك حفظ التغييرات عبر الضغط على مفتاح Enter. AAAA Records: استخدم هذا الحقل لإدخال عنوان IPv6 الخادوم الذي تريد استضافة نطاقك عليه وعنوان اسم المُضيف نفسه، كاسمٍ مرتبط مُرافق لنطاقك الرئيسي أو يمكنك أيضًا ربط عنوان الـIP الخاصّ بخادومك مع اسم النطاق دون أيّ شيءٍ قبله. لإتمام هذا، أنشئ اسم مُضيف جديد مع الرمز “@” في حقل hostname. يجب أن تبدو شاشتك كالتالي: احفظ التغييرات عبر الضغط على "CREATE". CNAME Records: تعمل "CNAME record" كاختصار لـ"A record"، عبر توجيه نطاقٍ فرعي إلى "A record". إذا تغيّر عنوان الـIP لـ"A record" فسيقوم "CNAME record" بالتوجيه إلى العنوان الجديد. لإضافة www إلى عنوان الويب الخاصّ بك، اضغط على "Add a new CNAME record" واملأ الحقلين الاثنين. يجب أن ترى شيئًا كالتالي: إذا كنت تحتاج أن تقوم بإعداد خادوم بريد على نطاقك، فيمكنك القيام بذلك عبر استخدام MX Records. MX Records: يجب أن يتم ملأ حقول MX Records باسم المُضيف وأولوية خادوم البريد الخاصّ بك، والتي هي عبارة عن قيمة تحدد الترتيب الذي يجب أن يتم استخدامه أثناء محاولة الوصول إلى خواديم البريد الإلكتروني. تنتهي جميع العناوين دومًا بـ"." عنوان MX Record صحيح سيبدو شيئًا كـ: mail1.example.com. أدناه تجد مثالًا على عناوين MX records مُعدّة لنطاقٍ يستخدم خواديم بريد جوجل (لاحظ النقطة في نهاية كل عنوان): إنهاء العمليةبمجرد أن تقوم بملأ جميع الحقول المطلوبة، ستأخذ معلوماتك وقتًا إلى أن يتم تحديثها. يجب أن يكون اسم النطاق الخاصّ بك جاهزًا في غضون بضع ساعات. بعد بعض الوقت، يمكنك أن تتأكد مما إذا كان اسم المُضيف الجديد قد تمّ تسجيله أم لا عبر استخدام: ping test.example.comيجب أن ترى شيئًا مثل: # ping test.example.com PING test.example.com (12.34.56.789) 56(84) bytes of data. 64 bytes from 12.34.56.789: icmp_req=1 ttl=63 time=1.47 ms 64 bytes from 12.34.56.789: icmp_req=2 ttl=63 time=0.674 msيجب أن تكون قادرًا على الوصول إلى الموقع كذلك عبر المتصفّح. ترجمة -وبتصرّف- للمقال How To Set Up a Host Name with DigitalOcean لصاحبته Etel Sverdlov.
  15. سنناقش في هذا الدرس أهمّية تحديث كلّ شيءٍ متعلّق بموقع ووردبريس الخاصّ بك إلى آخر الإصدارات المتوفّرة وأهميّة التحديثات بشكلٍ عام، وهو من أهمّ الأمور التي يمكنك القيام بها لزيادة حماية وأمان موقعك. لماذا نقوم بالتحديث؟السؤال الحقيقي يجب أن يكون "ولما لا"؟ يقوم مطوروا ووردبريس بإرسال التحديثات إلى المستخدمين لسببٍ معيّن في النهاية، حيث أنّ هذه التحديثات تحتوي على إصلاحاتٍ لثغراتٍ خطيرة يمكن أن يستغلها المهاجمون لمهاجمة موقعك، مما يجعل التحديث ضرورة لا مفرّ منها. تحديثات سكربت ووردبريس مهمّة بنفس أهمّية تحديثات أنظمة التشغيل والتطبيقات الأخرى، يتم دومًا اكتشاف ثغراتٍ جديدة في البرمجيات كلّ فترة، ويتم مع ذلك إرسال ترقيعاتٍ جديدة لترقيع هذه الثغرات كلّ فترة إلى أجهزة المستخدمين، مما يجعل التطبيق أكثر أمنًا" - Ken Westin الخبير الأمن في Tripwire, Inc. أنواع التحديثاتقبل أن نتابع، من المهمّ أن نفهم أنواع التحديثات المختلفة المتوفّرة في سكربت ووردبريس. يشير Tony Perez في تدوينة حديثة إلى أنّه هناك 3 أنواع مختلفة من التحديثات: تحديثات الأمان، الترقيعات والإصدارات الرئيسية. تحديثات الأمان هي بالضبط كما تبدو عليه من اسمها. يتم إصدارها بسرعة وتحتوي فقط على بضع إصلاحاتٍ لثغراتٍ موجودة تم اكتشافها مؤخرًا. تكون هذه التحديثات عادةً على شاكلة أرقام الإصدارات مثل 4.2.1. تحديثات الترقيعات أكبر قليلًا، لا تحتوي هي الأخرى على مميزاتٍ جديدة، ولكنّها تقوم بتحديث النظام وعادةً ما تتضمن تحديثاتٍ أمنية كذلك، كما أنّه يتم إصدارها بصفة دورية ومن الممكن توقّع وقت صدور الترقيع الجديد. وأمّا عن التحديثات الرئيسية من الانتقال من الإصدار 3.9 إلى الإصدار 4.0 فهذا تحديثٌ جوهري، يحتوي مميزاتٍ جديدة وإصلاحاتٍ للمشاكل الأمنية المعروفة بالإضافة لأمورٍ أخرى، كما أنّه يتم التدوين عنها في مدونة ووردبريس وفي العديد من المواقع الإخبارية الأخرى، حيث أنّها تحديثات كبيرة ويجب على الجميع معرفتها. قد تقوم هذه التحديثات أحيانًا بتحطيم شكل موقعك بسبب عدم توافقية مع القالب الذي تستخدمه مثلًا، ولكن مع وجود نسخة احتياطية من موقعك، فيجب ألّا تكون مشكلةً بالنسبة لك. الفشل بالتحديث يعني مشكلة أعظم كما ذكرنا سابقًا، عدم قيامك / فشلك بتحديث أيّ إضافات أو قوالب ووردبريس مثبّتة على موقعك قد يعرّضك لخطرٍ كبير، وما قد لا تفهمه هو "لماذا"؟ بمجرّد أن يتوفّر ترقيعٌ معيّن كتحديث، يتزايد الخطر على المستخدمين الذين لم يقوموا بالتحديث بصورةٍ كبيرة، لأنّ المخترقين سيكونون قادرين على قراءة الشفرة المصدرية للترقيع ومعرفة الثغرة الحقيقية وبالتالي يمكنهم استغلالها ضدّ مواقع ووردبريس التي لم تقم بالتحديث والترقيع. هناك فترة زمنية قصيرة ما بين توفّر الترقيع كتحديث لووردبريس وما بين قيام المُخترقين بالبدء باستغلال هذه الثغرة على مواقع ووردبريس التي لم تقم بالترقيع، وهذا هو الوقت الذي يجب على المستخدمين الانتباه إليه، حيث أنّ مجرّد الانتظار إهمالًا يتركك عرضةً لهجماتٍ أكثر - Ken Westin. يمكن قول نفس الأمر بخصوص القوالب والإضافات، صحيحٌ أنّها ليست جزءً من لبّ نواة ووردبريس، ولكنّها أيضًا قد تحتوي على ثغرات تمكّن المخترقين من استغلالها لاختراق موقعك، وأيضًا يتم اكتشاف هذه الثغرات كلّ فترة وتصدر تحديثات لترقيعها كلّ فترة، وعليك تثبيتها بمجرّد توفّرها. بعض السمات والقوالب تكون مبرمجة بصورة سيئة ويكون بها العديد من الثغرات ويجب عليك الانتباه إلى ذلك، كما يجب عليك تثبيت واستخدام القوالب والإضافات التي تستعملها فقط وحذف كلّ شيء لا تستعمله. إدارة تحديثات ووردبريسأفضل طريقة للتأكّد من أنّ كلّ شيء على موقعك محدّث هو جعل عملية التحقق من وجود تحديثات متوفّرة هي مهمّة روتينية أخرى على جدولك (لو لم تكن تقنيًا، فيجب عليك البحث عن استضافة تقوم تلقائيًا بتحديث جميع القوالب والإضافات والنواة الخاصّة بووردبريس)، يجب عليك التحقق من توفّر التحديثات بنفسك كلّ يوم لتجنّب أي مشاكل أمنية قد تحصل. منذ الإصدار 3.7 من ووردبريس فإنّ المنصة تسمح بالتحديث التلقائي بسهولة، بمجرّد تفعيل هذا الخيار، فإنّه هذا يعني أنّ نواة موقعك ستقوم بالتحديث تلقائيًا عند توفّر تحديثات جديدة بدون أيّ تدخّل منك. طبعًا لا يمكن فعل نفس الشيء بالنسبة للقوالب والإضافات، حيث يجب عليك القيام بتحديثها يدويًا. الخاتمةتحديثات ووردبريس مهمّة للغاية، بل ومهمّة جدًا، ومن واجبك الاهتمام بتحديث كلّ شيءٍ موجود على موقعك إلى الإصدارات الأخيرة المتوفّرة، وإلّا فإنك تترك بابك مفتوحًا للمخترقين ليخترقوك، إنّها مسألة وقت. ترجمة -وبتصرف- للمقال: The WordPress Developer’s Guide to Security: Updates لصاحبه: Brenda Barron.
  16. في الدرس السابق تحدثنا عن طرق تثبيت ووردبريس لأول مرة بأمان. في هذا الدرس، سنتحدّث عن كيفية تأمين موقع ووردبريس بعد تثبيته، سنتحدّث عن أساليب أفضل للحماية فوق مستوى نصائح "اختر كلمة مرور أكثر تعقيدًا" وسنحاول الغوص قليلًا في موضوع أمان ووردبريس. تقييد عمليات تسجيل الدخولواحدٌ من أول الأشياء التي يجب عليك فعلها لتأمين موقع ووردبريس الخاصّ بك هو تقييد عدد المرّات التي يمكن لشخصٍ ما أن يحاول تسجيل الدخول بها إلى الموقع. يحاول العديد من المخترقين القيام بهجمات التخمين أو ما يعرف بـ Bruteforce لمحاولة كسر اسم المستخدم / كلمة المرور الخاصّيَن بك، وحتّى لو لم تنجح هذه الهجمات في اختراق موقعك، فإنّه ستقوم باستهلاك جزء كبير من موارد خادومك وستقوم بوضع حملٍ عليه. عبر تقييد عمليات تسجيل الدخول، يمكنك منع المخترقين من محاولة القيام بهجمات Bruteforce. بمجرّد أن يقوم بمحاولة تخمين كلمة المرور مرتين أو ثلاث، فسيتم حظر عنوان الـIP الخاصّ به. يمكنك القيام بهذا الأمر بسهولة عبر تثبيت إصافة Limit Login Attempts، صحيحٌ أنّه لم يتم تحديثها منذ سنتين ولكنّها تمتلك مميزاتٍ رائعة، ولكن ربّما تودّ تجاهلها حاليًا بسبب انقطاع دعمها عن التحديثات الأمنية. عوضًا عن هذا، فإننا ننصح بإضافة Login Lockdown، تسمح لك هذه الإضافة أيضًا بتقييد عدد مرّات تسجيل الدخول الفاشلة قبل أن يتم حظر عنوان الـIP الخاصّ بالمستخدم الذي يحاول الدخول، كما يمكنك اختيار المدّة التي تريد حظر عنوان الـIP خلالها، ستصبح هجمات Bruteforce أصعب بكثير بعد تثبيت هذه الإضافة وضبطها، لأنّه سيجب على المخترقين استخدام وسيط (Proxy) بعد كلّ 3 محاولات فاشلة لتسجيل الدخول، وسيجب عليهم تغيير ذلك الوسيط آلاف المرّات ليتمكّنوا من تحقيق الهجوم، وهو الأمر الذي لا يتوفّر لديهم غالبًا. حظر المستخدمين الذين يحاولون تسجيل الدخول باسم Adminمن المهم ألّا تستخدم اسم "admin" كاسم مدير الموقع على موقعك، ومن المهم أيضًا أن تقوم بحظر كلّ من يحاول الدخول إلى ذلك المستخدم (طالما أنتَ لستَ المدير، والحساب غير موجود، فلماذا تحاول الدخول؟ إذن فأنتَ مُخترِق)، يمكنك القيام بهذا عن طريق إضافة Wordfence. تسمح لك هذه الإضافة بإعداد ميزة الحظر التلقائي هذه، بالطبع، هناك العديد من المميزات الأخرى في هذه الإضافة التي يمكنك استخدامها من أجل الحماية، مثل الاستيثاق الثنائي (two-factor authentication)، حظر الهجمات الشائعة والمزيد. ضبط صلاحيات الملفّات الصحيحةشيءٌ آخر يمكنك فعله هو ضبط صلاحياتٍ مناسبة للملفّات على موقعك. وفقًا لـ WordPress.org، فإنّ استخدام صلاحيات 777 للملفّات / المجلّدات هو أمرٌ خطير للغاية ويسمح للجميع أن يقوموا بتعديل ملفّات موقعك وإضافة أكواد خبيثة أو حتّى حذف الموقع بالكامل. يجب عليك أن تقوم بوضع صلاحيات 600 لملفّ wp-config.php، بينما يجب عليك أن تقوم بتعيين ملفّاتك الأخرى إلى وضع صلاحيات 640 أو 644، كما يجب أن تكون المجلّدات الموجودة على موقعك بالصلاحيات 750 أو 755. يمكنك تعلّم المزيد عن الصلاحيات عبر دليل ووردبريس الرسمي لتغيير الصلاحيات. إنشاء ملف htaccess.إذا كنتَ تريد تركيبة روابط دائمة (permalinks) جميلة لموقعك فإنّك ستحتاج ملفّ htaccess. عبر إضافة واحدٍ إلى موقعك فإنّك ستقوم بتحسين مستوى الحماية قليلًا، صحيحٌ أنّه ليس حلًا كاملًا ولا يمكنه فعل شيء جوهري لوحده ولكنّه إضافة جيّدة. هناك شرح شامل منشور على الويب حول إنشاء ملفّ htaccess. ، لن نقوم بشرح تلك العملية بالكامل هنا لأنّ العملية مشروحة بذاك الدليل بشكلٍ شامل. بمجرّد أن تقوم باتّباع ذاك الشرح فإنّه سيصبح بإمكانك منع الوصول إلى ملفّات معيّنة على موقع ووردبريس الخاصّ بك. إذا لم يكن الناس قادرين على الوصول إلى تلك الملفّات التي تريدها فلن يكونوا قادرين على العبث بها. لزيادة صعوبة اختراق موقع ووردبريس الخاصّ بك ستحتاج إلى إضافة بضع سطور من الأكواد لحظر الوصول إلى ملفّات معينة مثل: wp-config.phpreadme.htmllicense.txtwp-includes directoryيمكنك أيضًا منع الوصول إلى امتدادات معيّنة للملفّات، مثل ملفّات النسخ الاحتياطي، الإعدادات، السجلات المحفوظة على الخادوم.. إلخ. بشكلٍ عام، يجب حظر الوصول إلى أيّ شيء يتعلّق بالتصميم والتطوير والتوثيق الخاصّ بخلفيّة الموقع (back-end). إذا كنتَ تريد حظر الوصول إلى مجلّد إضافة أو قالب معيّن أو مسارٍ آخر على موقعك، فيمكنك حظر المجلّد بأكمله إن أردت. هذه حركة جيّدة للقيام بها في كلّ مجلّد لا يمتلك بداخله ملفّ index. حيث أنّ المجلّدات التي لا تحتوي على ملفّات index ستقوم بعرض كلّ الملفّات الموجودة بداخل ذاك المجلّد، مما يعطي معلوماتٍ هامّة يمكن استغلالها من طرف المخترقين، لذا يجب عليك إخفاؤها. إخفاء صفحة تسجيل الدخولهذا تعديلٌ آخر يمكن القيام به عن طريق htaccess. ولكن مختلف قليلًا عن التعديلات الأخرى ولذلك سنذكره هنا. يمكنك حظر وصول أيّ شخص إلى صفحة تسجيل الدخول الخاصّة بموقعك ومنح حقّ الوصول فقط إلى عنوان الـIP الخاصّ بك، وطبعًا، يجب أن يكون هناك مستخدمٌ واحد فقط للموقع بأكمله، وبالتالي فتلك ليست طريقة عملية حقًا لاستخدامها. إذا كنتَ تريد إبقاء خيارٍ مفتوح لإضافة كتّابٍ ومستخدمين آخرين إلى موقعك لاحقًا، فيمكنك استخدام إضافة Secure Hidden Login. تسمح لك هذه الإضافة بإخفاء حقول الإدخال من صفحة تسجيل الدخول الخاصّة بموقعك، ويتم إظهار حقول الإدخال لاسم المستخدم وكلمة المرور فقط عند الضغط على اختصاراتٍ معيّنة على لوحة المفاتيح، فإن حاول أحدهم فتح صفحة تسجيل الدخول، فلن يتمكّن من ذلك دون أن يعرف ما هي اختصارات لوحة المفاتيح التي تقوم بعرض صفحة تسجيل الدخول. إزالة وسم Generatorيقوم المخترقون بكلّ شيءٍ قد يمكّنهم من اختراق موقعك، واحدٌ من هذه الأشياء هو سكربتٌ شهير يستخدمه المخترقون لالتقاط المواقع التي تعمل بإصدارات معيّنة من ووردبريس عبر بصمات الأقدام (Footprints)، بصمات الأقدام هي عبارة عن سطور متعددة من الأكواد يمكن استخدامها للتعرّف على هوية موقع ويب ما، لسوء الحظّ فإن ووردبريس يستخدم هذه البصمات مما يجعل مواقع ووردبريس الموجودة على الشبكة قابلة للاكتشاف بسهولة. قد تبدو بصمة القدم الخاصّة بموقع ووردبريس كشيءٍ مثل: <meta name="generator" content="WordPress 3.8.4" />يمكنك إزالة هذا الوسم إن أردت من الشفرة المصدرية الخاصّة بموقعك، ولكن ما يزال عليك إضافة الشفرة التالية إلى ملفّ functions.php الخاصّ بقالبك: remove_action('wp_head', 'wp_generator');بعد هذا، لن يقوم موقع ووردبريس الخاصّ بك بتعريف نفسه على أنّه موقعٌ يعمل بسكربت ووردبريس، مما يصعّب المهمّة على المُخترقِين. تفعيل الاستيثاق الثنائي Two-Step Authenticationشيءٌ آخر يمكنك فعله لتأمين موقعك هو تفعيل الاستيثاق الثنائي أو ما يدعى بـ Two-Step Authentication. عندما تقوم بطلب خطوتين للاستيثاق من مستخدمي موقعك عوضًا عن خطوة واحدة فإنّك تصعّب الأمر جدًا على المُخترقِين. هناك عدّة إضافات موجودة لتفعيل الاستيثاق الثنائي على ووردبريس ومن بينها: Clef: بمجرّد تثبيت هذه الإضافة، فإنّ كل ما سيجب عليك فعله هو فتح تطبيق Clef على هاتفك المحمول وتركيز كاميرا الهاتف على شاشة الحاسوب الخاصّة بك، بعدها سيتم فتح القفل الموجود على موقعك وتتمكن من الدخول. Duo Two-Factor Authentication: بعد أن تقوم بإدخال كلمة المرور الخاصّة بك في مربّع الإدخال التقليدي، سيجب عليك إكمال خطوةٍ أخرى لإتمام عملية تسجيل الدخول، مثل تأكيد تسجيل الدخول من على هاتفك الذكي عبر رسالة SMS وغيرها من الطرق.الخاتمةإدارة الحماية على موقع ووردبريس الخاصّ وإعداد عمليات تسجيل الدخول ليتم تقييدها قدر المستطاع هو أمرٌ قد يستغرق منك بعض الوقت، ولكن بمجرّد أن تكتمل هذه الأمور، فإنّ موقعك سيكون أكثر أمانًا لمستخدميه. ترجمة -وبتصرف- للمقال The WordPress Developer’s Guide to Security: Management & Logins لصاحبته Brenda Barron.
  17. عند الاتصال بخادوم ويب أو تطبيق، يتم الردّ على كلّ طلب HTTP يتمّ استقباله من طرف الخادوم برمز حالة HTTP أو “HTTP status codes”. رموز حالة HTTP هي عبارة عن رموز مكوّنة من 3 أرقام يتم تصنيفها إلى 5 أصناف مختلفة. يمكن أن يتمّ التعرّف على صنف رمز الحالة بسرعة عبر الرقم الأوّل منه: 1xx: معلومة 2xx: نجاح 3xx: إعادة توجيه 4xx: خطأ من طرف جهاز العميل 5xx: خطأ من طرف الخادوميركّز هذا الدرس على استكشاف أبرز رموز أخطاء HTTP التي قد تصادفك مثل 4xx و5xx وإصلاحها. من منظور مدير النظام، هناك العديد من الحالات التي قد تجعل خادوم الويب يجيب طلبًا معيّنًا برمز خطأ معيّن، سنقوم بتغطية أكثر الأسباب الشائعة التي تؤدي إلى ذلك بالإضافة إلى حلولها. لمحة عامة عن أخطاء العميل والخادومأخطاء العميل، أو رموز حالة HTTP من 400 إلى 499، هي نتيجة لطلبات HTTP تمّ إرسالها بواسطة جهاز مستخدم (مثل متصفح ويب أو أيّ عميل HTTP آخر), صحيح أنّ هذا النوع من الأخطاء مرتبط بالعميل، إلّا أنّه سيكون من المفيد معرفة رمز الخطأ الذي يصادف المستخدم للتحقق مما إذا كان يمكن إصلاح المشكلة من إعدادات الخادوم. يتم إرجاع أخطاء الخادوم أو بالأحرى رموز حالة HTTP من 500 إلى 599 بواسطة خادوم الويب عندما يكتشف حصول مشكلة، وإلّا فإنّه لن يكون قادرًا على معالجة الطلب. نصائح عامة عن اكتشاف الأخطاء وإصلاحهاعند استخدام متصفّح ويب لاختبار خادوم ويب، قم بتحديث المتصفّح بعد تطبيق التغييرات على الخادوم.تحقق من سجلات الخادوم للمزيد من التفاصيل عن كيفية قيام الخادوم بمعالجة الطلبات. كمثال، تُنتِج خواديم الويب مثل Apache وNginx ملفّين اثنين يدعيان access.log وerror.log يمكن أن يتم فحصهما للحصول على المعلومات منهما.تذكّر أنّ تعريفات رموز حالة HTTP هي جزء من معيار مُضمَّن من قبل التطبيق الذي يخدم الطلبات. هذا يعني أنّ رمز الحالة الذي يتم إرجاعه إليك يعتمد على كيفية معالجة برنامج الخادوم لخطأ معيّن. سيفيدك هذا الدرس عمومًا لتوجيهك في المسار الصحيح بخصوص ذلك.الآن وبعد أن امتلكت فهمًا جيدًا لرموز حالة HTTP، سنلقي نظرةً على الأخطاء الشائعة التي قد تصافدك. 400 Bad Requestرمز الحالة 400، أو خطأ Bad Request، يعني أنّ طلب الـHTTP الذي تمّ إرساله إلى الخادوم كان يحوي دوالًا ومُعامِلات غير صحيحة. إليك بعض الأمثلة التي قد يطرأ فيها خطأ Bad Request والذي رقمه 400: كعكة المستخدم (Cookie) المرتبطة بالموقع تالفة، مسح خبيئة المتصفّح والكعكات قد يحلّ هذه المشكلة. طلب تالف بسبب متصفّح ويب سيء وقديم مثلًا. طلب تالف بسبب خطأٍ بشري مثل عند تشكيل طلبات HTTP بشكلٍ يدوي (مثل استعمال curl بطريقة غير صحيحة).401 Unauthorizedرمز الحالة 401، أو خطأ Unauthorized أو عدم التصريح يعني أنّ المستخدم يحاول الوصول إلى صفحة أو مادّة غير مخوّل له بالوصول إليها أو لم يتم السماح له بذلك بشكلٍ صحيح. يعني هذا أنّه يجب على المستخدم توفير بيانات الدخول ليتمكّن من رؤية البيانات والموارد المحمية. كمثال، إذا حاول مستخدم الوصول إلى صفحة محمية باستيثاق HTTP، كما في درسنا كيفية إعداد استيثاق http مع nginx على 14.04 ubuntu، ففي هذه الحالة، سيتلقّى المستخدم رمز الحالة "401" إلى أن يقوم بتوفير اسم مستخدم وكلمة مرور (تلك الموجودة في ملفّ htpasswd.) لخادوم الويب. 403 Forbiddenرمز الحالة 403، أو خطأ Forbidden أو "محظور"، يعني أنّ المستخدم قام بطلبٍ خاطئ إلّا أنّ الخادوم يرفض تنفيذه على كلّ حال بسبب عدم توفّر الصلاحيات الكافية للوصول إلى الصفحة المطلوبة. إذا كنت تواجه خطأ 403 بشكلٍ غير متوقّع، فهناك بضع أسباب يمكن أن نشرحها هنا. صلاحيات الملفاتتطرأ أخطاء 403 عادةً عندما يكون المستخدم الذي يشغّل عملية خادوم الويب لا يمتلك الصلاحيات الكافية لقراءة الملفّ الذي تمّ طلبه. لإعطاء مثال عن الكشف عن هذا الخطأ وإصلاحه، افترض حصول الوضع التالي: يحاول المستخدم الوصول إلى ملفّ الفهرس الخاصّ بالخادوم من http://example.com/index.htmlعملية تشغيل خادوم الويب مملوكة للمستخدم www-dataيوجد ملفّ الفهرس على الخادوم بالمسار usr/share/nginx/html/index.html/إذا كان المستخدم يحصل على خطأ 403، فتأكّد أنّ المستخدم www-data يمتلك الصلاحيات الكافية لقراءة ذلك الملفّ. يعني هذا عادةً أنّه يجب ضبط صلاحيات "الآخرين" أو الـ"Others" إلى السماح بالقراءة ليتم حلّ المشكلة، هناك عدّة طرق لتنفيذ هذا، ولكنّ هذا الأمر سيعمل في هذه الحالة: sudo chmod o=r /usr/share/nginx/html/index.html htaccess.سببٌ آخر قد يكون وراء خطأ 403 وغالبًا ما يحصل عن غير قصد، هو الاستخدام الخاطئ لملفّ htaccess.، يمكن أن يتمّ استخدام ملفّ htaccess. لمنع الوصول إلى صفحاتٍ أو موارد معيّنة من قبل عناوين IP محددة أو نطاقات، استخدام هذا الملفّ بشكلٍ غير صحيح قد يكون المشكلة مثلًا. إذا كان المستخدم يحصل على خطأ 403 بشكلٍ غير متوقع، فتأكّد من أنّ ملفّ الـhtaccess. الخاصّ بك ليس المسؤول عن ذلك. ملف الفهرس غير موجودإذا كان المستخدم يحاول الوصول إلى مجلّد لا يمتلك بداخله ملفّ فهرس افتراضيًا، ولم يكن خيار السماح بسرد محتويات المجلّدات مفعّلًا، فإنّ خادوم الويب سيُرجع خطأ حظر 403. كمثال، إذا كان المستخدم يحاول الوصول إلى http://example.com/emptydir ولم يكن هناك ملفّ فهرس في المجلّد emptydir على الخادوم، فإنّه سيتم إرجاع رمز حالة 403. إذا كنت تريد تفعيل خيار سرد محتويات المجلّدات في حال عدم وجود ملفّ فهرس بداخلها، فيمكنك القيام بذلك من إعدادات خادوم الويب الخاصّ بك. 404 Not Foundرمز الحالة 404، أو خطأ Not Found، يعني أنّ المستخدم كان قادرًا على التواصل مع الخادوم إلّا أنّه لم يتمكن من إيجاد الملفّ المطلوب أو الصفحة المنشودة. يمكن أن تطرأ أخطاء 404 في الكثير من الحالات. إذا كان المستخدم يتلقّى خطأ 404 بشكلٍ غير متوقّع، فإليك بعض الأسئلة التي يجب أن تسألها للمساعدة في تفحّص المشكلة وإصلاحها: هل الرابط الذي وجّهَ المستخدم إلى خادمك يحتوي على خطأ بالكتابة؟ هل قام المستخدم بكتابة العنوان الخاطئ؟ هل الملفّ موجود في المسار الحالي للخادوم؟ وهل تمّ نقله أو نقل الصفحة المطلوبة إلى مكانٍ آخر أو حذفها من الخادوم؟ هل تمّ ضبط إعدادات الخادوم إلى مسار الجذر الرئيسي المطلوب؟ هل المستخدم الذي يملك العملية المُشغّلة لخادوم الويب يمتلك الصلاحيات اللازمة للوصول إلى المسار الذي يحوي الملفّ بداخله؟ (تلميح: تتطلب المجلّدات صلاحيات القراءة والتنفيذ لتستطيع الوصول إليها). هل يتمّ الوصول إلى الملفّ أو الصفحة عبر وصلة رمزية (symbolic link)؟ إذا كان الأمر كذلك، فتحقق من أن خادوم الويب مضبوط ليتبع الوصلات الرمزية.500 Internal Server Errorرمز الحالة 500، أو 500 Internal Server Error يعني أنّ الخادوم غير قادر على معالجة الطلب لسببٍ مجهول. أحيانًا سيظهر هذا الرمز عندما تكون أخطاء 5xx أكثر عرضةً لتكون هي سبب المشكلة. عادةً ما يكون أبرز سببٍ مسبب لهذا الخطأ هو وجود مشكلة في إعدادات الخادوم (مثل ملفّ htaccess. تالف) أو حزم ناقصة (مثل محاولة تنفيذ سكربت PHP دون وجود حزمة PHP مثبّتة بشكلٍ صحيح على الخادوم). 502 Bad Gatewayرمز الحالة 502، أو 502 Bad Gateway، يعني أنّ الخادوم هو عبارة عن خادوم بوّابة أو وسيط (proxy)، وأنّه لا يتلقّى ردًا صحيحًا من خواديم الواجهة الخلفية (backend servers) التي يجب أن تقوم بمعالجة الطلب. إذا كان الخادوم المطلوب هو عبارة عن خادوم وسيط عكسي (reverse proxy server)، مثل موازِن للحِمل، فإليك بعض الأمور التي يمكنك التحقق منها: أنّ خواديم الواجهة الخلفية (حيث يتم توجيه طلبات HTTP) تعمل بشكلٍ صحيح. أنّ الخادوم العكسي مضبوط بشكلٍ صحيح، مع تحديد الخواديم الصحيحة للواجهة الخلفية. أنّ اتصال الشبكة بين خواديم الواجهة الخلفية وبين خادوم الوسيط العكسي يعمل بشكلٍ جيّد. إذا كان بإمكان الخواديم أن تتواصل عن طريق منافذ أخرى، فتأكّد أنّ الجدار الناري يسمح بمرور التدفّق (Traffic) بينها. إذا كان تطبيق الويب الخاصّ بك مضبوطًا للاستماع إلى socket، فتأكّد أنّ الـsocket موجودة في المسار الحالي وأنّها تمتلك الصلاحيات الكافية.503 Service Unavailableرمز الحالة 503، أو خطأ Service Unavailable، يعني أنّ الخادوم قد تحمّل فوق طاقته أو أنّه تحت الصيانة، يوحي هذا الخطأ أنّ الخدمة يجب أن تعود إلى العمل في وقتٍ ما من الزمن. إذا لم يكن الخادوم تحت الصيانة، يمكن لهذا أن يشير إلى أنّ الخادوم لا يملك الموارد الكافية من المعالج والذاكرة العشوائية لمعالجة جميع الطلبات الواردة، أو أنّ خادوم الويب يحتاج إلى أنّ يتم إعداده ليسمح بالمزيد من المستخدمين والعمليات. 504 Gateway Timeoutرمز الحالة 504، أو خطأ Gateway Timeout، يعني أنّ الخادوم هو عبارة عن خادوم بوّابة أو خادوم وسيط (proxy)، وأنّه لا يتلقّى ردًا من خواديم الواجهة الخلفية في فترة الوقت المسموح بها. يمكن لهذا الخطأ عادةً أن يحصل في الحالات التالية: اتصال الشبكة بين الخواديم ضعيف. خواديم الواجهة الخلفية التي تقوم بتنفيذ الطلب بطيئة جدًا، بسبب الأداء الضعيف. فترة المهلة لخادوم البوابة أو الوسيط قصيرة جدًا.الخاتمةيجب أن تكون قد صرتَ الآن مُدركًا لأبرز رموز أخطاء HTTP وأبرز الحلول المتوفّرة لهذه الأخطاء، يجب أن تمتلك أساسياتٍ جيّدة لاكتشاف الأخطاء وإصلاحها على خواديم الويب الخاصّة بك أو تطبيقاتك. ترجمة -وبتصرف- للمقال How To Troubleshoot Common HTTP Error Codes لصاحبه Mitchell Anicas.
  18. ما هي MySQL؟MySQL هي عبارة عن أداة إدارة قواعد بيانات شهيرة تستخدم لغة استعلامات SQL للوصول إلى البيانات والتعامل معها، يمكن استخدامها بسهولة لإدارة البيانات ضمن المواقع أو تطبيقات الويب. عمليات النسخ الاحتياطي مهمة جدًا لأي نوع من البيانات، وهذا مرتبط بشدّة عندما نتحدث عن قواعد البيانات. يمكن نسخ قواعد بيانات MySQL احتياطيا بواسطة عدة طرق سنشرحها في هذا الدرس. سنستخدم خادوم Ubuntu 12.04 مع MySQL 5.5 في شرحنا هذا. تأتي معظم توزيعات لينكس بإصداراتٍ حديثة من MySQL ويجب ألّا تواجه صعوبةً في تطبيق نفس المهام بطريقةٍ مشابهة على تلك التوزيعات. نسخ قاعدة بيانات MySQL باستخدام mysqldumpواحدة من أكثر الطرق شيوعا لعمل النسخ الاحتياطي لقاعدة بيانات MySQL هي استخدام أمرٍ يدعى "mysqldump". النسخ الاحتياطيالشكل الأساسي للأمر هو: mysqldump -u username -p database_to_backup > backup_name.sqlالاستعادةلاستعادة نسخة قاعدة بيانات MySQL مصنوعة بـmysqldump، يمكنك ببساطة إعادة توجيه الملفّ إلى MySQL مرةً أخرى. نحتاج إنشاء قاعدة بيانات فارغة لاستضافة البيانات التي سنقوم باستيرادها مجددًا. أوّلًا، قم بالولوج إلى MySQL عبر كتابة: mysql -u username -pأنشئ قاعدة بيانات جديدة الآن - والتي ستحوي جميع البيانات الموجودة في نسخة قاعدة البيانات التي قمت بنسخها مسبقًا - ومن ثمَّ، قم بالخروج: CREATE DATABASE database_name; exitالآن، يمكننا إعادة توجيه ملفّ النسخة إلى قاعدة البيانات الجديدة التي قمنا بإنشائها مسبقًا عبر استخدام الأمر: mysql -u username -p database_name < backup_name.sqlيجب أن يتم استعادة بياناتك الآن إلى قاعدة البيانات الجديدة التي أنشئتها. نسخ جدول MySQL احتياطيا إلى ملف نصييمكنك تصدير البيانات من جدول ما مباشرة إلى ملف نصي عبر استخدام جملة SELECT مع MySQL. الشكل الأساسي للعملية هو: SELECT * INTO OUTFILE 'table_backup_file' FROM name_of_table;ستقوم هذه العملية بحفظ بيانات الجدول إلى الملف النصي المطلوب. وسيفشل في حال كان هناك اسم ملف آخر موجود بنفس المسار الذي قررت حفظ الملف إليه. ملاحظة: يقوم هذا الخيار بحفظ بيانات الجدول فقط. إذا كانت بنية جدولك معقّدة ويجب حفظها كما هي، فالأفضل أن تستخدم طريقةً أخرى. نسخ معلومات MySQL احتياطيا باستخدام automysqlbackupهناك برنامج أداة يدعى "automysqlbackup" متوفّر في مستودعات توزيعة أوبونتو الرسمية. يمكن أن يتم جدولة هذه الأداة يدويا للقيام بعمليات النسخ الاحتياطي بأوقات محددة. لتثبيت هذا البرنامج، طبق الأمر التالي في الطرفية: sudo apt-get install automysqlbackupوقم بتشغيله عبر الأمر: sudo automysqlbackupستجد ملف الإعدادات الرئيسي لـautomysqlbackup في المسار "etc/default/automysqlbackup/". افتحه بصلاحيات الجذر: sudo nano /etc/default/automysqlbackupيمكنك أن ترى أن هذا الملف يقوم افتراضيا بتعيين العديد من المتغيرات باستخدام ملف MySQL الموجود في المسار "etc/mysql/debian.cnf/". وهو يقوم بقراءة اسم المستخدم وكلمة المرور وقواعد البيانات التي يجب نسخها احتياطيًا من هذا الملفّ. المسار الافتراضي للنُسَخ الاحتياطية هو “/var/lib/automysqlbackup”. ابحث عن هذا المسار لترى بنية النُسَخ الاحتياطية: ls /var/lib/automysqlbackup daily monthly weeklyإذا نظرنا إلى مجلد "daily"، فإنّه يمكننا أن نرى مجلدا فرعيًا داخله لكل قاعدة بيانات، حيث يكون بداخلها أيضًا ملفات النُسَخ الاحتياطية لقاعدة البيانات مضغوطة بصيغة gzip. استخدم الأمر التالي لترى محتويات ذاك المسار: .: database_name information_schema performance_schema ./database_name: database_name_2013-08-27_23h30m.Tuesday.sql.gz ./information_schema: information_schema_2013-08-27_23h30m.Tuesday.sql.gz ./performance_schema: performance_schema_2013-08-27_23h30m.Tuesday.sql.gzتقوم Ubuntu بتثبيت سكربت cron مع هذا البرنامج لتشغيله كل يوم. سيقوم تلقائيًا بتنظيم الملفات إلى مسارها الصحيح. كيفية النسخ الاحتياطي عند استخدام النسخ المتماثلمن الممكن استخدام النسخ المتماثل (Replication) في MySQL لعمل نسخة احتياطية عن البيانات مع الطرق المذكورة أعلاه كذلك. النسخ المتماثل هو عملية تمرير البيانات من خادومٍ إلى آخر (من رئيسي إلى فرعي) أو تمرير التغييرات من خادومٍ رئيسي إلى خادومٍ رئيسيٍ آخر. صحيح أن النسخ المتماثل يسمح بتمرير البيانات وحفظها، إلا أنه يعاني عندما تحاول حفظ البيانات من نقطة معينة من الزمان. هذا بسبب أن عملية النسخ المتماثل تحصل بشكل مستمر لتنسخ التغييرات الجديدة التي يتم إجراؤها على النظام. لتفادي هذه المشكلة يمكننا: تعطيل النسخ المتماثل مؤقتًا. جعل آلة النسخ الاحتياطي قابلة للقراءة فقط مؤقتًا.تعطيل النسخ المتماثل مؤقتايمكنك تعطيل النسخ المتماثل للخادوم الفرعي مؤقتًا عبر تنفيذ: mysqladmin -u user_name -p stop-slaveخيار آخر يمكنك استخدامه ولا يقوم بتعطيل عملية النسخ المتماثل بالكامل، بل يضعها بوضع الإيقاف المؤقت، هو تطبيق: mysql -u user_name -p -e 'STOP SLAVE SQL_THREAD;بعد إيقاف عملية النسخ المتماثل مؤقتًا، يمكنك القيام بعملية النسخ الاحتياطي باستخدام أحد الطرق المذكورة مسبقًا. يسمح لك هذا بإبقاء قاعدة البيانات الرئيسية نشطة بينما يتم نسخ قاعدة البيانات الفرعية. عندما يكتمل هذا، قم بإعادة تفعيل النسخ المتماثل عبر: mysqladmin -u user_name -p start-slaveجعل آلة النسخ الاحتياطي قابلة للقراءة فقط مؤقتايمكنك أيضًا أن تحافظ على البيانات على الخادوم عبر جعلها قابلة للقراءة فقط. يمكنك تنفيذ هذه الخطوات سواء كان على الخادوم الرئيسي (Master) أو الفرعي (Slave). أولا، قم بالولوج إلى MySQL بالصلاحيات اللازمة للقيام بذلك: mysql -u root -pالآن، يمكننا كتابة جميع التغييرات المحفوظة إلى القرص وجعل النظام قابلًا للقراءة فقط (read-only) عبر كتابة: FLUSH TABLES WITH READ LOCK; SET GLOBAL read_only = ON;الآن، قم بعمل النسخ الاحتياطي باستخدام mysqludump. بمجرّد اكتمال عملية النسخ الاحتياطي، قم بإعادة النظام إلى وضعه الأصلي عبر كتابة: SET GLOBAL read_only = OFF; UNLOCK TABLES; ملاحظة عن الطرق التي لم تعد مستحسنةmysqlhotcopyتتضمن MySQL سكربتا مكتوبا بلغة Perl لنسخ قواعد البيانات احتياطيا بسرعة ويدعى "mysqlhotcopy". يمكن أن يتم استخدام هذه الأداة للقيام بنسخ قاعدة البيانات بسرعة على الآلة المحلّية، ولكنها تمتلك بعض التقييدات التي تجعلنا نتجنبها. السبب الأهم الذي جعلنا لا نستخدمها هو أنها فقط تعمل مع البيانات التي تم تخزينها باستخدام محركات التخزين "MyISAM" و"Stroage" فقط. معظم المستخدمين لا يقومون بتغيير المحرك الافتراضي للتخزين، وبدءً من الإصدار 5.5 من MySQL فإن المحرك الافتراضي هو "InnoDB". لهذا لا يمكن استخدام هذه الأداة لأنها لا تتوافق مع المحرك. مشكلة أخرى مع هذا السكربت هو أنه يمكن تشغيله فقط على الآلة التي يتم تخزين قاعدة البيانات عليها. يمنعك هذا من القيام بعمليات النسخ الاحتياطي باستخدام آلة بعيدة (remote machine)، والذي يمكنه أن يكون مشكلة حقيقية في بعض الأحيان. نسخ ملفات الجداولطريقة أخرى تقتَرح بعض الأحيان هي القيام بنسخ الجداول التي تقوم MySQL بوضع البيانات فيها ببساطة ونقلها إلى مكان آخر. تعاني هذه الطريقة من نفس مشكلة "mysqlhotcopy". قد يكون منطقيًا استخدام هذه الطريقة مع المحرّكات التي تقوم بتخزين بياناتها على شكل ملفات، إلا أن InnoDB (وهو المحرك الافتراضي الجديد لـMySQL) لا يمكن نسخ قواعد البيانات الخاصة به بهذه الطريقة. الخاتمةهناك العديد من الطرق لإجراء عمليات النسخ الاحتياطي لقواعد بيانات MySQL، جميعها يمتلك نقاط قوة وضعف، ولكن بعضها أسهل للمستخدم وأفضل للتطبيق من غيرها. ستعتمد طريقة عملية النسخ الاحتياطي التي ستستخدمها بشكل رئيسي على احتياجاتك ومواردك، بالإضافة إلى بيئة العمل الخاصة بك. مهما كانت الطريقة التي تعتمد عليها، كن متأكدا من التحقق من النُسَخ الاحتياطية الخاصّة بك وحاول استرجاعها للتأكد من الأمر، لتكون متأكدا من أنها لا تحوي أي مشاكل. ترجمة -وبتصرف- للمقال How to Backup MySQL Databases on an Ubuntu VPS لصاحبه Justin Ellingwood.
  19. بعد أن قمنا مسبقًا بتثبيت وإعداد خادوم قاعدة بيانات MySQL التجريبي الخاصّ بنا، يمكننا الآن البدء باستخدام mysqlslap. يمكن تشغيل mysqlslap عبر طرفية الصدفة العادية، لذا لن يكون هناك حاجة إلى الدخول إلى MySQL لتشغيله من هناك. وعلى الرغم من ذلك، فإننا سنقوم في درسنا هذا بفتح اتصالٍ جديد إلى خادومنا بالإضافة إلى بدء جلسة MySQL جديدة من هناك بواسطة المستخدم sysadmin الذي أنشأناه من قبل، لكي نتمكّن من التحقق من بعض الأمور وتحديث أخرى في MySQL بشكلٍ أسهل. لذا وفي المجمل، فإننا سنمتلك طرفيةً واحدة مفتوحة مع مستخدمٍ بصلاحيات إدارية (sudo)، وطرفية واحدة لـMySQL. قبل أن ندخل في الأوامر الرئيسية المُستخدمة للاختبار، قد تودّ أن تلقي نظرةً على هذه القائمة لأكثر الخيارات المفيدة لـmysqlslap. يمكن أن يساعدك هذا على تصميم أوامر mysqlslap الخاصّ بك لاحقًا. الخياروظيفتهuser--اسم مستخدم MySQL الذي يجب الاتصال به على خادوم قاعدة البياناتpassword--كلمة المرور الخاصّة باسم المستخدم. من الأفضل تركها فارغة في سطر الأوامرhost--اسم خادوم قاعدة بيانات MySQLport--رقم المنفذ الذي يجب من خلاله الاتصال بـMySQL إذا كان الافتراضي غير مستخدمconcurrency--عدد اتصالات العملاء الافتراضية التي سيتم محاكاتها من طرف mysqlslapiterations--عدد المرّات التي سيتم تشغيل الاختبار فيهاcreate-schema--قاعدة البيانات التي سيتم تشغيل الاختبار عليهاquery--عملية الاستعلام التي يجب تنفيذها. يمكن لهذا أن يكون متغيّر استعلام SQL أو مسارًا لملفّ سكربت SQLcreate--الاستعلام الذي يجب إنشاؤه كجدول، مجددًا، يمكن لهذا أن يكون متغيّر استعلام SQL أو مسارًا لملفّ SQLdelimiter--الحائل الذي يجب استخدامه للفصل بين جُمَل SQL متعددةengine--محرّك قاعدة البيانات الذي يجب استخدامه، مثل InnoDBauto-generate-sql-- يسمح هذا الخيار لـMySQL بتنفيذ اختبار الحِمل باستخدام أمر SQL المُنشَئ تلقائيًا من طرف mysqlslapحالة استخدام: اختبار الأداء مع بيانات واستعلامات SQL منشئة تلقائياسنبدأ عبر استخدام ميّزة mysqlslap في الإنشاء التلقائي لجمل SQL. عندما نقوم باستخدامها، فإنّ mysqlslap سيقوم بإنشاء قاعدة بيانات مؤقّتة منفصلة تدعى "mysqlslap". ستحوي قاعدة البيانات هذه جدولًا بسيطًا يحوي هو الآخر عددًا صحيحًا واحدًا وعمودًا واحدًا من نوع varchar بداخله بيانات تجريبية. يمكن أن تكون هذه طريقةً سهلة وسريعة للتحقق من أداء خادوم قاعدة البيانات الكلّي. سنبدأ عبر اختبار اتصال عميلٍ واحدٍ فقط يتم تكراره مرّةً واحدة كذلك باستخدام جملة SQL مُنشئة تلقائيًا: sudo mysqlslap --user=sysadmin --password --host=localhost --auto-generate-sql --verboseيجب أن يبدو الخرج كالتالي: Benchmark Average number of seconds to run all queries: 0.009 seconds Minimum number of seconds to run all queries: 0.009 seconds Maximum number of seconds to run all queries: 0.009 seconds Number of clients running queries: 1 Average number of queries per client: 0يقوم mysqlslap بإعطاء بعض الإحصائيات عن اختبار الأداء كما رأينا من الخرج السابق، حيث أنّه يقوم بإرجاع متوسّط، أقل وأعلى عدد من الثواني التي يحتاجها ليقوم بتنفيذ عملية الاستعلام. يمكننا أيضًا أن نرى أنّ عدد اتصالات العملاء المُستخدمة لاختبار الحِمل هذا كان واحدًا فقط. الآن، جرّب محاكاة 50 اتصال، وقم باختيار تشغيل عملية الاستعلام المُنشَئة تلقائيًا 10 مرّات: sudo mysqlslap --user=sysadmin --password --host=localhost --concurrency=50 --iterations=10 --auto-generate-sql --verboseيعني هذا الأمر أنّه سيتم محاكاة 50 اتصالًا، يقوم كلّ منها بتنفيذ نفس عملية الاستعلام بنفس الوقت، وسيتم إعادة هذه الاختبار 10 مرّات. يظهر لنا الخرج فرقًا واضحًا في الوقت مع ازدياد الحِمل: Benchmark Average number of seconds to run all queries: 0.197 seconds Minimum number of seconds to run all queries: 0.168 seconds Maximum number of seconds to run all queries: 0.399 seconds Number of clients running queries: 50 Average number of queries per client: 0لاحظ كيف أنّ حقل "Number of clients running queries" أصبح الآن يظهر الرقم 50، وأنّ عدد عمليات الاستعلام بواسطة العميل الواحد هو صفر. تقوم SQL المُشَئة تلقائيًا بإنشاء جدولٍ بسيط يحوي حقلين اثنين، إلّا أنّه وفي معظم البيئات الإنتاجية فستكون بنية الجدول أكبر بكثير من هذا. يمكننا أن نفرض على mysqlslap أن يقوم بمحاكاة هذا عبر إضافة بعض الحقول الإضافية إلى جدول الاختبار. لفعل ذلك، يمكننا استخدام المُعامِلين الجديدين number-char-cols-- وnumber-int-cols--. تقوم هذه المُعامِلات بتحديد عدد الأعمدة من نوع varchar وint لإضافتها إلى جدول الاختبار. سنختبر استعلام SQL مُنشَئ تلقائيًا عن جدولٍ بـ5 أعمدة رقمية و20 عمود نصّي في المثال التالي. سنحاكي أيضًا 50 اتصالًا من أجهزة العملاء في الوقت ذاته وسنقوم بتكرار الاختبار 100 مرّة: sudo mysqlslap --user=sysadmin --password --host=localhost --concurrency=50 --iterations=100 --number-int-cols=5 --number-char-cols=20 --auto-generate-sql --verbosسيستغرق هذا الأمر وقتًا أطول. يمكننا أن نتحوّل إلى الطرفية الأخرى الني قمنا بتشغيل جلسة MySQL الخاصّة بنا عليها لنرى ما يجري بينما يتم تنفيذ الاختبار. لاحظ أنّه في حال انتظرت وقتًا طويلًا، سيكتمل الاختبار ولن تتمكن من رؤية قاعدة البيانات الاختبارية. من طرفية MySQL، طبّق: show databases;لاحظ وجود قاعدة mysqlslap: +--------------------+ | Database | +--------------------+ | information_schema | | employees | | mysql | | mysqlslap | | performance_schema | +--------------------+ 5 rows in set (0.01 sec)يمكنك أن تتحقق من الجدول في قاعدة البيانات الاختبارية إن أردت; إنّه يدعى t1. تحقق من نافذة الطرفية الأخرى الآن. عندما ينتهي الاختبار، ستلاحظ أنّ الأداء قد انخفض بدرجةٍ أكبر من السابق بسبب الحِمل الزائد: Benchmark Average number of seconds to run all queries: 0.695 seconds Minimum number of seconds to run all queries: 0.627 seconds Maximum number of seconds to run all queries: 1.442 seconds Number of clients running queries: 50 Average number of queries per client: 0ارجع إلى نافذة طرفية MySQL. يمكننا أن نرى أنّ mysqlslap قد حذف قاعدة البيانات المؤقّتة الخاصّة به، طبّق: show databases;الخرج: +--------------------+ | Database | +--------------------+ | information_schema | | employees | | mysql | | performance_schema | +--------------------+ 4 rows in set (0.00 sec)حالة استخدام: اختبار الأداء مع استعلامات مخصصةاستعلامات SQL المُنشَئة تلقائيًا جيّدة إذا كنت تريد تقييم موارد الخادوم الفيزيائية. هيَ مفيدة عندما تريد معرفة درجة الحِمل التي يمكن للنظام أن يتحمّلها. عندما تريد التحقق من تطبيقٍ يعتمد على قاعدة بيانات، فإنّك ستودّ اختبار استعلاماتٍ حقيقية على بياناتٍ حقيقية. يمكن لهذه الاستعلامات أن تأتي من خادوم الويب الخاصّ بك أو من خادوم التطبيق الذي تشغّله. الآن، سنفترض أنّك تعرف الاستعلامات المحددة التي تريد اختبارها. في القسم التالي، سنريك طريقةً لمعرفة عمليات الاستعلام التي يتم تنفيذها على خادومك. يمكنك جعل mysqlslap ينفّذ عملية استعلام معيّنة عبر الخيار query--. لا يمكن لجُمل الـSQL أن تحتوي على فواصل الأسطر (أكثر من سطر) ضمنها، ويجب فصلها بواسطة فاصلة منقوطة (;). يجب أيضًا إغلاق الاستعلامات بعلامتيّ تنصيص. في الشفرة التالية، سنقوم بتشغيل عملية استعلام بسيطة عن الجدول deptemp. يحوي جدول "deptemp" أكثر من ثلاثمئة ألف سجل بداخله. لاحظ كيف قمنا بتحديد قاعدة البيانات employees مع الخيار create-schema--: sudo mysqlslap --user=sysadmin --password --host=localhost --concurrency=50 --iterations=10 --create-schema=employees --query="SELECT * FROM dept_emp;" --verboseسيستغرق هذا بعض الوقت ليكتمل. بعدها، يجب أن تتلقّى تقريرًا عن اختبار الأداء كالتالي بعد دقيقة أو اثنتين: Benchmark Average number of seconds to run all queries: 18.486 seconds Minimum number of seconds to run all queries: 15.590 seconds Maximum number of seconds to run all queries: 28.381 seconds Number of clients running queries: 50 Average number of queries per client: 1(ملاحظة: إذا استغرقت العملية حوالي 10 دقائق أو لم ترجع أيّ خرج، فيجب عليك المحاولة مجددًا مع عددٍ أقل للخيار concurrency-- و/أو iterations--, أو محاولة تطبيقها على خادوم أقوى). بعدها، سنستخدم أكثر من جملة SQL مع الخيار query--. في المثال التالي، نقوم بإنهاء كلّ جملة بفاصلة منقوطة. سيعرف mysqlslap أننا نستخدم عددًا من أوامر SQL المنفصلة بسبب استخدامنا للخيارdelimiter--: sudo mysqlslap --user=sysadmin --password --host=localhost --concurrency=20 --iterations=10 --create-schema=employees --query="SELECT * FROM employees;SELECT * FROM titles;SELECT * FROM dept_emp;SELECT * FROM dept_manager;SELECT * FROM departments;" --delimiter=";" --verboseيستخدم هذا الاختبار نفس عدد الاتصالات ونفس عدد مرّات التكرار، إلّا أنّ الأداء كان أبطئ بشكلٍ ملحوظ بسبب استخدام أكثر من جملة SELECT واحدة (متوسّط 23.8 ثانية مقابل 18.486 ثانية). Benchmark Average number of seconds to run all queries: 23.800 seconds Minimum number of seconds to run all queries: 22.751 seconds Maximum number of seconds to run all queries: 26.788 seconds Number of clients running queries: 20 Average number of queries per client: 5يمكن لجُمل SQL التي يتم استخدامها في بيئة إنتاجية أن تكون معقّدة. إضافة جملة SQL معقّدة إلى سكربت هو أسهل من وضعها للاختبارات، لذا، يمكننا أن نطلب من mysqlslap أن يقوم بقراءة الاستعلامات من ملفّ سكربت. للقيام بهذا، فلنقم بإنشاء ملفّ سكربت من أوامر SQL. يمكننا استخدام الشفرة البرمجية أدناه لإنشاء الملفّ: sudo echo "SELECT * FROM employees;SELECT * FROM titles;SELECT * FROM dept_emp;SELECT * FROM dept_manager;SELECT * FROM departments;" > ~/select_query.sql sudo cp ~/select_query.sql /mysqlslap_tutorial/يحوي ملفّ select_query.sql جميع عبارات SELECT الآن. بما أنّ السكربت يحوي أكثر من عملية استعلام واحدة، فيمكننا استخدام مفهومٍ جديد في الاختبار. يمكن لـmysqlslap أن يقوم بتوزيع عمليات الاستعلام. يمكننا القيام بهذا عبر تحديد عدد الاستعلامات التي يجب على كلّ جهازٍ عميل متّصل أن ينفذّها. يسمح mysqlslap بفعل هذا عبر استخدام الخيار number-of-queries--. لذا، إذا كان لدينا 50 اتصال و1000 عمليّة استعلام يجب تنفيذها، فإنّ كلّ جهاز عميل متّصل سينفّذ حوالي 20 عملية استعلام تقريبًا. أخيرًا، يمكننا أيضًا استخدام الخيار debug-info--، والذي سيظهر لنا حسبة تقريبية للموارد المستعملة. في الشفرة البرمجية التالية، نطلب من mysqlslap أن يستخدم ملفّ السكربت الذي أنشأناه للتوّ. إننا نقوم أيضًا بتحديد المُعامِل number-of-queries. سيتم تكرار العمليّة مرّتين كما أننا نريد معلومات التنقيح (debug) ضمن الخرج: sudo mysqlslap --user=sysadmin --password --host=localhost --concurrency=20 --number-of-queries=1000 --create-schema=employees --query="/mysqlslap_tutorial/select_query.sql" --delimiter=";" --verbose --iterations=2 --debug-infoبعد أن يكتمل هذا الأمر، يجب أن نرى بعض النتائج المثيرة للاهتمام: Benchmark Average number of seconds to run all queries: 217.151 seconds Minimum number of seconds to run all queries: 213.368 seconds Maximum number of seconds to run all queries: 220.934 seconds Number of clients running queries: 20 Average number of queries per client: 50 User time 58.16, System time 18.31 Maximum resident set size 909008, Integral resident set size 0 Non-physical pagefaults 2353672, Physical pagefaults 0, Swaps 0 Blocks in 0 out 0, Messages in 0 out 0, Signals 0 Voluntary context switches 102785, Involuntary context switches 43هنا يكون متوسّط عدد الثواني اللازم لتنفيذ جميع عمليات الاستعلام في MySQL هو 217 ثانية، حوالي 4 دقائق. صحيحٌ أنّ هذا الرقم له علاقة بحجم الذاكرة العشوائية ونوع المعالج المُستخدم مع آلتنا الوهمية، إلّا أنّه كان كبيرًا أيضًا بسبب عدد الاستعلامات الكبير الذي كان كلّ جهاز عميل متصل يكرره مرّتين. يمكننا أن نرى وجود عددٍ كبير من أخطاء الصفحات غير العتادية (البرمجية). تحصل أخطاء الصفحات (page faults) عندما لا يمكن العثور على البيانات في الذاكرة ويتوجّب على النظام أن يبحث عنها على قرص الـSwap. يظهر الخرج أيضًا بعض المعلومات المتعلّقة بالمعالج المركزي. في حالتنا، فإننا نرى عدد كبيرًا من تبديلات السياق كذلك. حالة استخدام: سيناريو اختبار أداء عملي مع التقاط مباشر للاستعلاماتإلى الآن في أمثلتنا، كنّا نقوم بتطبيق عمليات الاستعلام مع قاعدة بيانات "employees" الخاصّة بنا، وهو ما قد لا يكون شيئًا يريدك مُدراء قواعد البيانات أن تفعله، وهناك سببٌ وجيهٌ لذلك. لا تريد أن تقوم بإضافة حِمل إضافي إلى قاعدة بياناتك الإنتاجية ولا تريد أن تقوم بتفيذ استعلامات اختبارية يمكنها أن تقوم بحذف، تحديث أو إدراج البيانات إلى جداول قاعدة البيانات الإنتاجية الخاصّة بك. سنريك كيفيّة عمل نسخة احتياطية من قاعدة بيانات إنتاجية وكيفيّة نسخها إلى بيئة تجريبية، في هذا المثال وعلى نفس الخادوم، ولكنّك طبعًا قد تودّ نسخها إلى خادومٍ منفصل بنفس قدرات العتاد. والأكثر أهميّة من ذلك، سنريك كيف تقوم بتسجيل الاستعلامات بشكلٍ حيّ أو مباشر (live) من قاعدة بيانات إنتاجية بالإضافة إلى كيفيّة إضافة الاستعلامات إلى سكربتٍ اختباري. في المجمل، ستحصل على الاستعلامات من بيئة عمل إنتاجية، ولكنّك ستقوم بتنفيذ الاختبارات على قاعدة البيانات التجريبية. الخطوات العامّة هي كالتالي، ويمكنك استخدامها لأيّ اختبار mysqlslap: انسخ قاعدة البيانات الإنتاجية إلى بيئة اختبارية.قم بإعداد MySQL لتسجيل والتقاط جميع طلبات الاتصال والاستعلام على قاعدة البيانات الإنتاجية.قم بمحاكاة حالة الاستخدام التي تحاول اختبارها. كمثال، إذا كنتَ تدير موقع تسوّق، يجب أن تشتري شيئًا لتقوم بتفعيل جميع عمليات الاستعلام الأساسية ضمن تطبيقك.قم بتعطيل تسجيل الاستعلامات.انظر إلى سجل الاستعلامات وقم بعمل قائمة بالاستعلامات التي تريد اختبارها.أنشئ ملفًّا اختباريًا لكلّ عملية استعلام تريد اختبارها.نفّذ الاختبارات.استخدم الخرج لتحسين أداء قاعدة البيانات الخاصّة بك.للبدء، قم بإنشاء نسخة احتياطية من قاعدة البيانات "employees". سنقوم بإنشاء مسارٍ منفصل لهذه النسخة الاحتياطية: sudo mkdir /mysqlslap_tutorial/mysqlbackup cd /mysqlslap_tutorial/mysqlbackupأنشئ النسخة الاحتياطية وانقلها إلى المسار الجديد: sudo mysqldump --user sysadmin --password --host localhost employees > ~/employees_backup.sql sudo cp ~/employees_backup.sql /mysqlslap_tutorial/mysqlbackup/اذهب إلى خادوم MySQL التجريبي الخاصّ بك، وأنشئ قاعدة البيانات "employees_backup": CREATE DATABASE employees_backup;في هذه النقطة، إذا كنتَ تستخدم خادومًا منفصلًا للاختبار، فيجب أن تنقل ملفّ employeesbackup.sql إليه، ومن جلسة الطرفيّة الرئيسية، استورد بيانات النسخة الاحتياطية إلى قاعدة البيانات employeesbackup: sudo mysql -u sysadmin -p employees_backup < /mysqlslap_tutorial/mysqlbackup/employees_backup.sqlعلى خادوم قاعدة بيانات MySQL الإنتاجية الخاصّ بك، فعّل سجل استعلامات MySQL العام وقم بتوفير اسم ملفٍّ خاصٍّ به. يقوم سجل الاستعلامات العام بالتقاط الاتصالات، الاتصالات المنقطعة وسجل الاستعلامات لقاعدة بيانات MySQL: SET GLOBAL general_log=1, general_log_file='capture_queries.log';الآن، شغّل الاستعلامات التي تريد اختبارها على خادوم MySQL الإنتاجي. في هذا المثال، سنقوم بتنفيذ عملية استعلام من سطر الأوامر. وعلى كلّ حال، قد تودّ إنشاء الاستعلامات من تطبيقك عوضًا عن تنفيذها بشكلٍ مباشر. إذا كنتَ تمتلك صفحة موقع تريد اختبار أدائها، فيجب عليك تنفيذ تلك العملية أو الوصول إلى تلك الصفحة الآن. كمثال، إذا كنتَ تدير موقع تسوّق إلكتروني، قد تودّ إكمال عملية الدفع الآن، والذي من شأنه أن يقوم بطلب جميع الاستعلامات المطلوبة على خادوم قاعدة البيانات. هذه هي عملية الاستعلام التي سنقوم بطلبها على خادوم MySQL الإنتاجي الخاصّ بنا. أولًا، قم باستخدام قاعدة البيانات الصحيحة: USE employees;والآن عملية الاستعلام: SELECT e.first_name, e.last_name, d.dept_name, t.title, t.from_date, t.to_date FROM employees e INNER JOIN dept_emp de ON e.emp_no=de.emp_no INNER JOIN departments d ON de.dept_no=d.dept_no INNER JOIN titles t ON e.emp_no=t.emp_no ORDER BY e.first_name, e.last_name, d.dept_name, t.from_date;الخرج المتوقّع: 489903 rows in set (4.33 sec)سنقوم بتعطيل التسجيل العام عندما تكتمل عملية الاستعلام: SET GLOBAL general_log=0;لاحظ أنّه في حال تركت التسجيل العام مفعّلًا، سيستمر إضافة الاستعلامات إلى السجل، والذي من شأنه جعل الاختبارات أصعب. لذا تأكّد أنّك قمت بتعطيل التسجيل مباشرةً بعد الإنتهاء من اختبارك. فلنتحقق من أنّ ملفّ السجل تمَّ إنشاؤه ضمن المسار var/lib/mysql/: sudo ls -l /var/lib/mysql/capt* -rw-rw----. 1 mysql mysql 861 Sep 24 15:09 /var/lib/mysql/capture_queries.logفلننسخ هذا الملفّ إلى مسار MySQL الاختباري الخاصّ بنا. إذا كنتَ تستخدم خادومًا منفصلًا للاختبار، فقم بنسخه إلى ذلك الخادوم: sudo cp /var/lib/mysql/capture_queries.log /mysqlslap_tutorial/يجب أن يكون هناك بعض البيانات داخل ملفّ السجل هذا. في مثالنا، يجب أن تكون الاستعلامات التي نريدها بالقرب من نهاية الملفّ. تحقق من آخر جزء من الملفّ عبر الأمر: sudo tail /mysqlslap_tutorial/capture_queries.logالخرج المتوقّع: 6294 Query show databases 6294 Query show tables 6294 Field List departments 6294 Field List dept_emp 6294 Field List dept_manager 6294 Field List employees 6294 Field List salaries 6294 Field List titles 140930 15:34:52 6294 Query SELECT e.first_name, e.last_name, d.dept_name, t.title, t.from_date, t.to_date FROM employees e INNER JOIN dept_emp de ON e.emp_no=de.emp_no INNER JOIN departments d ON de.dept_no=d.dept_no INNER JOIN titles t ON e.emp_no=t.emp_no ORDER BY e.first_name, e.last_name, d.dept_name, t.from_date 140930 15:35:06 6294 Query SET GLOBAL general_log=0يظهر هذا السجل أوامر SQL والتوقيت الزمني الخاصّ بها. جملة SQL SELECT الموجودة بالقرب من نهاية الملفّ هي الجزء الذي نحن مهتمّون به. يجب أن يكون بالضبط هو الأمر الذي نقوم بتنفيذه على خادوم قاعدة البيانات الإنتاجية، حيث أننا قمنا من هناك بالتقاطه. في مثالنا هذا، كنّا نعرف عملية الاستعلام بالفعل، ولكن، في بيئة عمل إنتاجية، يمكن أن تكون هذه الطريقة نافعة جدًا لمعرفة الاستعلامات التي ربّما لا تعرف بالضرورة أنّه يتم تشغيلها على خادومك. لاحظ أنّه في حال قمت بطلب استعلامات مختلفة أثناء عملية التسجيل (logging)، فإنّ هذا الملفّ سيبدو مختلفًا تمامًا. في سيناريو حقيقي، يمكن أن يتمّ ملئ هذا الملفّ بالمئات من المُدخَلات القادمة من مختلف الاتصالات. هدفك هو العثور على الاستعلام أو الاستعلامات التي تسبب هذا الحِمل. يمكنك أن تبدأ عبر إنشاء قائمة بكلّ سطر يتضمّن الكلمة "Query". بعدها، ستمتلك قائمةً دقيقة بالاستعلامات التي تمّ تنفيذها على قاعدة البيانات الخاصّة بك أثناء الاختبار. قم بنسخ كلّ استعلام تريد اختباره إلى ملفٍّ ينتهي بالامتداد sql. كمثال: sudo vi /mysqlslap_tutorial/capture_queries.sqlيجب أن تكون المحتويات هي استعلامات MySQL التي تريد اختبارها، دون استخدام أيّ سطور إضافية (استخدم سطر واحد فقط) ودون فاصلة منقوطة بالنهاية: SELECT e.first_name, e.last_name, d.dept_name, t.title, t.from_date, t.to_date FROM employees e INNER JOIN dept_emp de ON e.emp_no=de.emp_no INNER JOIN departments d ON de.dept_no=d.dept_no INNER JOIN titles t ON e.emp_no=t.emp_no ORDER BY e.first_name, e.last_name, d.dept_name, t.from_dateبعدها، تأكّد أنّ نتائج الاستعلامات لم يتم تخزينها في ذاكرة الخبيئة (cache). ارجع إلى جلسة MySQL الخاصّة بالخادوم الاختباري وطبّق الأمر التالي: RESET QUERY CACHE;الآن، صار الوقت المناسب لتشغيل أداة mysqlslap مع ملفّ السكربت. تأكّد أنّك تستخدم اسم ملفّ السكربت الصحيح مع المُعامِل query--. سنستخدم فقط 10 اتصالات افتراضية وسنكرر العمليّة مرّتين فقط. قم بتشغيل الأمر التالي من خادومك الاختباري: sudo mysqlslap --user=sysadmin --password --host=localhost --concurrency=10 --iterations=2 --create-schema=employees_backup --query="/mysqlslap_tutorial/capture_queries.sql" --verboseيجب أن يبدو خرج اختبار الأداء شيئًا كالتالي: Benchmark Average number of seconds to run all queries: 68.692 seconds Minimum number of seconds to run all queries: 59.301 seconds Maximum number of seconds to run all queries: 78.084 seconds Number of clients running queries: 10 Average number of queries per client: 1إذًا، كيف يمكننا الآن تحسين هذا الأداء؟ ستحتاج معرفةً جيّدة باستعلامات MySQL لتقييم ما تفعله عمليات الاستعلام. بالنظر مجددًا إلى الاستعلامات، يمكننا أن نرى أنّه تقوم بالعديد من عمليات الدمج على امتداد أكثر من جدول، تقوم الاستعلامات بإظهار تواريخ عمل الموظّف وأثناء القيام بذلك، تقوم بدمج أكثر من جدول عبر الحقل empno، كما أنّها تقوم باستخدام الحقل deptno للدمج، ولكن بما أنّه هناك أقسام سجلات قليلة فقط، فسنقوم بتجاهل هذا. بما أنّه هناك العديد من مُدخَلات empno في قاعدة البيانات، فمن المنطقي افتراضي أنّ إنشاء الفهارس في حقل empno يمكن أن يحسّن من أداء عمليات الاستعلام. مع القليل من التمرّن، بمجرّد أن تجد الاستعلامات التي تسبب ضغطًا على خادوم البيانات (وهو القسم الذي سيساعدك mysqlslap فيه!)، ستكون قادرًا على تقييم عمليات الاستعلام المتوفّرة بناءً على معرفتك بـMySQL وقاعدة بياناتك. بعدها، يمكنك محاولة تحسين قاعدة بياناتك أو الاستعلامات التي يتم تنفيذها عليها. في حالتنا، فلنضف الفهارس التي ذكرناه بالأعلى، سنقوم بإنشاء 3 فهارس فارغة لـempno. سيتم إنشاء فهرس واحد في حقل empno في جدول employees، وسيتم إنشاء فهرس آخر في حقل empno بالجدول deptemp، وسيتم إنشاء الأخير في حقل emp_no في جدول titles. فلنذهب إلى جلسة MySQL الاختبارية الخاصّة بنا ونطبّق الأوامر التالية: USE employees_backup; CREATE INDEX employees_empno ON employees(emp_no); CREATE INDEX dept_emp_empno ON dept_emp(emp_no); CREATE INDEX titles_empno ON titles(emp_no);بالعودة إلى نافذة الطرفية الرئيسية على خادومنا الاختباري، إذا قمنا بتشغيل mysqlslap بنفس المُعاملات، فسنرى اختلافًا في نتائج اختبار الأداء: sudo mysqlslap --user=sysadmin --password --host=localhost --concurrency=10 --iterations=2 --create-schema=employees_backup --query="/mysqlslap_tutorial/capture_queries.sql" --verbose Benchmark Average number of seconds to run all queries: 55.869 seconds Minimum number of seconds to run all queries: 55.706 seconds Maximum number of seconds to run all queries: 56.033 seconds Number of clients running queries: 10 Average number of queries per client: 1يمكن أن نرى وجود تحسّن فوري في متوسّط، أدنى وأقصى وقت لتنفيذ عمليات الاستعلام. عوضًا عن متوسّط 68 ثانية، يتم تنفيذ الاستعلامات الآن بغضون 55 ثانية. هذا تحسّن بحوالي 13 ثانية لنفس الاستعلامات التي تمّ تنفيذها. بما أنّ هذا التغيير في قاعدة البيانات أعادة نتيجةً جيّدة في البيئة الاختبارية، فإنّه يمكنك الآن أخذه بعين الاعتبار لتنفيذه على خادوم قاعدة البيانات الإنتاجية الخاصّة بك، ولكن لا تنسى أنّ تغييرات قاعدة البيانات لها دومًا إيجابيات وسلبيات عليك المفاضلة بينها. يمكنك إعادة عملية اختبار الأوامر والتحسينات مع جميع الاستعلامات التي جمعتها من ملفّ السجل الخاصّ بك. استكشاف الأخطاء وإصلاحها: mysqlslap لا يظهر الخرجإذا قمت بتنفيذ أمر اختبار ولم يرجع لك خرجًا، فهذا مؤشّرٌ جيّد إلى أنّ موارد خادومك قد تكون امتلأت بالفعل. قد تتضمّن أعراض هذه المشكلة نقصًا في خرج Benchmark، أو رسالة خطأ مثل: mysqlslap: Error when storing result: 2013 Lost connection to MySQL server during queryربّما قد تودّ إعادة الاختبار مجددًا مع عددٍ أقل للمُعامِل concurrency-- أو iterations--، أو يمكنك محاولة ترقية بيئة خادومك الاختباري لإصلاح المشكلة. يمكن أن يكون هذا طريقةً جيّدة لمعرفة حدود سعة خادوم قاعدة البيانات الخاصّ بك. الخاتمةmysqlslap هو أداة بسيطة وخفيفة يمكنها أن تندمج بسهولة مع محرّك قاعدة بيانات MySQL. وهي متوفّر لجميع إصدارات MySQL بدءًا من الإصدار 5.1.4. في هذا الدرس، رأينا كيفيّة استخدام mysqlslap مع خياراته المتعددة وجرّبنا الأمر مع قاعدة بيانات اختبارية كعيّنة. يمكنك تحميل قواعد بيانات عينية أخرى للاختبار من موقع MySQL والتمرّن عليها أيضًا. كما ذكرنا من قبل: رجاءًا لا تقم بتنفيذ الاختبارات على خادوم قاعدة بيانات إنتاجية. آخر حالة استخدام في درسنا هذا تعلّقت بعملية استعلام واحدة فقط. صحيحٌ أننا قمنا بتحسين أداء عملية الاستعلام تلك عبر إضافة فهارس إضافية إلى جميع الجداول الثلاث، إلّا أنّ العملية قد لا تكون بتلك البساطة في الحياة الحقيقية. إضافة المزيد من الفهارس قد يبطئ - في بعض الأحيان - أداء النظام وغالبًا مع يحتاج مُدراء قواعد البيانات إلى قياس إيجابيات إضافتها على حساب التغيير في الأداء الذي سيحصل. سيناريوهات الاختبار في الحياة الحقيقية أكثر تعقيدًا، ولكن هذا قد يعطيك الأدوات اللازمة للبدء في اختبار وتحسين أداء قاعدة البيانات الخاصّة بك. ترجمة -وبتصرف- للمقال: How To Measure MySQL Query Performance with mysqlslap لصاحبه: Sadequl Hussain.
  20. تأتي MySQL مع أداة تشخيص (diagnostic) تدعى mysqlslap، تمّ توفير هذه الأداة منذ الإصدار 5.1.4 من MySQL، وهي عبارة عن أداة قياس للأداء (benchmarking) يمكنها أن تساعد مدراء قواعد البيانات والمطورّين على أن يختبروا أداء خواديم قواعد البيانات الخاصّة بهم بسهولة. يمكن لـmysqlslap أن تحاكي عددًا كبيرًا من أجهزة العملاء التي تتصل بخادوم قاعدة البيانات بنفس الوقت. مُعامِلات اختبار الحمل (load testing parameters) قابلة للضبط بشكلٍ كلّي ويمكن استخدام نتائج الاختبارات المختلفة بهدف تحسين تصميم قواعد البيانات أو استهلاك موارد العتاد. في هذا الدرس، سنشرح كيفيّة تثبيت وإعداد mysqlslap بهدف إجراء اختبار الحِمْل (load test) على قاعدة بيانات MySQL باستخدام بعض عمليات الاستعلام الأساسية ولنرى كيف يمكن لاختبارات الأداء أن تساعدنا على تحسين هذه الاستعلامات لاحقًا. بعد القليل من التوضيحات المبدئية، سنقوم بعمل سيناريو تجريبي مشابه للتجربة الحقيقية حيث سنقوم بإنشاء نسخة من قاعدة بيانات موجودة حاليًا لنقوم بالاختبارات عليها، وسنجمع الاستعلامات من ملفّات السجل ونبدأ بالاختبار بواسطة سكربت. ما هو حجم الخادوم الذي يجب أن أستخدمه؟إذا كنتَ مهتمًا باختبار أداء خادوم قاعدة بياناتٍ معيّن، فيجب عليك أن تقوم بتشغيل اختبارات الأداء على خادوم بنفس المواصفات وبنسخة مطابقة تمامًا لقاعدة البيانات التي قمت بتثبيتها على خادومك الرئيسي. إذا كنتَ تريد المضيّ قدمًا بهذا الدرس بهدف التعلّم وتنفيذ كلّ أمر موجودٍ فيه، فإننا ننصحك بخادوم يمتلك 2 جيجابت من الذاكرة العشوائية (RAM) على الأقل. وبما أنّ الأوامر الموجودة في هذا الدرس تهدف إلى إرهاق الخادوم بالطلبات الكثيرة بهدف قياس أدائه، فإنّك قد تلاحظ أنّ الخواديم الأصغر حجمًا قد ينقطع الاتصال بها بسبب ذلك الحِمل. تمّ إنتاج الخرج الناتج في هذا الدرس بواسطة عدّة طرق بهدف تحسين الاستفادة من الأمثلة الموجودة هنا. الخطوة الأولى: تثبيت خادوم MySQL على نظام اختباريسنبدأ عبر تثبيت نسخة جديدة من خادوم MySQL المطوّر بواسطة المجتمع أو MySQL Community Server على نظام تشغيل اختباري. يجب ألّا تقوم بتشغيل أيّ أوامر أو استعلامات تجدها في هذا الدرس على خادوم قاعدة بيانات ضمن بيئة إنتاجية بتاتًا. تهدف هذه الاختبارات إلى الضغط على الخادوم التجريبي وقد تسبب تعليقا أو تعطلا لخادوم يعمل ضمن بيئة عمل إنتاجية. تمّ تنفيذ هذا الدرس ضمن بيئة العمل التالية: CentOS 7.أوامر تمّ تنفيذها بواسطة مستخدم جذر.2 جيجابت من الذاكرة العشوائية (RAM); لا تنسى أنّ الاختبارات التي سيتم ذكرها هنا تمّ إنتاجها بهدف التعليم ولا تعني بأيّ شكل من الأشكال أنّها نتيجة اختبارات رسمية صادرة عنّا.أولًا، سنقوم بإنشاء مسار ليحوي جميع الملفّات المتعلّقة بهذا الدرس. سيساعدنا هذا على إبقاء المكان نظيفًا. قم بالذهاب إلى هذا المسار: sudo mkdir /mysqlslap_tutorial cd /mysqlslap_tutorialبعدها، سنقوم بتحميل مستودع yum الخاصّ بنسخة المجتمع من خادوم MySQL. المستودع الذي سنحمّله هو مخصص بشكل اساسي لـRed Hat Enterprise Linux 7 إلّا أنّه يعمل بالطبع مع CentOS 7 كذلك: sudo wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpmالآن يمكننا تنفيذ rpm -Uvh لتثبيت هذا المستودع: sudo rpm -Uvh mysql-community-release-el7-5.noarch.rpmتحقق أنّه قد تمّ تثبيت المستودعات عبر تفحّص محتويات المجلّد etc/yum.repos.d/: sudo ls -l /etc/yum.repos.dيجب أن يبدو الخرج كالتالي: -rw-r--r--. 1 root root 1612 Jul 4 21:00 CentOS-Base.repo -rw-r--r--. 1 root root 640 Jul 4 21:00 CentOS-Debuginfo.repo -rw-r--r--. 1 root root 1331 Jul 4 21:00 CentOS-Sources.repo -rw-r--r--. 1 root root 156 Jul 4 21:00 CentOS-Vault.repo -rw-r--r--. 1 root root 1209 Jan 29 2014 mysql-community.repo -rw-r--r--. 1 root root 1060 Jan 29 2014 mysql-community-source.repoوفي حالتنا، فإنّ MySQL 5.6 Community Server هو ما نريده: mysql-connectors-community/x86_64 MySQL Connectors Community 10 mysql-tools-community/x86_64 MySQL Tools Community 6 mysql56-community/x86_64 MySQL 5.6 Community Server 64والآن قم بتثبيت خادوم MySQL: sudo yum install mysql-community-serverبمجرّد اكتمال العمليّة، قم بالتحقق من أنّه تمّ تثبيت المكوّنات فعلًا: sudo yum list installed | grep mysqlيجب أن تبدو القائمة كالتالي: mysql-community-client.x86_64 5.6.20-4.el7 @mysql56-community mysql-community-common.x86_64 5.6.20-4.el7 @mysql56-community mysql-community-libs.x86_64 5.6.20-4.el7 @mysql56-community mysql-community-release.noarch el7-5 installed mysql-community-server.x86_64 5.6.20-4.el7 @mysql56-communityبعدها، يجب أن نتأكّد أن عفريت MySQL أو MySQL Daemon يعمل بالفعل وأنّه سيبدأ تلقائيًا عند تشغيل الخادوم. يمكنك القيام بذلك عبر الأمر التالي: sudo systemctl status mysqld.serviceيجب أن ترى خرجًا كهذا: mysqld.service - MySQL Community Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; disabled) Active: inactive (dead)ابدأ الخدمة عبر: sudo systemctl start mysqld.serviceولجعلها تبدأ عند بدء تشغيل الخادوم: sudo systemctl enable mysqld.serviceوأخيرًا يجب علينا تأمين خادوم MySQL: sudo mysql_secure_installationسيظهر لك هذا مجموعة من الأسئلة. سنريك بالأسفل جميع الأسئلة مع أجوبتها التي يجب أن تختارها. في البداية لن يكون هناك كلمة مرور للمستخدم root الخاصّ بـMySQL، لذا، قم فقط بالضغط على زرّ Enter. أثناء الأسئلة، يجب أن تقوم بكتابة كلمة مرور جديدة وآمنة للمستخدم الجذر. يجب أن تقوم بكتابة y لإزالة حساب المستخدم المجهول من خادوم قاعدة البيانات، ولتعطيل السماح بالولوج البعيد للمستخدم الجذر وإعادة تحميل جدول الصلاحيات وغيرها: ... Enter current password for root (enter for none): OK, successfully used password, moving on... ... Set root password? [Y/n] y New password: Re-enter new password: Password updated successfully! Reloading privilege tables.. ... Success! ... Remove anonymous users? [Y/n] y ... Success! ... Disallow root login remotely? [Y/n] y ... Success! Remove test database and access to it? [Y/n] y - Dropping test database... ... Success! ... Reload privilege tables now? [Y/n] y ... Success! Cleaning up...يمكننا الآن أن نتّصل بقاعدة البيانات لنتأكّد من أنّ كلّ شيءٍ يعمل بشكلٍ صحيح: sudo mysql -h localhost -u root -pقم بإدخال كلمة مرور MySQL التي كتبتها للتوّ الآن. يجب أن ترى الخرج التالي: Enter password: Welcome to the MySQL monitor.... mysql>في طرفيّة <mysql قم بإدخال الأمر الذي سيظهر لك جميع قواعد البيانات: show databases;يجب أن ترى خرجًا كالتالي: +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | +--------------------+ 3 rows in set (0.00 sec)وأخيرًا، دعنا ننشئ مستخدمًا يدعى "sysadmin"، سيتم استخدام هذا الحساب للولوج إلى MySQL بدلًا من المستخدم الجذر. كن متأكّدًا من استبدال mypassword بكلمة المرور التي تريدها لهذا المستخدم. سنقوم أيضًا بمنح جميع الصلاحيات اللازمة لهذا المستخدم. في طرفيّة MySQL، قم بإدخال التالي: create user sysadmin identified by 'mypassword';الخرج: Query OK, 0 rows affected (0.00 sec)قم بإعطاء جميع الصلاحيات للمستخدم: grant all on *.* to sysadmin;الخرج: Query OK, 0 rows affected (0.01 sec)والآن فلنعد إلى طرفيّة نظام التشغيل العادية: quit;الخرج: Byeالخطوة الثانية: تثبيت قاعدة بيانات تجريبيةالآن، سنحتاج إلى تثبيت قاعدة بيانات تجريبية بهدف الاختبار. اسم قاعدة البيانات هذه هو "employees" وهي وهي متوفّرة بشكلٍ مجاني من على موقع MySQL، كما أنّه يمكن تحميل قاعدة البيانات من Launchpad. اخترنا قاعدة "employees" لأنّها تحتوي على مجموعة كبيرة من البيانات. رغم ذلك، فإنّ بنية قاعدة البيانات بسيطة بدرجة كافية، إنّها تحتوي على 6 جداول فقط، ولكن وفي داخلها، فهي تحتوي على سجلات 3 مليون موظّف (يمتلك جدول الرواتب لوحده حوالي 3 ملايين صفّ)، وسيساعدنا هذا على محاكاة حِمل بيئة عمل إنتاجية بشكل أفضل. أوّلًا، دعنا نتأكّد أننا في المسار mysqlslap_tutorial/ الخاصّ بنا: cd /mysqlslap_tutorialقم بتحميل آخر إصدار من قاعدة البيانات التجريبية: sudo wget https://launchpad.net/test-db/employees-db-1/1.0.6/+download/employees_db-full-1.0.6.tar.bz2قم بتثبيت bzip2 لنتمكّن من استخراج الملفّ: sudo yum install bzip2والآن قم بفكّ الضغط عن أرشيف قاعدة البيانات، قد يأخذ هذا وقتًا: sudo bzip2 -dfv employees_db-full-1.0.6.tar.bz2 sudo tar -xf employees_db-full-1.0.6.tarسيتم فكّ ضغط المحتويات إلى مسار منفصل جديد يدعى "employees_db"، نحتاج أن نقوم بالذهاب إلى هذا المجلّد لنقوم بتشغيل الأمر الذي يقوم بتثبيت قاعدة البيانات هذه. تتضمّن المحتويات ملفّ README، سجل للتغييرات، حِزَم بيانات وملفّات استعلامات SQL مختلفة تشكّل جميعها بنية قاعدة البيانات: cd employees_db ls -lوهذا هو ما يجب أن تراه: -rw-r--r--. 1 501 games 752 Mar 30 2009 Changelog -rw-r--r--. 1 501 games 6460 Oct 9 2008 employees_partitioned2.sql -rw-r--r--. 1 501 games 7624 Feb 6 2009 employees_partitioned3.sql -rw-r--r--. 1 501 games 5660 Feb 6 2009 employees_partitioned.sql -rw-r--r--. 1 501 games 3861 Nov 28 2008 employees.sql -rw-r--r--. 1 501 games 241 Jul 30 2008 load_departments.dump -rw-r--r--. 1 501 games 13828291 Mar 30 2009 load_dept_emp.dump -rw-r--r--. 1 501 games 1043 Jul 30 2008 load_dept_manager.dump -rw-r--r--. 1 501 games 17422825 Jul 30 2008 load_employees.dump -rw-r--r--. 1 501 games 115848997 Jul 30 2008 load_salaries.dump -rw-r--r--. 1 501 games 21265449 Jul 30 2008 load_titles.dump -rw-r--r--. 1 501 games 3889 Mar 30 2009 objects.sql -rw-r--r--. 1 501 games 2211 Jul 30 2008 README -rw-r--r--. 1 501 games 4455 Mar 30 2009 test_employees_md5.sql -rw-r--r--. 1 501 games 4450 Mar 30 2009 test_employees_sha.sqlقم بتشغيل هذا الأمر للاتصال بـMySQL وتشغيل سكربت employees.sql، والذي سيقوم بإنشاء قاعدة البيانات وتحميل البيانات إليها: sudo mysql -h localhost -u sysadmin -p -t < employees.sqlالآن، يجب عليك إدخال كلمة المرور التي اخترتها للمستخدم "sysadmin" من قبل. يجب أن يكون خرج العملية شيئًا كهذا، قد تأخذ وقتًا (حوال الدقيقة) ليكتمل: +-----------------------------+ | INFO | +-----------------------------+ | CREATING DATABASE STRUCTURE | +-----------------------------+ +------------------------+ | INFO | +------------------------+ | storage engine: InnoDB | +------------------------+ +---------------------+ | INFO | +---------------------+ | LOADING departments | +---------------------+ +-------------------+ | INFO | +-------------------+ | LOADING employees | +-------------------+ +------------------+ | INFO | +------------------+ | LOADING dept_emp | +------------------+ +----------------------+ | INFO | +----------------------+ | LOADING dept_manager | +----------------------+ +----------------+ | INFO | +----------------+ | LOADING titles | +----------------+ +------------------+ | INFO | +------------------+ | LOADING salaries | +------------------+الآن، يمكنك الولوج إلى MySQL وتشغيل بعض الاستعلامات البدائية للتحقق من أنّ البيانات قد تمّ استيرادها بنجاح: sudo mysql -h localhost -u sysadmin -pقم بإدخال كلمة المرور الخاصّة بالمستخدم sysadmin. تحقق من قائمة قواعد البيانات لرؤية قاعدة البيانات employees الجديدة: show databases;الخرج: +--------------------+ | Database | +--------------------+ | information_schema | | employees | | mysql | | performance_schema | +--------------------+ 4 rows in set (0.01 sec)استخدم قاعدة البيانات "employees" عبر الأمر: use employees;وللتحقق من الجداول الموجودة: show tables;الخرج: +---------------------+ | Tables_in_employees | +---------------------+ | departments | | dept_emp | | dept_manager | | employees | | salaries | | titles | +---------------------+ 6 rows in set (0.01 sec)إذا كنت تريد ذلك، فيمكنك التحقق من تفاصيل كلّ جدول من هذه الجداول. سنتحقق الآن من تفاصيل جدول titles فقط: describe titles;الخرج: +-----------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------+-------------+------+-----+---------+-------+ | emp_no | int(11) | NO | PRI | NULL | | | title | varchar(50) | NO | PRI | NULL | | | from_date | date | NO | PRI | NULL | | | to_date | date | YES | | NULL | | +-----------+-------------+------+-----+---------+-------+ 4 rows in set (0.01 sec)وللتحقق من رقم المُدخَلات: mysql> select count(*) from titles;+----------+ | count(*) | +----------+ | 443308 | +----------+ 1 row in set (0.14 sec)يمكنك التحقق من أيّ بيانات أخرى تريدها. بعد أن تنتهي، ارجع إلى طرفيّة نظام التشغيل الرئيسية عبر كتابة: quit;انتهى درسنا حول تثبيت mysqlslap وإعداده، اقرأ الدرس الآخر لمتابعة طريقة استخدامه للقيام بالاختبارات المطلوبة. ترجمة -وبتصرف- للمقال: How To Measure MySQL Query Performance with mysqlslap لصاحبه: Sadequl Hussain.
  21. TLS، أو حماية طبقة النقل (Transport Layer Security)، وسلفها SSL أو طبقة الحِزَم الآمنة (Secure Sockets Layer) هما عبارة عن بروتوكولات آمنة يتم إنشاؤها بهدف توجيه تدفّق البيانات العادية (traffic) ضمن طريق مشفّر وآمن أثناء تنقّلها، وقد قمنا سابقا بشرح كيفية إعداد SSL على خادوم Apache، سنقوم في هذا الدرس بشرح كيفية إعداده مع خادوم nginx. باستخدام هذه التكنولوجيا، يمكن للخواديم أن تقوم بإرسال تدفّق البيانات بشكل آمن بينها وبين الزائر دون الحاجة إلى القلق بخصوص وجود إمكانية لاعتراض تدفّق البيانات بينها وقراءتها بواسطة شخص ما من الخارج. يساعد نظام الشهادات المستخدمين على التحقق من هوية المواقع التي يزورونها أيضًا. في هذا الدرس، سنشرح كيفيّة إنشاء شهادة SSL موقّعة ذاتيًا لخادوم Nginx على Ubuntu 14.04، لن تسمح الشهادة الموقّعة ذاتيًا لمستخدميك من أن يتحققوا من هوية موقعك بما أنّها ليست موقّعة بواسطة واحدة من الجهات التي يثق بها متصفّحك، ولكنّها ستسمح لك بتشفير الاتصالات مع زوّارك. المتطلباتقبل أن تبدأ، يجب أن تهتم ببعض الإعدادات بالطبع. سنستخدم مستخدمًا غير مستخدم الجذر مع صلاحيات sudo في هذا الدرس. يمكنك إعداد واحد عبر اتباع الخطوات المذكورة في درسنا حول إعداد خادوم أوبونتو 14.04 الابتدائي. ستحتاج أيضًا إلى تثبيت خادوم Nginx. إذا كنت تريد إعداد خادوم LEMP كامل (Linux, Nginx, MySQL, PHP) فإنّه يمكنك مراجعة درسنا حول تثبيت LEMP على أوبونتو 14.04. إذا كنت تريد خادوم Nginx فقط، فيمكنك تثبيته بواسطة: sudo apt-get update sudo apt-get install nginxالخطوة الأولى: إنشاء شهادة SSLفلنبدأ عبر إنشاء مسار فرعي ضمن مجلّد إعدادات خادوم Nginx لنضع ملفّات الشهادة التي سنقوم بإنشائها فيه: sudo mkdir /etc/nginx/sslوالآن وبعد أن قمنا بإنشاء ذلك المسار، يمكننا أن نقوم بإنشاء تلك الملفّات بأمر واحد وهو: sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crtسيتم سؤالك عدّة أسئلة. قبل أن نتعرّف عليها، فلنتعرّف على ما يعنيه الأمر السابق: openssl: هذا هو الأمر الأساسي الذي يتم توفيره بواسطة OpenSSL لإنشاء وإدارة الشهادات، المفاتيح وطلبات التوقيع.. إلخ.req: يحدد هذا الأمر الفرعي أننا نريد استخدام إدارة طلبات توقيع الشهادة X.509. X.509 هو عبارة عن معيار بنية تحتية للمفتاح العمومي يحتاجه كلٌّ من SSL وTLS لإدار الشهادات. نريد أن نقوم بإنشاء شهادة X.509 جديدة، ولذلك فإننا سنستخدم هذا الأمر الفرعي.x509-: يقوم هذا أيضًا بتعديل الأمر السابق عبر إخبار الأداة أننا نريد إنشاء شهادة موقّعة ذاتيًا عوضًا عن إنشاء طلب توقيع شهادة، والذي كان ليحدث بالحالة العادية.nodes-: يخبر هذا الخيار OpenSSL بأننا لا نريد تأمين ملفّ المفتاح الخاصّ بنا بجملة مرور، لأنّ استخدام هذا الخيار سيعترض طريق خادوم nginx عندما يتم تشغيله تلقائيًا حيث أنّه يجب علينا إدخال جملة المرور في كلّ مرّة يبدأ فيها الخادوم وفي كلّ مرّة يتم فيها إعادة تشغيله.days 365-: يحدد هذا أنّ الشهادة التي سنقوم بإنشائها صالحة لمدّة 365 يومًا.newkey rsa:2048-: سينشئ هذا الخيار طلب الشهادة ومفتاحًا خاصًّا جديدًا في الوقت ذاته. هذا ضروري جدًا بما أننا لم نقم بإنشاء مفتاح خاصّ مسبقًا. يقوم rsa:2048 بإخبار OpenSSL بأن يقوم بتوليد مفتاح RSA بطول 2048 بت.keyout-: يسمّي هذا المُعامِل الملفّ الناتج لملفّ المفتاح الخاصّ الذي يتم إنشاؤه.out-: يسمّي هذا الخيار ملفّ الشهادة الناتج الذي نقوم بإنشائه.كما وضّحنا أعلاه، ستقوم هذه الخيارات بإنشاء ملفّ مفتاح وشهادة. سيتم سؤالنا بضع أسئلة عن خادومنا بهدف تضمين المعلومات بشكل صحيح في تلك الشهادة. قم بكتابة الأجوبة بشكل صحيح، أهمّ واحد منها هو جواب ذاك السؤال الذي يسألك عن: "Common Name (e.g. server FQDN or YOUR name)". يجب أن تقوم بإدخال اسم نطاقك الذي تريد استخدامه مع خادومك، أو عنوان الـIP العام إذا كنتَ لا تمتلك نطاقًا بعد. أجوبة الأسئلة ستبدو شيئًا كهذا: Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:New York Locality Name (eg, city) []:New York City Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc. Organizational Unit Name (eg, section) []:Ministry of Water Slides Common Name (e.g. server FQDN or YOUR name) []:your_domain.com Email Address []:admin@your_domain.comسيتم إنشاء الشهادة والمفتاح في مسار etc/nginx/ssl/. الخطوة الثانية: إعداد Nginx ليستخدم SSLالآن وبعد أن أصبح ملفّا الشهادة والمفتاح متوفّرين في مسار إعدادات Nginx، نحتاج الآن فقط إلى تعديل إعدادات خادوم Nginx الخاصّة بنا ليستفيد من التغييرات الجديدة. يمكنك تعلّم المزيد عن إعدادات خادوم Nginx من خلال قراءة تصنيف nginx على أكاديمية حسوب. يستطيع الإصدار 0.7.14 والأعلى منه من Nginx (تأتي أوبونتو 14.04 بالإصدار 1.4.6) أن يقوم بتفعيل SSL في نفس كتلة الخادوم (Server Block) كتدفّق HTTP عادي. يسمح لنا هذا بإعداد الوصول إلى نفس الموقع بطريقةٍ مختصرة بشكل أكبر. قد تبدو إعدادات الخادوم الخاصّة بك كالتالي: server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; root /usr/share/nginx/html; index index.html index.htm; server_name your_domain.com; location / { try_files $uri $uri/ =404; } }الشيء الوحيد الذي يجب علينا فعله لنجعل SSL تعمل على نفس الخادوم مع السماح باتصالات HTTP العادية هو إضافة السطور التالية: server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; listen 443 ssl; root /usr/share/nginx/html; index index.html index.htm; server_name your_domain.com; ssl_certificate /etc/nginx/ssl/nginx.crt; ssl_certificate_key /etc/nginx/ssl/nginx.key; location / { try_files $uri $uri/ =404; } }عندما تنتهي، احفظ الملفّ وأغلقه. الآن ستحتاج إلى إعادة تشغيل خادوم Nginx فقط لكي تأخذ التغييرات مجراها: sudo service nginx restartسيقوم هذا بإعادة تحميل إعدادات موقعك، وسيصبح قادرًا على الاستجابة إلى كل من طلبات HTTP وHTTPS. الخطوة الرابعة: اختبر إعداداتكيجب الآن أن تعمل وظيفة SSL بشكلٍ جيّد معك، ولكن يجب علينا اختبارها لنتأكّد من ذلك. أولًا، دعنا نتحقق أنّه ما يزال بإمكاننا الوصول إلى الموقع عبر بروتوكول HTTP العادي. في متصفّحك، قم بزيارة اسم نطاق الخادوم الخاصّ بك أو عنوان الـIP: http://اسم_النطاق_أو_عنوان_الآي_بييجب أن ترى الموقع العادي. في حالتي، سأرى رسالة Nginx الافتراضية فقط: إذا وصلت إلى هذه الصفحة، فهذا يعني أنّ خادومك ما يزال يخدم طلبات HTTP بشكل صحيح. الآن يمكننا التحقق مما إذا كان خادومنا قادرًا على استخدام SSL للتواصل أم لا. قم بذلك عبر كتابة بروتوكول https عوضًا عن http: https://اسم_النطاق_أو_عنوان_الآي_بيسترى رسالة تنبيه أن متصفّحك لم يتمكّن من التحقق من هوية خادومك لأنّه لم يتم توقيع الشهادة الخاصّة به من قبل جهة من الجهات التي يثق بها ذلك المتصفّح. هذه رسالة متوقّعة بمّا أنّ شهادتنا هي شهادة موقّعة ذاتيًا (self-signed). صحيح أّنّه لن يكون من الممكن استخدام شهادتنا للتحقق من هوية خادومنا، إلّا أنّ الخادوم سيزال قادرا على التواصل المشفّر. بمّا أنّ هذه الرسالة هي رسالة متوقّعة، فيمكنك الضغط على زرّ "المتابعة على كلّ حال" أو "Proceed anyway" أو أيّ خيار مشابه تجده أمامك للمتابعة. يجب أن ترى صفحة موقعك مجددًا: قد يظهر لك متصفّحك اسم بروتوكول "https" مشطوبًا في شريط العنوان أو محطّمًا أو بجانبه إشارة قفل مشطوبة. إذا ضغطت على أيقونة القفل، ستجد بعض المعلومات عن الاتصال: كما يمكنك أن ترى، المشكلة هي أنّ المتصفّح غير قادر على التحقق من هوية الخادوم بسبب أنّ شهادته ليست موقّعة من جهة إصدارات شهادات موثوقة بالنسبة إلى المتصفّح لا أكثر. يُظهر لك القسم الذي بالمنتصف أنّ الاتصال مشفّر، وهذا يعني أننا حققنا هدفنا على كلّ حال. الخاتمةلقد قمتَ الآن بإعداد خادوم Nginx الخاصّ بك ليعالج كلًّا من طلبات HTTP وSSL. سيساعدك هذا على التواصل مع زوّارك بشكل أأمن بالإضافة إلى جعل الجهات الخارجية غير قادرة على قراءة تدفّق البيانات الخاصّ بك. إذا كنتَ تخطط لإطلاق موقعٍ للعموم وتحتاج SSL، فإنّه يجب عليك شراء شهادة SSL من جهة شهادات موثوقة لموقعك لتجنّب ظهور رسالة التحذير الصفراء لزوّاك موقعك. ترجمة -وبتصرف- للمقال: How To Create an SSL Certificate on Nginx for Ubuntu 14.04 لصاحبه: Justin Ellingwood. حقوق الصورة البارزة: Designed by Freepik.
  22. يحبّ المصممون استخدام المساحات البيضاء، ويريد أصحاب المواقع ملأها. قد تبدو المساحات البيضاء واحدة من أكثر الجوانب المثيرة للجدل في التصميم. لماذا هي مهمّة جدًا إذًا وكيف يمكننا أن نضمن استخدامها بأفضل طريقة ممكنة؟ المساحات البيضاء هي حجر البناء الأساسي للتصميم الجيّد. إنّها واحدة من أوائل الأمور التي يفكّر بها أيّ مصمم. ولكن بالنسبة إلى العديد من أصحاب المواقع، فإنّها بكلّ بساطة مجرّد إهدارٍ لمساحةٍ كان يمكن استخدامها بشكلٍ أفضل لإيصال الرسائل، الخدمات والمنتجات التي يريدونها. أرغب في هذا المقال في أنّ أشرح سبب أهميّة المساحات البيضاء وكيفيّة إبقاءها ضمن التصميم دون الإضرار بمهام العمل. وعلى كلّ حال وقبل أن أبدأ في ذلك، يجب علينا أن نوضّح ما نعنيه بـ"المساحات البيضاء". مالذي يعنيه المصممون بالمساحات البيضاء؟عندما يتحدّث المصممون عن المساحات البيضاء، فهم يعنون المساحة السلبية بذلك. بعبارةٍ أخرى فهم يقصدون المسافة بين العناصر على الشاشة. وهي ليست دائمًا "بيضاء". فقد تكون هذه المساحة ملوّنة أو خليطًا من الألوان، ولكن وفي كلتا الحالتين فهي مساحة ضمن تصميم لا تحتوي على أيّ عناصر. يمكنك بالأسفل أن ترى بعض الأمثلة على المساحات البيضاء في عدّة مواقع. الآن وبعد أن قمنا بتعريف مصطلح "المساحات البيضاء" بوضوح، فإنّ السؤال التالي سيكون: “لماذا هي مهمّة؟". لماذا المساحات البيضاء مهمّةالمساحات البيضاء هي عنصر أساسي لأيّ تصميم لسببٍ وجيه. إذا تمّ استخدامها بشكلٍ جيّد فيمكنها أن تحوّل من شكل التصميم وتوفّر له العديد من المزايا والمحاسن. بعض هذه المحاسن يكون جماليًا بحتًا بينما تمتلك غيرها أثرًا مباشرًا على فعالية موقعك. أشارك معكم أدناه 4 إيجابيات لهذا النوع الأخير: تحسين الوضوحأفضل ميّزة للمساحات البيضاء هي أنّها تزيد من الوضوح. تحتاج فقط إلى مقارنة الأمثلة الظاهرة أدناه والمستنقاة من http://alistapart.com/article/whitespace حول المساحات البيضاء لتلاحظ كيفّ أنّ استخدامها بشكلٍ جيّد يمكنه أن يحسّن بشكلٍ هائل من درجة وضوح موقعك: فهمٌ أعلىصدّق أو لا تصدّق، يمكن للمساحات البيضاء بين الفقرات وحول أقسام النصوص أن تساعد الناس على أن يفهموا ما يقرؤون بشكلٍ أفضل. وفقًا لدراسة في 2004، يمكن لهذا النوع من المساحات البيضاء أن يحسّن نسبة الفهم بنسبة 20% تقريبًا. تركيزٌ أفضليمكن للمساحات البيضاء أيضًا أن تكون طريقةً رائعة لجذب اهتمام المستخدمين إلى عنصر معيّن على الشاشة. بالنسبة إلى غير المصممين، فإنّ أسهل طريقة لجعل شيءٍ ما يجذب اهتمامًا أكبر هي عبر جعله أكبر. ولكن غالبًا ما يكون إحاطة العنصر بالمساحات البيضاء فعّالًا بنفس الدرجة. إيصال النبرة الصحيحةوأخيرًا، فإنّ استخدام المساحات البيضاء يمكن أن يكون طريقةً ممتازة لإيصال أناقة ونضارة وانفتاح التصميم. طبعًا، هذه ليست الأمور التي تريد إيصالها دومًا عبر تصميمك، ولكنّ عندما تكون هي ما تريده، فليس هناك شيءٌ أفضل من استخدام العديد من المساحات البيضاء في التصميم. أصبحت محاسن المساحات البيضاء واضحةً الآن. ولكن أحيانًا يحصل وأن يتم طرد المساحات البيضاء خارجًا من التصميم. ولمنع هذا فإنّه يجب علينا أن نفهم لما قد يحصل هذا وكيف نتغلّب عليه. أعداء المساحات البيضاء الثلاثأعتقد أنّه هناك ثلاث أعداء رئيسيين يمنعون من استخدام المساحات البيضاء ضمن التصميم. إذا كنتَ تفهم ما هي هذه الأشياء وكيف تتعامل معها، فحينها ستوفّر فرصة أكبر لتصميمك ليستخدم المساحات البيضاء التي يحتاجها. فلنبدأ بالحديث عن الطيّ (the fold). الطيّ The foldيتم طرد المساحات البيضاء خارج التصميم عادةً بسبب أنّ شخصًا ما ضمن المؤسسة يعتقد أنّ المستخدمين لا يقومون باستخدام شريط التمرير (scrollbar). النتيجة هي أنّهم يصرّون على وضع أكبر كمّية ممكنة من المحتوى في أعلى مكان ممكن على الصفحة مما يمنع من استخدام أيّ مساحات بيضاء ضمن التصميم. وعلى كلّ حال، فقد تم إثبات خطأ فكرة أنّ المستخدمين لا يقومون باستخدام شريط التمرير مبكّرًا في عام 1997، بل وأظهرت دراسات حديثة أنّ المستخدمين يقومون باستخدام شريط التمرير بكثرة للانتقال إلى نهاية الصفحات. بالإضافة إلى ذلك، فإنّه من المهم أن تتذكّر أننا لا نعرف النقطة التي سيقوم المستخدمون بالبدء فيها باستخدام شريط التمرير. يعتمد هذا على نوع نظام التشغيل، المتصفّح، دقّة الشاشة والعديد من العوامل الأخرى. في النهاية فإنّ القلق على فكرة "طيّ" الصفحات هي فكرة خاطئة. بعد قول هذا، فإنّه ما يزال من الجيّد أن تضمن أنّ الرسائل التي تحثّ المستخدمين على اتّخاذ إجراء بالإضافة إلى المحتوى موضوعةٌ في أعلى الصفحة. ولكن، هذا لا يعني أنّه يجب عليك تجاهل المحتوى الآخر ضمن الصفحة. أضف إلى ذلك أنّ وضع الكثير من المحتوى في رأس الصفحة وبدايتها سيقلل من أهمّية المحتوى الرئيسي لأنّه سيتم تجاهله في مقابل محتوىً مجاورٍ أقل كما وضّحنا في نقطة "زيادة الانتباه" في الأعلى. محاولة قول الكثيرسببٌ شائع آخر يتم من أجله عدم استخدام المساحات البيضاء ضمن التصميم هو وجود الرغبة في إيصال الكثير من المعلومات في وقتٍ واحد. يمتلك معظم أصحاب المواقع الكثير من الأشياء التي يريدون قولها ولكنّ المستخدمين لسوء الحظ لا يعيرون سوى القليل من الاهتمام. لذلك فإنّه من المهم بالنسبة لك أن تقوم بـ"صرف" هذا الاهتمام بشكلٍ حكيم. صفحتا جوجل وياهو الرئيسيتان هما مثالٌ جيّد على هذه المشكلة. تعرض كلا الشركتان خدماتٍ مشابهة. ولكنّهما تتخذان مسارًا مختلفًا لطريقة هيكلة صفحتيهما الرئيسيتين. كما يمكنك أن ترى من لقطات الشاشة التالية، تحاول ياهو جلب المستخدم لينظر إلى كلّ شيءٍ في وقتٍ واحد. بينما تعرف جوجل أنّ المستخدم لديه تركيز محدود معك ولذلك فإنّهم يركّزون على منتجهم الرئيسي أولًا – البحث. عبر النظر إلى كلتا الصفحتين فإنّك تدرك مباشرةً أيّ واحدة منهما هي الأكثر فعالية. لكي تستفيد من هذه الفكرة أقترح عليك(أو على أولئك الذين يعملون ضمن مؤسستك والذين يريدون دفع المزيد من المحتوى) أن تقوم بتحديد 15 نقطة لاهتمام المستخدم. كلّ عنصرٍ تقوم بإضافته إلى الصفحة يكلّف نقطةً واحدة. إذا كان عنصرٌ ما على الشاشة أكثر أهمّية بالنسبة لك من واحدٍ آخر فإنّك بحاجة إلى إعطائه المزيد من النقاط لتجعله بارزًا. بعددٍ قليل من النقط المتوفّرة فإنّه يصبح من الواضح بشكلٍ سريع أنّك لا تستطيع قول كلّ شيءٍ تريده على الصفحة الرئيسية، ولذا فإنّه لا يوجد حاجة لإخراج المساحات البيضاء من التصميم. السياساتبالطبع وحتّى في أحسن الأحوال في العالم فإنّ صاحب الموقع قد يضطر إلى إضافة الكثير من المحتوى إلى صفحةٍ ما بسبب سياساتٍ داخلية. عندما يصرّ أحدٌ ما أعلى منك ضمن المؤسسة أن يظهر محتوى مشروعه أو مشروعها بأكمله على الصفحة الرئيسية فإنّه هناك القليل مما يمكنك فعله. هذا هو المكان الذي يعرض فيه كتاب "Laws of Simplicity" بعض النصائح الرائعة. إذا كنت لا تستطيع إزالة قطعة معيّنة من المحتوى من الصفحة، فحينها حاول تقليصها أو إخفاءها. خذ على سبيل المثال الطريق الذي استخدمناه على صفحة موقع Wiltshire Farm Foods الرئيسية. لأسباب عدّة فقد تقرر أن تحتوي الصفحة الرئيسية على الطعام وأخبار الصحّة بغضّ النظر عنّ أنّ هذه المعلومات ستشوّش على الزائر أن يقوم باتخاذ الإجراء المطلوب منه (شراء وجبة) ولم يكن شيئًا تهتم به الشريحة الكبرى من المستخدمين. كان حلّنا هو توفير هذا المحتوى ولكن إخفاؤه إلّا في حال قرر المستخدم عرضه. قطعة صغيرة من شفرة جافاسكربت كانت كافية لتوسيع ذلك القسم عند طلب المستخدم. هذا أخفى ذلك المحتوى عن أولئك المستخدمين الغير مهتمين به وسمح للتصميم بأن يحتوي على المزيد من المساحات البيضاء. الخاتمةهناك جدالٌ بسيط حول ما إذا كانت المساحات البيضاء عبارةً عن أداة قيّمة في التصميم يمكن أن تجعل أيّ موقع يبدو أكثر فعالية. ما أراه هو أنّه لا حاجة لأن تكون هذه النقطة هي نقطة خلاف بين المصممين وأصحاب المواقع. أؤمن بأنّ أيّ تصميم سيكون قادرًا على استخدام المساحات البيضاء بشكلٍ يلائم العمل المطلوب منه تنفيذه. ولكن مالذي تعتقدونه أيها الأصحاب؟ مالمشاكل التي واجهتموها مع المساحات البيضاء؟ لماذا تعتقدون أنّ المساحات البيضاء ضمن التصميم مهمّة جدًا؟ أو لماذا لا تعتقدون ذلك؟ شاركونا آرائكم في التعليقات أدناه. تمّت ترجمة المقال: Why whitespace matters وبتصرّف لصاحبه Paul Boag. حقوق الصورة البارزة: Designed by Freepik.
  23. تصميم تجربة المستخدم ليس هو نفس الشيء عندما تقارنه بتصميم واجهات الاستخدام. تجربة المستخدمين تحصل وراء الشاشات وبين الفجوات. كمصممي ويب وواجهات استخدام محمولة فإنّ عملنا يتركّز في بناء واجهاتٍ أنيقة. واجهاتٍ تكون عناصر أساسية في تجربة المستخدم. واجهات تسمح للمستخدمين بأن يحصلوا على أجوبة لأسئلتهم أو إكمال مهام أساسية بالنسبة لهم. عملنا هو أن نساعدهم في تحقيق أهدافهم. لكن إيّاك أن تخطئ وتعتقد أنّ هذه التفاعلات هي كلّ شيءٍ عن تجربة المستخدم. تجربة المستخدمين الرائعة تحصل دومًا خلف الشاشات وفي الفجوات. الفجوات التي تقع بين القنوات، الأجهزة وشركات الأعمال. تحصل تلك التجربة دومًا عندما تقوم المنظّمات بالاهتمام بالتفاصيل الدقيقة لتفاعلاتها مع العملاء. بسبب أنّ تصميم تجربة المستخدم يتعلّق بأكثر من أمر فإنّه من الصعب وصفه عادةً. لذا عوضًا عن ذلك، دعني أعطيك بعض الأمثلة على تفاعلاتٍ تساعد على إنشاء تجربة أفضل للمستخدمين. تفادي إزعاج دعم الهواتفتطبيق Barclays للهواتف الذكية مثال جيّد على تصميم جيّد لتجربة المستخدم. يمتلك التطبيق بذات نفسه واجهة جميلة. ولكنّ هذا ليس هو السبب وراء تجربة المستخدم الجيّدة الخاصّة به. يمتلك Barclays تطبيقًا ممتازًا للهاتف المحمول، ولكن السحر الحقيقي يحصل عندما تحاول الاتصال بهم. إذا أردت الاتصال بـBaraclays فإنّه يمكنك القيام بذلك عبر التطبيق. يسمح لك هذا بتخطّي الحاجة إلى الاستيثاق عبر الهاتف لأنّك قمتَ بهذا بالفعل عندما قمتَ بتسجيل الدخول إلى التطبيق. هذا مثال رائع على تجربة مستخدم مميّزة. أنا متأكّد من أنّ جلب نظام الهاتف والتطبيق ليتحدثا مع بعضهما البعض مباشرةً دون تدخل المستخدم لم يكن أمرًا سهلًا. ولكن بلا شكّ، فإنّه سيساعد المستخدمين على تجنّب الكثير من الإزعاج يوميًا. جعل عمليات الإرجاع أقل صعوبةإذا قمتَ من قبل بإرجاع منتج اشتريته عبر الشبكة فحينها أنت تعرف أنّ الأمر ليس سهلًا دومًا. يجب عليك كتابة طلب إرجاع، الذهاب إلى مكتب البريد والانتظار لأيّام قبل أن يعود المبلغ إلى حسابك الشخصي. وفوق كلّ هذا فهناك ذلك الأمر الذي تقلق حوله دومًا من أنّهم لن يعيدوا لك أموالك. على العكس مما سبق فقد كان لي تجربة حديثة في القيام بعملية إرجاع منتج. بعد أن أخبرت الشركة بأنني أريد إرجاع منتج خاصّ بهم، أخبروني بأنّ المال سيعود مباشرةً إلى حسابي، دون أيّ حاجة لانتظار عودة الطرد إليهم ومن ثمّ التحقق منه مجددًا. عند إرجاع منتج ما فهناك دومًا خوف من ألّا يعيدوا إليك نقودك. هذه فرصة سانحة لتحسين تجربة المستخدم. بعدها سألوني متى أريد أن يتم أخذ الطرد منّي. لم أحتج إلى توضيب الطرد وإغلاقه مجددًا أو تعبئة استمارة إرجاع ولصقها عليه والذهاب إلى البريد أو ما شابه. قام أحدهم فجأة بطرق باب منزلي حاملًا صندوقًا لكي يأخذ المنتج الذي أريد إرجاعه منّي. وضعت المنتج في ذلك الصندوق وأخذه لاحقًا. الآن، هذه تجربة مستخدم مميّزة. مساعدة الزبائن على أن يشعروا بالأمانعملت مرة مع زبون قام ببيع وجبات جاهزة مثلّجة لكبار السنّ. إنّه أمرٌ مثير للقلق بالنسبة لهم عندما يشترون المنتجات عبر الشبكة، ولا يحبّون فكرة أن يقوم شخص غريب بأن يطرق الباب عليهم. للتعامل مع هذه المشكلة، تمّ جعل اسم السائق وهويته واضحين لهم عندما يقومون بطلب عملية توصيل عبر الشبكة. بهذه الطريقة، سيتمكنون من تمييز الشخص الذي سيطرق الباب عليهم لاحقًا ليوصل الطلب إليهم. من الممكن لتجربة مستخدم جيّدة أن تقوم بزيادة أرباحك وأن تميّزك عن منافسيك. ولكنّهم لم يتوقّفوا هناك، بل يقومون بعمل فحص بواسطة الشرطة على جميع السائقين لكي يتمكّن الزبون من التأكّد من أنّ الأمر آمن. كان هذا مكلفًا واستغرق الكثير من الجهد، ولكنّه في المقابل زيادةً ملحوظةً في المبيعات. كان شيئًا لم يتمكّن منافسوهم (مثل Tescos) من تقديمه. الحفاظ على وقت المستخدمبالحديث عن عمليات التوصيل. هل قمت من قبل بالحصول على أيّ طرد عبر شركة DPD؟ أكره عمليات التوصيل، غالبًا ما لا يكون لديك أيّ فكرة عن متى سيصل الطرد الخاصّ بك وهل يجب عليك أن تقوم بمهامك وفقًا لهذا في الصباح أم في المساء. فهذا يعني أنّه يجب عليك أن تكون موجودًا ومستعدًا لرجل تسليم الطرود. لاشيء أبشع من اكتشاف وجود بطاقة تخبرك بالذهاب للمركز البريدي لاحقًا لتسلّم الطرد لأنّك اخترت اللحظة الخاطئة للذهاب إلى الحديقة. تسمح لك DPD بمعرفة موعد وصول الطرد الخاصّ بك بالضبط. تتعامل شركة DPD مع هذا. في يوم التوصيل سيقومون بمراسلتك قبل ساعةٍ من الموعد المتوقّع لوصول الطرد الخاصّ بك. كما وسيقومون أيضًا بالسماح لك بتعقّب طردك في الوقت الحقيقي ومعرفة مكانه عبر الخريطة. هذا يعني أنّه يمكنك معرفة مكان السائق وأن تقرر ما إذا كنت تمتلك 10 دقائق للذهاب إلى المتجر أم لا. بسبب تجربة المستخدم هذا، فإنني أتحمّس بشدّة عندما أكتشف أنني سأستلم طردًا عبر DPD! توفير الإلهاموأخيرًا أريد أن أذكر Etsy. يدرك المدراء في Etsy أنّه هناك الكثير من الأمور التي يمكن الاستفادة منها من قنوات التواصل الإجتماعي غير كونها مجرّد قناة تسويق. يعرفون أنّ العديد من زبائنهم يبحثون عن هديةٍ جيّدة ويحتارون في ماذا يشترون. لهذا قاموا ببناء تطبيق يقوم بالاتصال بحسابات المستخدمين على موقع Facebook. تقوم Etsy بدمج تجربة فيسبوك مع موقعهم عبر عرض اقتراحات الهدايا على المستخدمين عبر تحليل اهتمامات أصدقاء المستخدمين، يقوم التطبيق بتقديم الاقتراحات للمستخدمين عن ماهيّة الهدايا التي يجب عليهم شراؤها. استخدموا التكنولوجيا لتوفير مصدرٍ للإلهام لتجربة الشراء. أليس هذا هو نفسه خدمة العملاء؟ربّما تعتقد أنّ التفكير بهذه الطريقة هو أقرب إلى ما يشبه تصميم خدمة العملاء أكثر منه إلى تصميم تجربة المستخدم. ربّما تكون محقًا. تجربة المستخدمين ليست محدودة بقناةٍ واحدة، جهاز أو قطعة من مشروعك. الحقيقة هي أننا قمنا بتجزئة توصيفات أعمالنا بحيث تتداخل مع بعضها البعض غالبًا. أؤمن أنّ تصميم تجربة المستخدم مهمّ لأكثر من مجال. مجالات تتضمن كلا من تصميم واجهة الاستخدام وخدمة العملاء. مهما كان الاسم الذي تدعوها به، هناك درسٌ مهمّ لتعلّمه، وهو أنّ تجربة المستخدمين ليست محدودة بقناةٍ واحدة، جهاز أو قطعة من مشروعك. ترجمة -وبتصرّف- للمقال User experience design is not what you think لصاحبه Paul Boag. حقوق الصورة البارزة: Designed by Freepik.
  24. TLS، أو حماية طبقة النقل (Transport Layer Security)، وسلفها SSL أو طبقة الحِزَم الآمنة (Secure Sockets Layer) هما عبارة عن بروتوكولات آمنة يتم إنشاؤها بهدف توجيه تدفّق البيانات العادية (traffic) ضمن طريق مشفّر وآمن أثناء تنقّلها. تسمح هذه البروتوكولات للتدفّق بأن يتمّ إرساله بشكل آمن بين جهات بعيدة عن بعضها البعض دون وجود إمكانية لاعتراض تدفّق البيانات بينها وقراءتها بواسطة شخص ما في المنتصف. لها أيضًا دور فعّال في التحقق من هوّية النطاقات والخواديم الموجودة على الإنترنت عبر استخدامها كأداة للتحقق من هوية تلك الخواديم والنطاقات عبر جهة معيّنة تقوم بإصدار تلك الشهادات. في هذا الدرس، سنشرح كيفيّة إنشاء شهادة SSL موقّعة ذاتيًا لخادوم Apache على Ubuntu 14.04، والذي سيسمح لك بأن تقوم بتشفير التدفّق القادم إلى خادومك. صحيح أنّ هذا لن يوفّر لك ميّزة الاستفادة من استيثاق جهة ما من جهات الطرف الثالث (third-parties) لهويّة خادومك، إلّا أنّه يحقق هدف أولئك الذين يريدون نقل المعلومات بأمان وببساطة. المتطلباتقبل أن تبدأ، يجب أن تهتم ببعض الإعدادات بالطبع. سنستخدم مستخدمًا غير مستخدم الجذر مع صلاحيات sudo في هذا الدرس. يمكنك إعداد واحد عبر اتباع الخطوات المذكورة في درسنا حول إعداد خادوم أوبونتو 14.04 الابتدائي. ستحتاج أيضًا إلى تثبيت خادوم Apache. إذا لم تقم بالفعل بتثبيته وتشغيله فقم بتطبيق الأوامر التالية: sudo apt-get update sudo apt-get install apache2الخطوة الأولى: تفعيل وحدة SSLيأتي دعم SSL افتراضيًا بالواقع مع حزمة Apache على أوبونتو 14.04. نحتاج فقط أن نقوم بتفعيله بكلّ بساطة لكي نستفيد من مميزات SSL على خادومنا. لتفعيله، قم بالأمر التالي: sudo a2enmod sslبعد أن تقوم بتفعيل SSL، سيجب عليك إعادة تشغيل خادوم الويب ليتم تطبيق التغييرات: sudo service apache2 restartبعد هذا، سيكون خادومنا قادرًا على استخدام SSL في حال قمنا بضبطه ليقوم بذلك. الخطوة الثانية: إنشاء شهادة SSL موقعة ذاتيافلنبدأ عبر إنشاء مسار فرعي ضمن مجلّد إعدادات خادوم Apache لنضع ملفّات الشهادة التي سنقوم بإنشائها فيه: sudo mkdir /etc/apache2/sslوالآن وبعد أن قمنا بإنشاء ذلك المسار، يمكننا أن نقوم بإنشاء تلك الملفّات بأمر واحد وهو: sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crtفلنتعرّف على ما يعنيه الأمر السابق: openssl: هذا هو الأمر الأساسي الذي يتم توفيره بواسطة OpenSSL لإنشاء وإدارة الشهادات، المفاتيح وطلبات التوقيع.. إلخ.req: يقوم هذا بتحديد أمرٍ فرعي لإدارة طلب توقيع شهادة X.509 (CSR). X.509 هو معيار بنية تحتية للمفاتيح العمومية تستخدمه SSL لإدارة الشهادات والمفاتيح. بما أننا نريد إنشاء شهادة X.509 جديدة، فإنّ هذا هو ما نريده.x509-: يقوم هذا الخيار بتحديد أننا نريد إنشاء ملفّ شهادة موقّعة ذاتيًا عوضًا عن إنشاء طلب شهادة.nodes-: يخبر هذا الخيار OpenSSL بأننا لا نريد تأمين ملفّ المفتاح الخاصّ بنا بجملة مرور، لأنّ استخدام هذا الخيار سيعترض طريق خادوم أباتشي عندما يتم تشغيله تلقائيًا حيث أنّه يجب علينا إدخال جملة المرور في كلّ مرّة يبدأ فيها الخادوم وفي كلّ مرّة يتم فيها إعادة تشغيله.days 365-: يحدد هذا أنّ الشهادة التي سنقوم بإنشائها صالحة لمدّة 365 يومًا.newkey rsa:2048-: سينشئ هذا الخيار طلب الشهادة ومفتاحًا خاصًّا جديدًا في الوقت ذاته. هذا ضروري جدًا بما أننا لم نقم بإنشاء مفتاحٍ خاصّ مسبقًا. يقوم rsa:2048 بإخبار OpenSSL بأن يقوم بتوليد مفتاح RSA بطول 2048 بت.keyout-: يسمّي هذا المُعامِل الملفّ الناتج لملفّ المفتاح الخاصّ الذي يتم إنشاؤه.out-: يسمّي هذا الخيار ملفّ الشهادة الناتج الذي نقوم بإنشائه.عندما تقوم بضغط زرّ Enter فسيتم سؤالك بضع أسئلة. أهمّ واحدٍ منها هو ذاك السؤال الذي يسألك عن الـ"Common Name". يجب أن تقوم بإدخال اسم نطاقك الذي تريد استخدامه مع الشهادة هنا، أو عنوان الـIP العام إذا كنتَ لا تمتلك نطاقًا بعد. أجوبة الأسئلة ستبدو شيئًا كهذا: Country Name (2 letter code) [AU]:US State or Province Name (full name) [Some-State]:New York Locality Name (eg, city) []:New York City Organization Name (eg, company) [Internet Widgits Pty Ltd]:Your Company Organizational Unit Name (eg, section) []:Department of Kittens Common Name (e.g. server FQDN or YOUR name) []:your_domain.com Email Address []:your_email@domain.comسيتم إنشاء الشهادة والمفتاح في مسار etc/apache2/ssl/. الخطوة الثالثة: إعداد Apache ليستخدم SSLالآن وبعد أن أصبح ملفّا الشهادة والمفتاح متوفّرين، يمكننا الآن ضبط خادوم أباتشي ليستخدم هذه الملفّات ضمن ملفّ مستضيف وهمي (virtual host file). يمكنك تعلّم المزيد عن كيفيّة إعداد واحد من موقعنا. عوضًا عن وضع إعداداتنا كلّها في ملفّ 000-default.conf في مجلّد sites-available الفرعي، فسنقوم بوضع هذه الإعدادات في ملفّ default-ssl.conf والذي يحوي إعدادات SSL الافتراضية. افتح الملفّ بصلاحيات الجذر عبر: sudo nano /etc/apache2/sites-available/default-ssl.confيجب أن يبدو الملفّ كالتالي (بعد إزالة التعليقات): <IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> BrowserMatch "MSIE [2-6]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown </VirtualHost> </IfModule>قد يبدو هذا معقّدًا قليلًا، ولكن لحسن الحظّ فإننا لا نحتاج إلى تعديل معظم الخيارات هنا. نريد فقط إعداد الأمور العادية التي نريدها ضبطها للمستضيف الوهمي (مدير الخادوم، اسم الخادوم، اختصار الخادوم، المسار الجذر.. إلخ) بالإضافة إلى تغيير المكان الذي يبحث فيه أباتشي عن شهادة الـSSL والمفتاح. في النهاية، سيبدو الملفّ كالتالي: <IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin admin@example.com ServerName your_domain.com ServerAlias www.your_domain.com DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/apache2/ssl/apache.crt SSLCertificateKeyFile /etc/apache2/ssl/apache.key <FilesMatch "\.(cgi|shtml|phtml|php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> BrowserMatch "MSIE [2-6]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown </VirtualHost> </IfModule>احفظ الملفّ واخرج عندما تنتهي. الخطوة الرابعة: تفعيل شهادة SSL للمستضيف الوهميالآن وبعد أن قمنا بضبط المستضيف الوهمي الذي أعددناه ليستخدم SSL افتراضيًا، يجب عليك أن نقوم بتفعيله. يمكننا القيام بذلك ببساطة عبر تنفيذ: sudo a2ensite default-ssl.confومن ثمّ، سيجب عليك إعادة تشغيل خادوم أباتشي لتحميل ملفّ إعدادات المستضيف الجديد: sudo service apache2 restartيجب أن يتمَّ الآن تفعيل المستضيف الوهمي الجديد الخاصّ بك، والذي سيخدم المحتوى المشفّر باستخدام شهادة SSL التي قمتَ بإنشائها. الخطوة الخامسة: اختبر إعداداتكالآن وبعد أن قمتَ بإعداد كلّ شيء، يمكنك اختبار إعداداتك عبر زيارة اسم النطاق الخاصّ بك أو عنوان الـIP بعد كتابة //:https قبله، كالتالي: https://اسم_النطاق_أو_عنوان_الآي_بيسترى رسالة تنبيه أنّ متصفّحك لم يتمكّن من التحقق من هوية خادومك لأنّه لم يتم توقيع الشهادة الخاصّة به من قبل جهة من الجهات التي يثق بها ذلك المتصفّح. هذه رسالة متوقّعة بمّا أنّ شهادتنا هي شهادة موقّعة ذاتيًا (self-signed). صحيحٌ أّنّه لن يكون من الممكن استخدام شهادتنا للتحقق من هوية خادومنا، إلّا أنّ الخادوم سيزال قادرًا على التواصل المشفّر. بمّا أنّ هذه الرسالة هي رسالة متوقّعة، فيمكنك الضغط على زرّ "المتابعة على كلّ حال" أو "Proceed anyway" أو أيّ خيار مشابه تجده أمامك للمتابعة. سيتم أخذك بعدها إلى قيمة خيار DocumentRoot التي قمتَ بإعدادها مسبقًا في ملفّ إعدادات SSL الخاصّ بالمستضيف الوهمي. الآن هكذا، أصبح تدفّق البيانات الخاصّ بك مشفّرًا. يمكنك التحقق من ذلك عبر الضغط على أيقونة القفل الموجودة في شريط العنوان: يمكنك أن ترى ذلك القسم الأخضر في المنتصف الذي يخبرك أنّ الاتصال مشفّر. الخاتمةيجب أن تمتلك SSL مفعّلةً الآن على خادومك. ستساعدك على تأمين الاتصال بين موقعك وبين الزوّار، ولكنّ المتصفّحات ستقوم بتحذير كلّ مستخدم يزور موقعك بخصوص شهادة خادومك وأنّه غير قادر على التحقق منها. إذا كنتَ تخطط لإطلاق موقع للعموم وتحتاج SSL، فإنّه يجب عليك شراء شهادة SSL من جهة شهادات موثوقة لموقعك. يمكنك قراءة المزيد من الدروس حول كيفية إعداد خادوم أباتشي أو تأمين خادومك. ترجمة -وبتصرف- للمقال: How To Create a SSL Certificate on Apache for Ubuntu 14.04 لصاحبه: Justin Ellingwood. حقوق الصورة البارزة: Designed by Freepik.
  25. في هذا الدرس، سنشرح طريقة تثبيت Icinga على Ubuntu 14.04. نظام المراقبة Icinga هو نظام مفتوح المصدر لمراقبة الخواديم والخدمات. سنغطّي بعض الإعدادات الأساسية التي ستجعلك قادرًا على مراقبة خدمات الشبكة وموارد الجهاز المستضيف عبر واجهة الويب. سنستخدم أيضًا مشغّل ملحق Nagios البعيد (NRPE - Nagios Remote Plugin Executor)، والذي سيتم تثبيته كعميل (agent) على أنظمة بعيدة (remote systems) لمراقبة مواردها المحلّية (استخدام الأقراص، عدد المستخدمين المسجّلين للدخول.. إلخ). Icinga هو عبارة عن تطبيق مراقبة أنظمة شهير ومفتوح المصدر يعمل على مراقبة الأجهزة المستضيفة والخدمات، ويقوم أيضًا بتنبيهك دوريًا عن حالتها. Icinga هو عبارة عن اشتقاق (Fork) من Nagios، لذا فهما متوافقان مع بعضهما البعض ويتشاركان بالعديد من الأمور، وقد اكتسب Icinga شعبيةً بسبب عملية تطويره الأكثر سرعةً مقارنةً بـNagios. المتطلباتلإكمال هذا الدرس، ستحتاج إلى إمكانية استخدام صلاحيات الجذر على خادوم Ubuntu 14.04. يمكن العثور على إرشادات إعداد هذه الصلاحيات من هنا. أيضًا، إذا كنتَ تريد إعداد ميّزة التنبيه عبر البريد الإلكتروني، فستحتاج إلى القيام بإعداد Postfix بطريقةٍ صحيحة. يمكن العثور على إرشادات القيام بذلك من هنا. يتم تثبيت Postfix مع حزم Icinga، ولكن يمكن إعداده لاحقًا بعد أن يتم تثبيت Icinga. تثبيت Icingaسينقوم بتثبيت Icinga باستخدام الحزم. أيضًا، سنقوم باستخدام MySQL كقاعدة بيانات. قم بتطبيق الأمر التالي لإضافة مستودع Icinga إلى مدير الحزم الخاصّ بك: sudo add-apt-repository ppa:formorer/icingaثمّ قم بتحديث قاعدة الحزم الخاصّة بك: sudo apt updateوالآن قم بتثبيت Icinga وMySQL عبر الأمر: sudo apt install icinga icinga-doc icinga-idoutils mysql-server libdbd-mysql mysql-clientسيتم سؤالك عن أكثر من شيء أثناء عملية التثبيت. إليك قائمة بالأمور التي سيتم سؤالك عنها وكيف يجب أن تجاوب عليها: إعداد MySQL: قم بإدخال كلمة مستخدم جذر جديدة لـMySQL.إعداد Postfix: اختر "Internet Site".إعداد Postfix: قم بإدخال نطاقك المؤهّل الذي تستعمله (example.com مثلًا).إعداد icinga-cgi: قم بإدخال كلمة مرور للمستخدم "icingaadmin" (ستحتاجها لتسجيل الدخول إلى لوحة التحكّم لاحقًا).إعداد icinga-common: اختر "No" لتفعيل الأوامر الخارجية.إعداد icinga-idoutils: اختر "Yes" لإعداد قاعدة بيانات لـicinga-idoutils باستخدام dbconfig-common.إعداد icinga-idoutils: اختر "mysql" كنوع قاعدة البيانات.إعداد icinga-idoutils: أدخل كلمة مرور المستخدم الجذر (root) الخاصّ بقاعدة البيانات (التي قمتَ بإدخالها أولًا).إعداد icinga-idoutils: قم بإدخال كلمة مرور جديدة لمستخدم قاعدة البيانات الخاصّة بـicinga-idoutils.هكذا يكون تثبيت Icinga مكتملًا، ولكننا مانزال بحاجة إلى إعداد بضع أمور قبل أن نتمكّن من تشغيله. لاحظ أنّ خادوم Apache وPostfix قد تمّ تثبيتهما تلقائيًا أثناء تثبيت Icinga كاعتماديات. قم بإضافة المستخدم الرئيسي لخادوم Apache والذي يدعى www-data إلى مجموعة nagios: sudo usermod -a -G nagios www-dataقم بتفعيل عفريت ido2db لكي يبدأ عند الإقلاع، والذي يقوم بتخزين أحداث وإعدادات Icinga في قاعدة البيانات. لتعديل إعدادات Icinga الافتراضية: sudo vi /etc/default/icingaقم بتغيير قيمة IDO2DB إلى yes لتبدو بالشكل التالي: IDO2DB=yesاحفظ الملفّ واخرج، وقم بإعادة تشغيل خدمة ID02DB: sudo service ido2db startقم بتفغيل وحدة idomod عبر نسخ ملفّ عيّنة idoutils.cfg إلى مجلّد إعدادات Icinga الحالي: sudo cp /usr/share/doc/icinga-idoutils/examples/idoutils.cfg-sample /etc/icinga/modules/idoutils.cfgوالآن أصبح Icinga مضبوطًا وجاهزًا للبدء: sudo service icinga restartوالآن فلنجرّب واجهة Icinga الرسومية. الوصول إلى واجهة Icinga الرسوميةاذهب إلى http://yourhost/icinga ، وقم بتسجيل الدخول باستخدام مستخدم icingaadmin وكلمة المرور الخاصّة به اللذان قمت بإعدادهما مسبقًا. يجب أن ترى أنّه Icinga يقوم حاليًا بمراقبة مستضيفٍ واحدٍ فقط هو localhost (خادومك الحالي) و7 خدمات كالتالي: يعرض الصفّ الأوّل أنّ المستضيف الوحيد الذي يتم مراقبته حاليًا فعّال، ويظهر الصفّ السفلي أنّه هناك 7 خدمات يتم مراقبتها حاليًا وتعمل بشكلٍ جيّد. إذا كانت حالة localhost هي "Down"، فحينها ربّما تحتاج إلى تغيير صلاحيات الأمر ping الخاصّ بك. شغّل الأمر التالي للسماح للمستخدم nagios باستخدام الأمر ping: sudo chmod u+s `which ping`طرق المراقبة بواسطة Icingaهناك طريقتان رئيسيتان لمراقبة المستضيفين والخدمات بواسطة Icinga: مراقبة "الخدمات العموميّة المتوفّرة".المراقبة عبر عميل مثبّت على جهاز مستضيف (host) بعيد لجمع وإرسال البيانات إلى Icinga. عند استخدام الطريقة الأولى، تشير الخدمات العمومية العامّة إلى الخدمات التي يمكن الوصول إليها عبر الشبكة المحلّية أو الإنترنت. الأمثلة الأكثر شيوعًا لذلك هي HTTP, البريد، SSH وICMP Ping. هذه الطريقة مفيدة لمراقبة الأنظمة التي لا يمكنك (أو لا تريد) تثبيت عميل (agent) عليها، وأيضًا لمراقبة واجهات الشبكة المقابلة للمستخدم. لتضمين الطريقة الثانية، سنقوم بتثبيت NRPE كعميل خاصّ بنا على المستضيفين البعيدين (remote hosts) لمراقبة مواردهم المحلّية. سيسمح هذا لـIcinga بمراقبة أشياء مثل استخدام القرص، العمليات التي تعمل حاليًا وأمورٍ أخرى بالنظام لا يمكن للطريقة الأولى مراقبتها. الطريقة 1: مراقبة الخدمات العمومية المتوفرةبسبب أنّ الطريقة الأولى تقوم ببساطة بمراقبة الخدمات المُشغّلة حاليًا، فإنّ إعداد هذه الطريقة سيكون بأكمله على خادوم Icinga. يمكن مراقبة العديد من الأشياء باستخدام هذه الطريقة، لذا سنوضّح كيفية مراقبة واجهة عمومية (public interface) لخادوم ويب. أنشئ ملفًّا باسم المستضيف الخاصّ بك، باستخدام هذا الأمر (استبدل yourhost باسم المستضيف عندك): sudo vi /etc/icinga/objects/yourhost.cfgالآن قم بإضافة السطور التالية، حيث ستستبدل host_name باسم المستضيف الخاصّ بك (في كلا المكانين)، alias بوصف للمستضيف و address بعنوان الـIP العمومي الخاصّ بالمستضيف: define host { use generic-host host_name web-1 alias A Web Server address 107.170.xxx.xxx } define service { use generic-service host_name web-1 service_description HTTP check_command check_http }احفظ الملفّ واخرج، وقم بإعادة تحميل إعدادات خدمة Icinga لكيّ تأخذ التغييرات مجراها: sudo service icinga reloadالطريقة 2: المراقبة باستعمال عميل (Agent)كما ذكرنا سابقًا، سنستخدم NRPE كعميلنا الافتراضي لجلب البيانات من مستضيفٍ بعيد إلى Icinga. هذا يعني أنّه يجب تثبيت NRPE على جميع الأجهزة والخواديم المستضيفة التي سيتم مراقبتها باستخدام هذه الطريقة، وسيجب أيضًا إعداد خادوم Icinga ليستقبل البيانات من كلّ الأجهزة المستضيفة (hosts). فلنقم بتثبيت NRPE. تثبيت NRPE على مستضيف بعيدقم بتطبيق الأمر التالي على الخادوم الذي تريد أن يتم مراقبته لتحديث قاعدة بيانات الحزم: sudo apt updateوالآن قم بتثبيت NRPE وملحقات Nagios: sudo apt install nagios-plugins nagios-nrpe-serverابحث عن اسم نظام ملفّات الجذر الخاصّ بك (لأنّه واحدٌ من الأشياء التي نريد مراقبتها): df -h /سنستخدم اسم نظام الملفّات في إعدادات NRPE لمراقبة استخدام القرص الصلب (سيكون غالبًا /dev/vda/). الآن قم بفتح ملفّ nrpe.cfg للتعديل: sudo vi /etc/nagios/nrpe.cfgملفّ إعدادات NRPE طويلٌ جدًا ومليء بالتعليقات. هناك القليل من السطور التي يجب عليك تعديلها فقط: server_address: قم بتغييره إلى عنوان الـIP الخاصّ لهذا المستضيف.allowed_hosts: قم بتعيين هذا إلى عنوان الـIP الخاصّ لخادوم Icinga الخاصّ بك.[command[check_hda1: غيّر dev/hda1/ إلى اسم نظام الملفّات الجذر الخاصّ بك الذي حصلت عليه من الخطوة السابقة.يجب أن تبدو السطور الثلاثة كشيءٍ مشابه للتالي بعد التعديل: server_address=client_private_IP allowed_hosts=nagios_server_private_IP command[check_hda1]=/usr/lib/nagios/plugins/check_disk -w 20% -c 10% -p /dev/vdaلاحظ أنّه هناك العديد من الأوامر الأخرى المعرّفة في هذا الملفّ التي سيتم تشغيلها في حال ما إذا تمّ ضبط Icinga ليستعملها. لاحظ كذلك أنّ NRPE سيعمل على المنفذ 5666 لأنّ الخيار server_port مضبوط على القيمة 5666. إذا كنتَ تمتلك أيّ جدارٍ ناري يمنع ذلك المنفذ، فيجب عليك فتحه لخادوم Icinga. احفظ الملفّ واخرج، وقم بإعادة تشغيل NRPE ليتم تطبيق التغييرات: sudo service nagios-nrpe-server restartبمجرّد ما أن تنتهي من تثبيت وإعداد NRPE على أجهزة المستضيفين التي تريد مراقبتها، سيجب عليك إضافة هؤلاء المستضيفين (hosts) إلى إعدادات خادوم Icinga الخاصّ بك قبل أن يبدأ بمراقبتهم. إضافة مستضيف بعيد إلى إعدادات خادوم Icingaعلى خادوم Icinga الخاصّ بك، قم بإنشاء ملفّ إعداداتٍ جديد لكلّ واحدٍ من الأجهزة المستضيفة البعيدة التي تريد مراقبتها في etc/icinga/objects/ واستبدل yourhost باسم المستضيف الذي تريده: sudo vi /etc/icinga/objects/yourhost.cfgقم بإضافة تعريف المستضيف التالي إلى الملفّ، واستبدل قيمة host_name باسم المستضيف البعيد الخاصّ بك (استعملتُ wordpress-1 في مثالي)، قيمة alias بوصف للمستضيف وقيمة address بعنوان الـIP الخاصّ للمستضيف البعيد: define host { use generic-host host_name wordpress-1 alias My first wordpress server address 10.128.xxx.xxx }ثمّ قم بإضافة أيّ واحدٍ من أقسام الخدمات التي تريد مراقبتها. لاحظ أنّ قيمة check_command تحدد مالذي سيتم مراقبته. إليك بعض الأمثلة على ما يمكنك إضافته إلى ملفّ الإعدادات الخاصّ بالمستضيف البعيد الخاصّ بك: Ping: define service { use generic-service host_name wordpress-1 service_description PING check_command check_ping!100.0,20%!500.0,60% }SSH (عند تعيين notifications_enabled إلى 0 فإنّه يتم تعطيل التنبيهات للخدمة) define service { use generic-service host_name wordpress-1 service_description SSH check_command check_ssh notifications_enabled 0 }الحمل(Load): define service { use generic-service host_name wordpress-1 service_description Current Load check_command check_load!5.0!4.0!3.0!10.0!6.0!4.0 }المستخدمون الحاليون: define service { use generic-service host_name wordpress-1 service_description Current Users check_command check_users!20!50 }مساحة القرص: define service { use generic-service host_name wordpress-1 service_description Disk Space check_command check_all_disks!20%!10% }إذا كنت تتسائل عن معنى use generic-service، فهي عبارة عن خيار يقوم ببساطة بجلب قِيَم قالب خدمة يدعى "generic-service" المعرّف افتراضيًا. الآن احفظ الملفّ واخرج. وقم بإعادة تحميل إعدادات Icinga: sudo service icinga reloadمثال على واجهة المستخدمبعد ضبط إعدادات المراقبة على بعض أجهزة المستضيفين بواحدٍ من الطرق المتوفّرة، اذهب إلى واجهة الويب الخاصّة بـIcinga على http://youricingaserver.com/icinga وأدخل اسم المستخدم وكلمة المرور اللذين أدخلتهما أثناء التثبيت. واضغط على رابط "Service Link". يجب أن ترى قائمة بجميع الخدمات التي قمتَ بتجهيزها ليتم مراقبتها حاليًا. كمثال، إليك مستضيفين اثنين يتم مراقبتهما باستخدام ملفّات الإعدادات التي وصفناها بالأعلى. يتم مراقبة خدمة web-1HTTP عبر منفذ HTTP العادي الخاصّ بها، وهي حاليًا تخبرنا أنّ كلّ شيءٍ يعمل بشكلٍ جيّد، وwordpress-1 يخبرنا أيضًا أنّ جميع خدماته التي نراقبها تعمل بشكلٍ جيّد حاليًا. يمتلك Icinga الكثير من المزايا، يمكنك تصفّح واجهة الويب لاستكشاف المزيد عن المستضيفين والخدمات التي تراقبها. الخاتمةالآن وبعد أن صرتَ قادرًا على مراقبة الخواديم التي تريدها والخدمات التي تحددها، ربّما تريد إمضاء المزيد من الوقت في استكشاف الخدمات المهمّة بالنسبة لك والتي تريد مراقبتها. ربّما تودّ أيضًا إعداد التنبيهات عبر البريد الإلكتروني في حال امتلاء القرصّ الصلب الخاصّ بك مثلًا أو تعطّل موقعك الرئيسي، لكي تتمكن من حلّ المشاكل فورًا أو قبل حصولها حتّى. ترجمة -وبتصرف- للمقال: How To Use Icinga To Monitor Your Servers and Services On Ubuntu 14.04 لصاحبه: Mitchell Anicas. حقوق الصورة البارزة: Designed by Freepik.