1052 lines
30 KiB
Markdown
1052 lines
30 KiB
Markdown
# 🛡️ المرحلة 2: تأمين السيرفر (Server Hardening)
|
|
|
|
## 📋 نظرة عامة
|
|
هذه المرحلة تحوّل السيرفر إلى **قلعة منيعة** مع 9 طبقات حماية.
|
|
|
|
⚠️ **تحذير مهم**: اتبع الترتيب بالضبط لتجنب قطع الاتصال!
|
|
|
|
---
|
|
|
|
## 🚀 المتطلبات الأولية
|
|
|
|
```bash
|
|
# ✅ قبل البدء، تأكد من:
|
|
# 1. اللابتوب جاهز (المرحلة 1 مكتملة)
|
|
# 2. لديك المفتاح العام: cat ~/FORTRESS_KEYS/fortress_master.pub
|
|
# 3. اتصال SSH حالي بالسيرفر كـ root
|
|
# 4. عنوان IP السيرفر معروف
|
|
# 5. CloudPanel مثبت (إن وجد)
|
|
```
|
|
|
|
---
|
|
|
|
## 📦 الخطوة 0: الفحوصات الأولية (Pre-flight)
|
|
|
|
### 0.1 الاتصال الأولي بالسيرفر
|
|
```bash
|
|
# من اللابتوب - الاتصال الأول (كـ root عبر password)
|
|
ssh root@194.163.xxx.xxx
|
|
|
|
# بعد الدخول، نفذ:
|
|
```
|
|
|
|
### 0.2 سكريبت الفحص الأولي
|
|
```bash
|
|
cat > /tmp/preflight_check.sh <<'EOF'
|
|
#!/bin/bash
|
|
# 🔍 فحص ما قبل التثبيت
|
|
|
|
echo "🔍 TRIPZ FORTRESS - Pre-flight Check"
|
|
echo "════════════════════════════════════"
|
|
|
|
# معلومات النظام
|
|
echo "📊 معلومات النظام:"
|
|
echo " OS: $(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)"
|
|
echo " Kernel: $(uname -r)"
|
|
echo " RAM: $(free -h | awk '/^Mem:/ {print $2}')"
|
|
echo " Disk: $(df -h / | awk 'NR==2 {print $2}')"
|
|
echo ""
|
|
|
|
# التحقق من الاتصال
|
|
echo "🌐 التحقق من الاتصال:"
|
|
ping -c 2 8.8.8.8 >/dev/null 2>&1 && echo " ✅ Internet OK" || echo " ❌ No Internet!"
|
|
ping -c 2 google.com >/dev/null 2>&1 && echo " ✅ DNS OK" || echo " ❌ DNS Failed!"
|
|
echo ""
|
|
|
|
# المنافذ المفتوحة حالياً
|
|
echo "🔓 المنافذ المفتوحة حالياً:"
|
|
ss -tuln | grep LISTEN | awk '{print " " $5}' | sort -u
|
|
echo ""
|
|
|
|
# الخدمات الحالية
|
|
echo "🔧 الخدمات النشطة:"
|
|
systemctl list-units --type=service --state=running | grep -E "ssh|mysql|nginx|apache" | awk '{print " " $1}'
|
|
echo ""
|
|
|
|
# CloudPanel Check
|
|
if [ -d "/usr/local/cloudpanel" ]; then
|
|
echo "☁️ CloudPanel: ✅ مثبت"
|
|
echo " الإصدار: $(cat /usr/local/cloudpanel/version 2>/dev/null || echo 'غير معروف')"
|
|
else
|
|
echo "☁️ CloudPanel: ❌ غير مثبت"
|
|
fi
|
|
echo ""
|
|
|
|
# المستخدمين الحاليين
|
|
echo "👥 المستخدمين (UID >= 1000):"
|
|
awk -F: '$3 >= 1000 && $1 != "nobody" {print " " $1 " (UID: " $3 ")"}' /etc/passwd
|
|
echo ""
|
|
|
|
# تحذيرات
|
|
echo "⚠️ تحذيرات:"
|
|
[ "$(id -u)" -ne 0 ] && echo " ⚠️ يجب التشغيل كـ root!" || echo " ✅ Running as root"
|
|
[ -z "$SSH_CONNECTION" ] && echo " ⚠️ ليس عبر SSH!" || echo " ✅ Connected via SSH"
|
|
echo ""
|
|
|
|
echo "════════════════════════════════════"
|
|
echo "✅ الفحص مكتمل - جاهز للتثبيت"
|
|
EOF
|
|
|
|
chmod +x /tmp/preflight_check.sh
|
|
/tmp/preflight_check.sh
|
|
```
|
|
|
|
### 0.3 نسخة احتياطية سريعة (قبل التعديل)
|
|
```bash
|
|
# نسخة احتياطية للملفات الحساسة
|
|
mkdir -p /root/backup_before_fortress
|
|
cp -r /etc/ssh /root/backup_before_fortress/
|
|
cp /etc/sudoers /root/backup_before_fortress/ 2>/dev/null
|
|
[ -d /etc/nginx ] && cp -r /etc/nginx /root/backup_before_fortress/
|
|
[ -d /usr/local/cloudpanel ] && cp /usr/local/cloudpanel/version /root/backup_before_fortress/
|
|
|
|
echo "✅ نسخة احتياطية محفوظة في /root/backup_before_fortress"
|
|
```
|
|
|
|
---
|
|
|
|
## 👤 الخطوة 1: إنشاء المستخدم الإداري (tripzadmin)
|
|
|
|
### 1.1 إنشاء المستخدم
|
|
```bash
|
|
# إنشاء مستخدم إداري جديد
|
|
useradd -m -s /bin/bash -G sudo tripzadmin
|
|
|
|
# تعطيل كلمة المرور (سنستخدم المفاتيح فقط)
|
|
passwd -l tripzadmin
|
|
|
|
# تأكيد الإنشاء
|
|
id tripzadmin
|
|
# يجب أن ترى: uid=1000(tripzadmin) gid=1000(tripzadmin) groups=1000(tripzadmin),27(sudo)
|
|
```
|
|
|
|
### 1.2 إعداد SSH للمستخدم
|
|
```bash
|
|
# إنشاء مجلد SSH
|
|
mkdir -p /home/tripzadmin/.ssh
|
|
chmod 700 /home/tripzadmin/.ssh
|
|
|
|
# ⚠️ هنا: الصق المفتاح العام من اللابتوب!
|
|
# (من اللابتوب: cat ~/FORTRESS_KEYS/fortress_master.pub)
|
|
|
|
cat > /home/tripzadmin/.ssh/authorized_keys <<'SSHKEYEOF'
|
|
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... fortress-master-20250205
|
|
SSHKEYEOF
|
|
|
|
# تعيين الصلاحيات
|
|
chmod 600 /home/tripzadmin/.ssh/authorized_keys
|
|
chown -R tripzadmin:tripzadmin /home/tripzadmin/.ssh
|
|
|
|
# التحقق
|
|
ls -la /home/tripzadmin/.ssh/
|
|
```
|
|
|
|
### 1.3 إعطاء صلاحيات sudo بدون كلمة مرور
|
|
```bash
|
|
# للمستخدم الإداري فقط (لسهولة الإدارة)
|
|
cat > /etc/sudoers.d/tripzadmin <<'EOF'
|
|
# TRIPZ FORTRESS - Admin User
|
|
tripzadmin ALL=(ALL) NOPASSWD:ALL
|
|
|
|
# تعطيل صلاحيات sudo عن باقي المستخدمين لاحقاً
|
|
EOF
|
|
|
|
chmod 440 /etc/sudoers.d/tripzadmin
|
|
|
|
# التحقق من صحة التكوين
|
|
visudo -c
|
|
```
|
|
|
|
---
|
|
|
|
## 🧪 الخطوة 2: اختبار الاتصال (قبل قطع root!)
|
|
|
|
### 2.1 فتح جلسة SSH ثانية (CRITICAL!)
|
|
```bash
|
|
# ⚠️ من اللابتوب - افتح نافذة terminal ثانية:
|
|
ssh -i ~/FORTRESS_KEYS/fortress_master tripzadmin@194.163.xxx.xxx
|
|
|
|
# يجب أن تدخل بنجاح بدون كلمة مرور!
|
|
# إذا فشلت، لا تكمل! راجع الخطوة 1
|
|
|
|
# بعد الدخول، نفذ:
|
|
whoami # يجب أن يظهر: tripzadmin
|
|
sudo whoami # يجب أن يظهر: root (بدون طلب كلمة مرور)
|
|
```
|
|
|
|
### 2.2 إنشاء سكريبت الطوارئ
|
|
```bash
|
|
# من الجلسة الجديدة (tripzadmin):
|
|
sudo cat > /root/emergency_restore.sh <<'EOF'
|
|
#!/bin/bash
|
|
# 🆘 سكريبت الطوارئ - استعادة الوصول
|
|
|
|
echo "🆘 EMERGENCY RESTORE MODE"
|
|
echo "════════════════════════════════"
|
|
|
|
# استعادة SSH القديم
|
|
if [ -d /root/backup_before_fortress ]; then
|
|
echo "♻️ استعادة تكوين SSH القديم..."
|
|
cp -r /root/backup_before_fortress/ssh/* /etc/ssh/
|
|
systemctl restart sshd
|
|
echo "✅ SSH مستعاد"
|
|
fi
|
|
|
|
# إعادة فتح منفذ 22
|
|
ufw allow 22/tcp
|
|
echo "✅ منفذ 22 مفتوح"
|
|
|
|
# السماح بـ root login (مؤقت)
|
|
sed -i 's/PermitRootLogin no/PermitRootLogin yes/' /etc/ssh/sshd_config
|
|
systemctl restart sshd
|
|
echo "✅ Root login مفعّل"
|
|
|
|
echo "════════════════════════════════"
|
|
echo "✅ يمكنك الآن الاتصال كـ root"
|
|
EOF
|
|
|
|
sudo chmod +x /root/emergency_restore.sh
|
|
```
|
|
|
|
---
|
|
|
|
## 🔐 الخطوة 3: تأمين SSH (خطوة حساسة!)
|
|
|
|
### 3.1 تكوين SSH الآمن
|
|
```bash
|
|
# من جلسة tripzadmin:
|
|
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup
|
|
|
|
# التكوين الجديد
|
|
sudo tee /etc/ssh/sshd_config > /dev/null <<'SSHDEOF'
|
|
# ════════════════════════════════════════
|
|
# TRIPZ FORTRESS - SSH Hardened Config
|
|
# ════════════════════════════════════════
|
|
|
|
# المنفذ الجديد (سيتم تغييره لاحقاً)
|
|
Port 22
|
|
|
|
# البروتوكول
|
|
Protocol 2
|
|
|
|
# الاستماع
|
|
AddressFamily inet
|
|
ListenAddress 0.0.0.0
|
|
|
|
# المفاتيح فقط
|
|
PubkeyAuthentication yes
|
|
PasswordAuthentication no
|
|
PermitEmptyPasswords no
|
|
ChallengeResponseAuthentication no
|
|
|
|
# تعطيل root login المباشر
|
|
PermitRootLogin no
|
|
|
|
# المستخدمين المسموح لهم
|
|
AllowUsers tripzadmin
|
|
|
|
# الأمان
|
|
X11Forwarding no
|
|
PermitUserEnvironment no
|
|
AllowAgentForwarding no
|
|
AllowTcpForwarding no
|
|
PermitTunnel no
|
|
|
|
# الجلسات
|
|
MaxAuthTries 3
|
|
MaxSessions 2
|
|
ClientAliveInterval 300
|
|
ClientAliveCountMax 2
|
|
LoginGraceTime 30
|
|
|
|
# التشفير القوي
|
|
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
|
|
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
|
|
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512
|
|
|
|
# اللوق
|
|
SyslogFacility AUTH
|
|
LogLevel VERBOSE
|
|
|
|
# Banner (اختياري)
|
|
Banner /etc/ssh/banner.txt
|
|
SSHDEOF
|
|
|
|
# إنشاء banner تحذيري
|
|
sudo tee /etc/ssh/banner.txt > /dev/null <<'EOF'
|
|
════════════════════════════════════════════════════════
|
|
⚠️ AUTHORIZED ACCESS ONLY ⚠️
|
|
|
|
This system is protected by TRIPZ FORTRESS v8.1
|
|
All connections are monitored and logged.
|
|
Unauthorized access attempts will be prosecuted.
|
|
|
|
🛡️ Protected by 9-Layer Security System
|
|
════════════════════════════════════════════════════════
|
|
EOF
|
|
```
|
|
|
|
### 3.2 اختبار التكوين (قبل التطبيق!)
|
|
```bash
|
|
# التحقق من صحة التكوين
|
|
sudo sshd -t
|
|
|
|
# يجب ألا ترى أي أخطاء!
|
|
# إذا رأيت أخطاء، لا تكمل!
|
|
```
|
|
|
|
### 3.3 إعادة تشغيل SSH بأمان
|
|
```bash
|
|
# ⚠️ الطريقة الآمنة (لا تستخدم restart!)
|
|
sudo systemctl reload sshd
|
|
|
|
# التحقق من حالة الخدمة
|
|
sudo systemctl status sshd | grep Active
|
|
# يجب أن ترى: Active: active (running)
|
|
```
|
|
|
|
### 3.4 اختبار نهائي (من اللابتوب)
|
|
```bash
|
|
# افتح terminal ثالث من اللابتوب:
|
|
ssh -i ~/FORTRESS_KEYS/fortress_master tripzadmin@194.163.xxx.xxx
|
|
|
|
# يجب أن تدخل بنجاح!
|
|
# إذا نجح، أغلق الجلسات القديمة واستمر من الجلسة الجديدة
|
|
```
|
|
|
|
---
|
|
|
|
## 🔥 الخطوة 4: تثبيت وتكوين UFW (Firewall)
|
|
|
|
### 4.1 تثبيت UFW
|
|
```bash
|
|
sudo apt update
|
|
sudo apt install -y ufw
|
|
|
|
# عدم التفعيل بعد! (سنضبطه أولاً)
|
|
```
|
|
|
|
### 4.2 تكوين القواعد الأساسية
|
|
```bash
|
|
# السياسة الافتراضية
|
|
sudo ufw default deny incoming
|
|
sudo ufw default allow outgoing
|
|
|
|
# السماح بـ SSH الحالي (منفذ 22 حالياً)
|
|
sudo ufw allow 22/tcp comment 'SSH Temporary'
|
|
|
|
# HTTP و HTTPS (للتطبيقات)
|
|
sudo ufw allow 80/tcp comment 'HTTP'
|
|
sudo ufw allow 443/tcp comment 'HTTPS'
|
|
|
|
# CloudPanel (إن وجد)
|
|
if [ -d "/usr/local/cloudpanel" ]; then
|
|
sudo ufw allow 8443/tcp comment 'CloudPanel'
|
|
fi
|
|
|
|
# معاينة القواعد قبل التفعيل
|
|
sudo ufw show added
|
|
```
|
|
|
|
### 4.3 تفعيل UFW
|
|
```bash
|
|
# ⚠️ تأكد من وجود قاعدة SSH!
|
|
sudo ufw enable
|
|
|
|
# التحقق
|
|
sudo ufw status verbose
|
|
```
|
|
|
|
---
|
|
|
|
## 🎯 الخطوة 5: تثبيت Fail2Ban (الحماية من Brute-Force)
|
|
|
|
### 5.1 التثبيت
|
|
```bash
|
|
sudo apt install -y fail2ban
|
|
```
|
|
|
|
### 5.2 التكوين المحسّن
|
|
```bash
|
|
# التكوين الرئيسي
|
|
sudo tee /etc/fail2ban/jail.local > /dev/null <<'JAILEOF'
|
|
[DEFAULT]
|
|
# الإعدادات العامة
|
|
bantime = 3600
|
|
findtime = 600
|
|
maxretry = 3
|
|
destemail = your-email@example.com
|
|
sendername = TRIPZ-FORTRESS-ALERT
|
|
action = %(action_mwl)s
|
|
|
|
# Whitelist (عنوان IP الخاص بك)
|
|
ignoreip = 127.0.0.1/8 ::1
|
|
|
|
# ══════════════════════════════════════
|
|
# SSH Protection (الأهم!)
|
|
# ══════════════════════════════════════
|
|
[sshd]
|
|
enabled = true
|
|
port = 22
|
|
filter = sshd
|
|
logpath = /var/log/auth.log
|
|
maxretry = 3
|
|
bantime = 7200
|
|
findtime = 600
|
|
|
|
# حماية أقوى ضد SSH brute-force
|
|
[sshd-aggressive]
|
|
enabled = true
|
|
port = 22
|
|
filter = sshd
|
|
logpath = /var/log/auth.log
|
|
maxretry = 2
|
|
bantime = 86400
|
|
findtime = 300
|
|
|
|
# ══════════════════════════════════════
|
|
# Web Protection (لـ CloudPanel / Nginx)
|
|
# ══════════════════════════════════════
|
|
[nginx-http-auth]
|
|
enabled = true
|
|
port = 80,443
|
|
logpath = /var/log/nginx/error.log
|
|
|
|
[nginx-noscript]
|
|
enabled = true
|
|
port = 80,443
|
|
logpath = /var/log/nginx/access.log
|
|
|
|
[nginx-badbots]
|
|
enabled = true
|
|
port = 80,443
|
|
logpath = /var/log/nginx/access.log
|
|
|
|
[nginx-noproxy]
|
|
enabled = true
|
|
port = 80,443
|
|
logpath = /var/log/nginx/access.log
|
|
JAILEOF
|
|
```
|
|
|
|
### 5.3 فلتر SSH مخصص (اختياري)
|
|
```bash
|
|
sudo tee /etc/fail2ban/filter.d/sshd-custom.conf > /dev/null <<'EOF'
|
|
# Custom SSH filter for more aggressive detection
|
|
[Definition]
|
|
failregex = ^%(__prefix_line)s(?:error: PAM: )?[aA]uthentication (?:failure|error|failed) for .* from <HOST>( via \S+)?\s*$
|
|
^%(__prefix_line)s(?:error: PAM: )?User not known to the underlying authentication module for .* from <HOST>\s*$
|
|
^%(__prefix_line)sFailed (?:password|publickey) for .* from <HOST>(?: port \d*)?(?: ssh\d*)?$
|
|
^%(__prefix_line)sROOT LOGIN REFUSED.* FROM <HOST>\s*$
|
|
^%(__prefix_line)s[iI](?:llegal|nvalid) user .* from <HOST>\s*$
|
|
|
|
ignoreregex =
|
|
EOF
|
|
```
|
|
|
|
### 5.4 تفعيل Fail2Ban
|
|
```bash
|
|
# تفعيل وبدء الخدمة
|
|
sudo systemctl enable fail2ban
|
|
sudo systemctl start fail2ban
|
|
|
|
# التحقق من الحالة
|
|
sudo fail2ban-client status
|
|
|
|
# مراقبة سجل SSH
|
|
sudo fail2ban-client status sshd
|
|
```
|
|
|
|
---
|
|
|
|
## 🚪 الخطوة 6: Port Knocking (الطبقة السرية)
|
|
|
|
### 6.1 تثبيت Knockd
|
|
```bash
|
|
sudo apt install -y knockd
|
|
```
|
|
|
|
### 6.2 اختيار تسلسل الطرق
|
|
```bash
|
|
# اختر 3 منافذ عشوائية (ليست مستخدمة)
|
|
# مثال: 7531, 8642, 9753
|
|
# احفظها في مكان آمن!
|
|
|
|
KNOCK1=7531
|
|
KNOCK2=8642
|
|
KNOCK3=9753
|
|
```
|
|
|
|
### 6.3 تكوين Knockd
|
|
```bash
|
|
sudo tee /etc/knockd.conf > /dev/null <<EOF
|
|
[options]
|
|
UseSyslog
|
|
LogFile = /var/log/knockd.log
|
|
|
|
[openSSH]
|
|
sequence = $KNOCK1,$KNOCK2,$KNOCK3
|
|
seq_timeout = 15
|
|
command = /usr/sbin/ufw allow from %IP% to any port 22 proto tcp
|
|
tcpflags = syn
|
|
|
|
[closeSSH]
|
|
sequence = $KNOCK3,$KNOCK2,$KNOCK1
|
|
seq_timeout = 15
|
|
command = /usr/sbin/ufw delete allow from %IP% to any port 22 proto tcp
|
|
tcpflags = syn
|
|
EOF
|
|
```
|
|
|
|
### 6.4 تفعيل Knockd
|
|
```bash
|
|
# تحرير ملف التكوين الرئيسي
|
|
sudo sed -i 's/START_KNOCKD=0/START_KNOCKD=1/' /etc/default/knockd
|
|
|
|
# بدء الخدمة
|
|
sudo systemctl enable knockd
|
|
sudo systemctl start knockd
|
|
|
|
# التحقق
|
|
sudo systemctl status knockd
|
|
```
|
|
|
|
### 6.5 تطبيق Port Knocking على UFW
|
|
```bash
|
|
# ⚠️ خطوة حساسة: إغلاق منفذ SSH للجميع
|
|
sudo ufw delete allow 22/tcp
|
|
|
|
# الآن SSH مغلق! يجب استخدام knock للفتح
|
|
|
|
# ⚠️ قبل قطع الاتصال، اختبر من اللابتوب!
|
|
```
|
|
|
|
---
|
|
|
|
## 🧪 الخطوة 7: اختبار Port Knocking
|
|
|
|
### 7.1 من اللابتوب (في terminal منفصل)
|
|
```bash
|
|
# حدّث سكريبت knock بالتسلسل الصحيح
|
|
vim ~/FORTRESS_KEYS/knock.sh
|
|
|
|
# عدّل السطر:
|
|
KNOCK_SEQUENCE="7531 8642 9753" # استخدم أرقامك
|
|
|
|
# احفظ
|
|
|
|
# اختبر:
|
|
~/FORTRESS_KEYS/knock.sh 194.163.xxx.xxx
|
|
```
|
|
|
|
### 7.2 من السيرفر (مراقبة)
|
|
```bash
|
|
# في الجلسة المفتوحة، راقب السجل:
|
|
sudo tail -f /var/log/knockd.log
|
|
|
|
# يجب أن ترى رسائل الطرقات الصحيحة
|
|
```
|
|
|
|
---
|
|
|
|
## 🎣 الخطوة 8: Honeypot (Endlessh)
|
|
|
|
### 8.1 تثبيت Endlessh
|
|
```bash
|
|
sudo apt install -y git golang-go
|
|
|
|
cd /opt
|
|
sudo git clone https://github.com/skeeto/endlessh
|
|
cd endlessh
|
|
sudo make
|
|
|
|
# نسخ البرنامج
|
|
sudo cp endlessh /usr/local/bin/
|
|
```
|
|
|
|
### 8.2 تكوين Endlessh
|
|
```bash
|
|
# التكوين
|
|
sudo mkdir -p /etc/endlessh
|
|
sudo tee /etc/endlessh/config > /dev/null <<'EOF'
|
|
# Port to bind (standard SSH port to trap bots)
|
|
Port 22
|
|
|
|
# Delay between lines (milliseconds)
|
|
Delay 10000
|
|
|
|
# Maximum line length
|
|
MaxLineLength 32
|
|
|
|
# Maximum number of clients
|
|
MaxClients 4096
|
|
|
|
# Log level
|
|
LogLevel 1
|
|
EOF
|
|
```
|
|
|
|
### 8.3 Systemd Service
|
|
```bash
|
|
sudo tee /etc/systemd/system/endlessh.service > /dev/null <<'EOF'
|
|
[Unit]
|
|
Description=Endlessh SSH Tarpit
|
|
After=network.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=nobody
|
|
ExecStart=/usr/local/bin/endlessh -c /etc/endlessh/config
|
|
Restart=always
|
|
|
|
# Hardening
|
|
PrivateTmp=true
|
|
ProtectSystem=strict
|
|
ProtectHome=true
|
|
NoNewPrivileges=true
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
# تفعيل
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable endlessh
|
|
sudo systemctl start endlessh
|
|
|
|
# التحقق
|
|
sudo systemctl status endlessh
|
|
```
|
|
|
|
---
|
|
|
|
## 🎭 الخطوة 9: Fake Services (MySQL Trap)
|
|
|
|
### 9.1 سكريبت Fake MySQL
|
|
```bash
|
|
sudo tee /usr/local/bin/fake-mysql.sh > /dev/null <<'FAKEMYSQLEOF'
|
|
#!/bin/bash
|
|
# 🎭 Fake MySQL Service - Honeypot Trap
|
|
|
|
LOG_FILE="/var/log/fortress/fake-mysql.log"
|
|
PORT=3306
|
|
|
|
mkdir -p /var/log/fortress
|
|
|
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - Fake MySQL started on port $PORT" >> "$LOG_FILE"
|
|
|
|
# Listen and log
|
|
while true; do
|
|
nc -l -p $PORT -k 2>&1 | while read line; do
|
|
ATTACKER_IP=$(echo $line | grep -oE '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' | head -1)
|
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - MySQL probe from: $ATTACKER_IP" >> "$LOG_FILE"
|
|
|
|
# رسالة مضللة
|
|
echo -e "\x4a\x00\x00\x00\x0a\x35\x2e\x37\x2e\x33\x33" # MySQL handshake
|
|
sleep 2
|
|
done
|
|
done
|
|
FAKEMYSQLEOF
|
|
|
|
sudo chmod +x /usr/local/bin/fake-mysql.sh
|
|
```
|
|
|
|
### 9.2 Systemd Service
|
|
```bash
|
|
sudo tee /etc/systemd/system/fake-mysql.service > /dev/null <<'EOF'
|
|
[Unit]
|
|
Description=Fake MySQL Honeypot
|
|
After=network.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
ExecStart=/usr/local/bin/fake-mysql.sh
|
|
Restart=always
|
|
User=nobody
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
EOF
|
|
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable fake-mysql
|
|
sudo systemctl start fake-mysql
|
|
|
|
# السماح في UFW
|
|
sudo ufw allow 3306/tcp comment 'Fake MySQL Trap'
|
|
```
|
|
|
|
---
|
|
|
|
## 🔧 الخطوة 10: تحسينات النظام (Kernel Hardening)
|
|
|
|
### 10.1 Sysctl Hardening
|
|
```bash
|
|
sudo tee -a /etc/sysctl.conf > /dev/null <<'SYSCTLEOF'
|
|
|
|
# ════════════════════════════════════════
|
|
# TRIPZ FORTRESS - Kernel Hardening
|
|
# ════════════════════════════════════════
|
|
|
|
# SYN flood protection
|
|
net.ipv4.tcp_syncookies = 1
|
|
net.ipv4.tcp_max_syn_backlog = 2048
|
|
net.ipv4.tcp_synack_retries = 2
|
|
net.ipv4.tcp_syn_retries = 2
|
|
|
|
# TCP hardening
|
|
net.ipv4.tcp_rfc1337 = 1
|
|
net.ipv4.conf.all.rp_filter = 1
|
|
net.ipv4.conf.default.rp_filter = 1
|
|
|
|
# IP spoofing protection
|
|
net.ipv4.conf.all.accept_source_route = 0
|
|
net.ipv4.conf.default.accept_source_route = 0
|
|
net.ipv6.conf.all.accept_source_route = 0
|
|
net.ipv6.conf.default.accept_source_route = 0
|
|
|
|
# ICMP protection
|
|
net.ipv4.icmp_echo_ignore_broadcasts = 1
|
|
net.ipv4.icmp_ignore_bogus_error_responses = 1
|
|
net.ipv4.icmp_echo_ignore_all = 0
|
|
|
|
# Network performance
|
|
net.core.netdev_max_backlog = 2048
|
|
net.core.somaxconn = 1024
|
|
|
|
# TCP BBR (للأداء)
|
|
net.core.default_qdisc = fq
|
|
net.ipv4.tcp_congestion_control = bbr
|
|
|
|
# File system protection
|
|
fs.protected_hardlinks = 1
|
|
fs.protected_symlinks = 1
|
|
|
|
# Kernel pointers (security)
|
|
kernel.kptr_restrict = 2
|
|
kernel.dmesg_restrict = 1
|
|
SYSCTLEOF
|
|
|
|
# تطبيق التعديلات
|
|
sudo sysctl -p
|
|
```
|
|
|
|
---
|
|
|
|
## 💾 الخطوة 11: النسخ الاحتياطي التلقائي
|
|
|
|
### 11.1 سكريبت النسخ الاحتياطي
|
|
```bash
|
|
sudo mkdir -p /usr/local/bin/fortress
|
|
sudo mkdir -p /backup/fortress
|
|
|
|
sudo tee /usr/local/bin/fortress/backup.sh > /dev/null <<'BACKUPEOF'
|
|
#!/bin/bash
|
|
# ════════════════════════════════════════
|
|
# TRIPZ FORTRESS - Encrypted Backup
|
|
# ════════════════════════════════════════
|
|
|
|
BACKUP_DIR="/backup/fortress"
|
|
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
|
TEMP_DIR="/tmp/fortress_backup_$TIMESTAMP"
|
|
BACKUP_FILE="${BACKUP_DIR}/fortress_${TIMESTAMP}.tar.gz"
|
|
ENCRYPTED_FILE="${BACKUP_FILE}.enc"
|
|
RETENTION_DAYS=30
|
|
|
|
# إنشاء مجلد مؤقت
|
|
mkdir -p "$TEMP_DIR"
|
|
|
|
# نسخ الملفات المهمة
|
|
cp -r /etc/ssh "$TEMP_DIR/" 2>/dev/null
|
|
cp -r /etc/fail2ban "$TEMP_DIR/" 2>/dev/null
|
|
cp -r /etc/ufw "$TEMP_DIR/" 2>/dev/null
|
|
cp /etc/knockd.conf "$TEMP_DIR/" 2>/dev/null
|
|
cp /root/FORTRESS_INFO.txt "$TEMP_DIR/" 2>/dev/null
|
|
|
|
# ضغط
|
|
tar -czf "$BACKUP_FILE" -C /tmp "$(basename $TEMP_DIR)"
|
|
|
|
# تشفير AES-256
|
|
BACKUP_PASSWORD="TRIPZ_$(hostname)_$(date +%Y)"
|
|
openssl enc -aes-256-cbc -salt -pbkdf2 -in "$BACKUP_FILE" -out "$ENCRYPTED_FILE" -k "$BACKUP_PASSWORD"
|
|
|
|
# حذف غير المشفر
|
|
rm -f "$BACKUP_FILE"
|
|
rm -rf "$TEMP_DIR"
|
|
|
|
# تطبيق سياسة الاحتفاظ (30 يوم)
|
|
find "$BACKUP_DIR" -name "fortress_*.tar.gz.enc" -mtime +$RETENTION_DAYS -delete
|
|
|
|
echo "✅ النسخة الاحتياطية: $ENCRYPTED_FILE"
|
|
echo "🔑 كلمة فك التشفير: $BACKUP_PASSWORD"
|
|
|
|
# تنبيه Telegram (إن وُجد)
|
|
if [ -x /usr/local/bin/fortress/telegram_notify.sh ]; then
|
|
/usr/local/bin/fortress/telegram_notify.sh "✅ نسخة احتياطية جديدة: $(basename $ENCRYPTED_FILE)"
|
|
fi
|
|
BACKUPEOF
|
|
|
|
sudo chmod +x /usr/local/bin/fortress/backup.sh
|
|
```
|
|
|
|
### 11.2 جدولة النسخ الاحتياطي (Cron)
|
|
```bash
|
|
# إضافة مهمة cron (يومياً 2 صباحاً)
|
|
(sudo crontab -l 2>/dev/null; echo "0 2 * * * /usr/local/bin/fortress/backup.sh >> /var/log/fortress/backup.log 2>&1") | sudo crontab -
|
|
|
|
# التحقق
|
|
sudo crontab -l | grep backup
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 الخطوة 12: المراقبة والتنبيهات (Monitoring)
|
|
|
|
### 12.1 تثبيت أدوات المراقبة
|
|
```bash
|
|
sudo apt install -y htop iotop nethogs
|
|
```
|
|
|
|
### 12.2 سكريبت تنبيهات Telegram
|
|
```bash
|
|
sudo tee /usr/local/bin/fortress/telegram_notify.sh > /dev/null <<'TELEGRAMEOF'
|
|
#!/bin/bash
|
|
# 📱 Telegram Notification System
|
|
|
|
TELEGRAM_BOT_TOKEN="YOUR_BOT_TOKEN_HERE"
|
|
TELEGRAM_CHAT_ID="YOUR_CHAT_ID_HERE"
|
|
|
|
MESSAGE=$1
|
|
|
|
if [ -z "$MESSAGE" ]; then
|
|
echo "Usage: $0 'message'"
|
|
exit 1
|
|
fi
|
|
|
|
# إرسال الرسالة
|
|
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
|
|
-d chat_id="${TELEGRAM_CHAT_ID}" \
|
|
-d text="🛡️ FORTRESS ALERT
|
|
|
|
🖥️ Server: $(hostname)
|
|
🕐 Time: $(date '+%Y-%m-%d %H:%M:%S')
|
|
|
|
📨 Message:
|
|
$MESSAGE" \
|
|
-d parse_mode="HTML" > /dev/null
|
|
|
|
if [ $? -eq 0 ]; then
|
|
echo "✅ تم إرسال التنبيه"
|
|
else
|
|
echo "❌ فشل إرسال التنبيه"
|
|
fi
|
|
TELEGRAMEOF
|
|
|
|
sudo chmod +x /usr/local/bin/fortress/telegram_notify.sh
|
|
|
|
# ⚠️ لا تنسى تحديث TOKEN و CHAT_ID!
|
|
```
|
|
|
|
### 12.3 تنبيهات تلقائية (Fail2Ban)
|
|
```bash
|
|
# تكوين Fail2Ban لإرسال تنبيهات
|
|
sudo tee /etc/fail2ban/action.d/telegram.conf > /dev/null <<'EOF'
|
|
[Definition]
|
|
actionstart = /usr/local/bin/fortress/telegram_notify.sh "🟢 Fail2Ban بدأ"
|
|
actionstop = /usr/local/bin/fortress/telegram_notify.sh "🔴 Fail2Ban توقف"
|
|
actionban = /usr/local/bin/fortress/telegram_notify.sh "🚫 حظر IP: <ip> (Jail: <name>)"
|
|
actionunban = /usr/local/bin/fortress/telegram_notify.sh "✅ إلغاء حظر IP: <ip>"
|
|
EOF
|
|
|
|
# تفعيل في jail.local
|
|
sudo sed -i 's/action = %(action_mwl)s/action = %(action_mwl)s\n telegram/' /etc/fail2ban/jail.local
|
|
|
|
sudo systemctl restart fail2ban
|
|
```
|
|
|
|
---
|
|
|
|
## 📝 الخطوة 13: التوثيق وملف المعلومات
|
|
|
|
### 13.1 إنشاء ملف معلومات السيرفر
|
|
```bash
|
|
sudo tee /root/FORTRESS_INFO.txt > /dev/null <<EOF
|
|
════════════════════════════════════════════════════════
|
|
🛡️ TRIPZ FORTRESS v8.1 - Server Information
|
|
════════════════════════════════════════════════════════
|
|
تاريخ التثبيت: $(date '+%Y-%m-%d %H:%M:%S')
|
|
السيرفر: $(hostname)
|
|
IP: $(curl -s ifconfig.me)
|
|
|
|
🔐 معلومات الأمان:
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
المستخدم الإداري: tripzadmin
|
|
منفذ SSH: 22 (محمي بـ Port Knocking)
|
|
تسلسل Knocking: $KNOCK1, $KNOCK2, $KNOCK3
|
|
|
|
🛡️ الطبقات الأمنية النشطة:
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
✅ Layer 1: SSH Key-Only Authentication
|
|
✅ Layer 2: UFW Firewall
|
|
✅ Layer 3: Fail2Ban Progressive Blocking
|
|
✅ Layer 4: Port Knocking
|
|
✅ Layer 5: Endlessh Honeypot (Port 22)
|
|
✅ Layer 6: Fake MySQL Service (Port 3306)
|
|
✅ Layer 7: Kernel Hardening
|
|
✅ Layer 8: Encrypted Backups
|
|
✅ Layer 9: Telegram Alerts
|
|
|
|
🔧 أوامر مفيدة:
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
• فحص UFW: sudo ufw status verbose
|
|
• فحص Fail2Ban: sudo fail2ban-client status
|
|
• حظر Fail2Ban: sudo fail2ban-client status sshd
|
|
• سجل Knockd: sudo tail -f /var/log/knockd.log
|
|
• سجل Endlessh: sudo journalctl -u endlessh -f
|
|
• نسخ احتياطي يدوي: sudo /usr/local/bin/fortress/backup.sh
|
|
|
|
📁 الملفات المهمة:
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
• السجلات: /var/log/fortress/
|
|
• النسخ الاحتياطية: /backup/fortress/
|
|
• التكوينات: /etc/ssh/, /etc/fail2ban/, /etc/ufw/
|
|
|
|
⚠️ ملاحظات مهمة:
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
1. للاتصال: استخدم knock قبل SSH
|
|
2. النسخ الاحتياطية مشفرة بـ AES-256
|
|
3. الاحتفاظ بآخر 30 يوم فقط
|
|
4. تنبيهات Telegram مفعّلة
|
|
|
|
📞 الدعم:
|
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
https://tripz-egypt.com
|
|
[email protected]
|
|
|
|
════════════════════════════════════════════════════════
|
|
✅ السيرفر محمي بالكامل!
|
|
════════════════════════════════════════════════════════
|
|
EOF
|
|
|
|
# عرض الملف
|
|
sudo cat /root/FORTRESS_INFO.txt
|
|
```
|
|
|
|
---
|
|
|
|
## ✅ الخطوة 14: الفحوصات النهائية
|
|
|
|
### 14.1 سكريبت الفحص الشامل
|
|
```bash
|
|
sudo tee /usr/local/bin/fortress/health_check.sh > /dev/null <<'HEALTHEOF'
|
|
#!/bin/bash
|
|
# 🔍 TRIPZ FORTRESS - Health Check
|
|
|
|
echo "🔍 TRIPZ FORTRESS Health Check"
|
|
echo "════════════════════════════════════════════════"
|
|
|
|
# الخدمات
|
|
echo "🔧 الخدمات:"
|
|
services=("sshd" "ufw" "fail2ban" "knockd" "endlessh" "fake-mysql")
|
|
for svc in "${services[@]}"; do
|
|
if systemctl is-active --quiet "$svc" 2>/dev/null; then
|
|
echo " ✅ $svc نشط"
|
|
else
|
|
echo " ❌ $svc متوقف!"
|
|
fi
|
|
done
|
|
|
|
# UFW Status
|
|
echo ""
|
|
echo "🛡️ جدار الحماية:"
|
|
sudo ufw status | grep -E "Status:|22/tcp|80/tcp|443/tcp" | sed 's/^/ /'
|
|
|
|
# Fail2Ban Status
|
|
echo ""
|
|
echo "🚫 Fail2Ban:"
|
|
BANNED=$(sudo fail2ban-client status sshd 2>/dev/null | grep "Banned:" | awk '{print $NF}')
|
|
echo " محظورون حالياً: $BANNED"
|
|
|
|
# Disk Space
|
|
echo ""
|
|
echo "💾 مساحة القرص:"
|
|
df -h / | awk 'NR==2 {print " المستخدم: " $3 " / " $2 " (" $5 ")"}'
|
|
|
|
# الذاكرة
|
|
echo ""
|
|
echo "🧠 الذاكرة:"
|
|
free -h | awk 'NR==2 {print " المستخدم: " $3 " / " $2}'
|
|
|
|
# آخر نسخة احتياطية
|
|
echo ""
|
|
echo "💾 آخر نسخة احتياطية:"
|
|
LAST_BACKUP=$(ls -t /backup/fortress/*.enc 2>/dev/null | head -1)
|
|
if [ -n "$LAST_BACKUP" ]; then
|
|
echo " ✅ $(basename $LAST_BACKUP)"
|
|
echo " 📅 $(stat -c %y "$LAST_BACKUP" | cut -d'.' -f1)"
|
|
else
|
|
echo " ⚠️ لا توجد نسخ احتياطية"
|
|
fi
|
|
|
|
echo ""
|
|
echo "════════════════════════════════════════════════"
|
|
echo "✅ الفحص مكتمل"
|
|
HEALTHEOF
|
|
|
|
sudo chmod +x /usr/local/bin/fortress/health_check.sh
|
|
|
|
# تشغيل الفحص
|
|
sudo /usr/local/bin/fortress/health_check.sh
|
|
```
|
|
|
|
---
|
|
|
|
## 🎉 النتيجة النهائية
|
|
|
|
```bash
|
|
# الآن السيرفر:
|
|
# ✅ محمي بـ 9 طبقات أمنية
|
|
# ✅ Port Knocking مفعّل
|
|
# ✅ Honeypots نشطة
|
|
# ✅ نسخ احتياطية تلقائية
|
|
# ✅ تنبيهات Telegram
|
|
# ✅ Fail2Ban Progressive
|
|
# ✅ SSH محمي بالكامل
|
|
```
|
|
|
|
---
|
|
|
|
## 🆘 استكشاف الأخطاء
|
|
|
|
### مشكلة: لا أستطيع الاتصال بعد Port Knocking
|
|
```bash
|
|
# من السيرفر (إن كان لديك وصول):
|
|
sudo /root/emergency_restore.sh
|
|
|
|
# من CloudPanel (إن وُجد):
|
|
# استخدم Terminal من الواجهة
|
|
```
|
|
|
|
### مشكلة: Fail2Ban حظرني!
|
|
```bash
|
|
# إلغاء الحظر
|
|
sudo fail2ban-client set sshd unbanip YOUR_IP
|
|
```
|
|
|
|
### مشكلة: نسيت تسلسل Knocking
|
|
```bash
|
|
# من السيرفر:
|
|
sudo cat /etc/knockd.conf | grep sequence
|
|
```
|
|
|
|
---
|
|
|
|
## 📚 المرحلة التالية
|
|
|
|
بعد إتمام هذه المرحلة بنجاح، انتقل إلى:
|
|
📄 **PHASE_3_APPLICATION_DEPLOYMENT.md**
|
|
|
|
═══════════════════════════════════════════
|
|
✅ المرحلة 2 مكتملة - السيرفر محمي!
|
|
═══════════════════════════════════════════
|