Linux: جدار الحماية وأساسيات الأمان

خلال دقائق من ربط خادم لينكس جديد بالإنترنت، سيُمسح ويُستهدف بمحاولات هجوم. التعزيز الأمني ليس اختياريًا — إنه إجباري.

📋 المتطلبات المسبقة: يجب أن تعرف بالفعل

1. ما ستتعلمه


2. قصة حقيقية عن التعرض لهجوم

(1) نقطة الألم: هجمات القوة الغاشمة في اليوم الثاني

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

BASH
grep "Failed password" /var/log/auth.log | wc -l
# 1234 attempts!

ماسحات آلية حول العالم كانت تحاول باستمرار الدخول عبر منفذ SSH 22.

(2) ثلاث طبقات من التعزيز

فعل ثلاثة أشياء:

BASH
# 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 — جدار الحماية البسيط

BASH
# العمليات الأساسية
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
⚠️ تحذير: قواعد ufw/iptables تُطابَق بالترتيب — أول قاعدة مطابقة تُنفَّذ. إذا كتبت 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) قبل التفعيل، وإلا ستُغلق نفسك خارج الخادم.

BASH
# الرفض الافتراضي لكل الوارد
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

BASH
# توليد زوج مفاتيح (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

⚠️ تحذير: قبل تغيير منفذ SSH (مثلًا إلى 2222)، تأكد من أن لديك طريقة وصول بديلة. إذا كان مزود السحابة يقدم وحدة تحكم VNC، استخدمها كنسخة احتياطية. بعد تغيير المنفذ، تذكّر السماح بالمنفذ الجديد في ufw (ufw allow 2222/tcp)، وإلا سيحجبه جدار الحماية. أبقِ جلسة SSH قائمة قبل إجراء التغييرات كخط أمان.

عدّل /etc/ssh/sshd_config:

TEXT
Port 2222                      # تغيير المنفذ الافتراضي (تجنب المسح الآلي)
PermitRootLogin no             # تعطيل دخول الجذر المباشر
PasswordAuthentication no      # تعطيل الدخول بكلمة المرور
PubkeyAuthentication yes       # تفعيل الدخول بالمفتاح
AllowUsers alice bob           # السماح فقط بمستخدمين محددين
MaxAuthTries 3                 # أقصى محاولات مصادقة
ClientAliveInterval 60         # فاصل نبضات العميل (ثوانٍ)
ClientAliveCountMax 3         # أقصى فشل نبضات

تحقق من الإعدادات وأعد التشغيل:

BASH
sudo sshd -t                   # اختبار صياغة الإعدادات
sudo systemctl restart sshd    # إعادة تشغيل خدمة SSH

(4) fail2ban

💡 نصيحة: ملف jail.conf الخاص بـfail2ban تقدمه الحزمة وقد يُستبدل عند الترقية. الإعدادات المخصصة يجب توضعها في jail.local أو دليل /etc/fail2ban/jail.d/ — هذه الملفات لن تُستبدل بالترقيات ولها أولوية أعلى.

BASH
# تثبيت
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 كامل

BASH
# إذا كانت 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

الإخراج:

TEXT
Rule 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

BASH
# 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

الإخراج:

TEXT
Generating 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 عمليًا

BASH
# نسخ الإعدادات الأصلية احتياطيًا
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

BASH
# عرض حالة 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

الإخراج:

TEXT
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
1 unbanned

[sshd]
enabled = true
maxretry = 3
bantime = 86400
findtime = 600

(9) ▶ مثال: تحديثات أمان تلقائية

BASH
# تثبيت 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

الإخراج:

TEXT
Reading 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) ▶ مثال شامل: سكريبت تعزيز أمان خادم جديد بنقرة واحدة

BASH
#!/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 من مزود السحابة).


📖 ملخص


📝 تمارين

  1. أساسي (⭐): تحقق من حالة ufw الحالية، وافتح أو أغلق منفذًا، ثم ولّد زوج مفاتيح Ed25519 محليًا
  2. متوسط (⭐⭐): هيّئ دخول SSH بالمفاتيح إلى خادم اختبار (أو اختبار محلي)، ثم ثبّت fail2ban وتحقق من حالة سجن SSH
  3. متقدم (⭐⭐⭐): اكتب سكريبت تعزيز أمان يتضمن كل الخطوات أعلاه (إعداد ufw، مفاتيح SSH، تعزيز SSH، fail2ban)، يتطلب أن تتحقق كل خطوة من نجاحها قبل المتابعة، وتتراجع عند الفشل
Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%