VPS: نصائح أمان لينكس
تم إنشاء هذا الدليل باستخدام المنتجات التالية:
(قد تختلف التفاصيل مع المنتجات من مزودين مختلفين ولكن المفاهيم الرئيسية تظل كما هي)
مقدمة
هذا الدليل يحتوي على بعض النصائح والإرشادات حول كيفية جعل سيرفر لينكس الخاص بك أكثر أمانًا. خاصةً وأن السيرفرات (الافتراضية) يجب الوصول إليها من الخارج، فإن الحماية الأساسية ضد الوصول غير المرغوب فيه موصى بها بشدة ولا يجب تجاهلها.
يرجى ملاحظة أن هذه التعليمات ليست شاملة، ويمكن العثور على معلومات أكثر تفصيلاً في أقسام أخرى من وثائق ZAP. (مثلاً المصادقة الثنائية (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) وأغلقه (Nano: Ctrl + x).
يجب الآن إعادة تشغيل خدمة 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
استخدام جدار ناري
مبدأ الوصول الخارجي للسيرفر دائمًا واحد: يجب فتح منفذ ليتمكن السيرفر من الوصول إليه من الخارج. في حالة 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). التعليمات التالية تم اختبارها على ديبيان وأوبونتو، لكنها تعمل على توزيعات أخرى أيضًا.
أولاً، حدّث دليل 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
بعد تثبيت 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]
. قسم 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 مختلف، مما يسمح لك باختبار 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}
.
إذا كان لديك عدد غير معتاد من حظر عناوين 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 لاستيراد هذه القواعد بسرعة. تأكد من عدم وجود قواعد منفصلة تسمح بالوصول غير المقيد إلى سيرفر الويب الخاص بك، بخلاف القواعد التي أضفتها مؤخرًا، وإلا فلن تعمل.
الخلاصة - سيرفرك أصبح الآن أكثر أمانًا بكثير!
هذا الدليل عرض لك بعض الوظائف الأساسية والمتقدمة لتأمين سيرفر لينكس الخاص بك. إذا طبقت كل التوصيات التي تنطبق على نظامك، فإن سيرفرك أصبح بالفعل أكثر أمانًا من قبل - مبروك!
يمكن اتخاذ المزيد من الإجراءات بالطبع:
- المصادقة الثنائية (SSH)
- إضافة إعدادات إضافية لـ Fail2Ban
- إعداد إشعارات البريد في Fail2Ban
- وأكثر من ذلك...