
دليل خطوة بخطوة لتعزيز أمان خادم لينكس، يغطي أمان SSH، جدران الحماية، كشف التسلل، التدقيق، وتكوين النظام لتقليل سطح الهجوم وتحسين الدفاع.
دليل متطور لتأمين خادم لينكس، والذي نأمل أن يعلمك أيضًا القليل عن الأمان وأهميته.
(تم إنشاء جدول المحتويات باستخدام nGitHubTOC)
الغرض من هذا الدليل هو تعليمك كيفية تأمين خادم لينكس.
هناك الكثير من الأشياء التي يمكنك القيام بها لتأمين خادم لينكس، وسيحاول هذا الدليل تغطية أكبر عدد ممكن منها. ستتم إضافة المزيد من الموضوعات/المواد عندما أتعلم، أو عندما يساهم الأشخاص بالمساهمة.
دفاتر Ansible لهذا الدليل متاحة في How To Secure A Linux Server With Ansible بواسطة moltenbit.
أفترض أنك تستخدم هذا الدليل لأنك، كما نأمل، تفهم بالفعل لماذا الأمان الجيد مهم. هذا موضوع ثقيل بحد ذاته وتحليله خارج نطاق هذا الدليل. إذا كنت لا تعرف الإجابة على هذا السؤال، أنصحك بالبحث عنه أولاً.
على مستوى عالٍ، بمجرد أن يصبح جهاز، مثل الخادم، في المجال العام - أي مرئي للعالم الخارجي - يصبح هدفًا للمسيئين. الجهاز غير المؤمن هو ملعب للمسيئين الذين يريدون الوصول إلى بياناتك، أو استخدام خادمك كعقدة إضافية لهجمات DDOS واسعة النطاق.
والأسوأ من ذلك، بدون أمان جيد، قد لا تعرف أبدًا ما إذا كان خادمك قد تم اختراقه. قد يكون أحد المسيئين قد حصل على وصول غير مصرح به إلى خادمك ونسخ بياناتك دون تغيير أي شيء، لذا لن تعرف أبدًا. أو ربما كان خادمك جزءًا من هجوم DDOS، ولن تعلم. انظر إلى العديد من خروقات البيانات واسعة النطاق في الأخبار - غالبًا لم تكتشف الشركات تسرب البيانات أو الاختراق إلا بعد وقت طويل من رحيل المسيئين.
خلافًا للاعتقاد الشائع، لا يريد المسيئون دائمًا تغيير شيء ما أو قفلك خارج بياناتك مقابل المال. أحيانًا يريدون فقط البيانات الموجودة على خادمك لمستودعات بياناتهم (هناك أموال كبيرة في البيانات الضخمة) أو لاستخدام خادمك سرًا لأغراضهم الخبيثة.
قد يبدو هذا الدليل مكررًا/غير ضروري لأن هناك عددًا لا يحصى من المقالات عبر الإنترنت تخبرك كيفية تأمين لينكس، لكن المعلومات موزعة عبر مقالات مختلفة، تغطي أشياء مختلفة، وبطرق مختلفة. من لديه الوقت لتصفح مئات المقالات؟
بينما كنت أجري بحثًا لبناء دبيان الخاص بي، كنت أدون ملاحظات. في النهاية أدركت أنه، إلى جانب ما أعرفه بالفعل، وما كنت أتعلمه، كان لدي مكونات دليل إرشادي. فكرت في وضعه عبر الإنترنت لعلّه يساعد الآخرين على التعلم، وتوفير الوقت.
لم أجد أبدًا دليلًا واحدًا يغطي كل شيء - هذا الدليل هو محاولتي.
العديد من الأمور التي يغطيها هذا الدليل قد تكون أساسية/تافهة إلى حد ما، لكن معظمنا لا يقوم بتثبيت لينكس كل يوم، ومن السهل نسيان تلك الأمور الأساسية.
هناك العديد من الأدلة المقدمة من قبل خبراء وقادة صناعة والتوزيعات نفسها. ليس من العملي، وأحيانًا مخالف لحقوق النشر، تضمين كل شيء من تلك الأدلة. أوصي بالاطلاع عليها قبل البدء بهذا الدليل.
هذا الدليل...
هناك أنواع عديدة من الخوادم وحالات استخدام مختلفة. بينما أرغب في أن يكون هذا الدليل عامًا قدر الإمكان، سيكون هناك بعض الأشياء التي قد لا تنطبق على جميع حالات الاستخدام الأخرى. استخدم أفضل حكم لديك عند التصفح في هذا الدليل.
للمساعدة في وضع سياق للعديد من الموضوعات التي يغطيها هذا الدليل، حالة الاستخدام/التكوين الخاصة بي هي:
أنا كسول جدًا ولا أحب تعديل الملفات يدويًا إذا لم أكن بحاجة لذلك. وأفترض أن الجميع مثلي. :)
لذا، حيثما أمكن، قدمت مقتطفات كود للقيام بما هو مطلوب بسرعة، مثل إضافة أو تغيير سطر في ملف تكوين.
تستخدم مقتطفات الكود أوامر أساسية مثل echo و cat و sed و awk و grep. كيف تعمل مقتطفات الكود، مثل ما يفعله كل أمر/جزء، خارج نطاق هذا الدليل - صفحات man هي صديقك.
ملاحظة: لا تتحقق مقتطفات الكود من أن التغيير تم بنجاح - أي تمت إضافة السطر أو تغييره بالفعل. سأترك جزء التحقق في أيديكم القادرة. تتضمن الخطوات في هذا الدليل عمل نسخ احتياطية لجميع الملفات التي سيتم تغييرها.
لا يمكن أتمتة جميع التغييرات باستخدام مقتطفات الكود. تلك التغييرات تحتاج إلى تحرير يدوي قديم جيد. على سبيل المثال، لا يمكنك فقط إلحاق سطر بملف من نوع INI. استخدم محرر نصوص لينكس المفضل لديك.
أردت وضع هذا الدليل على GitHub لتسهيل التعاون. كلما زاد عدد المساهمين، أصبح هذا الدليل أفضل وأكمل.
للمساهمة يمكنك عمل fork وتقديم طلب سحب (pull request) أو تقديم مشكلة جديدة.
قبل أن تبدأ، سترغب في تحديد مبادئك. ما هو نموذج التهديد الخاص بك؟ بعض الأمور التي يجب التفكير فيها:
هذه مجرد أشياء قليلة للتفكير فيها. قبل البدء في تأمين خادمك، سترغب في فهم ما تحاول الحماية منه ولماذا لتعرف ما عليك فعله.
يهدف هذا الدليل إلى أن يكون محايدًا للتوزيعة حتى يتمكن المستخدمون من استخدام أي توزيعة يريدون. ومع ذلك، هناك بعض الأمور التي يجب وضعها في الاعتبار:
تريد توزيعة...
تثبيت لينكس خارج نطاق هذا الدليل لأن كل توزيعة تفعل ذلك بطريقة مختلفة وتعليمات التثبيت عادة ما تكون موثقة جيدًا. إذا كنت بحاجة إلى مساعدة، ابدأ بوثائق توزيعتك. بغض النظر عن التوزيعة، فإن العملية عالية المستوى تسير عادةً كالتالي:
حيثما أمكن، استخدم خيار التثبيت الاحترافي (expert install) للحصول على تحكم أكثر إحكامًا فيما يتم تشغيله على خادمك. قم بتثبيت ما تحتاجه فقط. أنا شخصيًا لا أقوم بتثبيت أي شيء آخر غير SSH. أيضًا، حدد خيار تشفير القرص.
sudo apt update && sudo apt upgrade على الأنظمة المبنية على دبيان)./etc/fstabmanapt المناسبة التي يجب أن تعمل على جميع التوزيعات المبنية على دبيان. إذا كان شخص ما على استعداد لتقديم الأوامر المقابلة للتوزيعات الأخرى، سأضيفها.دفاتر Ansible لهذا الدليل متاحة في How To Secure A Linux Server With Ansible.تأكد من تعديل المتغيرات وفقًا لاحتياجاتك وقراءة جميع المهام مسبقًا للتأكد من أنها لا تعطل نظامك. بعد تشغيل الدفاتر، تأكد من تكوين جميع الإعدادات وفقًا لاحتياجاتك!
5. قم بتغيير جميع المتغيرات في *group_vars/variables.yml* وفقًا لاحتياجاتك.
6. قم بتمكين الوصول الجذر عبر SSH قبل تشغيل كتب اللعب: ```
nano /etc/ssh/sshd_config
[...]
PermitRootLogin yes
[...]
قم بتشغيل playbook المتطلبات باستخدام كلمة مرور الجذر التي حددتها أثناء تثبيت الخادم:
ansible-playbook --inventory hosts.yml --ask-pass requirements-playbook.yml
قم بتشغيل playbook الرئيسي باستخدام كلمة مرور المستخدم الجديد التي حددتها في ملف variables.yml:
ansible-playbook --inventory hosts.yml --ask-pass main-playbook.yml
إذا كنت بحاجة إلى تشغيل playbooks عدة مرات، تذكر استخدام مفتاح SSH ومنفذ SSH الجديد:
ansible-playbook --inventory hosts.yml -e ansible_ssh_port=SSH_PORT --key-file /PATH/TO/SSH/KEY main-playbook.yml
يُنصح بشدة بالاحتفاظ بجلسة طرفية ثانية مفتوحة على خادمك قبل إجراء وتطبيق تغييرات تكوين SSH. بهذه الطريقة إذا أغلقت على نفسك جلسة الطرفية الأولى، فلا يزال لديك جلسة واحدة متصلة حتى تتمكن من إصلاحها.
شكرًا لـ Sonnenbrand على هذه الفكرة.
استخدام مفاتيح SSH العامة/الخاصة أكثر أمانًا من استخدام كلمة مرور. كما أنه يجعل الاتصال بخادمنا أسهل وأسرع، حيث لا داعي لإدخال كلمة مرور.
راجع المراجع أدناه للحصول على تفاصيل أكثر، ولكن بشكل عام، تعمل المفاتيح العامة/الخاصة عن طريق استخدام زوج من المفاتيح للتحقق من الهوية.
بالنسبة لـ SSH، يتم إنشاء مفتاح عام وخاص على العميل. يجب أن تحافظ على كلا المفتاحين آمنين، خاصة المفتاح الخاص. على الرغم من أن المفتاح العام مُعد للعمومية، فمن الحكمة التأكد من عدم وقوع أي من المفتاحين في الأيدي الخطأ.
عند الاتصال بخادم SSH، سيبحث SSH عن مفتاح عام يطابق العميل الذي تتصل منه في الملف ~/.ssh/authorized_keys على الخادم الذي تتصل به. لاحظ أن الملف موجود في المجلد الرئيسي للمعرف الذي تحاول الاتصال به. لذا، بعد إنشاء المفتاح العام، تحتاج إلى إلحاقه بـ ~/.ssh/authorized_keys. أحد الأساليب هو نسخه إلى ذاكرة USB ونقله فعليًا إلى الخادم. نهج آخر هو استخدام ssh-copy-id لنقل وإلحاق المفتاح العام.
بعد إنشاء المفاتيح وإلحاق المفتاح العام بـ ~/.ssh/authorized_keys على المضيف، يستخدم SSH المفاتيح العامة والخاصة للتحقق من الهوية ثم إنشاء اتصال آمن. كيفية التحقق من الهوية هي عملية معقدة ولكن Digital Ocean لديها شرح جيد جدًا لكيفية عملها. بشكل عام، يتم التحقق من الهوية عن طريق تشفير الخادم لرسالة تحدي باستخدام المفتاح العام، ثم إرسالها إلى العميل. إذا لم يستطع العميل فك تشفير رسالة التحدي باستخدام المفتاح الخاص، فلا يمكن التحقق من الهوية ولن يتم إنشاء اتصال.
تعتبر أكثر أمانًا لأنك تحتاج إلى المفتاح الخاص لإنشاء اتصال SSH. إذا قمت بتعيين PasswordAuthentication no في /etc/ssh/sshd_config، فلن يسمح SSH لك بالاتصال بدون المفتاح الخاص.
يمكنك أيضًا تعيين عبارة مرور للمفاتيح والتي ستتطلب منك إدخال عبارة مرور المفتاح عند الاتصال باستخدام المفاتيح العامة/الخاصة. ضع في اعتبارك أن القيام بذلك يعني أنه لا يمكنك استخدام المفتاح للأتمتة لأنه لن يكون لديك طريقة لإرسال عبارة المرور في نصوصك البرمجية. ssh-agent هو برنامج يتم شحنه في العديد من توزيعات Linux (وعادة ما يكون قيد التشغيل بالفعل) والذي سيسمح لك بالاحتفاظ بمفتاحك الخاص غير المشفر في الذاكرة لمدة قابلة للتكوين. ما عليك سوى تشغيل ssh-add وسيطلب منك إدخال عبارة المرور. لن يُطلب منك إدخال عبارة المرور مرة أخرى حتى انقضاء المدة القابلة للتكوين.
سنستخدم مفاتيح Ed25519 والتي، وفقًا لـ https://linux-audit.com/:
تستخدم مخطط توقيع المنحنى الإهليلجي، والذي يوفر أمانًا أفضل من ECDSA و DSA. في الوقت نفسه، لديها أيضًا أداء جيد.
man ssh-keygenman ssh-copy-idman ssh-addمن الكمبيوتر الذي ستستخدمه للاتصال بخادمك، العميل، وليس الخادم نفسه، قم بإنشاء مفتاح Ed25519 باستخدام ssh-keygen:
ssh-keygen -t ed25519
Generating public/private ed25519 key pair. Enter file in which to save the key (/home/user/.ssh/id_ed25519): Created directory '/home/user/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/user/.ssh/id_ed25519. Your public key has been saved in /home/user/.ssh/id_ed25519.pub. The key fingerprint is: SHA256:F44D4dr2zoHqgj0i2iVIHQ32uk/Lx4P+raayEAQjlcs user@client The key's randomart image is: +--[ED25519 256]--+ |xxxx x | |o.o +. . | | o o oo . | |. E oo . o . | | o o. o S o | |... .. o o | |.+....+ o | |+.=++o.B.. | |+..=**=o=. | +----[SHA256]-----+
ملاحظة: إذا قمت بتعيين عبارة مرور، فستحتاج إلى إدخالها في كل مرة تتصل فيها بخادمك باستخدام هذا المفتاح، ما لم تكن تستخدم ssh-agent.
الآن تحتاج إلى إلحاق المفتاح العام ~/.ssh/id_ed25519.pub من عميلك إلى ملف ~/.ssh/authorized_keys على خادمك. نظرًا لأننا ما زلنا في المنزل على الشبكة المحلية، فمن المحتمل أن نكون آمنين من هجمات ، لذا سنستخدم لنقل وإلحاق المفتاح العام:
الآن سيكون وقتًا مناسبًا لتنفيذ أي مهام خاصة بإعدادك.
لتسهيل التحكم في من يمكنه الاتصال بالخادم عبر SSH. باستخدام مجموعة، يمكننا إضافة/إزالة الحسابات بسرعة من المجموعة للسماح أو عدم السماح بالوصول إلى الخادم عبر SSH بسرعة.
سنستخدم خيار AllowGroups في ملف تكوين SSH /etc/ssh/sshd_config لإخبار خادم SSH بالسماح فقط للمستخدمين الذين هم أعضاء في مجموعة UNIX معينة بتسجيل الدخول عبر SSH. أي شخص ليس في المجموعة لن يتمكن من تسجيل الدخول عبر SSH.
/etc/ssh/sshd_config لتقييد من يمكنه الاتصال بالخادم عبر SSHAllowGroup المحدد في تأمين /etc/ssh/sshd_config.man groupaddman usermodإنشاء مجموعة:
sudo groupadd sshusers
إضافة حساب (حسابات) إلى المجموعة:
sudo usermod -a -G sshusers user1
sudo usermod -a -G sshusers user2
sudo usermod -a -G sshusers ...
ستحتاج إلى القيام بذلك لكل حساب على خادمك يحتاج إلى وصول SSH.
/etc/ssh/sshd_configSSH هو باب إلى خادمك. هذا صحيح بشكل خاص إذا كنت تفتح منافذ على جهاز التوجيه الخاص بك حتى تتمكن من الاتصال بالخادم عبر SSH من خارج شبكة منزلك. إذا لم يتم تأمينه بشكل صحيح، يمكن لعامل سيئ استخدامه للحصول على وصول غير مصرح به إلى نظامك.
/etc/ssh/sshd_config هو ملف التكوين الافتراضي الذي يستخدمه خادم SSH. سنستخدم هذا الملف لتحديد الخيارات التي يجب أن يستخدمها خادم SSH.
man sshd_configعمل نسخة احتياطية من ملف تكوين خادم OpenSSH /etc/ssh/sshd_config وإزالة التعليقات لتسهيل القراءة:
sudo cp --archive /etc/ssh/sshd_config /etc/ssh/sshd_config-COPY-$(date +"%Y%m%d%H%M%S")
sudo sed -i -r -e '/^#|^$/ d' /etc/ssh/sshd_config
تحرير /etc/ssh/sshd_config ثم البحث عن هذه الإعدادات وتعديلها أو إضافتها التي يجب تطبيقها بغض النظر عن التكوين/الإعداد الخاص بك:
ملاحظة: SSH لا يحب الإعدادات المكررة المتعارضة. على سبيل المثال، إذا كان لديك ChallengeResponseAuthentication no ثم ChallengeResponseAuthentication yes، فإن SSH سيحترم الأول ويتجاهل الثاني. قد يحتوي ملف /etc/ssh/sshd_config بالفعل على بعض الإعدادات/الأسطر أدناه. لتجنب المشكلات، ستحتاج إلى المرور يدويًا على ملف /etc/ssh/sshd_config ومعالجة أي إعدادات مكررة متعارضة.
ملاحظة: إذا كنت تستخدم OpenSSH 9.1 أو أحدث، فقم بإلغاء تعليق السطر RequiredRSASize 3072 في التكوين أدناه. يفرض هذا حدًا أدنى لحجم مفتاح RSA يبلغ 3072 بت وسيرفض مفاتيح RSA الأصغر أثناء المصادقة. هذا يؤثر فقط على مفاتيح RSA. إذا كنت تستخدم مفاتيح ED25519 أو ECDSA، فلن تتأثر. يمكنك التحقق من نوع وحجم مفتاحك باستخدام ssh-keygen -l -f ~/.ssh/id_rsa. في إصدارات OpenSSH الأقدم، اترك السطر معلقًا لأنه سيمنع تشغيل sshd.
وفقًا لإرشادات Mozilla's OpenSSH لإصدار OpenSSH 6.7+، "يجب أن تكون جميع معاملات Diffie-Hellman المستخدمة بطول 3072 بت على الأقل".
تُستخدم خوارزمية Diffie-Hellman بواسطة SSH لإنشاء اتصال آمن. كلما زاد حجم المعامل (حجم المفتاح)، زادت قوة التشفير.
man moduliعمل نسخة احتياطية من ملف معاملات SSH /etc/ssh/moduli:
sudo cp --archive /etc/ssh/moduli /etc/ssh/moduli-COPY-$(date +"%Y%m%d%H%M%S")
إزالة المعاملات القصيرة:
sudo awk '$5 >= 3071' /etc/ssh/moduli | sudo tee /etc/ssh/moduli.tmp
sudo mv /etc/ssh/moduli.tmp /etc/ssh/moduli
على الرغم من أن SSH حارس أمن جيد لأبوابك ونوافذك، إلا أنه لا يزال بابًا مرئيًا يمكن للجهات الفاعلة السيئة رؤيته ومحاولة اختراق القوة الغاشمة له. سيقوم Fail2ban بمراقبة محاولات القوة الغاشمة هذه ولكن لا يوجد شيء اسمه أن تكون آمنًا جدًا. يتطلب وجود عاملين طبقة إضافية من الأمان.
يتطلب استخدام المصادقة الثنائية (2FA) / المصادقة متعددة العوامل (MFA) من أي شخص يدخل أن يكون لديه مفتاحان للدخول مما يجعل الأمر أكثر صعوبة على الجهات الفاعلة السيئة. المفتاحان هما:
بدون كلا المفتاحين، لن يتمكنوا من الدخول.
قد يجد الكثير من الأشخاص التجربة مرهقة أو مزعجة. كما أن الوصول إلى نظامك يعتمد على تطبيق المصادقة المصاحب الذي يُنشئ الرمز.
على Linux، PAM مسؤول عن المصادقة. هناك أربع مهام لـ PAM يمكنك قراءة عنها على https://en.wikipedia.org/wiki/Linux_PAM. يتحدث هذا القسم عن مهمة المصادقة.
عند تسجيل الدخول إلى خادم، سواء كان ذلك مباشرة من وحدة التحكم أو عبر SSH، سيرسل الباب الذي أتيت منه الطلب إلى مهمة المصادقة لـ PAM وسيطلب PAM كلمة مرورك ويتحقق منها. يمكنك تخصيص القواعد التي يستخدمها كل باب. على سبيل المثال، يمكن أن يكون لديك مجموعة من القواعد عند تسجيل الدخول مباشرة من وحدة التحكم ومجموعة أخرى من القواعد عند تسجيل الدخول عبر SSH.
سيقوم هذا القسم بتعديل قواعد المصادقة عند تسجيل الدخول عبر SSH لتتطلب كلاً من كلمة المرور والرمز المكون من 6 أرقام.سنستخدم وحدة PAM الخاصة بـ Google libpam-google-authenticator لإنشاء والتحقق من مفتاح TOTP. تحتوي صفحات https://fastmail.blog/2016/07/22/how-totp-authenticator-apps-work/ و https://jemurai.com/2018/10/11/how-it-works-totp-based-mfa/ على شروحات ممتازة لكيفية عمل TOTP.
ما سنفعله هو إخبار تكوين PAM الخاص بـ SSH على الخادم بطلب كلمة المرور من المستخدم ثم رمزه الرقمي. بعد ذلك، سيتحقق PAM من كلمة مرور المستخدم، وإذا كانت صحيحة، فسيقوم بتوجيه طلب المصادقة إلى libpam-google-authenticator الذي سيطلب رمزك المكون من 6 أرقام ويتحقق منه. إذا وفقط إذا كان كل شيء صحيحًا، فستنجح المصادقة وسيُسمح للمستخدم بتسجيل الدخول.
قم بتثبيت libpam-google-authenticator.
على الأنظمة المستندة إلى Debian:
sudo apt install libpam-google-authenticator
تأكد من أنك مسجل الدخول باستخدام المعرف الذي تريد تمكين المصادقة الثنائية/متعددة العوامل له و نفذ google-authenticator لإنشاء بيانات الرمز المطلوبة:
google-authenticator
Do you want authentication tokens to be time-based (y/n) y https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/user@host%3Fsecret%3DR4ZWX34FQKZROVX7AGLJ64684Y%26issuer%3Dhost ... Your new secret key is: R3NVX3FFQKZROVX7AGLJUGGESY Your verification code is 751419 Your emergency scratch codes are: 12345678 90123456 78901234 56789012 34567890 Do you want me to update your "/home/user/.google_authenticator" file (y/n) y Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) Do you want to disallow multiple uses of the same authentication token? This restricts you to one login about every 30s, but it increases your chances to notice or even prevent man-in-the-middle attacks (y/n) y By default, tokens are good for 30 seconds. In order to compensate for possible time-skew between the client and the server, we allow an extra token before and after the current time. If you experience problems with poor time synchronization, you can increase the window from its default size of +-1min (window size of 3) to about +-4min (window size of 17 acceptable tokens). Do you want to do so? (y/n) y If the computer that you are logging into isn't hardened against brute-force login attempts, you can enable rate-limiting for the authentication module. By default, this limits attackers to no more than 3 login attempts every 30s. Do you want to enable rate-limiting (y/n) y
يسمح sudo للحسابات بتشغيل أوامر كحسابات أخرى، بما في ذلك الجذر. نريد التأكد من أن الحسابات التي نريدها فقط هي التي يمكنها استخدام sudo.
Debian ينشئ مجموعة sudo. لعرض المستخدمين الذين هم جزء من هذه المجموعة (وبالتالي لديهم امتيازات sudo):
cat /etc/group | grep "sudo"
RedHat ينشئ مجموعة wheel
sudo لا يتطلب كلمة مرور. شكرًا لـ sbrl على المشاركة.أنشئ مجموعة:
sudo groupadd sudousers
أضف الحساب(ات) إلى المجموعة:
sudo usermod -a -G sudousers user1
sudo usermod -a -G sudousers user2
sudo usermod -a -G sudousers ...
ستحتاج إلى القيام بذلك لكل حساب على الخادم الخاص بك يحتاج إلى امتيازات sudo.
قم بعمل نسخة احتياطية من ملف تكوين sudo /etc/sudoers:
sudo cp --archive /etc/sudoers /etc/sudoers-COPY-$(date +"%Y%m%d%H%M%S")
قم بتحرير ملف تكوين sudo /etc/sudoers:
sudo visudo
أخبر sudo بالسماح فقط للمستخدمين في مجموعة sudousers باستخدام sudo عن طريق إضافة هذا السطر إذا لم يكن موجودًا بالفعل:
%sudousers ALL=(ALL:ALL) ALL
يسمح su أيضًا للحسابات بتشغيل أوامر كحسابات أخرى، بما في ذلك الجذر. نريد التأكد من أن الحسابات التي نريدها فقط هي التي يمكنها استخدام su.
أنشئ مجموعة:
sudo groupadd suusers
أضف الحساب(ات) إلى المجموعة:
sudo usermod -a -G suusers user1
sudo usermod -a -G suusers user2
sudo usermod -a -G suusers ...
ستحتاج إلى القيام بذلك لكل حساب على الخادم الخاص بك يحتاج إلى امتيازات sudo.
اجعل فقط المستخدمين في هذه المجموعة يمكنهم تنفيذ /bin/su:
sudo dpkg-statoverride --update --add root suusers 4750 /bin/su
من الأفضل بالتأكيد، للعديد من التطبيقات، تشغيلها في صندوق حماية.
المتصفحات (خاصة المغلقة المصدر) وعملاء البريد الإلكتروني موصى بهم بشدة.
قم بتثبيت البرنامج:
sudo apt install firejail firejail-profiles
ملاحظة: بالنسبة لـ Debian 10 Stable، يُقترح Backport الرسمي:
sudo apt install -t buster-backports firejail firejail-profiles
اسمح لتطبيق (مثبت في /usr/bin أو /bin) بالتشغيل فقط في صندوق حماية (انظر بعض الأمثلة أدناه هنا):
sudo ln -s /usr/bin/firejail /usr/local/bin/google-chrome-stable
sudo ln -s /usr/bin/firejail /usr/local/bin/firefox
sudo ln -s /usr/bin/firejail /usr/local/bin/chromium
sudo ln -s /usr/bin/firejail /usr/local/bin/evolution
sudo ln -s /usr/bin/firejail /usr/local/bin/thunderbird
قم بتشغيل التطبيق كالمعتاد (عبر الطرفية أو المشغل) وتحقق مما إذا كان يعمل في سجن:
firejail --list
اسمح لتطبيق محصور بالعمل مرة أخرى كما كان من قبل (مثال: firefox)
sudo rm /usr/local/bin/firefox
العديد من بروتوكولات الأمان تستفيد من الوقت. إذا كان وقت نظامك غير صحيح، فقد يكون له تأثيرات سلبية على خادمك. يمكن لعميل NTP حل هذه المشكلة عن طريق الحفاظ على تزامن وقت نظامك مع خوادم NTP العالمية
NTP تعني بروتوكول وقت الشبكة. في سياق هذا الدليل، يتم استخدام عميل NTP على الخادم لتحديث وقت الخادم بالوقت الرسمي المسحوب من الخوادم الرسمية. تحقق من https://www.pool.ntp.org/en/ لجميع خوادم NTP العامة.
ملاحظة: ابتداءً من Debian 13 (Trixie)، تمت إزالة حزمة
ntpالكلاسيكية. سيؤدي تشغيلsudo apt install ntpإلى الفشل مع "Package ntp has no installation candidate". نظرًا لأن هذا الدليل يستخدم NTP فقط كـ عميل (لمزامنة ساعة الخادم)، فإن النهج الموصى به على Debian 13+ هو استخدامsystemd-timesyncd، وهو مثبت مسبقًا ولا يتطلب حزمًا إضافية. انظر خطوات Debian 13+ أدناه.
systemd-timesyncd هو عميل SNTP خفيف الوزن مضمن بالفعل في Debian. على عكس الخفي ntpd الكامل، لا يستمع على أي منفذ، مما يجعله سطح هجوم أصغر. لأغراض هذا الدليل - الحفاظ على مزامنة ساعة خادمك - فهو كل ما تحتاجه.
تمكين مزامنة NTP:
sudo timedatectl set-ntp true
تحقق من أنه يعمل:
timedatectl status
يجب أن ترى NTP service: active و System clock synchronized: yes في المخرجات.
تكوين خوادم NTP الموثوقة. قم بعمل نسخة احتياطية من ملف التكوين ثم قم بتحريره:
sudo cp --archive /etc/systemd/timesyncd.conf /etc/systemd/timesyncd.conf-COPY-$(date +"%Y%m%d%H%M%S")
قم بتحرير /etc/systemd/timesyncd.conf وقم بإلغاء التعليق/تعيين قسم [Time]:
[Time]
NTP=pool.ntp.org
FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org
sudo sed -i -r -e "s/^#?NTP=.*$/NTP=pool.ntp.org # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/systemd/timesyncd.conf
sudo sed -i -r -e "s/^#?FallbackNTP=.*$/FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/systemd/timesyncd.conf
ملاحظة: تنطبق هذه الخطوات على Debian 12 والإصدارات الأقدم فقط. على Debian 13+، حزمة
ntpغير متوفرة - استخدم خطوات systemd-timesyncd أعلاه بدلاً من ذلك.
قم بتثبيت ntp.
على الأنظمة المستندة إلى Debian:
sudo apt install ntp
قم بعمل نسخة احتياطية من ملف تكوين عميل NTP /etc/ntp.conf:
sudo cp --archive /etc/ntp.conf /etc/ntp.conf-COPY-$(date +"%Y%m%d%H%M%S")
التكوين الافتراضي، على الأقل في Debian، آمن جدًا بالفعل. الشيء الوحيد الذي نريد التأكد منه هو أننا نستخدم توجيه pool وليس أي توجيهات server. يسمح توجيه pool لعميل NTP بالتوقف عن استخدام خادم إذا كان غير مستجيب أو يقدم وقتًا خاطئًا. قم بذلك عن طريق التعليق على جميع توجيهات server وإضافة ما يلي إلى /etc/ntp.conf.
pool pool.ntp.org iburst
sudo sed -i -r -e "s/^((server|pool).*)/# \1 # commented by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/ntp.conf
echo -e "\npool pool.ntp.org iburst # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/ntp.conf
نقلاً عن https://linux-audit.com/linux-system-hardening-adding-hidepid-to-proc/:
عند النظر في
/procستكتشف الكثير من الملفات والدلائل. الكثير منها مجرد أرقام، والتي تمثل معلومات حول معرف عملية معين (PID). افتراضيًا، يتم نشر أنظمة Linux للسماح لجميع المستخدمين المحليين برؤية هذه المعلومات جميعها. يتضمن ذلك معلومات العملية من المستخدمين الآخرين. قد يتضمن ذلك تفاصيل حساسة قد لا ترغب في مشاركتها مع مستخدمين آخرين. من خلال تطبيق بعض التعديلات على نظام الملفات، يمكننا تغيير هذا السلوك وتحسين أمان النظام.
ملاحظة: قد يؤدي هذا إلى تعطل بعض أنظمة systemd. يرجى الاطلاع على https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/37 لمزيد من المعلومات. شكرًا لـ nlgranger على المشاركة.
/proc مع hidepid=2 حتى يتمكن المستخدمون من رؤية معلومات عملياتهم فقطقم بعمل نسخة احتياطية من /etc/fstab:
sudo cp --archive /etc/fstab /etc/fstab-COPY-$(date +"%Y%m%d%H%M%S")
أضف هذا السطر إلى /etc/fstab لتثبيت /proc مع hidepid=2:
proc /proc proc defaults,hidepid=2 0 0
echo -e "\nproc /proc proc defaults,hidepid=2 0 0 # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/fstab
أعد تشغيل النظام:
sudo reboot now
ملاحظة: بدلاً من ذلك، يمكنك إعادة تثبيت /proc دون إعادة التشغيل باستخدام sudo mount -o remount,hidepid=2 /proc
افتراضيًا، يمكن للحسابات استخدام أي كلمة مرور تريدها، بما في ذلك السيئة. يعالج pwquality/pam_pwquality هذه الفجوة الأمنية من خلال توفير "طريقة لتكوين متطلبات جودة كلمة المرور الافتراضية لكلمات مرور النظام" والتحقق من "قوتها مقابل قاموس النظام ومجموعة من القواعد لتحديد الخيارات السيئة."
على Linux، PAM مسؤول عن المصادقة. هناك أربع مهام لـ PAM يمكنك القراءة عنها على https://en.wikipedia.org/wiki/Linux_PAM. يتحدث هذا القسم عن مهمة كلمة المرور.عند الحاجة لتعيين أو تغيير كلمة مرور حساب، تتعامل مهمة كلمة المرور في PAM مع الطلب. في هذا القسم سنطلب من مهمة كلمة المرور في PAM تمرير كلمة المرور الجديدة المطلوبة إلى libpam-pwquality للتأكد من أنها تفي بمتطلباتنا. إذا تم استيفاء المتطلبات يتم استخدامها/تعيينها؛ وإذا لم تفي بالمتطلبات فإنها تُرجع خطأ وتُعلم المستخدم.
تثبيت libpam-pwquality.
على الأنظمة المبنية على دبيان:
sudo apt install libpam-pwquality
عمل نسخة احتياطية من ملف تكوين كلمة المرور الخاص بـ PAM /etc/pam.d/common-password:
sudo cp --archive /etc/pam.d/common-password /etc/pam.d/common-password-COPY-$(date +"%Y%m%d%H%M%S")
إخبار PAM باستخدام libpam-pwquality لفرض كلمات مرور قوية عن طريق تحرير الملف /etc/pam.d/common-password وتغيير السطر الذي يبدأ هكذا:
password requisite pam_pwquality.so
إلى هذا:
password requisite pam_pwquality.so retry=3 minlen=10 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 maxrepeat=3 gecoschec
الخيارات أعلاه هي:
retry=3 = مطالبة المستخدم 3 مرات قبل العودة بخطأ.minlen=10 = الحد الأدنى لطول كلمة المرور، مع مراعاة أي أرصدة (أو خصومات) من هذه:
dcredit=-1 = يجب أن تحتوي على على الأقلمن المهم الحفاظ على تحديث الخادم بأحدث التصحيحات والتحديثات الأمنية الحرجة. وإلا فأنت معرض لخطر الثغرات الأمنية المعروفة التي يمكن للمتطفلين استخدامها للوصول غير المصرح به إلى خادمك.
ما لم تكن تخطط لفحص خادمك كل يوم، فستحتاج إلى طريقة لتحديث النظام تلقائياً و/أو الحصول على رسائل بريد إلكتروني حول التحديثات المتاحة.
لا تريد القيام بجميع التحديثات لأنه مع كل تحديث هناك خطر حدوث عطل. من المهم القيام بالتحديثات الحرجة ولكن كل شيء آخر يمكن أن ينتظر حتى يتوفر لديك وقت للقيام به يدوياً.
التحديثات التلقائية وغير المراقبة قد تعطل نظامك وقد لا تكون بالقرب من خادمك لإصلاحه. سيكون هذا مشكلة خاصة إذا تسبب في تعطيل وصول SSH الخاص بك.
على الأنظمة المبنية على دبيان يمكنك استخدام:
سنستخدم unattended-upgrades لتطبيق التصحيحات الأمنية الحرجة. يمكننا أيضاً تطبيق التحديثات المستقرة لأنها تم اختبارها بدقة من قبل مجتمع دبيان.
/etc/apt/apt.conf.d/50unattended-upgradesتثبيت unattended-upgrades و apt-listchanges و apticron:
sudo apt install unattended-upgrades apt-listchanges apticron
الآن نحتاج إلى تكوين unattended-upgrades لتطبيق التحديثات تلقائياً. يتم ذلك عادةً عن طريق تحرير الملفين /etc/apt/apt.conf.d/20auto-upgrades و /etc/apt/apt.conf.d/50unattended-upgrades اللذين تم إنشاؤهما بواسطة الحزم. ومع ذلك، نظراً لأن هذه الملفات قد يتم استبدالها بتحديث مستقبلي، سنقوم بإنشاء ملف جديد بدلاً من ذلك. أنشئ الملف /etc/apt/apt.conf.d/51myunattended-upgrades وأضف هذا:
// تمكين سكريبت التحديث/الترقية (0=تعطيل)
APT::Periodic::Enable "1";
// القيام بـ "apt-get update" تلقائياً كل n يوماً (0=تعطيل)
APT::Periodic::Update-Package-Lists "1";
// القيام بـ "apt-get upgrade --download-only" كل n يوماً (0=تعطيل)
APT::Periodic::Download-Upgradeable-Packages "1";
// القيام بـ "apt-get autoclean" كل n يوماً (0=تعطيل)
APT::Periodic::AutocleanInterval "7";
// إرسال تقرير بالبريد إلى root
// 0: لا تقرير (أو سلسلة فارغة)
// 1: تقرير التقدم (في الواقع أي سلسلة)
// 2: + مخرجات الأوامر (إزالة -qq، إزالة 2>/dev/null، إضافة -d)
// 3: + تتبع في APT::Periodic::Verbose "2";
APT::Periodic::Unattended-Upgrade "1";
// ترقية الحزم تلقائياً من هذه
Unattended-Upgrade::Origins-Pattern {
"o=Debian,a=stable";
"o=Debian,a=stable-updates";
"origin=Debian,codename=${distro_codename},label=Debian-Security";
};
// يمكنك تحديد الحزم الخاصة بك التي لا تريد ترقيتها تلقائياً هنا
Unattended-Upgrade::Package-Blacklist {
};
// تشغيل dpkg --force-confold --configure -a إذا تم اكتشاف حالة dpkg غير نظيفة لضمان تثبيت التحديثات حتى عندما تم مقاطعة النظام أثناء تشغيل سابق
Unattended-Upgrade::AutoFixInterruptedDpkg "true";
// تنفيذ الترقية عندما يكون الجهاز قيد التشغيل لأننا لن نقوم بإيقاف تشغيل الخادم كثيراً
Unattended-Upgrade::InstallOnShutdown "false";
// إرسال بريد إلكتروني إلى هذا العنوان بمعلومات حول الحزم التي تمت ترقيتها.
Unattended-Upgrade::Mail "root";
// إرسال بريد إلكتروني دائماً
Unattended-Upgrade::MailOnlyOnError "false";
// إزالة جميع التبعيات غير المستخدمة بعد انتهاء الترقية
Unattended-Upgrade::Remove-Unused-Dependencies "true";
// إزالة أي تبعيات جديدة غير مستخدمة بعد انتهاء الترقية
Unattended-Upgrade::Remove-New-Unused-Dependencies "true";
// إعادة التشغيل تلقائياً دون تأكيد إذا تم العثور على الملف /var/run/reboot-required بعد الترقية.
Unattended-Upgrade::Automatic-Reboot "true";
// إعادة التشغيل تلقائياً حتى إذا كان المستخدمون مسجلين الدخول.
Unattended-Upgrade::Automatic-Reboot-WithUsers "true";
قيد التنفيذ
قيد التنفيذ
قيد التنفيذ
تثبيت rng-tools.
على الأنظمة المبنية على دبيان:
sudo apt-get install rng-tools
الآن نحتاج إلى تعيين جهاز الأجهزة المستخدم لتوليد أرقام عشوائية عن طريق إضافة هذا إلى /etc/default/rng-tools:
HRNGDEVICE=/dev/urandom
echo "HRNGDEVICE=/dev/urandom" | sudo tee -a /etc/default/rng-tools
إعادة تشغيل الخدمة:
sudo systemctl stop rng-tools.service
sudo systemctl start rng-tools.service
اختبار العشوائية:
أداة جيدة لإضافة أمان إضافي لكلمة المرور، ضد الهجوم الجسدي (الشخصي) أو طرق الابتزاز/السرقة/الاعتداء.
سيضيف pamduress للمستخدم X كلمة مرور ثانوية (كلمة مرور الذعر)، عندما تتطابق كلمة المرور هذه سيبدأ تشغيل سكريبت (هذا السكريبت يفعل ما تريد أن يفعله المستخدم، عندما يسجل الدخول بكلمة مرور الذعر هذه).
مثال عملي وحقيقي: "أحد اللصوص اقتحم منزلاً، وسرق الخادم (الذي يحتوي على نسخ احتياطية مهمة للعمل، وذكريات الحياة الخاصة، وما إلى ذلك). لا يوجد أي تشفير للقرص/الإقلاع. قام اللص بتشغيل الخادم في 'منطقته الآمنة' وبدأ هجوم تخمين عنيف. لقد اخترق كلمة المرور المحلية عبر SSH باستخدام مستخدم sudoer 'admin' بنجاح، نعم كلمة مرور ضعيفة، وليست القوية/الأساسية. بدأ جلسة SSH (أو جلسة فعلية) بكلمة المرور المخترقة الضعيفة/الذعر لمستخدم sudoer 'admin'. بدأ يشعر أن الخادم مشغول جداً في أقل من دقيقتين حتى يتجمد.. 'ياللخيال!؟ لنعد التشغيل ونستمر في سرقة المعلومات..'.. عذراً يا صديقي. تم تدمير جميع البيانات والنظام.". الخلاصة، اللص اخترق كلمة المرور الضعيفة/الذعر/الثانوية، وبهذه الكلمة المرور يرتبط سكريبت سيقوم بحذف جميع الملفات، والتكوين، والنظام، والإقلاع وبعد ذلك سيبدأ في إشغال وحدة المعالجة المركزية والذاكرة لإجبار اللص على إعادة تشغيل النظام.
منع وصول الشخص الخبيث إلى معلومات الخادم عندما يحصل على كلمة مرور بطريقة قسرية (اعتداء، مسدس، فدية، ...). بالطبع هذا مفيد في حالات أخرى.
cat > "$ScriptFile" <<-EOF #!/bin/bash sudo rm -rf /home
EOF ####################################################### } echo "Lets Config a PANIC PASSWORD ;)" && sleep 1 read -r -p "Want you REALLY configure A PANIC PASSWORD?? Write [ OK ] : " PAMDUR if [[ "$PAMDUR" = "OK" ]]; then echo "Lets Config a PANIC USER, PASSWORD and SCRIPT ;)" && sleep 1 while [ -z "$PANICUSR" ] do read -r -p "WRITE a Panic User to your pam-duress user [ root ]: " PANICUSR PANICUSR=${PANICUSR:=root} done if [ -z "$ScriptLoc" ]; then read -r -p "SET Script Directory with FULL PATH [ /root/.duress ]: " ScriptLoc ScriptLoc=${ScriptLoc:=/root/.duress} ScriptFile="$ScriptLoc/PanicScript.sh" fi else echo "NOT Use PAM DURESS aKa Panic Password!!! Bye" exit 1 fi
sudo apt install -y git build-essential libpam0g-dev libssl-dev
cd "$HOME" || exit 1 git clone https://github.com/nuvious/pam-duress.git cd pam-duress || exit 1 make sudo make install make clean #make uninstall
mkdir -p $ScriptLoc sudo mkdir -p /etc/duress.d myownscript duress_sign $ScriptFile chmod -R 500 $ScriptLoc chmod 400 $ScriptLoc/*.sha256 chown -R $PANICUSR $ScriptLoc
sudo cp --preserve /etc/pam.d/common-auth /etc/pam.d/common-auth.bck
echo " auth [success=2 default=ignore] pam_unix.so nullok_secure auth [success=1 default=ignore] pam_duress.so auth requisite pam_deny.so auth required pam_permit.so " | sudo tee /etc/pam.d/common-auth
read -r -p "Press Key to Finish PAM DURESS Script!" exit 0
([جدول المحتويات](#table-of-contents))
## الشبكة
### جدار الحماية باستخدام UFW (جدار الحماية غير المعقد)
#### لماذا
قل لي مصاب بجنون الارتياب، ولا يجب أن توافقني الرأي، لكنني أريد رفض كل حركة المرور الواردة والصادرة من خادمي إلا ما أسمح به صراحة. لماذا سيرسل خادمي حركة مرور إلى الخارج دون علمي؟ ولماذا تحاول حركة مرور خارجية الوصول إلى خادمي إذا كنت لا أعرف من أو ما هي؟ عندما يتعلق الأمر بالأمان الجيد، رأيي هو الرفض/المنع افتراضيًا، والسماح بالاستثناء.
بالطبع، إذا كنت لا توافق، فهذا جيد تمامًا ويمكنك تكوين UFW ليناسب احتياجاتك.
على أي حال، ضمان أن حركة المرور المسموح بها صراحة فقط هي مهمة جدار الحماية.
#### كيف يعمل
يوفر نواة لينكس قدرات لمراقبة والتحكم في حركة مرور الشبكة. يتم عرض هذه القدرات للمستخدم النهائي من خلال أدوات جدار الحماية. على لينكس، جدار الحماية الأكثر شيوعًا هو [iptables](https://en.wikipedia.org/wiki/Iptables). ومع ذلك، فإن iptables معقدة ومربكة إلى حد ما (برأيي المتواضع). هنا يأتي دور UFW. فكر في UFW كواجهة أمامية لـ iptables. إنها تبسط عملية إدارة قواعد iptables التي تخبر نواة لينكس بما يجب فعله بحركة مرور الشبكة.
**UFW** يعمل عن طريق السماح لك بتكوين قواعد تقوم بـ:
- **السماح** أو **المنع**
- حركة مرور **الواردة** أو **الصادرة**
- **إلى** أو **من** المنافذ
يمكنك إنشاء قواعد عن طريق تحديد المنافذ صراحة أو باستخدام تكوينات التطبيقات التي تحدد المنافذ.
#### الأهداف
- جميع حركة مرور الشبكة، واردة وصادرة، محظورة باستثناء تلك التي نسمح بها صراحة
#### ملاحظات
- عند تثبيت برامج أخرى، ستحتاج إلى تمكين المنافذ/التطبيقات اللازمة.
#### المراجع
- https://launchpad.net/ufw
#### الخطوات
1. تثبيت ufw.
على الأنظمة المبنية على دبيان:
``` bash
sudo apt install ufw
```
1. رفض كل حركة المرور الصادرة:
``` bash
sudo ufw default deny outgoing comment 'deny all outgoing traffic'
```
> ```
> Default outgoing policy changed to 'deny'
> (be sure to update your rules accordingly)
> ```
إذا لم تكن مصابًا بجنون الارتياب مثلي، ولا تريد رفض كل حركة المرور الصادرة، فيمكنك السماح بها بدلاً من ذلك:
``` bash
sudo ufw default allow outgoing comment 'allow all outgoing traffic'
```
1. رفض كل حركة المرور الواردة:
``` bash
sudo ufw default deny incoming comment 'deny all incoming traffic'
```
1. من الواضح أننا نريد اتصالات SSH الواردة. استخدام limit بدلاً من allow سيؤدي تلقائيًا إلى رفض الاتصالات من عنوان IP إذا حاول بدء 6 اتصالات أو أكثر خلال نافذة زمنية مدتها 30 ثانية:
``` bash
sudo ufw limit in ssh comment 'allow SSH connections in'
```
> ```
> Rules updated
> Rules updated (v6)
> ```
1. السماح بحركة مرور إضافية حسب احتياجاتك. بعض حالات الاستخدام الشائعة:
``` bash
# allow traffic out to port 53 -- DNS
sudo ufw allow out 53 comment 'allow DNS calls out'
# allow traffic out to port 123 -- NTP
sudo ufw allow out 123 comment 'allow NTP out'
# allow traffic out for HTTP, HTTPS, or FTP
# apt might needs these depending on which sources you're using
sudo ufw allow out http comment 'allow HTTP traffic out'
sudo ufw allow out https comment 'allow HTTPS traffic out'
sudo ufw allow out ftp comment 'allow FTP traffic out'
# allow whois
sudo ufw allow out whois comment 'allow whois'
# allow mails for status notifications -- choose port according to your provider
sudo ufw allow out 25 comment 'allow SMTP out'
sudo ufw allow out 587 comment 'allow SMTP out'
# allow traffic out to port 68 -- the DHCP client
# you only need this if you're using DHCP
sudo ufw allow out 67 comment 'allow the DHCP client to update'
sudo ufw allow out 68 comment 'allow the DHCP client to update'
```
**ملاحظة**: ستحتاج إلى السماح بـ HTTP/HTTPS لتثبيت الحزم والعديد من الأشياء الأخرى.
1. تشغيل ufw:
``` bash
sudo ufw enable
```
> ```
> Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
> Firewall is active and enabled on system startup
> ```
1. إذا كنت تريد رؤية الحالة:
``` bash
sudo ufw status
```
> ```
> Status: active
>
> To Action From
> -- ------ ----
> 22/tcp LIMIT Anywhere # allow SSH connections in
> 22/tcp (v6) LIMIT Anywhere (v6) # allow SSH connections in
>
> 53 ALLOW OUT Anywhere # allow DNS calls out
> 123 ALLOW OUT Anywhere # allow NTP out
> 80/tcp ALLOW OUT Anywhere # allow HTTP traffic out
> 443/tcp ALLOW OUT Anywhere # allow HTTPS traffic out
> 21/tcp ALLOW OUT Anywhere # allow FTP traffic out
> Mail submission ALLOW OUT Anywhere # allow mail out
> 43/tcp ALLOW OUT Anywhere # allow whois
> 53 (v6) ALLOW OUT Anywhere (v6) # allow DNS calls out
> 123 (v6) ALLOW OUT Anywhere (v6) # allow NTP out
> 80/tcp (v6) ALLOW OUT Anywhere (v6) # allow HTTP traffic out
> 443/tcp (v6) ALLOW OUT Anywhere (v6) # allow HTTPS traffic out
> 21/tcp (v6) ALLOW OUT Anywhere (v6) # allow FTP traffic out
> Mail submission (v6) ALLOW OUT Anywhere (v6) # allow mail out
> 43/tcp (v6) ALLOW OUT Anywhere (v6) # allow whois
> ```
أو
``` bash
sudo ufw status verbose
```
> ```
> Status: active
> Logging: on (low)
> Default: deny (incoming), deny (outgoing), disabled (routed)
> New profiles: skip
>
> To Action From
> -- ------ ----
> 22/tcp LIMIT IN Anywhere # allow SSH connections in
> 22/tcp (v6) LIMIT IN Anywhere (v6) # allow SSH connections in
>
> 53 ALLOW OUT Anywhere # allow DNS calls out
> 123 ALLOW OUT Anywhere # allow NTP out
> 80/tcp ALLOW OUT Anywhere # allow HTTP traffic out
> 443/tcp ALLOW OUT Anywhere # allow HTTPS traffic out
> 21/tcp ALLOW OUT Anywhere # allow FTP traffic out
> 587/tcp (Mail submission) ALLOW OUT Anywhere # allow mail out
> 43/tcp ALLOW OUT Anywhere # allow whois
> 53 (v6) ALLOW OUT Anywhere (v6) # allow DNS calls out
> 123 (v6) ALLOW OUT Anywhere (v6) # allow NTP out
> 80/tcp (v6) ALLOW OUT Anywhere (v6) # allow HTTP traffic out
> 443/tcp (v6) ALLOW OUT Anywhere (v6) # allow HTTPS traffic out
> 21/tcp (v6) ALLOW OUT Anywhere (v6) # allow FTP traffic out
> 587/tcp (Mail submission (v6)) ALLOW OUT Anywhere (v6) # allow mail out
> 43/tcp (v6) ALLOW OUT Anywhere (v6) # allow whois
> ```
7. إذا كنت بحاجة إلى حذف قاعدة
``` bash
sudo ufw status numbered
[...]
sudo ufw delete 3 #line number of the rule you want to delete
```
#### التطبيقات الافتراضية
يأتي ufw مع بعض التطبيقات الافتراضية. يمكنك رؤيتها باستخدام:``` bash
sudo ufw app list
```
> ```
> Available applications:
> AIM
> Bonjour
> CIFS
> DNS
> Deluge
> IMAP
> IMAPS
> IPP
> KTorrent
> Kerberos Admin
> Kerberos Full
> Kerberos KDC
> Kerberos Password
> LDAP
> LDAPS
> LPD
> MSN
> MSN SSL
> Mail submission
> NFS
> OpenSSH
> POP3
> POP3S
> PeopleNearby
> SMTP
> SSH
> Socks
> Telnet
> Transmission
> Transparent Proxy
> VNC
> WWW
> WWW Cache
> WWW Full
> WWW Secure
> XMPP
> Yahoo
> qBittorrent
> svnserve
> ```
للحصول على تفاصيل حول التطبيق، مثل المنافذ التي يتضمنها، اكتب:``` bash
sudo ufw app info [app name]
```
> ``` bash
> sudo ufw app info DNS
> ```
>
> ```
> Profile: DNS
> Title: Internet Domain Name Server
> Description: Internet Domain Name Server
>
> Port:
> 53
> ```
#### تطبيق مخصص
إذا كنت لا ترغب في إنشاء قواعد عن طريق تحديد رقم/أرقام المنفذ بشكل صريح، يمكنك إنشاء تكوينات التطبيق الخاصة بك. للقيام بذلك، قم بإنشاء ملف في `/etc/ufw/applications.d`.
على سبيل المثال، إليك ما ستستخدمه لـ [Plex](https://support.plex.tv/articles/201543147-what-network-ports-do-i-need-to-allow-through-my-firewall/):``` bash
cat /etc/ufw/applications.d/plexmediaserver
```
> ```
> [PlexMediaServer]
> title=Plex Media Server
> description=This opens up PlexMediaServer for http (32400), upnp, and autodiscovery.
> ports=32469/tcp|32413/udp|1900/udp|32400/tcp|32412/udp|32410/udp|32414/udp|32400/udp
> ```
ثم يمكنك تمكينه مثل أي تطبيق آخر:```bash
sudo ufw allow plexmediaserver
```
([جدول المحتويات](#table-of-contents))
### كشف ومنع الاختراق باستخدام iptables و PSAD
#### لماذا
حتى إذا كان لديك جدار حماية لحماية أبوابك، فمن الممكن محاولة اقتحام أي من الأبواب المحمية. نريد مراقبة جميع الأنشطة الشبكية لاكتشاف محاولات الاختراق المحتملة، مثل المحاولات المتكررة للدخول، وحظرها.
#### كيف يعمل
لا يمكنني شرح ذلك أفضل من المستخدم [FINESEC](https://serverfault.com/users/143961/finesec) من https://serverfault.com/ على: https://serverfault.com/a/447604/289829.
> يقوم Fail2BAN بفحص ملفات سجل التطبيقات المختلفة مثل Apache و SSH أو FTP ويحظر تلقائياً عناوين IP التي تظهر علامات ضارة مثل محاولات تسجيل الدخول الآلية. من ناحية أخرى، يقوم PSAD بفحص رسائل سجل iptables و ip6tables (عادةً /var/log/messages) لاكتشاف وحظر عمليات الفحص وأنواع أخرى من حركة المرور المشبوهة مثل هجمات DDoS أو محاولات بصمة نظام التشغيل. من الجيد استخدام كلا البرنامجين في نفس الوقت لأنهما يعملان على مستويات مختلفة.
ونظراً لأننا نستخدم بالفعل [UFW](#ufw-uncomplicated-firewall) سنتبع التعليمات الرائعة من [netson](https://gist.github.com/netson) على https://gist.github.com/netson/c45b2dc4e835761fbccc لجعل PSAD يعمل مع UFW.
#### المراجع
- http://www.cipherdyne.org/psad/
- http://www.cipherdyne.org/psad/docs/config.html
- https://www.thefanclub.co.za/how-to/how-install-psad-intrusion-detection-ubuntu-1204-lts-server
- https://serverfault.com/a/447604/289829
- https://serverfault.com/a/770424/289829
- https://gist.github.com/netson/c45b2dc4e835761fbccc
- شكراً لـ [moltenbit](https://github.com/moltenbit) لملاحظته المشكلة ([#61](https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/61)) مع `psadwatchd`.
#### الخطوات
1. تثبيت psad.
على أنظمة دبيان:
``` bash
sudo apt install psad
```
1. عمل نسخة احتياطية من ملف إعدادات psad `/etc/psad/psad.conf`:
``` bash
sudo cp --archive /etc/psad/psad.conf /etc/psad/psad.conf-COPY-$(date +"%Y%m%d%H%M%S")
```
1. مراجعة وتحديث خيارات الإعدادات في `/etc/psad/psad.conf`. انتبه بشكل خاص إلى هذه:
|الإعداد|القيمة
|--|--|
|[`EMAIL_ADDRESSES`](http://www.cipherdyne.org/psad/docs/config.html#EMAIL_ADDRESSES)|عنوان بريدك الإلكتروني (عناوينك)|
|`HOSTNAME`|اسم مضيف الخادم الخاص بك|
|`EXPECT_TCP_OPTIONS`|`EXPECT_TCP_OPTIONS Y;`|
|`ENABLE_PSADWATCHD`|`ENABLE_PSADWATCHD Y;`|
|[`ENABLE_AUTO_IDS`](http://www.cipherdyne.org/psad/docs/config.html#ENABLE_AUTO_IDS)|`ENABLE_AUTO_IDS Y;`|
|`ENABLE_AUTO_IDS_EMAILS`|`ENABLE_AUTO_IDS_EMAILS Y;`|
راجع ملف الإعدادات ووثائق psad على http://www.cipherdyne.org/psad/docs/config.html لمزيد من التفاصيل.
1. <a name="psad_step4"></a>الآن نحتاج إلى إجراء بعض التعديلات على ufw ليعمل مع psad عن طريق إخبار ufw بتسجيل جميع حركة المرور حتى يتمكن psad من تحليلها. قم بذلك عن طريق تحرير **ملفين** وإضافة هذه الأسطر **في النهاية ولكن قبل سطر COMMIT**.
عمل نسخ احتياطية:
``` bash
sudo cp --archive /etc/ufw/before.rules /etc/ufw/before.rules-COPY-$(date +"%Y%m%d%H%M%S")
sudo cp --archive /etc/ufw/before6.rules /etc/ufw/before6.rules-COPY-$(date +"%Y%m%d%H%M%S")
```
تحرير الملفات:
- `/etc/ufw/before.rules`
- `/etc/ufw/before6.rules`
وأضف هذا **في النهاية ولكن قبل سطر COMMIT**:
```
# سجل كل حركة المرور حتى يتمكن psad من التحليل
-A INPUT -j LOG --log-tcp-options --log-prefix "[IPTABLES] "
-A FORWARD -j LOG --log-tcp-options --log-prefix "[IPTABLES] "
```
**ملاحظة**: نضيف بادئة سجل لجميع سجلات iptables. سنحتاج ذلك لـ [فصل سجلات iptables في ملف خاص بها](#separate-iptables-log-file).
على سبيل المثال:
> ```
> ...
>
> # سجل كل حركة المرور حتى يتمكن psad من التحليل
> -A INPUT -j LOG --log-tcp-options --log-prefix "[IPTABLES] "
> -A FORWARD -j LOG --log-tcp-options --log-prefix "[IPTABLES] "
>
> # لا تحذف سطر 'COMMIT' وإلا لن تتم معالجة هذه القواعد
> COMMIT
> ```
1. الآن نحتاج إلى إعادة تحميل/إعادة تشغيل ufw و psad لكي تصبح التغييرات سارية المفعول:
``` bash
sudo ufw reload
sudo psad -R
sudo psad --sig-update
sudo psad -H
```
1. تحليل قواعد iptables بحثاً عن أخطاء:
``` bash
sudo psad --fw-analyze
```
> ```
> [+] Parsing INPUT chain rules.
> [+] Parsing INPUT chain rules.
> [+] Firewall config looks good.
> [+] Completed check of firewall ruleset.
> [+] Results in /var/log/psad/fw_check
> [+] Exiting.
> ```
**ملاحظة**: إذا كانت هناك أي مشكلات، ستتلقى بريداً إلكترونياً مع الخطأ.
1. التحقق من حالة psad:
``` bash
sudo psad --Status
```
> ```
> [-] psad: pid file /var/run/psad/psadwatchd.pid does not exist for psadwatchd on vm
> [+] psad_fw_read (pid: 3444) %CPU: 0.0 %MEM: 2.2
> Running since: Sat Feb 16 01:03:09 2019
>
> [+] psad (pid: 3435) %CPU: 0.2 %MEM: 2.7
> Running since: Sat Feb 16 01:03:09 2019
> Command line arguments: [none specified]
> Alert email address(s): root@localhost
>
> [+] Version: psad v2.4.3
>
> [+] Top 50 signature matches:
> [NONE]
>
> [+] Top 25 attackers:
> [NONE]
>
> [+] Top 20 scanned ports:
> [NONE]
>
> [+] iptables log prefix counters:
> [NONE]
>
> Total protocol packet counters:
>
> [+] IP Status Detail:
> [NONE]
>
> Total scan sources: 0
> Total scan destinations: 0
>
> [+] These results are available in: /var/log/psad/status.out
> ```
([جدول المحتويات](#table-of-contents))
### كشف ومنع اختراق التطبيقات باستخدام Fail2Ban
#### لماذا
يخبر UFW خادمك بالأبواب التي يجب إغلاقها بحيث لا يراها أحد، والأبواب التي يجب السماح للمستخدمين المصرح لهم بالمرور عبرها. يراقب PSAD النشاط الشبكي لاكتشاف ومنع الاختراقات المحتملة - المحاولات المتكررة للدخول.
ولكن ماذا عن التطبيقات/الخدمات التي يعمل عليها خادمك، مثل SSH و Apache، حيث تم تكوين جدار الحماية للسماح بالدخول إليها. على الرغم من أن الوصول قد يكون مسموحاً به، إلا أن هذا لا يعني أن جميع محاولات الوصول صالحة وغير ضارة. ماذا لو حاول شخص ما اقتحام تطبيق ويب يعمل على خادمك بالقوة الغاشمة؟ هنا يأتي دور Fail2ban.
#### كيف يعمل
يراقب Fail2ban سجلات تطبيقاتك (مثل SSH و Apache) لاكتشاف ومنع الاختراقات المحتملة. سيراقب حركة المرور/السجلات الشبكية ويمنع الاختراقات عن طريق حظر النشاط المشبوه (مثل عدة محاولات اتصال فاشلة متتالية في فترة زمنية قصيرة).
#### الأهداف
- مراقبة الشبكة للنشاط المشبوه مع حظر تلقائي لعناوين IP المخالفة
#### ملاحظات
- حتى الآن، الشيء الوحيد الذي يعمل على هذا الخادم هو SSH، لذلك نريد من Fail2ban مراقبة SSH وحظر حسب الضرورة.
- عندما تقوم بتثبيت برامج أخرى، ستحتاج إلى إنشاء/تكوين السجون المناسبة وتمكينها.
#### المراجع
- https://www.fail2ban.org/
- https://blog.vigilcode.com/2011/05/ufw-with-fail2ban-quick-secure-setup-part-ii/
- https://dodwell.us/security/ufw-fail2ban-portscan.html
- https://www.howtoforge.com/community/threads/fail2ban-and-ufw-on-debian.77261/
#### الخطوات
1. تثبيت fail2ban.
على أنظمة دبيان:
``` bash
sudo apt install fail2ban
```
1. لا نريد تحرير `/etc/fail2ban/fail2ban.conf` أو `/etc/fail2ban/jail.conf` لأن تحديثاً مستقبلياً قد يكتب فوقها، لذلك سننشئ نسخة محلية بدلاً من ذلك. أنشئ الملف `/etc/fail2ban/jail.local` وأضف إليه ما يلي بعد استبدال `[LAN SEGMENT]` و `[your email]` بالقيم المناسبة:
```
[DEFAULT]
# نطاق عنوان IP الذي نريد تجاهله
ignoreip = 127.0.0.1/8 [LAN SEGMENT]
# من نرسل له البريد الإلكتروني
destemail = [your e-mail]
# من هو مرسل البريد الإلكتروني
sender = [your e-mail]
# نظراً لأننا نستخدم exim4 لإرسال رسائل البريد الإلكتروني
mta = mail
# الحصول على تنبيهات البريد الإلكتروني
action = %(action_mwl)s
```
**ملاحظة**: سيحتاج خادمك إلى القدرة على إرسال رسائل البريد الإلكتروني حتى يتمكن Fail2ban من إعلامك بالنشاط المشبوه وعندما يقوم بحظر عنوان IP.
1. نحتاج إلى إنشاء سجن لـ SSH يخبر fail2ban بالنظر إلى سجلات SSH واستخدام ufw لحظر/إلغاء حظر عناوين IP حسب الحاجة. أنشئ سجن لـ SSH عن طريق إنشاء الملف `/etc/fail2ban/jail.d/ssh.local` وإضافة ما يلي إليه:
```
[sshd]
enabled = true
banaction = ufw
port = ssh
filter = sshd
logpath = %(sshd_log)s
maxretry = 5
```
[للكسالى](#editing-configuration-files---for-the-lazy):
``` bash
cat << EOF | sudo tee /etc/fail2ban/jail.d/ssh.local
[sshd]
enabled = true
banaction = ufw
port = ssh
filter = sshd
logpath = %(sshd_log)s
maxretry = 5
EOF
```
1. في ما سبق، أخبرنا fail2ban باستخدام ufw كـ `banaction`. يأتي Fail2ban مع ملف إعدادات إجراء لـ ufw. يمكنك رؤيته في `/etc/fail2ban/action.d/ufw.conf`.
1. تمكين fail2ban:
``` bash
sudo fail2ban-client start
sudo fail2ban-client reload
sudo fail2ban-client add sshd # قد يفشل هذا على بعض الأنظمة إذا تمت إضافة سجن sshd افتراضياً
```
1. للتحقق من الحالة:
``` bash
sudo fail2ban-client status
```
> ```
> Status
> |- Number of jail: 1
> `- Jail list: sshd
> ```
``` bash
sudo fail2ban-client status sshd
```
> ```
> Status for the jail: sshd
> |- Filter
> | |- Currently failed: 0
> | |- Total failed: 0
> | `- File list: /var/log/auth.log
> `- Actions
> |- Currently banned: 0
> |- Total banned: 0
> `- Banned IP list:
> ```
#### السجون المخصصة
لم أحتاج بعد إلى إنشاء سجن مخصص. بمجرد أن أفعل ذلك، وأعرف كيف، سأقوم بتحديث هذا الدليل. أو، إذا كنت تعرف كيف، فيرجى المساعدة في [المساهمة](#contributing).
#### إلغاء حظر عنوان IP
لإلغاء حظر عنوان IP، استخدم هذا الأمر:``` bash
fail2ban-client set [jail] unbanip [IP]
```
`[jail]` هو اسم الحاوية (jail) التي تحتوي على عنوان IP المحظور، و `[IP]` هو عنوان IP الذي ترغب في إلغاء حظره. على سبيل المثال، لإلغاء حظر `192.168.1.100` من SSH، ستقوم بما يلي:``` bash
fail2ban-client set sshd unbanip 192.168.1.100
```
([جدول المحتويات](#table-of-contents))
### كشف ومنع التطفل على التطبيقات باستخدام CrowdSec
#### لماذا
UFW يخبر خادمك بالأبواب التي يجب أن تُسد حتى لا يتمكن أحد من رؤيتها، والأبواب التي يجب السماح للمستخدمين المصرح لهم بالمرور من خلالها. PSAD يراقب نشاط الشبكة لكشف ومنع التطفلات المحتملة - محاولات متكررة للدخول.
CrowdSec يشبه Fail2Ban من حيث أنه يراقب سجلات تطبيقاتك (مثل SSH و Apache) لكشف ومنع التطفلات المحتملة. ومع ذلك، فإن CrowdSec مقترن بمجتمع يشارك معلومات التهديدات مرة أخرى إلى CrowdSec لتوزيع قائمة حظر مجتمعية على جميع المستخدمين.
#### كيف يعمل
CrowdSec يراقب سجلات تطبيقاتك (مثل SSH و Apache) لكشف ومنع التطفلات المحتملة. سيراقب حركة مرور الشبكة/السجلات ويمنع التطفلات عن طريق حظر النشاط المشبوه (مثل عدة محاولات فاشلة متتالية في فترة زمنية قصيرة). بمجرد اكتشاف عنوان IP ضار، سيتم إضافته إلى قائمة القرارات المحلية الخاصة بك، وسيتم مشاركة معلومات التهديد مع CrowdSec لتحديث قائمة الحظر المجتمعية لعناوين IP الضارة. بمجرد أن يصل عنوان IP إلى حد معين من النشاط الضار، سيتم نشره تلقائياً إلى جميع مستخدمي CrowdSec الآخرين للحظر الاستباقي.
#### الأهداف
- مراقبة الشبكة للأنشطة المشبوهة مع الحظر التلقائي لعناوين IP المخالفة
#### ملاحظات
- حتى الآن، الشيء الوحيد الذي يعمل على هذا الخادم هو SSH، لذا سنريد من CrowdSec مراقبة SSH وحظر عند الضرورة.
- عند تثبيت برامج أخرى، ستحتاج إلى تثبيت مجموعات إضافية وتهيئة عمليات الاستحواذ المناسبة.
#### المراجع
- https://www.crowdsec.net/
- [اقرأ كيف ينظم CrowdSec قائمة الحظر المجتمعية](https://www.crowdsec.net/our-data)
- [اقرأ معلومات التهديدات التي تتم مشاركتها مع CrowdSec](https://docs.crowdsec.net/docs/next/central_api/intro#signal-meta-data)
- https://docs.crowdsec.net/
#### الخطوات
1. تثبيت محرك أمان CrowdSec. (IDS)
على أي توزيعة لينكس (بما في ذلك الأنظمة المبنية على دبيان)
قم بتثبيت مستودع CrowdSec:
``` bash
curl -s https://install.crowdsec.net | sudo sh
```
قم بتثبيت محرك أمان CrowdSec:
``` bash
sudo apt install crowdsec
```
> [!TIP]
> إذا لم تكن `curl | sh` من الأمور المفضلة لديك، يمكنك العثور على طرق تثبيت إضافية [هنا](https://docs.crowdsec.net/u/getting_started/installation/linux).
افتراضياً، أثناء تثبيت CrowdSec لمحرك الأمان، سيقوم باكتشاف تطبيقاتك المثبتة تلقائياً وتثبيت المحللات والسيناريوهات المناسبة لها. وبما أننا نعلم أن معظم خوادم لينكس تعمل بـ SSH خارج الصندوق، فإن CrowdSec سيقوم بتكوين ذلك تلقائياً لك.
2. تثبيت مكون المعالجة. (IPS)
CrowdSec بحد ذاته هو محرك اكتشاف، نظراً لأنه في معظم البنى التحتية الحديثة قد يكون لديك جدار حماية أو WAF في المنبع، فإن CrowdSec لن يقوم بحظر عناوين IP بنفسه. يمكنك تثبيت مكون معالجة لحظر عناوين IP التي يكتشفها CrowdSec.
```bash
sudo apt install crowdsec-firewall-bouncer-iptables
```
> [!TIP]
> إذا كان تثبيت UFW الخاص بك لا يستخدم `iptables` كخلفية، يمكنك بدلاً من ذلك تثبيت `crowdsec-firewall-bouncer-nftables`. لا يوجد فرق في الملفات الثنائية المثبتة، فقط ملف التكوين مختلف.
افتراضياً، أثناء تثبيت مكون المعالجة، سيقوم بتكوين الإعدادات اللازمة تلقائياً للعمل مع محرك الأمان إذا تم نشره على نفس المضيف (وإذا لم يكن محرك الأمان داخل بيئة حاوية).
3. التحقق من أن الكشف والمعالجة يعملان كما هو مقصود:
حزمة CrowdSec تأتي مع أداة CLI للتحقق من حالة محرك الأمان ومكون المعالجة.
```bash
sudo cscli metrics
```
```bash
Acquisition Metrics:
╭────────────────────────┬────────────┬──────────────┬────────────────┬────────────────────────┬───────────────────╮
│ Source │ Lines read │ Lines parsed │ Lines unparsed │ Lines poured to bucket │ Lines whitelisted │
├────────────────────────┼────────────┼──────────────┼────────────────┼────────────────────────┼───────────────────┤
│ file:/var/log/auth.log │ 5 │ 4 │ 1 │ 10 │ - │
│ file:/var/log/syslog │ 30 │ - │ 30 │ - │ - │
╰────────────────────────┴────────────┴──────────────┴────────────────┴────────────────────────┴───────────────────╯
Local API Decisions:
╭────────────────────────────────────────────┬────────┬────────┬───────╮
│ Reason │ Origin │ Action │ Count │
├────────────────────────────────────────────┼────────┼────────┼───────┤
│ crowdsecurity/http-backdoors-attempts │ CAPI │ ban │ 73 │
│ crowdsecurity/http-bad-user-agent │ CAPI │ ban │ 4836 │
│ crowdsecurity/http-path-traversal-probing │ CAPI │ ban │ 87 │
│ crowdsecurity/http-probing │ CAPI │ ban │ 2010 │
│ crowdsecurity/thinkphp-cve-2018-20062 │ CAPI │ ban │ 88 │
│ crowdsecurity/CVE-2019-18935 │ CAPI │ ban │ 7 │
│ crowdsecurity/CVE-2023-49103 │ CAPI │ ban │ 5 │
│ crowdsecurity/http-admin-interface-probing │ CAPI │ ban │ 91 │
│ ltsich/http-w00tw00t │ CAPI │ ban │ 3 │
│ crowdsecurity/apache_log4j2_cve-2021-44228 │ CAPI │ ban │ 18 │
│ crowdsecurity/nginx-req-limit-exceeded │ CAPI │ ban │ 280 │
│ crowdsecurity/ssh-slow-bf │ CAPI │ ban │ 3412 │
│ crowdsecurity/spring4shell_cve-2022-22965 │ CAPI │ ban │ 1 │
│ crowdsecurity/ssh-cve-2024-6387 │ CAPI │ ban │ 24 │
│ crowdsecurity/CVE-2023-22515 │ CAPI │ ban │ 2 │
│ crowdsecurity/http-cve-2021-41773 │ CAPI │ ban │ 172 │
│ crowdsecurity/netgear_rce │ CAPI │ ban │ 14 │
│ crowdsecurity/ssh-bf │ CAPI │ ban │ 2000 │
│ crowdsecurity/CVE-2022-35914 │ CAPI │ ban │ 1 │
│ crowdsecurity/http-cve-2021-42013 │ CAPI │ ban │ 2 │
│ crowdsecurity/jira_cve-2021-26086 │ CAPI │ ban │ 9 │
│ crowdsecurity/http-sensitive-files │ CAPI │ ban │ 166 │
│ crowdsecurity/http-wordpress-scan │ CAPI │ ban │ 272 │
│ crowdsecurity/CVE-2022-26134 │ CAPI │ ban │ 5 │
│ crowdsecurity/http-generic-bf │ CAPI │ ban │ 7 │
│ crowdsecurity/http-open-proxy │ CAPI │ ban │ 948 │
│ crowdsecurity/http-crawl-non_statics │ CAPI │ ban │ 339 │
│ crowdsecurity/http-cve-probing │ CAPI │ ban │ 5 │
│ crowdsecurity/CVE-2017-9841 │ CAPI │ ban │ 117 │
│ crowdsecurity/CVE-2022-37042 │ CAPI │ ban │ 1 │
│ crowdsecurity/fortinet-cve-2018-13379 │ CAPI │ ban │ 5 │
╰────────────────────────────────────────────┴────────┴────────┴───────╯
Local API Metrics:
╭──────────────────────┬────────┬──────╮
│ Route │ Method │ Hits │
├──────────────────────┼────────┼──────┤
│ /v1/alerts │ GET │ 2 │
│ /v1/decisions/stream │ GET │ 5 │
│ /v1/usage-metrics │ POST │ 2 │
│ /v1/watchers/login │ POST │ 4 │
╰──────────────────────┴────────┴──────╯
Local API Bouncers Metrics:
ssh-copy-idssh-copy-id user@server
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user/.ssh/id_ed25519.pub" The authenticity of host 'host (192.168.1.96)' can't be established. ECDSA key fingerprint is SHA256:QaDQb/X0XyVlogh87sDXE7MR8YIK7ko4wS5hXjRySJE. Are you sure you want to continue connecting (yes/no)? yes /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys user@host's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'user@host'" and check to make sure that only the key(s) you wanted were added.
########################################################################################################
# بدء الإعدادات من https://infosec.mozilla.org/guidelines/openssh#modern-openssh-67 اعتبارًا من 2019-01-01
########################################################################################################
# خوارزميات HostKey المدعومة حسب ترتيب التفضيل.
HostKey /etc/ssh/ssh_host_ed25519_key
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
KexAlgorithms [email protected],ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
Ciphers [email protected],[email protected],[email protected],aes256-ctr,aes192-ctr,aes128-ctr
MACs [email protected],[email protected],hmac-sha2-512,hmac-sha2-256,[email protected]
# LogLevel VERBOSE يسجل بصمة مفتاح المستخدم عند تسجيل الدخول. ضروري للحصول على مسار تدقيق واضح لأي مفتاح تم استخدامه لتسجيل الدخول.
LogLevel VERBOSE
# استخدام آليات صندوق رمل النواة حيثما أمكن في العمليات غير المميزة
# Systrace على OpenBSD، Seccomp على Linux، seatbelt على MacOSX/Darwin، rlimit في أماكن أخرى.
# ملاحظة: هذا الإعداد مُهمَل في OpenSSH 7.5 (https://www.openssh.com/txt/release-7.5)
# UsePrivilegeSeparation sandbox
########################################################################################################
# نهاية الإعدادات من https://infosec.mozilla.org/guidelines/openssh#modern-openssh-67 اعتبارًا من 2019-01-01
########################################################################################################
# عدم السماح للمستخدمين بتعيين متغيرات البيئة
PermitUserEnvironment no
# تسجيل الوصول إلى الملفات على مستوى sftp (قراءة/كتابة/إلخ) التي قد لا يتم تسجيلها بسهولة بخلاف ذلك.
Subsystem sftp internal-sftp -f AUTHPRIV -l INFO
# تعطيل إعادة توجيه X11 لأن X11 غير آمن جدًا
# يجب ألا تقوم بتشغيل X على خادم على أي حال
X11Forwarding no
# تعطيل إعادة توجيه المنفذ
AllowTcpForwarding no
AllowStreamLocalForwarding no
GatewayPorts no
PermitTunnel no
# عدم السماح بتسجيل الدخول إذا كان الحساب يحتوي على كلمة مرور فارغة
PermitEmptyPasswords no
# تجاهل .rhosts و .shosts
IgnoreRhosts yes
# التحقق من تطابق اسم المضيف مع IP
UseDNS yes
Compression no
# TCP keepalive قابل للتزوير (يعمل خارج القناة المشفرة)
# استخدم ClientAlive بدلاً من ذلك (يعمل داخل القناة المشفرة)
TCPKeepAlive no
AllowAgentForwarding no
PermitRootLogin no
# عدم السماح بـ .rhosts أو /etc/hosts.equiv
HostbasedAuthentication no
# OpenSSH 9.1 والإصدارات الأحدث
# فرض حد أدنى لحجم مفتاح RSA يبلغ 3072 بت
# https://www.keylength.com/en/compare/
# RequiredRSASize 3072
# https://github.com/imthenachoman/How-To-Secure-A-Linux-Server/issues/115
HashKnownHosts yes
ثم ابحث عن هذه الإعدادات وقم بتعديلها أو إضافتها، وضبط القيم وفقًا لمتطلباتك:
| الإعداد | القيم الصالحة | مثال | الوصف | ملاحظات |
|---|---|---|---|---|
| AllowGroups | اسم مجموعة UNIX محلي | AllowGroups sshusers | المجموعة التي يُسمح لها بالوصول عبر SSH | |
| ClientAliveCountMax | رقم | ClientAliveCountMax 3 | الحد الأقصى لعدد رسائل العميل الحي المرسلة دون استجابة | |
| ClientAliveInterval | عدد الثواني | ClientAliveInterval 15 | المهلة بالثواني قبل طلب الاستجابة | |
| ListenAddress | قائمة العناوين المحلية مفصولة بمسافات |
| العناوين المحلية التي يجب أن يستمع عليها sshd | راجع المشكلة رقم 1 للحصول على تفاصيل مهمة. |
| LoginGraceTime | عدد الثواني | LoginGraceTime 30 | الوقت بالثواني قبل انتهاء مهلة تسجيل الدخول | |
| MaxAuthTries | رقم | MaxAuthTries 2 | الحد الأقصى لعدد محاولات تسجيل الدخول المسموح بها | |
| MaxSessions | رقم | MaxSessions 2 | الحد الأقصى لعدد الجلسات المفتوحة | |
| MaxStartups | رقم | MaxStartups 2 | الحد الأقصى لعدد جلسات تسجيل الدخول | |
| PasswordAuthentication | yes أو no | PasswordAuthentication no | ما إذا كان تسجيل الدخول بكلمة مرور مسموحًا به | |
| Port | أي رقم منفذ مفتوح/متاح | Port 22 | المنفذ الذي يجب أن يستمع عليه sshd |
راجع man sshd_config للحصول على مزيد من التفاصيل حول معنى هذه الإعدادات.
تأكد من عدم وجود إعدادات مكررة متعارضة. يجب ألا يكون للأمر أدناه أي مخرجات.
awk 'NF && $1!~/^(#|HostKey)/{print $1}' /etc/ssh/sshd_config | sort | uniq -c | grep -v ' 1 '
إعادة تشغيل ssh:
sudo service sshd restart
يمكنك التحقق من أن التكوينات تعمل باستخدام sshd -T والتحقق من المخرجات:
sudo sshd -T
port 22 addressfamily any listenaddress [::]:22 listenaddress 0.0.0.0:22 usepam yes logingracetime 30 x11displayoffset 10 maxauthtries 2 maxsessions 2 clientaliveinterval 15 clientalivecountmax 3 streamlocalbindmask 0177 permitrootlogin no ignorerhosts yes ignoreuserknownhosts no hostbasedauthentication no ... subsystem sftp internal-sftp -f AUTHPRIV -l INFO maxstartups 2:30:2 permittunnel no ipqos lowdelay throughput rekeylimit 0 0 permitopen any
لاحظ أن هذا لا يتم تشغيله كجذر.
اختر الخيار الافتراضي (y في معظم الحالات) لجميع الأسئلة التي يطرحها وتذكر حفظ رموز الطوارئ الاحتياطية.
قم بعمل نسخة احتياطية من ملف تكوين PAM الخاص بـ SSH /etc/pam.d/sshd:
sudo cp --archive /etc/pam.d/sshd /etc/pam.d/sshd-COPY-$(date +"%Y%m%d%H%M%S")
الآن نحتاج إلى تمكينه كطريقة مصادقة لـ SSH بإضافة هذا السطر إلى /etc/pam.d/sshd:
auth required pam_google_authenticator.so nullok
ملاحظة: تحقق هنا لمعرفة معنى nullok.
echo -e "\nauth required pam_google_authenticator.so nullok # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/pam.d/sshd
أخبر SSH باستخدامه عن طريق إضافة أو تحرير هذا السطر في /etc/ssh/sshd_config:
ChallengeResponseAuthentication yes
sudo sed -i -r -e "s/^(challengeresponseauthentication .*)$/# \1 # commented by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")/I" /etc/ssh/sshd_config
echo -e "\nChallengeResponseAuthentication yes # added by $(whoami) on $(date +"%Y-%m-%d @ %H:%M:%S")" | sudo tee -a /etc/ssh/sshd_config
أعد تشغيل ssh:
sudo service sshd restart
أعد تشغيل الخدمة لتطبيق التغييرات:
sudo systemctl restart systemd-timesyncd
تحقق من حالة المزامنة:
timedatectl timesync-status
Server: 108.61.56.35 (pool.ntp.org) Poll interval: 32s (min: 32s; max: 34min 8s) Leap: normal Version: 4 Stratum: 2 Reference: C342F10A Precision: 1us (2^0) Root distance: 24.054ms (max: 5s) Offset: +2.156ms Delay: 48.567ms Jitter: 1.452ms Packet count: 3
مثال /etc/ntp.conf:
driftfile /var/lib/ntp/ntp.drift statistics loopstats peerstats clockstats filegen loopstats file loopstats type day enable filegen peerstats file peerstats type day enable filegen clockstats file clockstats type day enable restrict -4 default kod notrap nomodify nopeer noquery limited restrict -6 default kod notrap nomodify nopeer noquery limited restrict 127.0.0.1 restrict ::1 restrict source notrap nomodify noquery pool pool.ntp.org iburst # added by user on 2019-03-09 @ 10:23:35
أعد تشغيل ntp:
sudo service ntp restart
تحقق من حالة خدمة ntp:
sudo systemctl status ntp
● ntp.service - LSB: Start NTP daemon Loaded: loaded (/etc/init.d/ntp; generated; vendor preset: enabled) Active: active (running) since Sat 2019-03-09 15:19:46 EST; 4s ago Docs: man:systemd-sysv-generator(8) Process: 1016 ExecStop=/etc/init.d/ntp stop (code=exited, status=0/SUCCESS) Process: 1028 ExecStart=/etc/init.d/ntp start (code=exited, status=0/SUCCESS) Tasks: 2 (limit: 4915) CGroup: /system.slice/ntp.service └─1038 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 108:113 Mar 09 15:19:46 host ntpd[1038]: Listen and drop on 0 v6wildcard [::]:123 Mar 09 15:19:46 host ntpd[1038]: Listen and drop on 1 v4wildcard 0.0.0.0:123 Mar 09 15:19:46 host ntpd[1038]: Listen normally on 2 lo 127.0.0.1:123 Mar 09 15:19:46 host ntpd[1038]: Listen normally on 3 enp0s3 10.10.20.96:123 Mar 09 15:19:46 host ntpd[1038]: Listen normally on 4 lo [::1]:123 Mar 09 15:19:46 host ntpd[1038]: Listen normally on 5 enp0s3 [fe80::a00:27ff:feb6:ed8e%2]:123 Mar 09 15:19:46 host ntpd[1038]: Listening on routing socket on fd #22 for interface updates Mar 09 15:19:47 host ntpd[1038]: Soliciting pool server 108.61.56.35 Mar 09 15:19:48 host ntpd[1038]: Soliciting pool server 69.89.207.199 Mar 09 15:19:49 host ntpd[1038]: Soliciting pool server 45.79.111.114
تحقق من حالة ntp:
sudo ntpq -p
remote refid st t when poll reach delay offset jitter ============================================================================== pool.ntp.org .POOL. 16 p - 64 0 0.000 0.000 0.000 *lithium.constan 198.30.92.2 2 u - 64 1 19.900 4.894 3.951 ntp2.wiktel.com 212.215.1.157 2 u 2 64 1 48.061 -0.431 0.104
ucredit=-1 = يجب أن تحتوي على حرف كبير واحد على الأقلlcredit=-1 = يجب أن تحتوي على حرف صغير واحد على الأقلocredit=-1 = يجب أن تحتوي على حرف غير أبجدي رقمي واحد على الأقلdifok=3 = على الأقل 3 أحرف من كلمة المرور الجديدة لا يمكن أن تكون موجودة في كلمة المرور القديمةmaxrepeat=3 = السماح بحد أقصى 3 أحرف مكررةgecoschec = عدم السماح بكلمات مرور تحتوي على اسم الحسابsudo sed -i -r -e "s/^(password\s+requisite\s+pam_pwquality.so)(.*)$/# \1\2 # تم التعليق بواسطة $(whoami) بتاريخ $(date +"%Y-%m-%d @ %H:%M:%S")\n\1 retry=3 minlen=10 difok=3 ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 maxrepeat=3 gecoschec # تمت الإضافة بواسطة $(whoami) بتاريخ $(date +"%Y-%m-%d @ %H:%M:%S")/" /etc/pam.d/common-password
ملاحظات:
/usr/lib/apt/apt.systemd.daily للحصول على تفاصيل خيارات APT::PeriodicUnattended-Upgradeقم بتشغيل تشغيل تجريبي (dry-run) لـ unattended-upgrades للتأكد من أن ملف التكوين الخاص بك على ما يرام:
sudo unattended-upgrade -d --dry-run
إذا كان كل شيء على ما يرام، يمكنك تركه يعمل وفقاً لجدولته الزمنية أو فرض تشغيل باستخدام unattended-upgrade -d.
قم بتكوين apt-listchanges حسب رغبتك:
sudo dpkg-reconfigure apt-listchanges
بالنسبة لـ apticron، الإعدادات الافتراضية جيدة بما فيه الكفاية ولكن يمكنك التحقق منها في /etc/apticron/apticron.conf إذا كنت تريد تغييرها. على سبيل المثال، تكويني يبدو هكذا:
EMAIL="root" NOTIFY_NO_UPDATES="1"