لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 08/04/15 في كل الموقع
-
Ajenti هي لوحة تحكّم عبر الويب حرّة ومفتوحة المصدر يمكن استخدامها لتنفيذ مجموعة كبيرة ومتنوعة من مهام إدارة الخوادم، علاوةً على إمكانية تغطيتها لمجموعة أخرى من المهام عبر تركيب إضافات add-ons كإضافة Ajenti V والتي تسمح بإدارة عدّة مواقع من خلال لوحة تحكم واحدة. في هذا الدرس سوف نشرح تركيب مدوّنة ووردبريس WordPress على لوحة التحكم Ajenti مع الإضافة Ajenti V، حيث أفترض أنك قمت بتركيبهما في وقتٍ سابق. المتطلباتفي هذا الدرس ستحتاج إلى: عنوان نطاق domain مُسجّل ومربوط مع خادوم مُثبّت عليه لوحة التحكم Ajenti مع الإضافة Ajenti V (خلال الدرس سأستخدم النطاق example.com للتوضيح). لوحة التحكم Ajenti مُثبتة ومضبوطة بشكل صحيح مع الإضافة Ajenti V، يمكنك قراءة هذا الدرس لتثبيت Ajenti خطوة بخطوة.الخطوة الأولى: ضبط ووردبريسمن خلال متصفح الويب لديك انتقل إلى عنوان لوحة تحكم Ajenti الخاصة بك مثل https://panel.example.com وسجّل دخولك باستخدام حساب المدير admin الذي أنشأته أثناء تركيب Ajenti و Ajenti V. من الشريط الجانبي وتحت القسم Web اختر Websites. في المرة الأولى قد تُعطى إشعارًا بأنّ الخاصيّة غير مُفعّلة بعد، فقط اضغط على الزر Enable ودع Ajenti V يقوم ببعض عمليات الضبط الضروريّة. الآن سيظهر لنا قسمٌ يُسمى New Website وأسفله حقل نصيّ بعنوان Name. اكتب اسمًا معرّفًا لموقعك في هذا الحقل ثم اضغط على الزر Create، حيث ستلاحظ إدراج الموقع أسفل القسم Websites. اختر Manage لإدارته. أسفل قسم Website Files غيّر المسار srv/new-website/ إلى أي مجلد آخر مثل srv/example.com/. اضغط على الزر Set ثم Create Directory. تذكّر المجلد الذي اخترته، حيث سترفع إليه الملفات بعد قليل. أسفل القسم General أزل تفعيل الخيار Maintenance mode. ثم انقر على Apply changes أسفل الصفحة. الآن من أعلى الصفحة اختر علامة التبويب Domains، اضغط على الزر Add واكتب عنوان نطاقك مثل example.com ضمن المربع النصي الظاهر، ثم انقر على Apply Changes. انتقل إلى علامة التبويب Advanced، وأدخل النصّ التالي ضمن مربع Custom configuration:# This order might seem weird - this is attempted to match last if rules below fail. location / { try_files uriuri/ /index.php?$args; } # Add trailing slash to */wp-admin requests. rewrite /wp-adminscheme://hosturi/ permanent; # Directives to send expires headers and turn off 404 error logging. location ~* ^.+\.(ogg|ogv|svg|svgz|eot|otf|woff|mp4|ttf|rss|atom|jpg|jpeg|gif|png|ico|zip|tgz|gz|rar|bz2|doc|xls|exe|ppt|tar|mid|midi|wav|bmp|rtf)$ { access_log off; log_not_found off; expires max; } location = /favicon.ico { log_not_found off; access_log off; } location = /robots.txt { allow all; log_not_found off; access_log off; } # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac). # Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban) location ~ /\. { deny all; } # Deny access to any files with a .php extension in the uploads directory # Works in sub-directory installs and also in multisite network # Keep logging the requests to parse later (or to pass to firewall utilities such as fail2ban) location ~* /(?:uploads|files)/.*\.php$ { deny all; }انقر Apply changes. لننتقل الآن إلى لسان التبويب Content ومن القائمة المنسدلة اختر PHP FastCGI واضغط Create. انقر على القائمة Advanced أسفل new PHP entry، وأدخل المحتوى التالي ضمن Custom configuration. انتبه إلى أنه غير متطابق مع محتوى Custom configuration في الخطوة السابقة. try_files uri=404;fastcgisplitpathinfo(.+\.php)(/.+);انقر Apply Changes. انتقل إلى علامة التبويب MySQL أسفل قسم Databases، أدخل اسمًا لقاعدة البيانات، لهذا الدرس سأختار الاسم database_name وانقر على Create. الآن ومن أسفل قسم Users انقر على Create يمكنك الإبقاء على اسم المستخدم وكلمة المرور المولّدة تلقائيًا أو تغييرها إن شئتْ، ولهذا الدرس سأستخدم db_user و db_password على التوالي، عندما يكون كل شيء جاهزًا انقر على Apply Changes. احتفظ بالمعلومات التي أدخلتها جانبًا؛ اسم قاعدة البيانات، اسم المستخدم، وكلمة المرور، حيث ستحتاجها بعد قليل لإكمال إعداد ووردبريس. الخطوة الثانية: رفع الملفاتقبل أن تتمكّن من فك ضغط ملفات نظام ووردبريس أنت تحتاج لأداة فك الضغط zip أولًا. من الشريط الجانبي وأسفل قسم Tools اختر Terminal واضغط على New، انقر على الصندوق الأسود الذي سيظهر أمامك واطبع بداخله الأمر التالي: apt-get install zip unzip بعد انتهاء العملية انقر على X بجوار Terminal 0 أعلى الصفحة. عُد الآن مجددًا إلى قسم Websites واضغط على Manage بجوار موقعك، ثم اذهب إلى لسان التبويب General ضمن موقعك وأسفل القسم Automatic Downloader أدخل http://wordpress.org/latest.zip واضغط على Download and Unpack، حيث ستظهر نافذة طرفية وتتولى عملية تنزيل وفك ضغط حزمة ووردبريس، يمكنك الضغط على الزر X بجوار Terminal 0 في أعلى الصفحة بعد الانتهاء. عُد إلى القسم Tools في الشريط الجانبي وانقر على File Manager ثم توجّه إلى الدليل الذي أنشأته مسبقًا داخل المجلد /srv/ بالنقر على اسم المجلد، هناك يجب أن تُشاهد مجلد باسم wordpress والذي يتمّ إنشائه أثناء تنزيل وفك الضغط التلقائي للحزمة ووردبريس، ادخل إليه وحدد جميع الملفات والمجلدات التي بداخله كما يلي: الآن اختر العملية Cut من شريط الأدوات أعلى الشاشة: عُد إلى مجلدك داخل الدليل /srv/ مثل srv/example.com/ وألصق جميع الملفات والمجلدات بداخله مباشرةً. سيأخذ ذلك بضعة دقائق للانتهاء يمكنك بعدها حذف المجلد الفارغ wordpress. الآن جميع ملفات ووردبريس بداخل المجلد الجذر root لموقعك. الخطوة الثالثة: تركيب ووردبريسفي متصفح الإنترنت لديك انتقل إلى عنوان موقعك مثل http://example.com وستظهر أمامك صفحة ترحيبية من مُثبّت برنامج ووردبريس، اختر اللغة التي ترغب باستخدامها مع البرنامج واضغط على Continue ثم .. !Let’s go. في حقل اسم قاعدة البيانات غيّر القيمة الافتراضية wordpress إلى الاسم الذي اخترته سابقًا (database_name مثلًا هي القيمة التي اخترناها لهذا الدرس)، كذلك أدخل اسم المستخدم وكلمة المرور التي قمتَ بتحديدها. أبقِ قيمة Database host كما هي localhost. كما يمكنك ترك قيمة الخانة Table Prefix على حالها wp_ إلا أنه يُنصح بتغييرها لدواعٍ أمنيّة، مثلا يمكنك كتابة blog_ أو شيء من هذا القبيل، المهم أن لا يتجاوز طول الاسم خمسة محارف وأن ينتهي بالرمز _. الآن يمكنك النقر على زر Run the install لإكمال عملية التثبيت، وبعدها سيتبقى عليك تزويد البرنامج ببعض المعلومات عن موقعك (كالاسم، ومعلومات تسجيل الدخول). الخلاصةفي نهاية هذا الدرس يُفترض أن تكون قد تمكّنت من تثبيت برنامج ووردبريس بنجاح على لوحة تحكم Ajenti الخاصة بك. ترجمة -وبتصرف- للمقال Installing WordPress on Ajenti V لصاحبه Jonah Aragon.1 نقطة
-
تتعرّض جميع الخدمات التي يتم تقديمها عبر الإنترنت لمختلف أنواع الهجمات من قبل أطرافٍ مُسيئة. فإذا كانت الخدمة تتطلب تسجيل دخول (أو ما يُعرف بالتوثيق أو المُصادقة)؛ فسيحاول بعض المستخدمين غير الشرعيين أو برمجيات bot الخبيثة الولوج إلى الخدمة من خلال تكرار محاولات المُصادقة بتجريب بيانات تسجيلٍ مختلفة في كلّ مرة. من الأمثلة الشائعة على ذلك الهجمات التي تتعرض لها خدمة SSH من قبل شبكة الروبوت Botnet لتجريب أسماء حسابات شائعة بشكل آلي بهدف اختراق الخدمة، إلا أنّه لحسن الحظّ فقد تمّ إنشاء عدّة خدمات مثل fail2ban لمساعدتنا على التخفيف من هذه الهجمات. يعمل fail2ban عن طريق تعديل قواعد جدار النار بشكل حيوي لحظر العناوين التي تحاول تسجيل الدخول بعد عددٍ مُحدّدٍ من المرات الفاشلة. في هذا الدرس سنُناقش بمزيدٍ من التعمق كيفيّة عمل الأداة fail2ban وكيف يمكننا تعديل سلوكها لتتوافق مع متطلباتنا. المفهوم الأساسيالفكرة الأساسية في عمل fail2ban هي مراقبة سجلات logs الخدمات الشائعة لرصد محاولات تسجيل الدخول الفاشلة. عندما يُضبط fail2ban لمراقبة سجل خدمة ما، فإنه يبحث في مُرشّح filter مُخصّص لهذه الخدمة. يتم تصميم المُرشِّح لتعريف حالة "فشل المُصادقة" لهذه الخدمة باستخدام تعابير نمطيّة مُعقّدة Regular Rxpressions تُعرّف متغيرًا يُدعى failregex. لحُسن الحظ يأتي fail2ban مع مجموعة مُرشحات جاهزة للخدمات الأكثر شيوعًا. عندما يطابق سطر ما من سجل الخدمة المُراقبة المُتغيّر failregex من المُرشّح؛ يتم تنفيذ الإجراءات المُحدّدة لهذه الخدمة، والتي يمكن ضبطها للقيام بأشياء مختلفة اعتمادًا على ما يفضّله مُدير الخادوم. الإجراء الافتراضي الذي يتمّ تنفيذه عادةً هو حظر عنوان الـ IP المُسيء عن طريق تعديل قواعد iptables لجدار الحماية. يمكنك أيضًا توسيع هذا الإجراء لإرسال بريد إلكتروني إلى مدير الخادوم مع تقرير whois عن المهاجم، أو إرفاق الأسطر التي أدّت إلى إطلاق إجراءات الحماية من سجل الخدمة. يمكن كذلك تعديل إجراءات الحماية لتنفيذ أوامر مختلفة عن سلوك iptables المُعتاد، إذ يمكنك اختيار أوامر أكثر تعقيدًا أو أبسط كما تريد، بالإضافة إلى ملفات الضبط الخاصة بجدار الحماية، وخيارات التنبيه المتاحة. بشكل افتراضي يتم تنفيذ إجراءات الحماية عند الكشف على ثلاث محاولات تسجيل دخول فاشلة خلال عشرة دقائق، ويكون وقت الحظر الافتراضي هو عشرة دقائق أيضًا. العدد الافتراضي لمحاولات المُصادقة الفاشلة ضروريّ لتفعيل الحظر على جانب SSH إلا أنّه يمكن تعديل ملف الضبط من قبل مدير الخادوم ورفع عدد المحاولات اللازمة لتشغيل إجراءات الحماية إلى ست مرات مثلًا. عند استخدام أسلوب iptables الافتراضي لحماية حركة SSH، تُنشئ الأداة fail2ban سلسلة جديدة عند بدء الخدمة، مُضيفةً قاعدة جديدة إلى سلسلة الإدخال INPUT chain والتي تُرسل حركة مرور البيانات TCP الموجّهة عند المنفذ 22 إلى السلسلة الجديدة. في السلسلة الجديدة تُضاف قاعدة مُفردة مُعيدةً الحركة إلى سلسلة الإدخال INPUT chain. هذا ما يجعل حركة البيانات تقفز إلى السلسلة الجديدة أولًا ومن ثم تقفز عائدةً، ورغم أن ذلك لا يؤثر على حركة مرور البيانات بدايةً إلا أنه مع تكرار عنوان IP ما لعملية المُصادقة عدّة مرات ووصوله إلى عتبة "فشل المصادقة"؛ تُضاف قاعدة إلى بداية السلسلة الجديدة لمنع حركة المرور الصادرة من عنوان IP المُسيء، والذي يؤدي إلى حظره فورًا. بعد انتهاء فترة الحظر تُحذف القاعدة من iptables، ويتم إزالة السلسلة والقواعد المرتبطة بها عند انتهاء خدمة fail2ban. استعراض إعدادات خدمة Fail2banيتم ضبط fail2ban من خلال مجموعة متنوعة من الملفات الموجودة ضمن الدليل /etc/fail2ban/ والمرتبة بشكلٍ هرمي. فعلى سبيل المثال يضبط الملف fail2ban.conf بعض إعدادات التشغيل الأساسية مثل طريقة daemon في تسجيل المعلومات وكيفيّة استخدام المقابس socket وملفات pid. بكل الأحوال فإن الإعدادات الرئيسية تُحفظ في ملفات تُدعى "jails". بشكل افتراضي يأتي fail2ban مع الملف jail.conf والذي يُستبدل عادةً مع كلّ تحديث، لذا يُنصح المستخدمون بنسخ هذا الملف تحت اسم jail.local وإجراء التعديلات هناك. إذا كنت تملك بالفعل الملف jail.local افتحه على الفور باستخدام محرّر نصيّ: sudo nano /etc/fail2ban/jail.local أما إذا لم يكن الملف موجودًا بالفعل أو كان فارغًا بعد فتحه؛ انسخه من جديد باسم jail.local ثم افتحه بمحرّر نصيّ: sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local sudo nano /etc/fail2ban/jail.local لنُلقي نظرة على الخيارات المتاحة هنا ونرى كيف يتفاعل هذا الملف مع ملفات الضبط الأخرى ضمن النظام. القسم الافتراضييُعرّف الجزء الأول من الملف القيم الافتراضية لآلية عمل fail2ban. يمكن تجاوز هذه الخيارات من قبل مقاطع الضبط اللاحقة والخاصة بكل خدمة على حدا. بإهمال التعليقات سيبدو القسم الافتراضي مشابهًا لهذا: [DEFAULT] ignoreip = 127.0.0.1/8 bantime = 600 findtime = 600 maxretry = 3 backend = auto usedns = warn destemail = root@localhost sendername = Fail2Ban banaction = iptables-multiport mta = sendmail protocol = tcp chain = INPUT action_ = %(banaction)s[name=%(name)s, port=”%(port)s”, protocol=”%(protocol)s”, chain=”%(chain)s”] action_mw = %(banaction)s[name=%(name)s, port=”%(port)s”, protocol=”%(protocol)s”, chain=”%(chain)s”] %(mta)s-whois[name=%(name)s, dest=”%(destemail)s”, protocol=”%(protocol)s”, chain=”%(chain)s”, sendername=”%(sendername)s”] action_mwl = %(banaction)s[name=%(name)s, port=”%(port)s”, protocol=”%(protocol)s”, chain=”%(chain)s”] %(mta)s-whois-lines[name=%(name)s, dest=”%(destemail)s”, logpath=%(logpath)s, chain=”%(chain)s”, sendername=”%(sendername)s”] action = %(action_)s دعونا نشرح ماذا يعني ذلك في الواقع: ignoreip: يُعرّف هذا الخيار مجموعة عناوين IP كقائمة بيضاء يتمّ تجاهلها من قبل نظام الحظر. افتراضيًا يتم تعيين هذا الخيار لتجاهل حركة المرور القادمة من قبل الجهاز نفسه فقط، ومن الجيد أن نُبقي على ذلك. bantime: يُحدّد هذا الخيار طول مدّة الحظر بالثواني، وبشكل افتراضي يأخذ القيمة 600 ثانية (أي عشرة دقائق). findtime: يُحدّد الفترة الزمنية التي ستتم مراقبتها للنظر في تكرار محاولات تسجيل الدخول الفاشلة. القيمة الافتراضية هي 600 ثانية (أي عشرة دقائق أيضًا)، والذي يعني أن fail2ban سيحسب عدد محاولات الولوج الفاشلة في آخر عشرة دقائق. maxretry: يُحدّد عدد محاولات تسجيل الدخول الفاشلة التي سيُحظر بعدها عنوان IP مباشرةً من قبل fail2ban وذلك ضمن الإطار الزمني المُحدّد من قبل findtime. backend: يُحدّد هذا الخيار كيف يراقب fail2ban ملفات السجل، فالقيمة auto تعني أن fail2ban سيجرّب أسلوب pyinotify ثم gamin وبعدها يختار خوارزمية بناءً على ما هو متاح. usedns: يُحدّد خوادم DNS التي سوف تُستخدم للمساعدة في تنفيذ الحظر. فالقيمة "no" تعني استخدام عناوين IP نفسها في الحظر بدلًا من استعمال اسم المضيف hostnames. بينما تسعى القيمة "warn" إلى الاستفادة من أدلة DNS للبحث عن اسم المضيف وحظره مع تسجيل النشاط للمراجعة. destemail: يُوضع هنا عنوان البريد الإلكتروني الذي ستُرسل إشعارات التنبيه إليه (فيما إذا كانت ميزة الإشعارات مُفعّلة). sendername: يُحدّد محتوى الحقل "from" في رسائل الإشعارات المولّدة من الخيار السابق. banaction: يُعيّن هذا الخيار العمل الذي سيتم تنفيذه حال الوصول إلى عتبه "فشل المُصادقة"، وفي الواقع هناك ملف ضمن الدليل /etc/fail2ban/action.d/ باسم iptables-multiport.conf يُعالج مهمة iptables لحجب عناوين IP، وهو ما سنتطرق إليه لاحقًا. mta: وكيل نقل البريد المُستخدم لإرسال التنبيهات البريدية. protocol: يُحدّد نوع حركة مرور البيانات التي سيتم إسقاطها عند تنفيذ حظر IP، وكذلك نوع حركة المرور التي سيتم إرسالها إلى سلسلة iptables جديدة. chain: وهي السلسلة التي سيتم ضبطها مع قاعدة قفز jump rule لإرسال حركة المرور إلى fail2ban. باقي المُعاملات تُعرِّف إجراءات مختلفة يمكن تخصيصها. تُمرّر هذه الإجراءات في بعض المُعاملات السابقة من خلال سلسلة استيفاء string interpolation على النحو التالي: %(var_name)s في السطر أعلاه يُستبدل محتوى var_name. باتباع هذه الطريقة يتم إسناد المتغيّر action إلى المُعرّف action_ بشكلٍ افتراضي (ما يؤدي إلى تنفيذ الحظر دون إرسال إشعار عبر البريد)، وهذا بدوره يُضبط عبر استدعاء الإجراء iptables-multiport مع قائمة من المُعاملات (مثل اسم الخدمة، المنفذ، البروتوكول، والسلسلة) اللازمة لتنفيذ الحظر. يتم استبدال name مع اسم الخدمة كما هو مُحدّد بواسطة ترويسات الأقسام في الأسفل. أقسام الخدمات الخاصةأسفل القسم الافتراضي هناك أقسام مُخصّصة لكل خدمة على حدا والتي يمكن استخدامها لتجاوز الإعدادات الافتراضية، وهذا يتبع للخيارات التي يمكن لها أن تأخذ قيمًا مُختلفة عن القيم العادية. تُحدّد ترويسة كل مقطع كما يلي: [service_name] أي مقطع يحتوي على هذا السطر سيُقرأ ويٌفعّل: enabled = true تُضبط المُعاملات ضمن كل قسم بما في ذلك ملف المُرشّح والذي يجب استخدامه لتحليل السجلات ومواقع ملفات السجلات نفسها. خذ بعين الاعتبار أن المقطع الذي يُحدِّد إجراءات الحماية لخدمة SSH يبدو مثل هذا: [SSH] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 6 يُفعّل السطر الأول enabled= true القسم الخاص بخدمة SSH ويُعيّن المنفذ إلى منفذ SSH (بالرقم 22) مُخبرًا fail2ban بالنظر إلى السجل var/log/auth.log/ وتحليله باستخدام آليات الترشيح المُحدّدة ضمن الدليل /etc/fail2ban/filters.d/ في الملف المُسمى sshd.conf. تؤخذ جميع أجزاء المعلومات اللازمة من المُعاملات المُعرّفة ضمن القسم [DEFAULT] . فعلى سبيل المثال يتم تعيين إجراء تنفيذ الخيار action_ والذي يحظر عنوان IP المُسيء باستخدام iptables-multiport والذي يشير إلى الملف iptables-multiport.conf ضمن المسار /etc/fail2ban/action.d/. وكما ترى يجب أن تكون الإجراءات ضمن المقطع [DEFAULT] عامة ومرنة. الاستخدام المُكثّف لمُعاملات الاستبدال جنبًا إلى جنب مع المُعاملات المزودة بقيم افتراضية معقولة يجعل التعريفات سهلة التجاوز عند الضرورة. شرح ملف الترشيحمن أجل فهم ما يجري في إعدادات الضبط الخاصة بنا، نحن بحاجة إلى فهم كلًا من ملف المُرشّح filter file وملف الإجراء action file، والتي تُشكّل الجزء الأكبر من العمل. يُحدّد ملف المُرشّح الأسطر التي يبحث عنها fail2ban في ملفات السجل لتحديد خصائص المُسيء. بينما يُزوّد ملف الإجراء بجميع الإجراءات المطلوبة، من بناء صيغة لجدار الحماية firewall structure عند بدء تشغيل الخدمة، وحتى إضافة وحذف القواعد، علاوةً على إلغاء صيغة جدار الحماية عند توقّف الخدمة. دعونا ننظر في ملف المُرشّح المدعو بواسطة خدمة SSH لدينا من الإعدادات أعلاه: sudo nano /etc/fail2ban/filter.d/sshd.conf [INCLUDES] before = common.conf [Definition] _daemon = sshd failregex = ^%(__prefix_line)s(?:error: PAM: )?[aA]uthentication (?:failure|error) for .* from ( via \S+)?\s*^%(__prefix_line)s(?:error: PAM: )?User not known to the underlying authentication module for .* from \s* ^%(__prefix_line)sFailed \S+ for .? from (?: port \d)?(?: ssh\d*)?(: (ruser .|(\S+ ID \S+ (serial \d+) CA )?\S+ %(__md5hex)s(, client user “.“, client host “.“)?))?\s^%(__prefix_line)sROOT LOGIN REFUSED.* FROM \s* ^%(__prefix_line)siI user .* from \s*^%(__prefix_line)sUser .+ from not allowed because not listed in AllowUsers\s* ^%(__prefix_line)sUser .+ from not allowed because listed in DenyUsers\s*^%(__prefix_line)sUser .+ from not allowed because not in any group\s* ^%(__prefix_line)srefused connect from \S+ ()\s*^%(__prefix_line)sUser .+ from not allowed because a group is listed in DenyGroups\s* ^%(__prefix_line)sUser .+ from not allowed because none of user’s groups are listed in AllowGroups\s*$ ignoreregex = يبدو هذا مُعقّدًا للغاية، لنبسطّه قليلًا فيما يلي. يُحدّد المقطع [INCLUDES] الملفات الأخرى التي ستتم قراءتها قبل أو بعد الملف، في مثالنا هذا يُقرأ الملف common.conf وتُوضع محتوياته أمام الأسطر الأخرى من الأصل، وهذا ما يُضيف بعض المعاملات اللازمة لضبط الإعدادات لدينا. بعد ذلك لدينا المقطع [Definition] والذي يُحدّد القواعد الفعلية لمطابقات المرشّح. بدايةً نُحدّد اسم خدمة daemon المراقبة بواسطة المعامل _daemon. ومن ثمّ يأتي تعريف المتغيّر failregex المُحدّد بواسطة أنماط تبحث عن أية أسطر مطابقة في ملفات السجل، وهي عبارة عن تعابير نمطيّة Regular Expressions تتطابق مع مختلف الأخطاء والإخفاقات التي يمكن أن تحدث عندما لا تتم مصادقة تسجيل الدخول بشكل صحيح. فعلى سبيل المثال يُستبدل الجزء prefix_line)s__)% من التعريف السابق مع قيمة معاملات الإعداد من ملف common.conf. يُستخدم هذا التعبير لمطابقة المعلومات التي تكتبها أنظمة التشغيل إلى ملفات السجل عندما تستخدم الأساليب القياسية. فعلى سبيل المثال بعض الأسطر من السجل var/log/auth.log/ قد تبدو مثل هذا: May 6 18:18:52 localhost sshd[3534]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=101.79.130.213 May 6 18:18:54 localhost sshd[3534]: Failed password for invalid user phil from 101.79.130.213 port 38354 ssh2 May 6 18:18:54 localhost sshd[3534]: Received disconnect from 101.79.130.213: 11: Bye Bye [preauth] الجزء الملّون بالأحمر يُمثّل نمطًا قياسيًا standard pattern مُدرجًا من قبل نظام التشغيل لدعم السياق context. بعد ذلك هناك عدد غير قليل من الطرق المختلفة التي يمكن لخدمة iptables كتابة محاولات الفشل وفقها إلى السجل. يحتوي ملف السجل السابق على محاولتي تسجيل دخول فاشلتين في السطرين الأوّل والثاني (إحداهما خطأ مصادقة من نوع PAM والأخرى خطأ كلمة مرور)، يتم تعريف التعابير النمطية في المرشّح لمطابقة أي سطر يحمل رسالة فشل في المصادقة، لا ينبغي عليك أن تعدّل أيٍ من هذه الأسطر، لكنك يجب أن تكون مدركًا لأهمية العثور على جميع مُدخلات السجل الدالة على وقوع خطأ استخدام غير مُصرّح به للتطبيق الذي تعمل على حمايته؛ فيما لو رغبت بتصميم مرشّح خاص بشكل يدوي. في الجزء السفليّ من الملف يمكنك أن ترى المعامل ignoreregex فارغ حاليًا، والذي يمكن استخدامه لاستبعاد أنماط أكثر تحديدًا تطابق عادةً حالات فشل مصادقة لا ترغب لـ fail2ban بنفيها لاحتمالات مختلفة. لن نُعدّل شيئًا هنا. احفظ الملف وأغلقه بعد الانتهاء من دراسته. شرح ملف الإجراءدعونا الآن نلقي نظرة على ملف الإجراء action file المسؤول عن إعداد جدار الحماية وفق صيغة تُسهّل التعديلات لحظر المُضيفين المُسيئين malicious hosts إضافةً إلى ضمهم أو حذفهم عند الضرورة. وكما تذكرون يُدعى الإجراء الخاص باستدعاء خدمة SSH لدينا بـ iptables-multiport، لنفتح الآن الملف المرتبط بها: sudo nano /etc/fail2ban/action.d/iptables-multiport.conf بحذف التعليقات يبدو الملف مشابهًا لهذا: [INCLUDES] before = iptables-blocktype.conf [Definition] actionstart = iptables -N fail2ban- iptables -A fail2ban- -j RETURN iptables -I -p -m multiport –dports -j fail2ban- actionstop = iptables -D -p -m multiport –dports -j fail2ban- actioncheck = iptables -n -L | grep -a ‘fail2ban-[ \t]’ actionban = iptables -I fail2ban- 1 -s -j actionunban = iptables -D fail2ban- -s -j [Init] name = default port = ssh protocol = tcp chain = INPUT يبدأ الملف بتضمين محتوى ملف إجراء آخر يُدعى i iptables-blocktype.confوالذي يُعرّف ببساطة المُعامل blocktype المسؤول عن ضبط القيود التي سيتم فرضها على العميل المحظور. بشكلٍ افتراضي يتم تعيين blocktype لرفض الحزم packets الواردة من قبل العميل المحظور وإعادتها مع رسالة تفيد بأنّ المنفذ المطلوب غير قابل للوصول حاليًا، وهذا ما سوف نستخدمه في قواعد الحظر تاليًا. بعد ذلك تأتي تعريفات القواعد نفسها حيث معظم الإجراءات واضحة إلى حدٍ ما، فالإجراء actionstart يقوم بإعداد جدار الحماية iptables عند بدء تشغيل خدمة fail2ban، إذ يُنشئ سلسلة جديدة مُضيفًا إليها قاعدة للعودة إلى سلسلة الدعوة calling chain، ثم يدرج قاعدة في بداية سلسلة INPUT والتي تقوم بتمرير حركة البيانات المُطابقة للبروتوكول والمنفذ الصحيحين المتجهين إلى السلسلة الجديدة. يتم ذلك باستخدام القيم التي قمنا بتمريرها مع الإجراء المُعرّف في ملف jail.local الخاص بنا. كما تؤخذ قيمة الخانة name من ترويسة المقطع المرتبط بكلّ خدمة، بينما تؤخذ قيم chain،protocol وport من سطر action نفسه من الملف. ولعلكم تذكرون أن هذه أيضًا - بدورها- أضيفت إلى سطر الإجراء عبر إدخال مُعاملات أخرى مُحددة في أماكن أخرى من هذا الملف. إلى الآن فإن fail2ban قد مرّر وحوّل العديد من المُعاملات بين الأجزاء المختلفة من ملفات الضبط الخاصة به. جميع المُعاملات التي تم تعيينها من قبل ملف آخر يُشار إليها عبر تضمين اسم المُعامل بقوسي زاوية: عندما ننتقل إلى الأسفل نحو تعريف الإجراء actionstop نرى بأن أوامر جدار الحماية تُنفّذ ببساطة عكس أوامر الإجراء actionstart؛ حيث نُنهي صيغة جدار الحماية المُنشأة عندما نوقف خدمة fail2ban. يتأكّد الإجراء actioncheck من إنشاء السلسة المناسبة قبل محاولة إضافة قواعد الحظر. بعد ذلك نصل إلى قاعدة الحظر الفعلية actionban والتي تعمل عن طريق إضافة قاعدة جديدة إلى السلسلة المُنشأة، تطابق هذه القاعدة عنوان IP المصدر للعميل المُسيء (يُقرأ هذا المُعامل من قبل سجلات التصريح authorization logs عندما تُبلغ العتبة maxretry) ويتم تأسيس الحظر بتعريف المُعامل blocktype الموجود في المقطع [INCLUDE] في الجزء العلوي من الملف. تزيل actionunban ببساطة القاعدة المُنشأة ويتم ذلك تلقائيًا بواسطة fail2ban بعد انقضاء وقت الحظر. أخيرًا نصل إلى القسم [Init] والذي يقتصر دوره على تزويد بعض الافتراضات في حال استدعاء ملف الإجراء من دون تمرير جميع القيم اللازمة. ترجمة -وبتصرف- للمقال How Fail2ban Works to Protect Services on a Linux Server لصاحبه Justin Ellingwood.1 نقطة
-
لماذا يعتبر طرح الشكاوي من منتج ما عبر تويتر فعّالا للغاية؟ هل يحدث هذا لأن الشركات لا ترغب بأن تنتشر الملاحظات والانتقادات حولها، ويتم تفضيلها وإعادة تغريدها، أو ما هو أسوأ من هذا: أن تغدو في قائمة #أكثر التغريدات تداولًا؟ يمكننا استعارة بعض العبارات من كتاب جون رونسون المميّز So You’ve Been Publicly Shamed: المشكلة أن معظم الناس لا يدركون التداعيات المحتلمة لهذا النموذج العصري من التشهير، هناك الكثير حقّا من الحالات للاستخدام السلبي لهذا السلاح، فمثلا في وادي السيليكون رأينا مؤخرًا كيف هُدِّدتْ آدريا ريتشاردز وأُرهِبتْ عبر الإنترنت عقب حادثة PyCon. هذه السُلطة فعّالة في عالم الأعمال أيضًا، هل سبق وعانيت مطولا لإلغاء خدمة ما خاصة بك؟ إليك طريقة واحدة للحصول على اهتمام الشركات: التغريدة الأولى ترجمة التغريدة: أحتاج لأن أفهم بشكل أكبر كيفية عمل Intercom وكيف يساعدنا؟ الردّ: بالتأكيد؛ يمكنك إرسال رسالة إلكترونية لبريدنا team@intercom.io، وسنساعدك لفهم أفضل الطرق لاستخدام Intercom. 3. لا تهدر وقتك مع الغوغاءليست جميع الشكاوى سواء من حيث الأهمية؛ فبعضها لا تحتاج استجابة مباشرة، وأحيانًا لا تستحق أي رد على الإطلاق، من المهم أن تعرف ما يقوله الناس حول شركتك في تويتر (أو كما يسمّيه المسوّقون تحليل المشاعر) لكن ذلك لا يعني وجوب الردّ على كل من يشير لك في تغريدة، وإليك كيف يمكن لك أن تحدد فئة الأشخاص الذين لا يجب أن تردّ عليهم: شكواهم غير محدّدة مثل "مرحبا Comcast@ أريد أن تكون خدمة الإنترنت المقدمة لي عظيمة".شكواهم غير عملية مثل "Comcast@ ليست جيدة كفاية سأتحول إلى شركة كذا".يستخدمون كلمات بذيئة أو أي نوع من أنواع الهجوم الشخصي.هم من أفضل أصدقاء منافسيك، أعتقد أن هذا يقول ما يكفي.في هذه السيناريوهات؛ قد يضفي الردّ عليهم والانخراط المباشر معهم الشرعية على ما يقولون، قد يؤدي ذلك أيضًا إلى استمرار نفس المستخدمين بالتغريد عنكم كل يوم، رغم جهودكم لتوجيههم لقنوات الدعم الفني، في هذه الحالات من الأفضل تجاهل ما يكتبون. 4. التمسك بمبادئكيخاف العديد من مؤسسي الشركات من الدعاية السلبية؛ وربما يتفاعلون نتيجة خوفهم هذا بشكل مفرط، هل تذكر الجدل الدائر حول Gamergate؟ عندما استغرق اللاعبون في الوسائط الاجتماعية ليذمّوا الشركات التي نشرت مطبوعات تنتقد Gamergate، العديد من هذه الشركات مثل Intel استسلمت وسحبت الإعلانات المنشورة، لكن هذا أعطى نتيجة عكسية سريعة إذ كشف للناس أن هذه الشركات لم تقم بأي بحث حقيقي يدعم انتقاداتها السابقة، وكان هذا محرّكا للرأي العام ضدّهم. نرى العديد من الشركات أيضًا تناضل لحفظ ماء الوجه، فتطرد موظفيها على نشرهم لكلمات لا يراها المغرّدون جيدة، أشار رونسون في كتابه إلى جوستين ساكو، وهي امرأة غرّدت تعليقا تافهًا يعبر عن وجهة نظرها بإفريقيا ما جعلها تُطرد من العمل على الفور من قبل مخدومها بشركة IAC. يشكّل الانصياع للرأي العام ورد الفعل دون إجراء تحقيق شفاف ومناسب علامة سيئة لشركتك، ويعطي الغوغاء المزيد من الأسباب ليقوموا بحملات عبر الإنترنت. إن علاجك للمشكلات المشروعة عبر وسائل التواصل الاجتماعي عوضًا عن محادثات الدعم الفني مهما كان موزونًا ومفيدًا فهو يشكل نوعًا من الإذعان، حاول أن تفهم الحالة المواجهة لك قبل أن تردّ بشكل دفاعيّ عليها. 5. اجعل تجربة الدعم الفني أسهلمعظم الناس الذين يطلبون الدعم الفني إنما يريدون علاج مشكلتهم المحددة فقط، لا تدمير عملك، وهم يشيرون إليك عبر تويتر لأنهم لا يتوقعون استجابة سريعة من خلال الوسائل التقليدية، والحل بسيط: اجعل عملاءك يحلون مشاكلهم بسهولة، ركّز على الأساسيات بدل الكماليات المبهرجة.شجّع التغذية الراجعة لمنتجك، وذكّر الناس أن أفضل طريقة للقيام بذلك هو عبر الموقع ذاته.قد يكون للمحادثة المباشرة دور في شعور عمليك برضا موازٍ لما يحققه من شكواه في تويتر، طالما أن استجابتك لهم كانت خلال الوقت المتوقّع. وكما هو الحال في الحياة الحقيقية، فالناس تميل لأن تكون وقحة مع هؤلاء الذين لا تربطهم بهم علاقة حقيقية. تُرجم وبتصرف عن مقال Don’t let your users become a Twitter mob لكاتبته sara yin.1 نقطة
-
لا أحد يُقلّل من قيمة الوقت، لا سيما بالنسبة للشركات الناشئة في مراحلها المبكّرة إذ يكتسب قيمة مضافة، حيث تحاول القيام بالعديد من الأمور في وقت واحد: بناء منتج، جذب عملاء، ضم مُوظّفين، تهيئة الأمور الماليّة والقانونية والإدارية، ومهام أخرى كثيرة. فلماذا تُراكَ تُضيف "إطلاق مدوّنة" لقائمة مهامك الطويلة والتي تفيض بما فيها؟ إذا كنت ممن يتبعون نصيحة "برمج وتحدّث للمستخدمين" فلمَ تتجه الآن لإنشاء مُدوّنة؟ ستسمع الكثير من النصائح الموجّهة مُخبرة إياك كيف يُسهم التسويق في دفع عجلة أعمالك التجارية خلال بضعة أسابيع فقط، لذا وانطلاقًا من إدارتنا لمدوّنة شركتنا النّاشئة على مدى أربعة أعوام؛ سنشارككم بعض الدروس التي تعلمناها خلال رحلتنا. 1. المردود المادّي للمدونة بطيءالمدونة ليست آلة تدرّ المال فور كتابة المحتوى، كما أنها ليست حلقةً مغلقة تعود عليك بكلّ ما تستثمره فيها، حتى لو لاقتْ مقالاتُك الأولى نجاحًا كبيرًا فإنّك لن تجني أرباحًا من هذا النجاح مباشرةً، ولن تكون قادرًا على قياس قيمة إنتاجك خلال مدّة قصيرة، تذكّر: ما لم تبِِعْ مساحاتٍ إعلانية على مدوّنتك؛ فإنّ النجاح لا يُقاس بمجرّد عدد مشاهدات الصفحات. 2. المدوّنة ذات مردود تراكمي يشرح توماسز تونجوز هذا بأفضل شكل ويدعمه بالأرقام والإثباتات (في المخطط البيانيّ أعلاه)، فأثَر المقالات في مدوّنتك ليس ليوم واحد فقط؛ بل قد تبقى لأسابيع؛ أشهر أو حتى لسنوات بعد نشرها، وما يعزّز هذا بشكل خاص احتواء المقالات على مبادئ وأفكار وليس مجرّد أحداث محليّة وآنيّة، عندما تعطي رأيك مثلا في استراتيجية شركة Apple في مؤتمرها WWDC فإنك ستحظى على الغالب بنشاط سريع على مدوّنتك، لكنّ لست وحدك من يعلّق على حدث كهذا، كما أنّ نشاط مدونتك عقبه غالبًا ما يكون عابرًا وآنيًا. 3. لا قيمة لمدوّنة بمُحتوى مُتوسّط القيمةلم يعد يكفي أن تكون المدوّنة عبارة عن "صناعة محتوى" فقط، فالممارسات القديمة في التدوين أضحتْ بالية، كاستجداء المدوّنين الزّوّار guest bloggers مع محتوى بجودة متدنيّة، ونشر مقالات تحمل وصف "الدليل النهائيّ لـ..."، ونسخ أعمال الآخرين لإعادة كتابة آرائهم ونشرها مجدّدًا، والتدوين حول "أفضل عشرة اقتباسات"؛ كلّ هذا لم يعد مجديًا. تحدّث راند فيشكين مؤخرًا عن هذه النقطة إذ لا بدّ لك في هذه الأيام من تقديم محتوى مميّز أو لا تقدّم شيئا، هناك العديد من الأمثلة التي تدعم هذا الرأي، فالمدوّنة ليست مساحة يمكنك أن تنافس فيها بـ "محتوى متوسّط القيمة"، ولأجل هذا فإن كثيرًا من محاولات نشر عدد مُحدّد من المقالات كل شهر تؤدي إلى محتوى ضحل لا يعود عليك بالفائدة. 4. يتطّلب التدوين آراء واقعيّة وشفّافة تحدّثنا عن هذه النقطة سابقًا، إذ حتى لو كانت الأفكار الواردة في المقالات صحيحة بل ومبرهنًا على صحتها لكنها مكتوبة بلهجة ضعيفة وبشكل ضبابيّ؛ فإنها لن تستطيع إيصال المعنى كما يفعل من يعلنون عن آرائهم بشكل صريح وواضح. لسنا متفقين جميعًا بالضرورة في شركتنا النّاشئة مع كل نقطةٍ وردتْ في المقالات التي ننشرها على مُدوّنتنا، ولكن الوضوح الذي فيها هو السبب الذي جعل أفكار هذه المقالات تنتشر وتُناقَش بشكل كبير، وأطال عمر كلماتها لمدة طويلة بعد كتابتها. 5. التدوين كالعضلة يحتاج للتدريب المستمر من أكثر الأسئلة التي تُطرح علينا "كيف تجدون الوقت الكافي للتدوين؟" وكأننا وجدنا بعض الساعات الإضافية المُخبئة تحت الأريكة، نحن لا نجد الوقت: بل نصنعه، يجب التدرّب على الكتابة؛ إذا كنت تتعامل مع محتوى مدوّنتك بجدية سوف تجد الوقت للتدريب، من المضحك أن أحدًا لم يسألنا أين نجد الوقت الكافي للتصميم أو للبرمجة. ننشر في مدوّنة شركتنا النّاشئة مقالاتٍ لجميع العاملين في الشركة من كافة المستويات، الكلّ يشارك في صناعة محتواها، وهذا النشاط مُثمّن وله قيمته إذ يعطينا الفرصة جميعًا لنكون مؤثرين بشكل كبير. 6. لا يجب على كل شركة ناشئة أن تدوّن وتنشرغالبًا ما تمتلك الشركات العظيمة رؤية محدّدة حول الكيفية التي يجب أن تسير بها الأمور، وتصنع منتجًا وفقًا لهذه الرؤية، فمثلًا إذا كنت تعتقد أن إدارة المشاريع تعني التواصل بشكل واضح، متكرّر، ومتناغم؛ فستتجه لبناء منتج يعكس هذه الرؤية، عندها ربما تكتب مقالات تلخّص وجهة نظرك، كطريقة لشرح منهج وثقافة منتجك. بشكل مشابه؛ إذا كنت تظنّ أن أصحاب الأعمال التجارية يجب أن يعرفوا عملاءهم؛ أو أن الحديث إلى المستخدمين يجب أن يكون أسهل، فغالبًا ستصنع منتجًا يعكس هذا أيضًا، وستكتب بعدها مقالات تطرح رؤيتك هذه، إنّ جوهر استراتيجيات صنع محتوى تسويقي فعّال هو بإنتاج محتوى جذّاب يلخّص الخطوط العريضة لمنتجك ويجذب شريحة من المستخدمين، أولئك الذين تلامسهم رؤيتك ومنتجك وتتقاطع معهم بنقطة ما. وهذا هو السبب الذي يجعل نشر المقالات ليس مناسبًا للجميع: على سبيل المثال إذا كان منتجك عبارة عن برنامج خدميّ مستقل لا يمثّل رأيًا أو توجّها مُعيّنًا (مثل تطبيق ضغط صور، أو أداة بسيطة لرفع الملفّات) فمن المستبعد أن يكون لديك أساس كاف لكتابة سلسلة من المقالات تلخّص رؤيتك. في كلا الحالتين، يمكنك الحديث بحماسة مفرطة عن منتجك وكيفيّة عمله، لكن القيام بذلك قد يعني ألّا يتجاوز الحديث دقيقة واحدة ويكون حديثك مُوجّهًا لعدد قليل من مستخدميك المحتملين. 7. لا يجب أن يكون غرض كل المقالات هو التّسويق/تحقيق مبيعاتقلنا من قبل أن المُحتوى هو التسويق، ولكن هذا لا يجب أن يعني تضمين كل مقالة أهدافك التجارية، فالتدوين ليس تسويقًا مباشرًا، يجب أن نتعامل مع كل جزء من المقال بعين القارئ لا التاجر، عن طريق الكتابة أنت توسّع جمهورك وتزيد ولاءهم، لذا عندما يكون لديك جمهور مستمع سوف تكون ردّة فعلهم المصادقة والتأييد عندما تخبرهم بمنتجك الجديد أو الميزة الأخيرة التي أطلقتها. 8. التحرير هو السرحتى تستطيع مجاراة النموّ الذي تطمح إليه، عليك ببساطة أن ترتقي بصناعة المحتوى بطريقة لا تخلّ بمبادئك، على سبيل المثال؛ يمكنك توسيع نطاق النشر على شبكة أوسع، تغطية المزيد من الموضوعات والمجالات، أو التعمّق في نقاط معينة، لكن لا يمكنك أن تنشر شيئًا لا قيمة له، على الإطلاق. ثمة نقطة مهمّة يجب توضيحها، فالاتّفاق مع محرّر ليهتمّ بموازنة المحتوى وإدارته قد لا يحقق لك الكثير، إذ لا بد من وجود استراتيجية محتوى واضحة تُعرّف المواضيع والمجالات التي ترغب بتغطيتها، مستوى المقالات جودة المحتوى، أنواع الكتّاب، والكثير حول ذلك. ما لم يكن لديك تفكير واضح حول هذه النقاط سيتأثر المحرر بذلك ويكون التطبيق سيئًا. ترجمة -وبتصرّف- للمقال Lessons Learned From Scaling a Blog لكاتبه John Collins.1 نقطة
-
يُكسبنا ارتكاب الأخطاء العديد من الخبرات، بل لعلّه معلمنا الأول، فكيف لنا أن نقوم بأي شيء على الوجه الأمثل ما لم نخطئ، وهذا هو الحال مع إطلاق ميزات جديدة في منتجك، بعض الميزات تنجح منذ اليوم الأول لإطلاقها؛ وبعضها تحتاج القليل من التعديلات لتنجح؛ وأخرى تستلزم بضعة أسابيع لتحقّق ذلك، لكن هناك ميزات تكتشف فور إطلاقها أنها لا تعمل بالشكل المخطط له. حسنًا؛ ارتكاب الأخطاء في المزايا المضافة أمر لا بدّ منه؛ لكن إصلاحها غير مضمون، وهنا تأتي الحاجة لإيقاف ميزة ما، النهج الشائع في هذه الحالة هو ألا تذكّر المستخدمين بها؛ تتصرّف وكأنها غير موجودة، دعهم يتجاهلونها ببساطة. ثمة منهج آخر مختلف لكنّه يؤدي لذات النتيجة هو أن تضع الميزات التي ترغب في إيقافها في آخر سلّم أولوياتك، مع وجود قرار غير مُعلن بعدم العمل عليها أو مواصلة تطويرها. ما لم تكن ترغب في أن يُصبح مُنتجك متضخمًا بالمزايا غير المرغوب فيها؛ فإنه يجدر بك الاعتراف بضرورة إنهاء المزايا التي لا تعمل كما يجب، سنخبرك في هذا المقال كيف تفعل ذلك بأقل إزعاج ممكن لزبائنك: 1. التأكد من قرارك إذا كنت تعرف منتجك جيّدًا وكنت تفهم زبائنك جيّدًا سيكون بإمكانك التّأكّد من صحة قرارك بسهولة. إليك بعض الأسئلة التي يجب أن تكون قادرًا على الإجابة عليها قبل الشّروع في إيقاف ميزة: ما هي النسبة المئوية للمستخدمين الذي يستطيعون استخدام هذه الميزة (يعني تقع ضمن الخصائص التي تُغطّيها اشتراكاتهم)؟ما هي النسبة المئوية للأرباح التي يُمثّلها هؤلاء المستخدمون؟ما هي المحاولات التي بذلتها لتزيد نسبة استخدام هذه الميزة ؟متى سألت شخصًا ممن لا يستخدمونها عن السبب الذي دفعه للتّخلي عن استخدام هذه الميزة؟لو عاد بك الزمن؛ هل كنت ستبني أو ستصمم هذه الميزة بشكل مختلف أو أنك لم تكن لتبنيها على الإطلاق؟إذا كان بإمكانك الإجابة عن هذه الأسئلة، ولم تمدّك الإجابات بدافع لإعطاء الميزة فرصةً جديدة، فعليك في هذه الحالة التّخلّص منها. مهما كانت هذه الميزة غريبة أو فريدة من نوعها فستجد مُستخدما يستخدمها وفق سياقه الخاص الذي لا يُناسب الجميع، وكلما زاد عدد المستخدمين لها كلما كان أمر إيقافها أصعب، الأمر الذي يذهب بنا إلى الخطوة التالية. 2. توقّف عن توفير الخاصّيّة لمستخدمين جددتوقّف عن زيادة حجم مشكلتك، لا أحد يحبّ أن يؤخذ شيء منه حتى أولئك الذين يستخدمون المنتج بشكل مجاني والذين لا نيّة لهم في استخدامها، لذا فإن أول خطوة لإنهاء ميزة هو تعليمها على أنّها ميزة لن تُوفّر للمُستخدمين الجُدد (الأمر الذي سيتيح لك التّخلّص من الميزة بشكل تدريجيّ). من الآن فصاعدًا؛ لن يرى المستخدمون الجدد هذه الميزة، في نفس الوقت يجب التأكد أنّك حذفتها من المواد التسويقية على موقعك ولن يُحيل فريق التّسويق إليها أو يستخدمها كوسيلة لإقناع المُستخدمين الجُدد. 3. قسّم المستخدمين إلى فئتين إذا تم إطلاقُك لهذه الميزة بشكل صحيح؛ فإنك قد حاولت ولا بد إقناع الناس بتجريبها، لذا فإن توقُّف معظم المستخدمين عن استخدامها سيكون سببًا كافيًا لك لإلغائها، والسبب الذي ربما تقرأ لأجله هذه المقالة هو أن "معظم" المستخدمين توقفوا عنها فقط، وليس "جميعهم". لذا فإن خطوتك التالية هي أن تقسم المستخدمين إلى فئتين "المستخدمين الحقيقين" و "الهواة"، لنقل أنك ترغب في إيقاف ميزة تقويم calendar في منتجك، لن يكون استخدام الهواة غالبًا لهذه الميزة كبيرًا وسيكتفي أغلبهم بإضافة ما بين حدث و5 أحداث إلى التقويم، كما أنه يُحتمل أنّهم لم يضيفوا أو يستعرضوا أيًا منها خلال أشهر، أما المستخدمين الحقيقين فسيكون لديهم الكثير من الأحداث والتفاعلات مع التقويم بشكل أسبوعيّ، لن يلاحظ الهواة حتى أنك أزلت هذه الميزة، لكن المستخدمين الحقيقين سيلاحظون وينزعجون لأنها تدخل ضمن طريقة سير أعمالهم workflow. لذا دعنا بداية نخفي الميزة عن الهواة، والذين بأسوأ الأحوال سيلاحظون نقص أيقونة في واجهة المستخدم، يمكنك أن تكون أكثر حرصًا هنا وتشرح سبب قيامك بذلك، لكن نادرًا ما يستحق الأمر العناء، ربما ينتهي بك الأمر لتكتب رسالة من قبيل "المزايا التي لا تستخدمها لن تظهر لك مجدّدًا". وصلنا الآن للمستخدمين الذين سيسبّب لهم إلغاء الميزة إرباكًا، هؤلاء الذين يعتمدون حقّا عليها ويستمتعون باستخدامها. 4. أعلن عن إنهاء الميزة لمن تبقّى من المستخدمينستحتاج إلى المكوّنات التالية لكتابة تفسير جيّد حول سبب اتّخاذك لهذا القرار: فهم الحاجة التي كانوا يستخدمون الميزة لأجلها.إبراز سبب واضح ومحدّد يبيّن سبب إنهائك لهذه الميزة.تقديم اقتراح أو مجموعة اقتراحات حول البدائل التي يمكن لهم أن يستخدموها لأداء نفس الغرض.توضيح كيف يمكن لهم استيراد بياناتهم بشكل سليم.سيكون من الجيد أن تقدّم لهم وسيلة تضمن لهم انتقالًا سلسًا إلى منتج آخر يقدم الخدمة ذاتها، لكن نادرًا ما تتمكن من ذلك، فعدد المستخدمين الذين يحتاجون هذا غالبًا ما يكون قليلًا جدًا مما يجعل بناء أدوات لاستيراد البيانات الخاصة بهم أمرًا لا ترغب فيه الشّركات التي ينوون الانتقال إليها. بناءً على درجة تأثّر العملاء بإلغاء الميزة يجب عليك أن تحدد المُدّة الزّمنية اللازمة ما بين الإعلان عن إيقاف الميزة وإيقافها الفعلي، وعادة ما تتراوح هذه الفترة ما بين شهر وسنة، وقد تضطر إلى أن تكون هذه الفترة أطول في بعض الحالات. يجب أن تحتوي رسالتك إلى الزبائن على العناصر التالية: ما الذي يحدث بوضوح تام، لا تترك أي أمر مفتوحًا للشك أو التخمين.التاريخ المحدد الذي سيتم إيقاف الميزة فيه.إبداء تعاطفك وتأسفك للانقطاع الذي ستسببه لهم (لا تنس أنهم وثقوا بشيء بنيته أنت، وأنت الآن توقفه).تعليمات حول كيف ومتى يستوردون بياناتهم إن كان هذا ضروريًا.نصائح حول كيفية تحقيق ذات الأداء بخدمات بديلة.لماذا؟يبدو بوضوح أن إيقاف ميزة يتطّلب جُهدًا أكبر من مُجرّد إهمالها وتركها معلّقة، لكن "ما الضّرر الذي سيُسبّبه الأمر؟" ليست جملة تصدر عن مُدير مُنتج ناجح. على كل حال فإن المنتجات المميزة تمتلك أهدافًا واضحة، لذا فإن الميزات التي لا يستخدمها أحد هي مثال واضح عن الأشياء التي لا تملك أو تخدم أهدافًا واضحة. حالما تتخلّص من الأفكار غير المُجدية، ستجد أفكار جديدة طريقها لتطفو إلى السّطح من جديد، وكما يشير جاسون فريد فإن الإنقاص يمكن أن يكون سببًا في الزيادة، فالعقول الراكدة تُصبح منفتحة، والمنتجات المتضخمة تصبح مركّزة، ومواقع التسويق المليئة بالضوضاء والمربكة تصبح أكثر وضوحًا. وكما يعلم أيّ نحّات، فإن الفن يُعرف عادة بما يُمكنك التّخلّص منه. تُرجم بتصرّف عن مقال How to Sunset a Feature لكاتبه des traynor. حقوق الصورة: Phone vector designed by Freepik.1 نقطة
-
ما هو Cron؟Cron هي أداة جدولة تسمح لك بتخصيص المهام ليتمّ تشغيلها في أوقاتٍ مضبوطة بشكل مُسبق، حيث يمكن أن تُستخدم لأتمتة أي شيء تقريبًا على نظام التشغيل الخاص بك لا سيما تلك المهام التي يجب أن تُشغّل على فترات منتظمة. تُعتبر Cron أداةً أساسيّة لمديري الأنظمة إذ تبرع في المهام الروتينيّة التي ينبغي تنفيذها كلّ ساعة/يوم بالمقدار الذي تبرع فيه تجاه المهام التي يجب القيام بها مرةً أو مرتين في العام. نناقش في هذا الدرس كيفيّة استخدام Cron من خلال سطر الأوامر، وفهم ملف الضبط الخاص بها، إضافةً إلى حديثنا عن Anacron، وهي الأداة التي يمكن استخدامها لضمان تشغيل المهام حتى عندما يتم إيقاف تشغيل الخادوم لبعض الوقت. سوف نستخدم في درسنا هذا توزيعة Ubuntu 14.04، ويمكنك بالتأكيد تطبيق الشرح هنا على أي توزيعة غنو لينكس أخرى. كيف تعمل Cron؟تبدأ Cron مع إقلاع النظام وتعمل في الخلفية مع باقي خدمات Daemon، وهذا يعني أنها تعمل دون تدخّل من قبل المستخدم مُترقبةً أحداثًا معينة لتشغيل المهام المضبوطة. بالنسبة لـ Cron فإن هذه الأحداث هي مواقيت محدّدة من الزمن، حيث يعمل Cron في الخلفية ويتحقّق كلّ دقيقة فيما إذا كان من المقرّر تشغيل أمر ما هذه الدقيقة، وذلك تبعًا لملف الضبط الخاص به، وفي حال الإيجاب يُنفّذ Cron الأوامر المُحددّة له بشكل مسبق لهذه اللحظة، ومن ثم يعود للعمل ضمن الخلفية مترقبًا الدقائق القادمة، أما في حال النفي فإنه سينتظر لستين ثانية قبل أن يعاود تحقّقه. ونظرًا لأسلوبه في الجدولة والفحص دقيقةً بدقيقة؛ فإنه يعتبر قابلًا للضبط بشكل مرن للغاية، وحالما تُثبّت Cron على توزيعة غنو لينكس لديك فإنه سيضُبط لتشغيل مجموعة متنوعة من المهام. كيفيّة قراءة Crontabيُقرّر Cron ما هي الأوامر التي سيتم تشغيلها وفي أي توقيت من خلال قراءة مجموعة من الملفات التي يُعرف كلّ منها باسم "crontab"، يمكنك على سبيل المثال مشاهدة ملف "crontab" المطبّق على مستوى النظام system-wide بالنظر إلى محتويات الملف "etc/crontab/": less /etc/crontabSHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # m h dom mon dow user command 17 * * * * root cd / && run-parts –report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.monthly )يُمثّل الخرج السابق ملف crontab الخاص بالنظام والذي لا ينبغي تعديل محتوياته في معظم الحالات، لذا يجدر بك دومًا كتابة ملف crontab خاص بك، إضافةً إلى أن الملف الخاص بالنظام معُرض للاستبدال عند تحديث النظام مما يعرّض تعديلات للضياع. بكل الأحوال يحتوي الملف السابق على بضعة أجزاء مُهمّة والتي نحتاج إلى فهمها. يُحدِّد أول سطرين الصدفة shell التي ستُنفذ الأوامر المدرجة، والمسار الذي توجد به هذه الأوامر. بينما يُحدّد ما تبقى من الملف الأوامر المجدولة مع مواقيتها، حيث كل سطر في هذه القائمة يمثّل سِجلًا أو صفًا في جدول، بينما تشير مسافات "tab" إلى أعمدة هذا الجدول، وتُمثّل كل خلية بأعمدة مفصولة بمسافات أو علامات تبويب tabs. أما سطر التعليقات (والذي يبدأ بإشارة #) فيشرح ما يمثّله كل عمود من الأعمدة.جدولة الساعات والدقائق باستخدام Cronيُخصّص العمود الأول لدقائق الساعة التي يفترض أن يُنفذ بها الأمر ويأخذ قيمة ضمن (0-59)، بينما يُحدّد العمود الثاني قيمة "ساعة من اليوم" ضمن (0-23)، وتعني علامة النجمة (*) "كل قيمة ممكنة" وتستخدم كعلامة شاملة. من خلال الجمع بين هذين العمودين نحصل على التوقيت الزمني للأمر. على سبيل المثال يحتوي السطر الثاني في الجدول على الرقم 25 ضمن عمود الدقائق و 6 لعمود الساعات: 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) وهذا يعني أن السطر الثاني سيُشغّل في الساعة 6:25 صباحًا. وبالمثل يُشغِّل السطر الأول الأمر الخاص به في الدقيقة 17 من كل ساعة: 17 * * * * root cd / && run-parts --report /etc/cron.hourly لذا سيتم تشغيله في الساعات 1:17am ،2:17am ،3:17am ...الخ جدولة الأيام باستخدام Cronتُحدّد كلًا من العمود الثالث، الرابع، والخامس؛ الأيام التي يجب أن تُشغِّل الأوامر، حيث يُحدِّد العمود الثالث قيمة "يوم من الشهر" ضمن المجال (1-31) (لا تنسَ أن الشهور مختلفة بعدّد أيامها؛ لذا كن حذرًا)، ويحدّد العمود الرابع أيّ الشهور التي ستُنفّذ فيها الأوامر ويأخذ قيمة من (1-12)، بينما يُحدّد العمود الخامس أي يومٍ من أيام الأسبوع التي يجب أن تنفّذ فيها الأوامر ويأخذ قيمة من (0-7). حيث يمكنك الجدولة باستخدام واحدة "الأسبوع" عوضًا عن "الشهر". إذا لم تتطابق خانتا "اليوم من الأسبوع" و "اليوم من الشهر" فإن الأمرّ سينفّذ إذا تحقّق أيٍ منهما. كما يمكن تحديد أيام الأسبوع والأشهر باستخدام الأحرف الثلاثة الأولى من أسمائها. إضافةً للنجمة يمكن استخدام الشرطة (-) لتحديد نطاق ما، واستخدام الفاصلة (,) لتحديد قيم متعدّدة. كما يمكننا تحديد "فاصل زمني" بإتباع قيمة ما مع إشارة "/"، فعلى سبيل المثال لتنفيذ الأمر كل ساعة يمكننا استخدام "*/2" في عمود الساعات. إذا نظرنا إلى ملف crontab سنلاحظ أن السجل الثالث يُشغّل كل أحد الساعة 6:47 صباحا: 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) أما السجل الرابع فهو يعمل أوّل كل شهر في الساعة 6:52 صباحًا: 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )استخدام اختصارات الوقت للجدولةيمكننا استبدال الأعمدة الخمسة الأولى من كل سجل بـ "مُسمى مختصر" إذا لم يكن لديك طلبًا مُعقّدًا، صيغة الاختصار تبدأ بإشارة "@" ويتلوها مُسمى الفترة. فعلى سبيل المثال يمكننا جدولة أمر بحيث يُنفّد كل أسبوع بتحديد "weekly@" بدلًا من إنشاء سجل بخمسة أعمدة، الخيارات الأخرى هي: "yearly" ،"@monthly" ،"@daily@" و "hourly@" إضافةً لذلك لدينا الاختصار "reboot@" والذي يعمل فقط عند تشغيل النظام وبدء تشغيل cron، ولهذا يُسمى بـ "reboot@" وليس "cron-restart"أو شيئًا من هذا القبيل. ضع في اعتبارك دومًا أن هذه الاختصارات لا توفّر إمكانيات تخصيص الأعمدة الخمسة، وبدلًا من ذلك فإنها تضبط الأوامر بحيث تعمل عند أول لحظة ممكنة تتطابق مع الاختصار. فعلى سبيل المثال يُشغّل الاختصار "monthly@" الأمر في منتصف الليل من أوّل الشهر، ما يعني أن جميع الأوامر المضبوطة على هذا الاختصار ستعمل في وقتٍ واحد، حيث لا إمكانية لترتيب هذه الأوامر كما مع أسلوب الأعمدة الخمسة في الضبط. تخصيص الأوامر والمستخدمين مع Cronيشمل العمود السادس والموجود فقط في ملف crontab الخاص بالنظام على اسم المستخدم الذي سيُنفّد الأمر من خلاله. بينما يُحدّد العمود الأخير الأوامر المطلوب تشغيلها، يمكن للأمر أن يحتوي على علامة النسبة المئوية (%) والتي تعني أن كل ما هو بعدها يتم تمريره إلى الأمر كدخل قياسي. ليعمل ملف crontab بشكل صحيح يجب إنهاء كل سجل مع محرف سطر جديد، هذه ليست مشكلة بالنسبة لمعظم السجلات، لكن تأكد من وجود سطر فارغ بعد آخر مُدخل ضمن الملف، وإلا فإنه لن يعمل كما يجب. استخدام ميزة “run-parts” والأدلةلو تمعّنا في الأوامر المكتوبة ضمن ملف crontab السابق والخاص بالنظام، فسنشاهد إشارة إلى ما يسمى "anacron" (المزيد عن ذلك لاحقًا)، إضافةً لـ "run-parts". يتيح لنا الأمر "run-parts" ببساطة تشغيل كل أمر قابل للتنفيذ ضمن مجلّد محدّد، ويستخدم هذا الأسلوب على نحو واسع مع cron لأنه يتيح لنا تشغيل سكربتات scripts عديدة في توقيتٍ واحد عن طريق وضعها في مكانٍ واحد، وهو ما يسمح لأن يبقى ملف crontab مرتبًا وبسيطًا، ويسمح لنا بجدولة المزيد من المهام عن طريق وضعها (أو إنشاء اختصار لها) كسكربتات في الدليل المناسب بدلًا من تعديل ملف crontab. عادةً ما تُخصّص معظم التوزيعات مجلد لكل فترة بحيث يتم وضع السكربتات بها ليتم تشغيلها في تلك الفترة، فعلى سبيل المثال تخصص توزيعة Ubuntu المجلدات التالية: cron.daily ،cron.hourly cron.monthly وcron.weekly. إنشاء ملفات Crontabs للمستخدمينبعد استعراضنا لأساسيات التعامل مع Cron يمكنك الآن البدء بجدولة المهام الخاصة بك عن طريق استخدام الأمر "crontab". لاحظ أن ملف "crontab" الخاص بك لن يحتوى عمود "المستخدم"، لأنه سيتم تشغيل الأوامر المضمّنة به من خلال امتيازات المستخدم الخاصّة بك. لمعرفة الـ crontab الحالي، اكتب: crontab -l غالبًا فلن يكون هناك ملف مسبق إلا إذا كنت قد أنشأت واحدًا بشكل يدويّ، وفي هذه الحالة فمن الأفضل أخذ نسخة احتياطية من الملف الحالي قبل البدء بالتحرير بحيث يمكنك التراجع عن أي تغييرات قد تقوم بها. لأخذ نسخة احتياطية إلى مجلد المنزل باسم "cron.bak"، نفّذ الأمر: crontab -l > ~/cron.back للبدء بتحرير ملف crontab اكتب: crontab -eno crontab for demouser - using an empty one Select an editor. To change later, run ‘select-editor’. 1. /bin/nanoاستخدام Anacron مع Cronواحدة من أكبر نقاط ضعف Cron افتراضها أن خادومك أو جهاز الحاسوب الخاص بك يعمل طوال الوقت 24/7، حيث يُلغى تنفيذ كل مهمة مجدولة في وقتٍ يكون فيه حاسوبك مطفئًا. يعتبر ذلك مشكلة خطيرة مع الأنظمة التي لا يمكن ضمان تشغيلها طوال الوقت، وكحلّ لهذه المشكلة تم تطوير أداة Anacron المبنية على anachronistic لضمان تنفيذ الأوامر طوال الوقت. يستخدم Anacron المُعاملات غير المُفصّلة في خيارات Cron، وهذا يعني أن Anacron تكمل عمل Cron وليست بديلًا عنه. أسلوب عمل Anacron يعتمد على إنشاء ملفات بأختام زمنية time-stamped عند تنفيذ أمر ما مجدول من خلال Cron، فإذا كان الأمر قد جُدول للتنفيذ بشكل يومي إلا أنه قد تم إيقاف تشغيل الحاسوب في الوقت الذي يفترض أن يُنفّذ به الأمر، فعندما يعمل anacron في المرة التالية سيرى أنه قد مضى أكثر من 24 ساعة على آخر تنفيذ للجدول اليومي وهذا ما يعني فوات موعده، فيقوم بتنفيذ الأوامر المجدولة. تملك الأداة anacron جدولًا للمواعيد مثل Cron يدعى "anacrontab" ويخزّن في دليل "etc/" كذلك. لنلقي نظرة كيف يبدو: less /etc/anacrontab# /etc/anacrontab: configuration file for anacron # See anacron(8) and anacrontab(5) for details. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # These replace cron’s entries 1 5 cron.daily nice run-parts –report /etc/cron.daily 7 10 cron.weekly nice run-parts –report /etc/cron.weekly @monthly 15 cron.monthly nice run-parts –report /etc/cron.monthlyبالعموم فإن بنية الملف شبيهة بملفات crontab السابقة مع عدد أعمدة أقل، وبعض الملاحظات الجديرة بالانتباه. يُحدّد العمود الأول عدد المرات التي يجب تنفيذ الأمر بها تبعًا للأيام، فالقيمة "1" تعني أنّه جيب تشغيل الأمر يوميًا، بينما تشغّل القيمة "3" الأمر كل ثلاثة أيام. يُحدّد العمود الثاني التأخير الزمني قبل تنفيذ الأوامر، حيث لا يعمل Anacron في الخلفية daemon بل يتم تشغيله بشكل صريح لمرة واحدة، وهذا يسمح بتنظيم العمل، فلا تُنفّذ جميع الأوامر دفعةً واحدة. على سبيل المثال يُشغّل السطر الأوّل كل يوم بعد خمس دقائق من استدعاء anacron: 1 5 cron.daily nice run-parts --report /etc/cron.daily بينما يُشغّل السطر التالي أسبوعيًا (كل سبعة أيام) بعد عشرة دقائق من استدعاء anacron: 7 10 cron.weekly nice run-parts --report /etc/cron.weekly يحتوي العمود الثالث على الاسم الذي سيعرّف مهمة السطر في رسائل anacron وفي سجلات النظام، بينما يحتوي العمود الرابع على الأوامر الفعليّة التي سيجري تشغيلها. يمكنك أن ترى أنه قد تم تعيين anacron لتشغيل بعض السكربتات التي تُنفّذ أيضًا من قبل Cron، ولدرء التعارض تلجئ التوزيعات عادةً إلى إعطاء أولوية لإحدى الأداتين على الأخرى بحيث تعمل واحدة منهما فقط على تنفيذ الأمر المجدول. في توزيعة Ubuntu مثلًا يختبر ملف "/etc/crontab/" إذا كانت anacron مُثبّتة على النظام، بحيث يُشغّل السكربتات النصيّة في أدلة cron فقط في حال لم يتم العثور على anacron. بعض التوزيعات تتبع أسلوب آخر بجعل cron يُحدّث الأختام الزمنية ل anacron في كل مرّة يتم فيها تنفيذ مهمة مجدولة مما يمنع anacron عن تنفيذ نفس الأمر عند استدعاءه. خاتمةتعتبر أداتي cron و anacron من أفضل أدوات أتمتة تنفيذ المهام الروتينية، لذا من المهم استيعاب كيفية الاستفادة من نقاط القوّة في كلّ منهما وتجنب نقاط ضعفهما مما يعطيك أقصى قدر من الفائدة والفعالية. ورغم أنه قد يبدو أمر إعدادهم للمرة الأولى مربكًا بعض الشيء، إلا أن ذلك سيوفّر عليك الكثير من الوقت على المدى الطويل في تكرار العمليات مرّةً بعد أخرى دون أن تحتاج غالبًا لتعديلات تذكر على ملفات الإعداد لاحقًا.1 نقطة