Linux: جدار الحماية وأساسيات الأمان
خلال دقائق من ربط خادم لينكس جديد بالإنترنت، سيُمسح ويُستهدف بمحاولات هجوم. التعزيز الأمني ليس اختياريًا — إنه إجباري.
📋 المتطلبات المسبقة: يجب أن تعرف بالفعل
- الدرس 23: أساسيات الشبكات
1. ما ستتعلمه
- إعداد القواعد الأساسية بufw
- مصادقة مفاتيح SSH
- تعزيز أمان SSH
- حماية fail2ban من هجمات القوة الغاشمة
- تحديثات الأمان النظامية
2. قصة حقيقية عن التعرض لهجوم
(1) نقطة الألم: هجمات القوة الغاشمة في اليوم الثاني
اشترى شياو مينغ خادمًا سحابيًا لاستضافة مدونته. في اليوم الثاني، فحص السجلات كان مرعبًا:
grep "Failed password" /var/log/auth.log | wc -l
# 1234 attempts!
ماسحات آلية حول العالم كانت تحاول باستمرار الدخول عبر منفذ SSH 22.
(2) ثلاث طبقات من التعزيز
فعل ثلاثة أشياء:
# 1. التحويل لمصادقة المفاتيح
ssh-keygen -t ed25519
ssh-copy-id user@server
# 2. تعطيل تسجيل الدخول بكلمة المرور
sudo sed -i 's/PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
# 3. تثبيت fail2ban: 5 محاولات فاشلة → حظر 24 ساعة
sudo apt install fail2ban
sudo systemctl enable fail2ban
(3) الفائدة: الهجمات انخفضت إلى الصفر
بعد التعزيز، المحاولات الفاشلة في auth.log انخفضت من أكثر من 1000 يوميًا إلى 0.
3. نقاط المعرفة
(1) ufw — جدار الحماية البسيط
# العمليات الأساسية
sudo ufw status # عرض الحالة
sudo ufw enable # تفعيل جدار الحماية
sudo ufw disable # تعطيل جدار الحماية
sudo ufw reload # إعادة تحميل القواعد
# إدارة القواعد
sudo ufw allow 22/tcp # السماح بـSSH
sudo ufw allow 80/tcp # السماح بـHTTP
sudo ufw allow 443/tcp # السماح بـHTTPS
sudo ufw deny 23/tcp # رفض Telnet
sudo ufw deny from 10.0.0.100 # حظر IP محدد
# ملفات التطبيقات
sudo ufw app list # عرض التطبيقات
sudo ufw allow "Nginx Full" # السماح بـNginx (80+443)
sudo ufw allow "OpenSSH" # السماح بـSSH
# إدارة القواعد
sudo ufw status numbered # عرض القواعد مرقمة
sudo ufw delete 2 # حذف القاعدة 2
allow from 0.0.0.0/0 قبل deny from malicious_ip، فلن يُنفَّذ الرفض أبدًا — السماح طُبّق أولًا. انتبه لترتيب القواعد واستخدم ufw status numbered لفحص القائمة.
ufw allow from لتحديد IPs موثوقة، لا تستخدم أبدًا 0.0.0.0/0 (يسمح بكل IPs) — هذا يكافئ عدم وجود قيد ويبطل الغرض من جدار الحماية. حدد دائمًا IPs ملموسة أو نطاقات CIDR، مثل ufw allow from 192.168.1.0/24.
سياسة أمان الخادم الجديد:
ufw default deny incoming يعني أن كل الاتصالات الواردة مرفوضة افتراضيًا — نهج القائمة البيضاء حيث فقط المنافذ المصرح بها بـallow قابلة للوصول. هذه هي السياسة الافتراضية الأأمن، لكن يجب أن تسمح بـSSH (22/tcp) قبل التفعيل، وإلا ستُغلق نفسك خارج الخادم.
# الرفض الافتراضي لكل الوارد
sudo ufw default deny incoming
# السماح الافتراضي لكل الصادر
sudo ufw default allow outgoing
# فتح فقط المنافذ المطلوبة
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw enable
(2) مصادقة مفاتيح SSH
# توليد زوج مفاتيح (Ed25519 موصى به)
ssh-keygen -t ed25519 -C "your_email@example.com"
# RSA تقليدي (4096 بت)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# نسخ المفتاح العام إلى الخادم
ssh-copy-id user@server-ip
# أو إضافة يدويًا
cat ~/.ssh/id_ed25519.pub | ssh user@server-ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# التحقق من الدخول بالمفتاح
ssh user@server-ip
(3) تعزيز أمان SSH
ufw allow 2222/tcp)، وإلا سيحجبه جدار الحماية. أبقِ جلسة SSH قائمة قبل إجراء التغييرات كخط أمان.
عدّل /etc/ssh/sshd_config:
Port 2222 # تغيير المنفذ الافتراضي (تجنب المسح الآلي)
PermitRootLogin no # تعطيل دخول الجذر المباشر
PasswordAuthentication no # تعطيل الدخول بكلمة المرور
PubkeyAuthentication yes # تفعيل الدخول بالمفتاح
AllowUsers alice bob # السماح فقط بمستخدمين محددين
MaxAuthTries 3 # أقصى محاولات مصادقة
ClientAliveInterval 60 # فاصل نبضات العميل (ثوانٍ)
ClientAliveCountMax 3 # أقصى فشل نبضات
تحقق من الإعدادات وأعد التشغيل:
sudo sshd -t # اختبار صياغة الإعدادات
sudo systemctl restart sshd # إعادة تشغيل خدمة SSH
(4) fail2ban
jail.conf الخاص بـfail2ban تقدمه الحزمة وقد يُستبدل عند الترقية. الإعدادات المخصصة يجب توضعها في jail.local أو دليل /etc/fail2ban/jail.d/ — هذه الملفات لن تُستبدل بالترقيات ولها أولوية أعلى.
# تثبيت
sudo apt install fail2ban
# عرض الحالة
sudo fail2ban-client status
sudo fail2ban-client status sshd
# الإعدادات الافتراضية (/etc/fail2ban/jail.conf)، عادةً لا حاجة لتغييرها
# [sshd]
# enabled = true
# port = ssh
# filter = sshd
# logpath = /var/log/auth.log
# maxretry = 5
# bantime = 3600
# إنشاء تجاوز محلي
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo systemctl restart fail2ban
# عرض IPs المحظورة
sudo iptables -L f2b-sshd -n
(5) ▶ مثال: إعداد ufw كامل
# إذا كانت SSH متصلة، اسمح بـSSH أولًا
sudo ufw allow 22/tcp
# ضبط السياسات الافتراضية
sudo ufw default deny incoming
sudo ufw default allow outgoing
# فتح منافذ الخدمات
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 2222/tcp # إذا غُيّر منفذ SSH
# التفعيل
sudo ufw enable
sudo ufw status verbose
الإخراج:
TEXTRule added Rule added Default incoming policy changed to 'deny' Default outgoing policy changed to 'allow' Rule added Rule added Rule added Firewall is active and enabled on system startup Status: active Logging: on (low) To Action From -- ------ ---- 22/tcp ALLOW IN Anywhere 80/tcp ALLOW IN Anywhere 443/tcp ALLOW IN Anywhere 2222/tcp ALLOW IN Anywhere
(6) ▶ مثال: إنشاء واستخدام مفاتيح SSH
# 1. توليد زوج مفاتيح على الجهاز المحلي
ssh-keygen -t ed25519
# 2. نسخ إلى الخادم
ssh-copy-id -i ~/.ssh/id_ed25519.pub alice@192.168.1.100
# 3. اختبار الدخول بدون كلمة مرور
ssh alice@192.168.1.100
# 4. استخدام ملف إعدادات SSH لتسهيل الدخول
cat >> ~/.ssh/config << 'EOF'
Host myserver
HostName 192.168.1.100
User alice
Port 2222
IdentityFile ~/.ssh/id_ed25519
EOF
# الآن يمكنك استخدام الاختصار
ssh myserver
الإخراج:
TEXTGenerating public/private ed25519 key pair. Enter file in which to save the key (/home/alice/.ssh/id_ed25519): Your identification has been saved in /home/alice/.ssh/id_ed25519 Your public key has been saved in /home/alice/.ssh/id_ed25519.pub The key fingerprint is: SHA256:abc123def456 alice@workstation /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/alice/.ssh/id_ed25519.pub" Number of key(s) added: 1 Now try logging into the machine: ssh alice@192.168.1.100 Welcome to Ubuntu 22.04.3 LTS Last login: Tue Jul 7 10:23:45 2026
(7) ▶ مثال: تعزيز SSH عمليًا
# نسخ الإعدادات الأصلية احتياطيًا
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
# تعديل الإعدادات
sudo sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_config
sudo sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo sed -i 's/^#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config
# التحقق من الإعدادات
sudo sshd -t
# إعادة تشغيل SSH
sudo systemctl restart sshd
الإخراج:
TEXT(no output from sshd -t means config is valid)
(8) ▶ مثال: إعداد fail2ban
# عرض حالة fail2ban
sudo fail2ban-client status
# عرض حالة سجن SSH
sudo fail2ban-client status sshd
# Status for the jail: sshd
# |- Filter
# | |- Currently failed: 3
# | |- Total failed: 45
# | `- File list: /var/log/auth.log
# `- Actions
# |- Currently banned: 5
# |- Total banned: 12
# `- Banned IP list: 192.168.1.100 10.0.0.50
# إلغاء حظر IP يدويًا
sudo fail2ban-client set sshd unbanip 192.168.1.100
# مدة حظر مخصصة
sudo tee /etc/fail2ban/jail.d/custom-sshd.conf << 'EOF'
[sshd]
enabled = true
maxretry = 3
bantime = 86400 # 24 ساعة
findtime = 600 # خلال 10 دقائق
EOF
sudo systemctl restart fail2ban
الإخراج:
TEXTStatus for the jail: sshd |- Filter | |- Currently failed: 3 | |- Total failed: 45 | `- File list: /var/log/auth.log `- Actions |- Currently banned: 5 |- Total banned: 12 `- Banned IP list: 192.168.1.100 10.0.0.50 1 unbanned [sshd] enabled = true maxretry = 3 bantime = 86400 findtime = 600
(9) ▶ مثال: تحديثات أمان تلقائية
# تثبيت unattended-upgrades
sudo apt install unattended-upgrades
# الإعداد
sudo dpkg-reconfigure --priority=low unattended-upgrades
# أو تعديل الإعدادات يدويًا
sudo tee /etc/apt/apt.conf.d/50unattended-upgrades << 'EOF'
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}-security";
"${distro_id}:${distro_codename}-updates";
};
Unattended-Upgrade::AutoFixInterruptedDpkg "true";
Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-New-Unused-Dependencies "true";
EOF
الإخراج:
TEXTReading package lists... Done Building dependency tree... Done The following NEW packages will be installed: unattended-upgrades 0 upgraded, 1 newly installed, 0 to remove
(10) ▶ مثال شامل: سكريبت تعزيز أمان خادم جديد بنقرة واحدة
#!/bin/bash
# secure-server.sh - سكريبت تعزيز أمان خادم جديد
# التعليمات: شغّله فور أول دخول SSH
# ملاحظة: تأكد من أن لديك جلسة SSH أخرى مفتوحة في طرفية منفصلة كنسخة احتياطية!
set -euo pipefail
SSH_PORT="${1:-2222}"
echo "========================================"
echo " Server Security Hardening"
echo " Time: $(date)"
echo "========================================"
# 1. تحديث النظام
echo ">>> 1/6 Updating system..."
sudo apt update && sudo apt upgrade -y
# 2. إعداد جدار الحماية
echo ">>> 2/6 Configuring firewall..."
sudo ufw --force disable
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow "$SSH_PORT/tcp" comment 'SSH'
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'
sudo ufw --force enable
echo "Firewall configured (SSH port: $SSH_PORT)"
# 3. إعداد مفاتيح SSH
echo ">>> 3/6 Configuring SSH keys..."
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 4. تعزيز SSH
echo ">>> 4/6 SSH security hardening..."
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
sudo sed -i "s/^#Port 22/Port $SSH_PORT/" /etc/ssh/sshd_config
sudo sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
sudo sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo sed -i 's/^#PubkeyAuthentication yes/PubkeyAuthentication yes/' /etc/ssh/sshd_config
sudo sed -i 's/^#MaxAuthTries 6/MaxAuthTries 3/' /etc/ssh/sshd_config
sudo sshd -t && sudo systemctl restart sshd
echo "SSH hardening complete"
# 5. تثبيت fail2ban
echo ">>> 5/6 Installing fail2ban..."
sudo apt install -y fail2ban
sudo tee /etc/fail2ban/jail.d/sshd.conf << EOF
[sshd]
enabled = true
port = $SSH_PORT
maxretry = 3
bantime = 86400
findtime = 600
EOF
sudo systemctl enable --now fail2ban
# 6. تحديثات أمان تلقائية
echo ">>> 6/6 Configuring automatic updates..."
sudo apt install -y unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades -y
echo ""
echo "========================================"
echo "Security hardening complete!"
echo ""
echo "Important notes:"
echo " 1. SSH port changed to $SSH_PORT"
echo " 2. Root login disabled"
echo " 3. Password login disabled"
echo " 4. Ensure your public key is added to ~/.ssh/authorized_keys"
echo " 5. Before closing this SSH session, test connection in a new terminal:"
echo " ssh -p $SSH_PORT ${USER}@$(curl -s ifconfig.me)"
echo "========================================"
❓ أسئلة شائعة
س: هل
ufw enableسيغلقني خارج الخادم؟ ج: قد يفعل ذلك، إذا لم تسمح بـSSH أولًا. شغّل دائمًاsudo ufw allow 22/tcpقبلsudo ufw enable. أبقِ جلسة SSH قائمة كشبكة أمان، واختبر في طرفية جديدة قبل إغلاق القديمة.
س: هل مفاتيح SSH أم كلمات المرور أكثر أمانًا؟ ج: مصادقة المفاتيح أكثر أمانًا بكثير من كلمات المرور. المفاتيح تستخدم تشفيرًا غير متناظر RSA 4096 بت أو Ed25519 يستحيل كسره نظريًا بالقوة الغاشمة. كلمات المرور يمكن تخمينها أو مهاجمتها بقواميس أو سرقتها بالتصيد.
س: هل حظر fail2ban دائم؟ ج: لا، هو مؤقت افتراضيًا (عادةً ساعة واحدة). يمكنك تخصيص المدة عبر
bantime. الحظر الدائم غير موصى به — IPs المهاجمين تتغير بشكل متكرر، وقائمة الحظر ستنمو بلا حدود.
س: كيف أتصل بعد تغيير منفذ SSH؟ ج:
ssh -p 2222 user@host. أو اضبطPort 2222في~/.ssh/config.
س: لماذا أبقي تسجيل الدخول بكلمة مرور مفعّلًا لفترة؟ ج: كحل بديل. إذا فقدت مفتاحك أو تلف، الدخول بكلمة المرور هو طريقك الوحيد. عطّله فقط بعد تأكيد عمل مصادقة المفاتيح بشكل موثوق. أبقِ دائمًا طريقة وصول بديلة (مثل وحدة تحكم VNC من مزود السحابة).
📖 ملخص
- ufw:
allow 22/tcp←default deny incoming←enable - مفاتيح SSH:
ssh-keygen -t ed25519←ssh-copy-id user@host← تعطيل الدخول بكلمة المرور - تعزيز SSH: تغيير المنفذ، وتعطيل الجذر، وتعطيل كلمة المرور، وتقييد المستخدمين
- fail2ban:
maxretry=3، وbantime=86400، وfindtime=600 unattended-upgradesلترقيعات أمان تلقائية
📝 تمارين
- أساسي (⭐): تحقق من حالة ufw الحالية، وافتح أو أغلق منفذًا، ثم ولّد زوج مفاتيح Ed25519 محليًا
- متوسط (⭐⭐): هيّئ دخول SSH بالمفاتيح إلى خادم اختبار (أو اختبار محلي)، ثم ثبّت fail2ban وتحقق من حالة سجن SSH
- متقدم (⭐⭐⭐): اكتب سكريبت تعزيز أمان يتضمن كل الخطوات أعلاه (إعداد ufw، مفاتيح SSH، تعزيز SSH، fail2ban)، يتطلب أن تتحقق كل خطوة من نجاحها قبل المتابعة، وتتراجع عند الفشل