تخطي إلى المحتوى الرئيسي

سيرفر مخصص: نصائح أمان لينكس

تم إنشاء هذا الدليل باستخدام المنتجات التالية:

(قد تختلف التفاصيل مع المنتجات من مزودين مختلفين ولكن المفاهيم الرئيسية تظل كما هي)

مقدمة

يحتوي هذا الدليل على بعض النصائح والإرشادات حول كيفية جعل سيرفر لينكس الخاص بك أكثر أمانًا. خصوصًا أن السيرفرات يجب أن تُستخدم عن بُعد، لذا فإن الحماية الأساسية ضد الوصول غير المرغوب فيه أمر موصى به بشدة ولا يجب تجاهله.

معلومات

يرجى ملاحظة أن هذه التعليمات ليست شاملة، ويمكنك العثور على معلومات أكثر تفصيلًا في أقسام أخرى من وثائق ZAP. (مثل المصادقة الثنائية (SSH))

نصيحة

أسهل طريقة لحماية سيرفرك دائمًا هي نفسها، بغض النظر عن نوع السيرفر: استخدم كلمات مرور قوية، حدّث خدماتك بانتظام، وكن حذرًا بشأن الخدمات التي تثبتها والدلائل التي تتبعها.

تأمين SSH

SSH (Secure Shell) هو خدمة تتيح لك الوصول عن بُعد إلى وحدة تحكم السيرفر لتنفيذ الأوامر. يمكنك معرفة كيفية إعداد SSH على سيرفرك هنا: الوصول الأولي (SSH)

بشكل افتراضي، يتم استخدام تسجيل الدخول عبر كلمة المرور لـ SSH. لكن هذا له عيب كبير وهو أن المصادقة يمكن تجاوزها بسهولة نسبيًا باستخدام هجوم القوة العمياء، خاصة إذا استخدمت كلمة مرور بسيطة جدًا. لذا إذا قررت استخدام تسجيل الدخول بكلمة مرور، يرجى استخدام كلمة مرور آمنة.

لحماية سيرفرك بشكل أفضل من الوصول غير المرغوب فيه عبر SSH، يجب تفعيل المصادقة فقط عبر مفاتيح SSH وتعطيل تسجيل الدخول بكلمة المرور. اطلع على دليل مفتاح SSH الذي يشرح كيفية إنشاء وإضافة مفاتيح SSH.

تكوين منافذ خدماتك

الخدمةالمنفذ
SSH22
FTP21
البريد25
DNS53
HTTP80
HTTPS443

خدمات مثل 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).

Port sshd

يجب إعادة تشغيل خدمة SSH لتطبيق التغييرات.

# على أوبونتو/ديبيان/سينتوس مثلاً
sudo systemctl restart sshd

منفذ FTP

إذا قمت بتثبيت خدمة FTP مثل proFTPd، يمكن تغيير المنفذ بسهولة عبر تعديل ملف الإعدادات، والإجراء مشابه لخدمة SSH.

ابحث عن ملف الإعداد proftpd.conf

find / -name "proftpd.conf" 2>/dev/null

عادةً ما يكون الملف في /etc/proftpd.conf (سينتوس) أو /etc/proftpd/proftpd.conf (أوبونتو، ديبيان). افتح الملف باستخدام nano وأزل الـ "#" قبل port وأدخل المنفذ الذي تريده. تأكد من اتباع التعليمات أعلاه لتجنب اختيار منفذ غير صالح.

نصيحة

استخدم Ctrl + W للبحث داخل nano.

nano /etc/proftpd/proftpd.conf

Port proftpd

استخدام جدار ناري

مبدأ الوصول الخارجي للسيرفر هو نفسه دائمًا: يجب فتح منفذ ليتمكن السيرفر من الاستجابة من الخارج. في حالة 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
  1. القاعدة الأولى تحظر الحزم إذا كان هناك أكثر من اتصالين في حالة TIME_WAIT على المنفذ 22 من عنوان IP واحد.
  2. القاعدة الثانية تضيف عنوان IP للاتصال الجديد إلى قائمة recent.
  3. القاعدة الثالثة تحظر الاتصالات الجديدة من عناوين IP التي حاولت الاتصال أكثر من مرتين في الثانية الأخيرة.

UFW

كما ذكرنا، UFW هي واجهة أبسط لـ IPTables. الخطوة الأولى هي تثبيت UFW لأنه غير مثبت افتراضيًا في كل التوزيعات. نفذ الأوامر كـ root أو باستخدام sudo.

سجّل دخولك إلى سيرفر لينكس. إذا كنت تحتاج مساعدة، اتبع دليلنا الوصول الأولي (SSH). التعليمات التالية تم اختبارها على ديبيان وأوبونتو، لكنها تعمل على توزيعات أخرى أيضًا.

أولًا، حدّث قائمة الحزم والخدمات:

sudo apt update && sudo apt upgrade -y

ثم ثبّت UFW:

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 مع إعدادات جاهزة لبعض الخدمات الشائعة مثل:

  • apache
  • lighttpd
  • sshd
  • qmail
  • postfix
  • Courier Mail Server يمكن إضافة خدمات أخرى باستخدام تعبيرات منتظمة (RegEx) وتحديد ملف السجل المطلوب.

كمثال، نلقي نظرة على ملف /var/log/auth.log الذي يحتوي على كل محاولات تسجيل الدخول عبر SSH، سواء الناجحة أو الفاشلة. /var/log/auth.log

هنا يمكنك رؤية السطر:

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.local. انسخ محتويات jail.conf إلى الملف الجديد وافتحه:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

يمكنك الآن تعديل كل الإعدادات في jail.local، بما في ذلك الخدمات التي تريد مراقبتها. ركز على القسم بعد [Default] حيث يتم إعداد الإعدادات العامة.

انزل قليلاً حتى تجد هذا الجزء وعدّله كما يلي:

الخاصيةالشرحالقيمة
ignoreipعناوين IP التي لا يجب حظرها127.0.0.1/8
ignorecommandغير مهم
bantimeمدة حظر عنوان IP1h
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 مختلف لتجربة Fail2Ban.

خطر

لا تختبر هذا على شبكتك العادية، فقد يتم حظر عنوان 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

كما ترى، الاتصال من سيرفرك المحمي بـ 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
# مدة الحظر تزداد مع كل حظر لهذا IP
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 لاستيراد قواعد الجدار الناري هذه دفعة واحدة. تأكد من عدم وجود قواعد منفصلة تسمح بالوصول المفتوح إلى سيرفرك، بخلاف القواعد التي أضفتها مؤخرًا، وإلا فلن تعمل.

الخلاصة - سيرفرك أصبح الآن أكثر أمانًا بكثير!

هذا الدليل عرض لك بعض الوظائف الأساسية والمتقدمة لتأمين سيرفر لينكس الخاص بك. إذا طبقت كل التوصيات التي تنطبق على نظامك، فإن سيرفرك أصبح أكثر أمانًا بكثير من قبل - مبروك!

يمكنك اتخاذ المزيد من الإجراءات: