سيرفر مخصص: نصائح أمان لينكس
تم إنشاء هذا الدليل باستخدام المنتجات التالية:
(قد تختلف التفاصيل مع المنتجات من مزودين مختلفين ولكن المفاهيم الرئيسية تظل كما هي)
مقدمة
يحتوي هذا الدليل على بعض النصائح والإرشادات حول كيفية جعل سيرفر لينكس الخاص بك أكثر أمانًا. خصوصًا أن السيرفرات يجب الوصول إليها من الخارج، لذا يُنصح بشدة بالحماية الأساسية ضد الوصول غير المرغوب فيه ولا يجب تجاهلها.
يرجى ملاحظة أن هذه التعليمات ليست شاملة، ويمكن العثور على معلومات أكثر تفصيلاً في أقسام أخرى من وثائق ZAP. (مثلاً 2FA (SSH))
أسهل طريقة لحماية سيرفرك دائمًا هي نفسها، بغض النظر عن نوع السيرفر: استخدم كلمات مرور قوية، حدّث خدماتك بانتظام، وكن حذرًا بشأن الخدمات التي تثبتها والدلائل التي تتبعها.
تأمين SSH
SSH (Secure Shell) هو خدمة تتيح لك الوصول عن بُعد إلى وحدة تحكم السيرفر لتنفيذ الأوامر. يمكنك معرفة كيفية إعداد SSH على سيرفرك هنا: الوصول الأولي (SSH)
افتراضيًا، يتم استخدام تسجيل الدخول عبر كلمة مرور لـ SSH. لكن هذا له عيب كبير وهو أن المصادقة يمكن تجاوزها بسهولة نسبياً باستخدام هجوم القوة الغاشمة، خاصة إذا استخدمت كلمة مرور بسيطة جدًا. لذا إذا قررت استخدام تسجيل الدخول بكلمة مرور، يرجى استخدام كلمة مرور آمنة.
لحماية سيرفرك بشكل أفضل من الوصول غير المرغوب فيه عبر SSH، يجب تفعيل المصادقة فقط عبر مفاتيح SSH وتعطيل تسجيل الدخول بكلمة مرور. اطلع على دليل مفتاح SSH الذي يشرح كيفية إنشاء وإضافة مفاتيح SSH.
تكوين منافذ خدماتك
| الخدمة | المنفذ |
|---|---|
| SSH | 22 |
| FTP | 21 |
| البريد | 25 |
| DNS | 53 |
| HTTP | 80 |
| HTTPS | 443 |
خدمات مثل SSH أو FTP تستخدم نفس المنافذ افتراضيًا (بعضها مذكور في الجدول أعلاه). إذا أراد شخص خبيث خارجي تنفيذ هجوم قوة غاشمة على خدمة SSH في سيرفرك، يجب أن يعرف أولاً أي منفذ يستخدم للوصول إلى SSH. إذا لم تقم بتغيير هذه المنافذ، فإن المنافذ 22 و21 عادة ما تكون هدفًا لتنفيذ الأوامر مباشرة على السيرفر أو الوصول إلى الملفات عبر FTP.
لتجنب ذلك، نوصي بتعيين منافذ الخدمات القياسية كمنافذ مخصصة من قبلك. في الجزء التالي من هذا الدليل ستتعرف على كيفية القيام بذلك:
يجب أن يكون المنفذ الذي تختاره بين 1024 و65536 ويجب ألا يكون مستخدمًا بالفعل!
يمكنك استخدام الأمر cat /etc/services لعرض بعض المنافذ القياسية لتجنب اختيار منفذ مستخدم مسبقًا.
منفذ SSH
لتغيير منفذ SSH، يجب تعديل ملف الإعدادات. عادة ما يكون موجودًا في /etc/ssh/sshd_config، وإذا لم يكن هناك يمكنك استخدام الأمر التالي للعثور عليه.
find / -name "sshd_config" 2>/dev/null
افتح الملف باستخدام nano (كمستخدم root أو باستخدام sudo).
sudo nano /etc/ssh/sshd_config
أضف المنفذ الذي تريده بعد Port. إذا كان Port معلقًا (مثلاً #Port 22)، قم بإزالة الـ "#" واستبدل 22 بالمنفذ الذي تريده. ثم احفظ الملف (في Nano استخدم Ctrl + o) وأغلقه (Ctrl + x).
يجب الآن إعادة تشغيل خدمة SSH لتطبيق التغييرات.
# على Ubuntu/Debian/CentOS مثلاً
sudo systemctl restart sshd
منفذ FTP
إذا قمت بتثبيت خدمة FTP مثل proFTPd، يمكن أيضًا تغيير المنفذ بسهولة عن طريق تعديل ملف الإعدادات، والإجراء مشابه لخدمة SSH.
ابحث عن ملف الإعداد proftpd.conf
find / -name "proftpd.conf" 2>/dev/null
عادة ما يكون الملف في /etc/proftpd.conf (CentOS) أو /etc/proftpd/proftpd.conf (Ubuntu, Debian).
افتح الملف باستخدام nano وأزل الـ "#" قبل port وأدخل المنفذ الذي تريده. تأكد من اتباع التعليمات السابقة لتجنب اختيار منفذ غير صالح.
استخدم Ctrl + W للبحث داخل nano.
nano /etc/proftpd/proftpd.conf
استخدام جدار ناري
مبدأ الوصول الخارجي للسيرفر دائمًا هو نفسه: يجب فتح منفذ ليتمكن السيرفر من الوصول إليه من الخارج. في حالة SSH، يكون هذا افتراضيًا المنفذ 22/TCP. (راجع أعلاه كيفية تغيير المنفذ الافتراضي)
المشكلة هنا أن هذا المنفذ متاح للجميع، بغض النظر عن الشخص أو الموقع أو النية. هذا يشكل ثغرة أمنية كبيرة حيث يمكن للمهاجمين إغراق السيرفر بمحاولات تسجيل دخول إما لاكتشاف كلمة المرور الصحيحة (عبر هجوم القوة الغاشمة إذا كان تسجيل الدخول بكلمة مرور مفعلًا) أو محاولة إغراق شبكة السيرفر (مثل هجمات DDoS)، وهو أمر شائع.
لتقليل هذه المخاطر، يمكنك تطبيق قواعد جدار ناري تقيد الوصول إلى المنافذ المفتوحة.
هناك طريقتان يمكنك استخدامهما:
- IPTables: هو جدار الحماية الأصلي في لينكس، يوفر خيارات كثيرة لكنه معقد بعض الشيء.
- UFW: واجهة أبسط لـ IPTables بدون الحاجة لأوامر معقدة، لكنه أكثر تقييدًا.
الأمر يعود لك في اختيار الطريقة التي تناسبك. حسب الاستخدام قد تحتاج مرونة IPTables، وأحيانًا UFW تكفي (مثلاً لفتح/إغلاق المنافذ فقط وهو أفضل من لا شيء!).
IPTables
في هذا القسم، ستستخدم IPTables لإنشاء قواعد تحد من عدد محاولات الاتصال الممكنة. الشرح لكل أمر موجود تحت كتلة الكود.
يرجى ملاحظة أن هذه القواعد مفعلة فقط لـ المنفذ 22 (القيمة بعد --dport) ويجب تعديل الأوامر للخدمات الأخرى.
قد لا تعمل الأوامر التالية على كل توزيعة لينكس، لكنها تعمل على الغالبية العظمى من التوزيعات الشهيرة.
أولًا، سجل دخولك إلى سيرفر لينكس. إذا كنت بحاجة لمساعدة، اتبع دليلنا الوصول الأولي (SSH). ثم نفذ الأوامر التالية بالترتيب:
iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 --connlimit-mask 32 -j DROP
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 1 --hitcount 2 -j DROP
- القاعدة الأولى تحظر الحزم إذا كان هناك أكثر من اتصالين في حالة
TIME_WAITعلى المنفذ 22 من عنوان IP واحد. - القاعدة الثانية تضيف عنوان IP للاتصال الجديد إلى قائمة
recent. - القاعدة الثالثة تحظر الاتصالات الجديدة من عناوين IP التي حاولت الاتصال أكثر من مرتين في الثانية الأخيرة.
UFW
كما ذكرنا، UFW هي واجهة أبسط لـ IPTables. الخطوة الأولى هي تثبيت UFW لأنه غير مثبت افتراضيًا في كل توزيعات لينكس. يجب تنفيذ الأوامر كـ root أو باستخدام sudo.
سجل دخولك إلى سيرفر لينكس. إذا كنت بحاجة لمساعدة، اتبع دليلنا الوصول الأولي (SSH). التعليمات التالية تم اختبارها على Debian وUbuntu لكنها تعمل على توزيعات أخرى أيضًا.
أولًا، حدّث دليل apt والخدمات المثبتة.
sudo apt update && sudo apt upgrade -y
ثم ثبت UFW عبر apt.
sudo apt install ufw -y
تأكد من نجاح التثبيت بالأمر:
sudo ufw status
> Firewall not loaded
لتجنب حظر نفسك من السيرفر، يجب تفعيل خدمة ssh أولًا قبل تفعيل الجدار الناري.
إذا غيرت منفذ SSH مسبقًا، أدخل المنفذ الجديد هنا بدلًا من 22.
استخدم الأوامر التالية لتفعيل خدمة ssh:
sudo ufw allow 22/tcp
sudo ufw enable
sudo ufw status
يجب أن تظهر نتيجة مشابهة:
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
22/tcp (v6) ALLOW Anywhere (v6)
الآن نفذ الأمر التالي لتقييد الاتصالات إلى 6 في الدقيقة:
ufw limit 22/tcp
UFW يسمح فقط بتقييد عدد الاتصالات إلى 6 في الدقيقة. محدد UFW بسيط وقد لا يناسب كل الحالات. للتكوين الأكثر تفصيلاً ومرونة، نوصي باستخدام IPTables مباشرة.
الجدار الناري (سواء IPTables أو UFW) يمكنه فقط "عد" محاولات الاتصال وحظرها بشكل آلي. مع Fail2Ban يمكنك فحص ملفات السجل للكشف عن الأنشطة المشبوهة. القسم التالي يشرح كيفية تثبيت وتفعيل Fail2Ban.
إجراءات حماية إضافية باستخدام Fail2Ban
Fail2Ban هي خدمة تحظر عناوين IP التي تحاول الاتصال بالسيرفر بنوايا خبيثة. تراقب Fail2Ban بعض ملفات السجل للكشف عن الأنشطة المشبوهة وتؤمن النظام بطريقة فعالة وبسيطة.
بعد التثبيت، يأتي Fail2Ban مع إعدادات مسبقة لبعض الخدمات الشائعة مثل:
- apache
- lighttpd
- sshd
- qmail
- postfix
- Courier Mail Server يمكن إضافة خدمات أخرى باستخدام تعبيرات منتظمة (RegEx) وتحديد ملف السجل المطلوب.
كمثال، لننظر إلى سجل في /var/log/auth.log يحتوي على كل محاولات تسجيل الدخول عبر SSH، سواء الناجحة أو الفاشلة.
هنا يمكنك رؤية السطر:
Dec 2 12:59:19 vps-zap515723-2 sshd[364126]: Failed password for root from 92.117.xxx.xxx port 52504 ssh2
Fail2Ban يستخدم هذا الملف ويراقبه لمحاولات المصادقة الفاشلة. وبما أن الملف يحتوي على عنوان IP للمهاجم، يمكن لـ Fail2Ban حظر هذا العنوان بعد عدة محاولات فاشلة.
تثبيت Fail2Ban
سجل دخولك إلى سيرفر لينكس. إذا كنت بحاجة لمساعدة، اتبع دليلنا الوصول الأولي (SSH). نفذ الأوامر كـ root أو باستخدام sudo.
sudo apt update && sudo apt upgrade -y
sudo apt install fail2ban
بعد التثبيت، تحقق من حالة الخدمة باستخدام systemctl: (يمكنك الخروج من systemctl بـ Ctrl+C)
systemctl status fail2ban.service
* fail2ban.service - Fail2Ban Service
Loaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor pres>
Active: active (running) since Sat 2023-12-02 13:10:33 UTC; 24s ago
Docs: man:fail2ban(1)
Process: 23988 ExecStartPre=/bin/mkdir -p /run/fail2ban (code=exited, statu>
Main PID: 23989 (fail2ban-server)
CPU: 409ms
CGroup: /system.slice/fail2ban.service
`-23989 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
Dec 02 13:10:33 vps-zap515723-1 systemd[1]: Starting Fail2Ban Service...
Dec 02 13:10:33 vps-zap515723-1 systemd[1]: Started Fail2Ban Service.
Dec 02 13:10:34 vps-zap515723-1 fail2ban-server[23989]: Server ready
إعداد Fail2Ban
Fail2Ban مثبت الآن، لكنه غير مفعل أو مهيأ بعد. اطلع على مجلد /etc/fail2ban وستجد الملفات التالية:
action.d fail2ban.d jail.conf paths-arch.conf paths-debian.conf
fail2ban.conf filter.d jail.d paths-common.conf paths-opensuse.conf
لإنشاء "جلب" (jail) نشط، يجب إنشاء ملف jail.local. انسخ محتويات jail.conf إلى الملف الجديد وافتحه:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
يمكنك الآن تعديل كل الإعدادات في jail.local، بما في ذلك الخدمات التي تريد مراقبتها.
ركز فقط على الجزء بعد [Default]. قسم Default مخصص للإعدادات العامة.
انتقل للأسفل قليلاً حتى تجد هذا الجزء وعدّله كما يلي:
| الخاصية | الشرح | القيمة |
|---|---|---|
| ignoreip | عناوين IP التي لا يجب حظرها | 127.0.0.1/8 |
| ignorecommand | غير مهم. | |
| bantime | مدة حظر عنوان IP | 1h |
| findtime | الإطار الزمني لمحاولات الدخول الفاشلة التي تؤخذ بعين الاعتبار | 10m |
| maxretry | عدد المحاولات الفاشلة التي تؤدي للحظر | 5 |
# يمكن تعريفها باستخدام فاصل فراغ (أو فاصلة).
#ignoreip = 127.0.0.1/8 ::1
# ignorecommand = /path/to/command <ip>
ignorecommand =
# "bantime" هو عدد الثواني التي يُحظر فيها المضيف.
bantime = 1h
# يُحظر المضيف إذا قام بـ "maxretry" محاولات خلال "findtime"
# ثواني.
findtime = 10m
# "maxretry" هو عدد المحاولات الفاشلة قبل حظر المضيف.
maxretry = 5
أكملت الآن إعداد الإعدادات العامة. لمراقبة خدمة SSH مثلاً، انتقل للأسفل إلى وسم [sshd]. إذا غيرت المنفذ، ضع المنفذ الجديد تحت port.
سيبدو وسم [sshd] كالتالي:
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 4
كما ترى، يمكن عمل إعدادات فردية لكل خدمة (مثل maxretry هنا أقل من الإعداد العام). إذا لم تفعل ذلك، تُستخدم الإعدادات العامة.
الآن فقط أعد تشغيل Fail2Ban لتفعيل المراقبة.
sudo systemctl restart fail2ban.service
التحقق من عمل Fail2Ban
إذا كان لديك VPN أو سيرفر ثاني، يمكنك تجربة حظر نفسك عبر Fail2Ban للتأكد من عمل الخدمة. باستخدام VPN أو نقطة اتصال عبر هاتفك، ستحصل على عنوان IP مختلف يسمح لك بالاختبار.
لا تختبر هذا على شبكتك العادية، لأن عنوان IP الخاص بك قد يُحظر وستُحرم من الوصول!
حاول الاتصال عبر SSH إلى سيرفرك (بعنوان IP مختلف!) وأدخل كلمة مرور خاطئة عدة مرات. يجب أن تظهر النتيجة مثل:
root@185.223.29.xxx's password:
Permission denied, please try again.
root@185.223.29.xxx's password:
Permission denied, please try again.
root@185.223.29.xxx's password:
root@185.223.29.xxx: Permission denied (publickey,password).
root@vps-zap515723-2:/var/log# ssh root@185.223.29.179
root@185.223.29.xxx's password:
Permission denied, please try again.
root@185.223.29.xxx's password:
Permission denied, please try again.
root@185.223.29.xxx's password:
^C
root@vps-zap515723-2:/var/log# ssh root@185.223.29.xxx
ssh: connect to host 185.223.29.xxx port 22: Connection refused
كما ترى، الاتصال من عنوان IP المحمي بـ Fail2Ban مرفوض (Connection refused بدلًا من Permission denied).
اعرض الآن حالة Fail2Ban. سترى أن عنوان IP محظور.
fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 4
| |- Total failed: 8
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: xxx
لفك الحظر عن IP، استخدم الأمر: fail2ban-client set sshd unbanip {your IP}.
إذا كان لديك عدد غير معتاد من الحظر، يُنصح بزيادة مدة الحظر مع كل محاولة فاشلة لتقليل عدد محاولات الدخول.
[sshd]
enabled = true
port = 22
filter = sshd
logpath = /var/log/auth.log
maxretry = 4
bantime = 1h
# مدة الحظر تزداد مع كل حظر لهذا العنوان
bantime.increment = true
# عامل التدرج 24 ساعة (1h,24h,48h,3d,4d....)
bantime.factor = 24
# الحد الأقصى لمدة الحظر = 5 أسابيع
bantime.maxtime = 5w
تأمين سيرفرات الويب باستخدام Cloudflare
الكثير يستخدم Cloudflare كمدير DNS لنطاقاتهم. Cloudflare ليس فقط من أكبر الشبكات في العالم التي تقدم أوقات تحميل صفحات أقل، زمن استجابة أقل وتجربة أفضل، بل تحمي مواقعك من هجمات DoS/DDoS، بما في ذلك الفيضانات وأنواع الهجمات الجديدة التي تظهر يوميًا.
في هذا الدليل، ستتعلم كيف تحمي سيرفر الويب الخاص بك من الهجمات.
سنفترض أن نطاقك مُدار بالفعل عبر Cloudflare، وإذا لم يكن كذلك يمكنك اتباع دليلهم لنقل نطاقك. اذهب إلى تبويب سجلات DNS من لوحة معلومات Cloudflare، وتأكد أن السجل الخاص بسيرفر الويب لديك يحمل السحابة البرتقالية ويقول "Proxied".
الآن، كل حركة المرور التي تمر عبر نطاقك ستذهب عبر Cloudflare ومن ثم إلى سيرفرك، مع ضمان أنها حركة شرعية. لكن سيرفرك لا يزال متاحًا من خارج Cloudflare، لذلك يجب عليك تقييد الوصول إلى المنافذ 80 و443 لبروتوكول TCP على سيرفر لينكس الخاص بك، والسماح فقط بالوصول إذا كانت الحركة من Cloudflare الشرعية.
للقيام بذلك، يمكنك تقييد الوصول يدويًا باستخدام قواعد جدار ناري من قائمة IPv4 العامة لـ Cloudflare وقائمة IPv6 العامة لـ Cloudflare.
بدلاً من ذلك، يمكنك توفير الوقت باستخدام أدوات مثل Cloudflare-ufw لاستيراد قواعد الجدار الناري هذه دفعة واحدة. تأكد من عدم وجود قواعد منفصلة تسمح بالوصول المفتوح إلى سيرفر الويب لديك، بخلاف القواعد التي أضفتها مؤخرًا، وإلا فلن تعمل.
الخلاصة - سيرفرك أصبح الآن أكثر أمانًا بكثير!
هذا الدليل عرض لك بعض الوظائف الأساسية والمتقدمة لتأمين سيرفر لينكس الخاص بك. إذا طبقت كل التوصيات التي تنطبق على نظامك، فإن سيرفرك أصبح أكثر أمانًا بكثير من قبل - مبروك!
يمكنك بالطبع اتخاذ المزيد من الإجراءات:
- 2FA (SSH)
- إضافة إعدادات إضافية لـ Fail2Ban
- إعداد إشعارات البريد في Fail2Ban
- والمزيد...