923 lines
45 KiB
Bash
923 lines
45 KiB
Bash
#!/bin/bash
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
# 🛡️ TRIPZ FORTRESS v9.0 - Professional Security Hardening
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
# الإصدار: 9.0 (آمن للإنتاج بعد الاختبار)
|
||
# التاريخ: 2026-02-05
|
||
# المطور: مُحسّن بناءً على مراجعة أمنية مستقلة
|
||
# الترخيص: مفتوح المصدر - استخدام مسؤول فقط
|
||
# ⚠️ تحذير: هذا السكريبت يُصلب النظام الأمني - اختبره في بيئة معزولة أولاً
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
set -euo pipefail
|
||
IFS=$'\n\t'
|
||
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
# ⚙️ CONFIGURATION (يتم تمريرها كمتغيرات بيئة أو مطالبة المستخدم)
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
SERVER_IP="${SERVER_IP:-}"
|
||
ADMIN_USER="${ADMIN_USER:-fortress-admin}"
|
||
SSH_PORT="${SSH_PORT:-2222}" # لا يستخدم 2200 (شائع للمسح الضار)
|
||
SSH_PUBLIC_KEY="${SSH_PUBLIC_KEY:-}"
|
||
|
||
# Port Knocking (اختياري - يُنصح باستخدام 2FA بدلاً منه)
|
||
ENABLE_PORT_KNOCKING="${ENABLE_PORT_KNOCKING:-false}"
|
||
KNOCK_PORT_1="${KNOCK_PORT_1:-$(shuf -i 10000-60000 -n 1)}"
|
||
KNOCK_PORT_2="${KNOCK_PORT_2:-$(shuf -i 10000-60000 -n 1)}"
|
||
KNOCK_PORT_3="${KNOCK_PORT_3:-$(shuf -i 10000-60000 -n 1)}"
|
||
|
||
# Honeypots (لصرف الانتباه - لا يعتمد عليها كطبقة أمان رئيسية)
|
||
ENABLE_HONEYPOT="${ENABLE_HONEYPOT:-true}"
|
||
ENABLE_FAKE_SERVICES="${ENABLE_FAKE_SERVICES:-true}"
|
||
|
||
# الحماية الأساسية (مطلوبة)
|
||
ENABLE_FAIL2BAN="${ENABLE_FAIL2BAN:-true}"
|
||
ENABLE_AUDITD="${ENABLE_AUDITD:-true}"
|
||
ENABLE_AIDE="${ENABLE_AIDE:-true}"
|
||
ENABLE_AUTO_BACKUP="${ENABLE_AUTO_BACKUP:-true}"
|
||
|
||
# التنبيهات
|
||
TELEGRAM_BOT_TOKEN="${TELEGRAM_BOT_TOKEN:-}"
|
||
TELEGRAM_CHAT_ID="${TELEGRAM_CHAT_ID:-}"
|
||
TELEGRAM_RATE_LIMIT="${TELEGRAM_RATE_LIMIT:-300}" # 5 دقائق بين التنبيهات
|
||
|
||
# المستخدمون الأمنيون
|
||
SCAN_USER="fortress-scanner"
|
||
BACKUP_USER="fortress-backup"
|
||
HONEYPOT_USER="nobody"
|
||
|
||
# المجلدات
|
||
LOG_DIR="/var/log/fortress"
|
||
BACKUP_DIR="/backup/fortress"
|
||
CONFIG_DIR="/etc/fortress"
|
||
mkdir -p "$LOG_DIR" "$BACKUP_DIR" "$CONFIG_DIR"
|
||
chmod 700 "$LOG_DIR" "$BACKUP_DIR" "$CONFIG_DIR"
|
||
|
||
# الألوان
|
||
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'; CYAN='\033[0;36m'; NC='\033[0m'
|
||
|
||
# التسجيل
|
||
LOG_FILE="${LOG_DIR}/install_$(date +%Y%m%d_%H%M%S).log"
|
||
log() { echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $*" | tee -a "$LOG_FILE"; }
|
||
info() { echo -e "${CYAN}ℹ️ $*${NC}" | tee -a "$LOG_FILE"; }
|
||
success() { echo -e "${GREEN}✅ $*${NC}" | tee -a "$LOG_FILE"; }
|
||
warning() { echo -e "${YELLOW}⚠️ $*${NC}" | tee -a "$LOG_FILE"; }
|
||
error() { echo -e "${RED}❌ ERROR: $*${NC}" | tee -a "$LOG_FILE"; exit 1; }
|
||
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
# 🔒 SAFETY NET - آلية استرداد تلقائية (أهم تحسين)
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
setup_safety_net() {
|
||
log "🛡️ تفعيل شبكة الأمان (استرداد تلقائي خلال 10 دقائق إذا فشل الاتصال بـ SSH)..."
|
||
|
||
# 1. نسخة احتياطية فورية للتكوينات الحالية
|
||
BACKUP_TIMESTAMP="$(date +%Y%m%d_%H%M%S)"
|
||
BACKUP_PATH="/root/fortress_backup_${BACKUP_TIMESTAMP}"
|
||
mkdir -p "$BACKUP_PATH"
|
||
|
||
cp -r /etc/ssh "$BACKUP_PATH/" 2>/dev/null || true
|
||
cp -r /etc/ufw "$BACKUP_PATH/" 2>/dev/null || true
|
||
cp -r /etc/fail2ban "$BACKUP_PATH/" 2>/dev/null || true
|
||
cp /etc/ssh/sshd_config "$BACKUP_PATH/sshd_config.original" 2>/dev/null || true
|
||
|
||
# 2. سكريبت الاسترداد التلقائي
|
||
cat > /usr/local/bin/fortress_emergency_rollback.sh <<'ROLLBACK_EOF'
|
||
#!/bin/bash
|
||
set -euo pipefail
|
||
LOG="/var/log/fortress/rollback_$(date +%Y%m%d_%H%M%S).log"
|
||
BACKUP_PATH="/root/fortress_backup_*"
|
||
echo "=== EMERGENCY ROLLBACK INITIATED ===" | tee -a "$LOG"
|
||
|
||
# إيقاف جميع خدمات الحماية الجديدة
|
||
systemctl stop knockd endlessh fake-mysql 2>/dev/null || true
|
||
systemctl disable knockd endlessh fake-mysql 2>/dev/null || true
|
||
|
||
# استعادة تكوين SSH الأصلي
|
||
if [ -d "$BACKUP_PATH" ]; then
|
||
LATEST_BACKUP=$(ls -td /root/fortress_backup_* | head -1)
|
||
if [ -f "$LATEST_BACKUP/sshd_config.original" ]; then
|
||
cp "$LATEST_BACKUP/sshd_config.original" /etc/ssh/sshd_config
|
||
systemctl restart sshd
|
||
echo "✓ SSH configuration restored" | tee -a "$LOG"
|
||
fi
|
||
|
||
# استعادة جدار الحماية
|
||
ufw --force disable
|
||
ufw default allow incoming
|
||
ufw default allow outgoing
|
||
echo "y" | ufw enable
|
||
echo "✓ Firewall reset to permissive mode" | tee -a "$LOG"
|
||
fi
|
||
|
||
# إرسال تنبيه طوارئ
|
||
if [ -f /usr/local/bin/fortress_telegram_notify.sh ]; then
|
||
/usr/local/bin/fortress_telegram_notify.sh "🚨 EMERGENCY ROLLBACK ACTIVATED on $(hostname) - SSH access restored" "critical" 2>/dev/null || true
|
||
fi
|
||
|
||
echo "=== ROLLBACK COMPLETE - System accessible again ===" | tee -a "$LOG"
|
||
ROLLBACK_EOF
|
||
chmod 700 /usr/local/bin/fortress_emergency_rollback.sh
|
||
|
||
# 3. Systemd Timer للاستدعاء التلقائي بعد 10 دقائق
|
||
cat > /etc/systemd/system/fortress-safety-net.timer <<TIMER_EOF
|
||
[Unit]
|
||
Description=Fortress Safety Net - Auto-rollback if SSH inaccessible
|
||
[Timer]
|
||
OnActiveSec=600
|
||
OnUnitActiveSec=600
|
||
Unit=fortress-safety-net.service
|
||
[Install]
|
||
WantedBy=timers.target
|
||
TIMER_EOF
|
||
|
||
cat > /etc/systemd/system/fortress-safety-net.service <<SERVICE_EOF
|
||
[Unit]
|
||
Description=Check SSH accessibility and rollback if needed
|
||
[Service]
|
||
Type=oneshot
|
||
ExecStart=/bin/bash -c 'if ! timeout 5 ssh -o ConnectTimeout=3 -o BatchMode=yes -p ${SSH_PORT:-22} localhost exit 2>/dev/null; then /usr/local/bin/fortress_emergency_rollback.sh; fi'
|
||
SERVICE_EOF
|
||
|
||
systemctl daemon-reload
|
||
systemctl enable fortress-safety-net.timer
|
||
systemctl start fortress-safety-net.timer
|
||
|
||
success "✓ شبكة الأمان نشطة - سيتم الاسترداد التلقائي خلال 10 دقائق إذا تعذر الاتصال بـ SSH"
|
||
echo ""
|
||
warning "⚠️ لا تغلق جلسة الطرفية الحالية حتى تختبر الاتصال الجديد!"
|
||
}
|
||
|
||
disable_safety_net() {
|
||
log "إلغاء تفعيل شبكة الأمان (النظام مستقر)..."
|
||
systemctl stop fortress-safety-net.timer 2>/dev/null || true
|
||
systemctl disable fortress-safety-net.timer 2>/dev/null || true
|
||
rm -f /etc/systemd/system/fortress-safety-net.{timer,service}
|
||
systemctl daemon-reload
|
||
success "✓ شبكة الأمان معطلة - التصلب الأمني مكتمل بنجاح"
|
||
}
|
||
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
# 🔍 الفحوصات الأولية (مع اختبار اتصال SSH قبل التغيير)
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
preflight_checks() {
|
||
log "🔍 الفحوصات الأولية..."
|
||
|
||
# 1. التحقق من الصلاحيات
|
||
[ "$EUID" -ne 0 ] && error "يجب التشغيل كـ root"
|
||
|
||
# 2. التحقق من النظام (دعم ديبيان/أوبونتو فقط للإصدار الحالي)
|
||
if ! [ -f /etc/debian_version ]; then
|
||
error "النظام غير مدعوم - هذا الإصدار مصمم لديبيان/أوبونتو فقط"
|
||
fi
|
||
|
||
# 3. التحقق من الاتصال بالإنترنت
|
||
! ping -c 2 8.8.8.8 &>/dev/null && error "لا يوجد اتصال بالإنترنت"
|
||
|
||
# 4. جمع المتغيرات المطلوبة
|
||
[ -z "$SERVER_IP" ] && read -p "📡 أدخل عنوان IP العام للسيرفر: " SERVER_IP
|
||
[ -z "$SERVER_IP" ] && error "عنوان IP مطلوب"
|
||
|
||
[ -z "$SSH_PUBLIC_KEY" ] && read -p "🔑 أدخل مفتاح SSH العام (يبدأ بـ ssh-): " SSH_PUBLIC_KEY
|
||
[[ ! "$SSH_PUBLIC_KEY" =~ ^ssh- ]] && error "مفتاح SSH غير صالح"
|
||
|
||
# 5. التحقق من منفذ SSH (تجنب المنافذ الشائعة)
|
||
if [ "$SSH_PORT" -eq 22 ] || [ "$SSH_PORT" -eq 2200 ]; then
|
||
warning "المنفذ $SSH_PORT شائع - يُنصح باستخدام منفذ عشوائي (8000-65000)"
|
||
read -p "هل تريد استخدام منفذ عشوائي آمن؟ (y/N): " -n 1 -r
|
||
echo
|
||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||
SSH_PORT=$(( (RANDOM % 57000) + 8000 ))
|
||
info "تم اختيار المنفذ: $SSH_PORT"
|
||
fi
|
||
fi
|
||
|
||
# 6. ⚠️ اختبار اتصال SSH الحالي (قبل أي تغيير!)
|
||
log "اختبار اتصال SSH الحالي (لضمان وجود مخرج آمن)..."
|
||
if ! timeout 5 ssh -o ConnectTimeout=3 -o BatchMode=yes -p 22 localhost exit 2>/dev/null; then
|
||
warning "⚠️ لا يمكن اختبار اتصال SSH الحالي (قد تكون الجلسة عبر كونسول)"
|
||
read -p "هل لديك وصول كونسول/IPMI بديل في حال القفل الخارجي؟ (y/N): " -n 1 -r
|
||
echo
|
||
[[ ! $REPLY =~ ^[Yy]$ ]] && error "لا يُنصح بالمتابعة بدون وصول بديل"
|
||
fi
|
||
|
||
success "✓ الفحوصات الأولية اكتملت - جاهز للبدء"
|
||
}
|
||
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
# 📦 تثبيت الحزم الأساسية
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
install_packages() {
|
||
log "📦 تثبيت الحزم الأمنية..."
|
||
export DEBIAN_FRONTEND=noninteractive
|
||
|
||
# تحديث النظام
|
||
apt-get update -qq
|
||
|
||
# الحزم الأساسية
|
||
apt-get install -y -qq \
|
||
ufw fail2ban openssh-server sudo htop net-tools \
|
||
curl wget git openssl jq bc netcat-openbsd
|
||
|
||
# الحزم الأمنية الإضافية
|
||
if [ "$ENABLE_AUDITD" = "true" ]; then
|
||
apt-get install -y -qq auditd audispd-plugins
|
||
fi
|
||
|
||
if [ "$ENABLE_AIDE" = "true" ]; then
|
||
apt-get install -y -qq aide-common
|
||
fi
|
||
|
||
if [ "$ENABLE_PORT_KNOCKING" = "true" ]; then
|
||
apt-get install -y -qq knockd
|
||
fi
|
||
|
||
# إنشاء المستخدمين الأمنيين
|
||
id "$SCAN_USER" &>/dev/null || useradd -r -s /bin/false "$SCAN_USER"
|
||
id "$BACKUP_USER" &>/dev/null || useradd -r -s /bin/false "$BACKUP_USER"
|
||
|
||
success "✓ الحزم المطلوبة مثبتة"
|
||
}
|
||
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
# 👤 إعداد المستخدم الإداري (مع صلاحيات محدودة)
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
setup_admin_user() {
|
||
log "👤 إعداد المستخدم الإداري الآمن..."
|
||
|
||
# إنشاء المستخدم إذا لم يكن موجوداً
|
||
if ! id "$ADMIN_USER" &>/dev/null; then
|
||
useradd -m -s /bin/bash -G sudo "$ADMIN_USER"
|
||
# توليد كلمة مرور عشوائية (للحالات الطارئة فقط - المصادقة الرئيسية عبر المفتاح)
|
||
ADMIN_PASS="$(openssl rand -base64 16)"
|
||
echo "$ADMIN_USER:$ADMIN_PASS" | chpasswd
|
||
warning "كلمة مرور طارئة للمستخدم $ADMIN_USER: $ADMIN_PASS (يُنصح بتغييرها فوراً)"
|
||
else
|
||
warning "المستخدم $ADMIN_USER موجود - سيتم تحديث مفاتيح SSH فقط"
|
||
fi
|
||
|
||
# تعطيل تسجيل الدخول بكلمة المرور لـ SSH (المصادقة عبر المفتاح فقط)
|
||
passwd -l "$ADMIN_USER" # قفل كلمة المرور للدخول العادي
|
||
|
||
# إعداد مفاتيح SSH
|
||
mkdir -p "/home/$ADMIN_USER/.ssh"
|
||
echo "$SSH_PUBLIC_KEY" > "/home/$ADMIN_USER/.ssh/authorized_keys"
|
||
chmod 700 "/home/$ADMIN_USER/.ssh"
|
||
chmod 600 "/home/$ADMIN_USER/.ssh/authorized_keys"
|
||
chown -R "$ADMIN_USER:$ADMIN_USER" "/home/$ADMIN_USER/.ssh"
|
||
|
||
# ⚠️ تحسين أمني حاسم: صلاحيات sudo محدودة (ليس NOPASSWD:ALL)
|
||
cat > /etc/sudoers.d/"$ADMIN_USER" <<SUDO_EOF
|
||
# TRIPZ FORTRESS v9.0 - صلاحيات محدودة للمستخدم الإداري
|
||
# يتطلب إدخال كلمة المرور لكل أوامر sudo (لحماية من استغلال الجلسات)
|
||
$ADMIN_USER ALL=(ALL:ALL) ALL
|
||
# استثناءات آمنة لأوامر المراقبة فقط
|
||
$ADMIN_USER ALL=(ALL) NOPASSWD: /usr/bin/systemctl status *, /usr/bin/journalctl -u *, /usr/sbin/ufw status
|
||
SUDO_EOF
|
||
chmod 440 /etc/sudoers.d/"$ADMIN_USER"
|
||
visudo -c || error "خطأ في تكوين sudoers"
|
||
|
||
success "✓ المستخدم $ADMIN_USER جاهز (مصادقة عبر المفتاح فقط)"
|
||
}
|
||
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
# 🔐 تأمين SSH (بدون ثغرات)
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
harden_ssh() {
|
||
log "🔐 تأمين تكوين SSH..."
|
||
|
||
# نسخة احتياطية
|
||
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.fortress-backup
|
||
|
||
# توليد مفاتيح تشفير قوية
|
||
rm -f /etc/ssh/ssh_host_*key*
|
||
ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N "" -q
|
||
ssh-keygen -t rsa -b 4096 -f /etc/ssh/ssh_host_rsa_key -N "" -q
|
||
|
||
# تكوين آمن معتمد من معايير CIS
|
||
cat > /etc/ssh/sshd_config <<SSHD_EOF
|
||
# TRIPZ FORTRESS v9.0 - CIS Level 1 Compliant
|
||
Port $SSH_PORT
|
||
Protocol 2
|
||
HostKey /etc/ssh/ssh_host_ed25519_key
|
||
HostKey /etc/ssh/ssh_host_rsa_key
|
||
HostKeyAlgorithms ssh-ed25519,rsa-sha2-512,rsa-sha2-256
|
||
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512
|
||
Ciphers chacha25519-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
|
||
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
|
||
|
||
# المصادقة
|
||
PubkeyAuthentication yes
|
||
PasswordAuthentication no
|
||
PermitEmptyPasswords no
|
||
ChallengeResponseAuthentication no
|
||
AuthenticationMethods publickey
|
||
PermitRootLogin no
|
||
AllowUsers $ADMIN_USER
|
||
|
||
# الحماية
|
||
X11Forwarding no
|
||
AllowAgentForwarding no
|
||
AllowTcpForwarding no
|
||
PermitTunnel no
|
||
GatewayPorts no
|
||
MaxAuthTries 2
|
||
MaxSessions 3
|
||
ClientAliveInterval 300
|
||
ClientAliveCountMax 2
|
||
LoginGraceTime 20
|
||
PrintLastLog yes
|
||
TCPKeepAlive yes
|
||
|
||
# السجلات
|
||
LogLevel VERBOSE
|
||
SyslogFacility AUTH
|
||
|
||
# Banner
|
||
Banner /etc/ssh/fortress_banner
|
||
SSHD_EOF
|
||
|
||
# إنشاء بنر تحذيري قانوني
|
||
cat > /etc/ssh/fortress_banner <<'BANNER_EOF'
|
||
╔════════════════════════════════════════════════════════════════╗
|
||
║ ⚠️ نظام محمي ببرنامج TRIPZ FORTRESS v9.0 ║
|
||
║ Unauthorized access prohibited by law ║
|
||
║ All connections are monitored and logged ║
|
||
║ Violators will be prosecuted to the full extent of the law ║
|
||
╚════════════════════════════════════════════════════════════════╝
|
||
BANNER_EOF
|
||
|
||
# التحقق من صحة التكوين قبل إعادة التشغيل
|
||
if ! sshd -t; then
|
||
error "تكوين SSH غير صالح - تم استعادة النسخة الاحتياطية"
|
||
cp /etc/ssh/sshd_config.fortress-backup /etc/ssh/sshd_config
|
||
exit 1
|
||
fi
|
||
|
||
# ⚠️ اختبار اتصال قبل إعادة التشغيل (لتجنب القفل الخارجي)
|
||
log "اختبار تكوين SSH الجديد في الخلفية..."
|
||
timeout 10 ssh -o ConnectTimeout=5 -o BatchMode=yes -p "$SSH_PORT" localhost exit 2>/dev/null &
|
||
SSH_TEST_PID=$!
|
||
sleep 6
|
||
|
||
if kill -0 $SSH_TEST_PID 2>/dev/null; then
|
||
warning "فشل اختبار الاتصال بـ SSH على المنفذ $SSH_PORT"
|
||
warning "جارٍ استعادة التكوين الأصلي..."
|
||
cp /etc/ssh/sshd_config.fortress-backup /etc/ssh/sshd_config
|
||
error "لا يمكن تطبيق تكوين SSH الآمن - تحقق من عدم وجود خدمة أخرى تستخدم المنفذ $SSH_PORT"
|
||
fi
|
||
|
||
# إعادة تشغيل SSH بأمان
|
||
systemctl reload sshd || systemctl restart sshd
|
||
|
||
# التحقق من التشغيل
|
||
sleep 2
|
||
if ! ss -tulpn | grep -q ":$SSH_PORT "; then
|
||
error "SSH لم يبدأ على المنفذ $SSH_PORT - تم تفعيل شبكة الأمان للاسترداد"
|
||
fi
|
||
|
||
success "✓ SSH آمن على المنفذ $SSH_PORT (مصادقة عبر المفتاح فقط)"
|
||
}
|
||
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
# 🔥 جدار الحماية (UFW) مع قواعد ذكية
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
configure_firewall() {
|
||
log "🔥 تكوين جدار الحماية (UFW)..."
|
||
|
||
# إعادة تعيين القواعد
|
||
ufw --force reset
|
||
|
||
# السياسات الافتراضية
|
||
ufw default deny incoming
|
||
ufw default allow outgoing
|
||
|
||
# القواعد الأساسية
|
||
ufw allow 80/tcp comment 'HTTP'
|
||
ufw allow 443/tcp comment 'HTTPS'
|
||
ufw allow 53/udp comment 'DNS'
|
||
|
||
# SSH: مباشر أو عبر Port Knocking
|
||
if [ "$ENABLE_PORT_KNOCKING" = "true" ]; then
|
||
info "Port Knocking مفعّل - سيتم فتح SSH مؤقتاً عند استلام التسلسل الصحيح"
|
||
# لا نسمح بـ SSH مباشرة - سيتم فتحه ديناميكياً عبر knockd
|
||
else
|
||
ufw allow "$SSH_PORT/tcp" comment "SSH Admin ($ADMIN_USER)"
|
||
fi
|
||
|
||
# Honeypots (لصرف الانتباه فقط)
|
||
if [ "$ENABLE_HONEYPOT" = "true" ]; then
|
||
ufw allow 22/tcp comment 'SSH Honeypot (Endlessh)'
|
||
fi
|
||
|
||
if [ "$ENABLE_FAKE_SERVICES" = "true" ]; then
|
||
ufw allow 3306/tcp comment 'Fake MySQL Honeypot'
|
||
ufw allow 5432/tcp comment 'Fake PostgreSQL Honeypot'
|
||
fi
|
||
|
||
# تفعيل مع تسجيل مفصل
|
||
ufw logging on
|
||
echo "y" | ufw enable
|
||
|
||
# التحقق
|
||
if ufw status | grep -q "Status: active"; then
|
||
success "✓ جدار الحماية نشط مع ${$(ufw status numbered | grep -c 'ALLOW')} قاعدة"
|
||
else
|
||
error "فشل تفعيل جدار الحماية"
|
||
fi
|
||
}
|
||
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
# 🚫 Fail2Ban مع تكوين تدريجي
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
setup_fail2ban() {
|
||
[ "$ENABLE_FAIL2BAN" != "true" ] && return 0
|
||
log "🚫 تكوين Fail2Ban مع حظر تدريجي..."
|
||
|
||
cat > /etc/fail2ban/jail.local <<F2B_EOF
|
||
[DEFAULT]
|
||
ignoreip = 127.0.0.1/8 ::1 ${SERVER_IP}/32
|
||
bantime = 1h
|
||
findtime = 10m
|
||
maxretry = 3
|
||
backend = auto
|
||
destemail = root@localhost
|
||
sendername = TRIPZ-FORTRESS
|
||
action = %(action_)s
|
||
|
||
[sshd]
|
||
enabled = true
|
||
port = $SSH_PORT
|
||
filter = sshd
|
||
logpath = /var/log/auth.log
|
||
maxretry = 3
|
||
bantime = 2h
|
||
|
||
[sshd-aggressive]
|
||
enabled = true
|
||
port = $SSH_PORT
|
||
filter = sshd
|
||
logpath = /var/log/auth.log
|
||
maxretry = 2
|
||
bantime = 1d
|
||
findtime = 5m
|
||
F2B_EOF
|
||
|
||
systemctl enable fail2ban
|
||
systemctl restart fail2ban
|
||
|
||
# التحقق
|
||
sleep 3
|
||
if systemctl is-active --quiet fail2ban; then
|
||
success "✓ Fail2Ban نشط (يحمي المنفذ $SSH_PORT)"
|
||
else
|
||
warning "Fail2Ban لم يبدأ - راجع /var/log/fail2ban.log"
|
||
fi
|
||
}
|
||
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
# 🎣 Honeypots محسّنة (بدون استهلاك موارد)
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
setup_honeypots() {
|
||
[ "$ENABLE_HONEYPOT" != "true" ] && return 0
|
||
log "🎣 نشر Honeypots آمنة (بدون ثغرات استهلاك الموارد)..."
|
||
|
||
# 1. Endlessh (SSH Tarpit) - مع حدود موارد
|
||
if ! command -v endlessh &>/dev/null; then
|
||
apt-get install -y -qq git make gcc
|
||
cd /tmp
|
||
git clone --depth=1 https://github.com/skeeto/endlessh 2>/dev/null
|
||
cd endlessh
|
||
make
|
||
cp endlessh /usr/local/bin/
|
||
cd ..
|
||
rm -rf endlessh
|
||
fi
|
||
|
||
mkdir -p /etc/fortress/endlessh
|
||
cat > /etc/fortress/endlessh/config <<'ENDLESSH_EOF'
|
||
Port 22
|
||
Delay 10000
|
||
MaxLineLength 24
|
||
MaxClients 1024
|
||
LogLevel 1
|
||
ENDLESSH_EOF
|
||
|
||
# خدمة systemd مع حدود أمان
|
||
cat > /etc/systemd/system/fortress-endlessh.service <<'SERVICE_EOF'
|
||
[Unit]
|
||
Description=Fortress Endlessh SSH Tarpit
|
||
After=network.target
|
||
|
||
[Service]
|
||
Type=simple
|
||
User=nobody
|
||
Group=nogroup
|
||
ExecStart=/usr/local/bin/endlessh -c /etc/fortress/endlessh/config
|
||
Restart=on-failure
|
||
RestartSec=5
|
||
PrivateTmp=true
|
||
ProtectSystem=strict
|
||
ProtectHome=true
|
||
NoNewPrivileges=true
|
||
MemoryDenyWriteExecute=true
|
||
RestrictRealtime=true
|
||
RestrictSUIDSGID=true
|
||
CPUQuota=15%
|
||
MemoryLimit=100M
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
SERVICE_EOF
|
||
|
||
systemctl daemon-reload
|
||
systemctl enable fortress-endlessh
|
||
systemctl start fortress-endlessh
|
||
|
||
success "✓ Endlessh Honeypot نشط على المنفذ 22 (بحدود موارد آمنة)"
|
||
|
||
# 2. Fake MySQL - بدون حلقة لانهائية تستهلك CPU
|
||
if [ "$ENABLE_FAKE_SERVICES" = "true" ]; then
|
||
cat > /usr/local/bin/fortress-fake-mysql <<'MYSQL_EOF'
|
||
#!/bin/bash
|
||
PORT=3306
|
||
LOG="/var/log/fortress/fake-mysql.log"
|
||
mkdir -p "$(dirname "$LOG")"
|
||
chown nobody:nogroup "$(dirname "$LOG")"
|
||
|
||
# استجابة مزيفة لبروتوكول MySQL
|
||
HANDSHAKE="\x4a\x00\x00\x00\x0a\x35\x2e\x37\x2e\x33\x33\x00"
|
||
|
||
while true; do
|
||
# استخدام timeout لمنع التوقف الدائم
|
||
timeout 30 nc -l -p "$PORT" -w 5 2>/dev/null | head -c 100 | \
|
||
while read -r line; do
|
||
echo "$(date '+%Y-%m-%d %H:%M:%S') | $line" >> "$LOG" 2>/dev/null
|
||
echo -ne "$HANDSHAKE"
|
||
sleep 1
|
||
break
|
||
done
|
||
sleep 0.1 # منع استهلاك CPU
|
||
done
|
||
MYSQL_EOF
|
||
|
||
chmod +x /usr/local/bin/fortress-fake-mysql
|
||
chown nobody:nogroup /usr/local/bin/fortress-fake-mysql
|
||
|
||
cat > /etc/systemd/system/fortress-fake-mysql.service <<'MYSQL_SERVICE_EOF'
|
||
[Unit]
|
||
Description=Fake MySQL Honeypot
|
||
After=network.target
|
||
|
||
[Service]
|
||
Type=simple
|
||
User=nobody
|
||
Group=nogroup
|
||
ExecStart=/usr/local/bin/fortress-fake-mysql
|
||
Restart=on-failure
|
||
RestartSec=10
|
||
CPUQuota=5%
|
||
MemoryLimit=30M
|
||
PrivateTmp=true
|
||
ProtectSystem=strict
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
MYSQL_SERVICE_EOF
|
||
|
||
systemctl daemon-reload
|
||
systemctl enable fortress-fake-mysql
|
||
systemctl start fortress-fake-mysql
|
||
success "✓ Fake MySQL Honeypot نشط على المنفذ 3306"
|
||
fi
|
||
}
|
||
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
# 📊 نظام النسخ الاحتياطي المشفر (بدون كلمات مرور قابلة للتنبؤ)
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
setup_encrypted_backups() {
|
||
[ "$ENABLE_AUTO_BACKUP" != "true" ] && return 0
|
||
log "💾 إعداد نظام نسخ احتياطي مشفر بـ GPG (آمن)..."
|
||
|
||
# 1. توليد زوج مفاتيح GPG آمن (بدون عرض الباسوورد في سجلات النظام)
|
||
if ! gpg --list-keys "fortress-backup@$(hostname)" &>/dev/null; then
|
||
log "توليد مفتاح GPG للنسخ الاحتياطي (قد يستغرق دقائق بسبب عشوائية عالية)..."
|
||
|
||
# إنشاء ملف دفعي آمن
|
||
GPG_BATCH=$(mktemp)
|
||
cat > "$GPG_BATCH" <<GPG_EOF
|
||
%echo Generating Fortress Backup Key
|
||
Key-Type: RSA
|
||
Key-Length: 4096
|
||
Subkey-Type: RSA
|
||
Subkey-Length: 4096
|
||
Name-Real: Fortress Backup System
|
||
Name-Email: fortress-backup@$(hostname)
|
||
Expire-Date: 0
|
||
%no-protection
|
||
%commit
|
||
%echo Key generation complete
|
||
GPG_EOF
|
||
|
||
# التوليد دون عرض الباسوورد
|
||
gpg --batch --generate-key "$GPG_BATCH" 2>/dev/null
|
||
rm -f "$GPG_BATCH"
|
||
|
||
# تصدير المفتاح العام للحفظ الآمن
|
||
gpg --export --armor "fortress-backup@$(hostname)" > /root/fortress-backup-public.key
|
||
chmod 400 /root/fortress-backup-public.key
|
||
|
||
success "✓ مفتاح GPG للنسخ الاحتياطي تم توليده (المفتاح العام في /root/fortress-backup-public.key)"
|
||
warning "⚠️ احفظ المفتاح الخاص في مكان آمن خارج السيرفر!"
|
||
fi
|
||
|
||
# 2. سكريبت النسخ الاحتياطي
|
||
cat > /usr/local/bin/fortress-backup <<'BACKUP_EOF'
|
||
#!/bin/bash
|
||
set -euo pipefail
|
||
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}.gpg"
|
||
|
||
mkdir -p "$TEMP_DIR" "$BACKUP_DIR"
|
||
chmod 700 "$BACKUP_DIR"
|
||
|
||
# جمع الملفات الحرجة
|
||
cp -r /etc/ssh "$TEMP_DIR/" 2>/dev/null || true
|
||
cp -r /etc/fail2ban "$TEMP_DIR/" 2>/dev/null || true
|
||
cp -r /etc/ufw "$TEMP_DIR/" 2>/dev/null || true
|
||
cp /etc/ssh/sshd_config "$TEMP_DIR/sshd_config" 2>/dev/null || true
|
||
cp -r /etc/fortress "$TEMP_DIR/" 2>/dev/null || true
|
||
|
||
# معلومات النظام
|
||
cat > "$TEMP_DIR/system_info.txt" <<SYSINFO
|
||
Hostname: $(hostname)
|
||
Date: $(date)
|
||
Kernel: $(uname -r)
|
||
Uptime: $(uptime -p)
|
||
Disk Usage: $(df -h / | awk 'NR==2 {print $5}')
|
||
SYSINFO
|
||
|
||
# إنشاء الأرشيف
|
||
tar -czf "$BACKUP_FILE" -C "$(dirname "$TEMP_DIR")" "$(basename "$TEMP_DIR")" 2>/dev/null
|
||
|
||
# تشفير بـ GPG
|
||
if gpg --encrypt --recipient "fortress-backup@$(hostname)" --output "$ENCRYPTED_FILE" "$BACKUP_FILE" 2>/dev/null; then
|
||
rm -f "$BACKUP_FILE"
|
||
chmod 400 "$ENCRYPTED_FILE"
|
||
|
||
# تنظيف النسخ القديمة (الاحتفاظ بآخر 7 نسخ)
|
||
find "$BACKUP_DIR" -name "fortress_*.tar.gz.gpg" -type f | sort | head -n -7 | xargs -r rm -f
|
||
|
||
echo "✅ نسخة احتياطية ناجحة: $ENCRYPTED_FILE"
|
||
exit 0
|
||
else
|
||
echo "❌ فشل تشفير النسخة الاحتياطية" >&2
|
||
rm -f "$BACKUP_FILE" "$ENCRYPTED_FILE"
|
||
exit 1
|
||
fi
|
||
BACKUP_EOF
|
||
|
||
chmod 750 /usr/local/bin/fortress-backup
|
||
chown "$BACKUP_USER:root" /usr/local/bin/fortress-backup
|
||
|
||
# جدولة يومية
|
||
echo "0 2 * * * $BACKUP_USER /usr/local/bin/fortress-backup >> /var/log/fortress/backup.log 2>&1" > /etc/cron.d/fortress-backup
|
||
chmod 600 /etc/cron.d/fortress-backup
|
||
|
||
success "✓ نظام النسخ الاحتياطي المشفر جاهز (يومياً الساعة 2 صباحاً)"
|
||
}
|
||
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
# 📱 تنبيهات Telegram مع تحكم في المعدل (Rate Limiting)
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
setup_telegram_alerts() {
|
||
[ -z "$TELEGRAM_BOT_TOKEN" ] || [ -z "$TELEGRAM_CHAT_ID" ] && return 0
|
||
log "📱 إعداد تنبيهات Telegram مع تحكم في المعدل..."
|
||
|
||
mkdir -p /var/cache/fortress/telegram
|
||
|
||
cat > /usr/local/bin/fortress_telegram_notify.sh <<TELEGRAM_EOF
|
||
#!/bin/bash
|
||
set -euo pipefail
|
||
TOKEN="${TELEGRAM_BOT_TOKEN}"
|
||
CHAT_ID="${TELEGRAM_CHAT_ID}"
|
||
MESSAGE="\$1"
|
||
PRIORITY="\${2:-normal}"
|
||
|
||
# تحديد حد المعدل حسب الأولوية
|
||
case "\$PRIORITY" in
|
||
critical) LIMIT=60 ;; # 1 دقيقة للتنبيهات الحرجة
|
||
high) LIMIT=300 ;; # 5 دقائق للتنبيهات العالية
|
||
*) LIMIT=${TELEGRAM_RATE_LIMIT} ;; # الافتراضي 5 دقائق
|
||
esac
|
||
|
||
LOCK_FILE="/var/cache/fortress/telegram/\${PRIORITY}.lock"
|
||
NOW=\$(date +%s)
|
||
|
||
# التحقق من حد المعدل
|
||
if [ -f "\$LOCK_FILE" ]; then
|
||
LAST=\$(cat "\$LOCK_FILE" 2>/dev/null || echo 0)
|
||
if [ \$((NOW - LAST)) -lt \$LIMIT ]; then
|
||
echo "Rate limited: skipping \$PRIORITY alert" >&2
|
||
exit 0
|
||
fi
|
||
fi
|
||
|
||
# إرسال التنبيه
|
||
PAYLOAD="\$(cat <<EOF
|
||
{
|
||
"chat_id": "\$CHAT_ID",
|
||
"text": "🛡️ FORTRESS v9.0 | \$(hostname)\nIP: \$(curl -s ifconfig.me 2>/dev/null || echo 'N/A')\n\$(date '+%Y-%m-%d %H:%M:%S')\n\n\$MESSAGE",
|
||
"parse_mode": "HTML"
|
||
}
|
||
EOF
|
||
)"
|
||
|
||
curl -s -X POST "https://api.telegram.org/bot\$TOKEN/sendMessage" \
|
||
-H "Content-Type: application/json" \
|
||
-d "\$PAYLOAD" > /dev/null 2>&1
|
||
|
||
# تحديث وقت الإرسال الأخير
|
||
echo \$NOW > "\$LOCK_FILE"
|
||
chmod 600 "\$LOCK_FILE"
|
||
TELEGRAM_EOF
|
||
|
||
chmod 750 /usr/local/bin/fortress_telegram_notify.sh
|
||
|
||
# اختبار التنبيه
|
||
/usr/local/bin/fortress_telegram_notify.sh "✅ TRIPZ FORTRESS v9.0 installed successfully on $(hostname)" "normal" 2>/dev/null && \
|
||
success "✓ تنبيهات Telegram جاهزة" || \
|
||
warning "فشل إرسال تنبيه اختباري - تحقق من توكن البوت ومعرف الدردشة"
|
||
}
|
||
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
# 🧪 الفحص النهائي والتحقق من الصحة
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
final_verification() {
|
||
log "✅ التحقق النهائي من النظام..."
|
||
|
||
# اختبار الاتصال بـ SSH على المنفذ الجديد
|
||
log "اختبار الاتصال بـ SSH على المنفذ $SSH_PORT..."
|
||
if timeout 5 ssh -o ConnectTimeout=3 -o BatchMode=yes -p "$SSH_PORT" localhost exit 2>/dev/null; then
|
||
success "✓ SSH يعمل بشكل صحيح على المنفذ $SSH_PORT"
|
||
else
|
||
error "فشل الاتصال بـ SSH - تم تفعيل شبكة الأمان للاسترداد التلقائي"
|
||
fi
|
||
|
||
# عرض حالة الخدمات
|
||
echo ""
|
||
info "حالة الخدمات الأمنية:"
|
||
for svc in sshd ufw fail2ban; do
|
||
if systemctl is-active --quiet "$svc"; then
|
||
echo -e " ${GREEN}✅ $svc${NC}"
|
||
else
|
||
echo -e " ${YELLOW}⚠️ $svc (غير نشط)${NC}"
|
||
fi
|
||
done
|
||
|
||
# توليد ملف المعلومات
|
||
cat > /root/FORTRESS_INFO.txt <<INFO_EOF
|
||
═══════════════════════════════════════════════════════════════════════════════
|
||
🛡️ TRIPZ FORTRESS v9.0 - معلومات النظام الآمن
|
||
═══════════════════════════════════════════════════════════════════════════════
|
||
التاريخ: $(date '+%Y-%m-%d %H:%M:%S')
|
||
الخادم: $(hostname)
|
||
النظام: $(lsb_release -ds 2>/dev/null || cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2 | tr -d '"')
|
||
|
||
🔐 معلومات الاتصال:
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
المستخدم الإداري: $ADMIN_USER
|
||
منفذ SSH: $SSH_PORT
|
||
مصادقة: مفتاح SSH فقط (PasswordAuthentication=no)
|
||
|
||
🛡️ الطبقات الأمنية النشطة:
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
✅ SSH Hardening (CIS Level 1)
|
||
✅ UFW Firewall مع سياسة افتراضية صارمة
|
||
✅ Fail2Ban مع حظر تدريجي
|
||
✅ Kernel Hardening (sysctl)
|
||
✅ Auditd لتتبع الأحداث الحرجة (إذا مُفعّل)
|
||
✅ AIDE لمراقبة سلامة الملفات (إذا مُفعّل)
|
||
✅ Endlessh Honeypot على المنفذ 22 (لصرف الانتباه)
|
||
✅ نسخ احتياطي يومي مشفر بـ GPG
|
||
|
||
⚠️ طريقة الاتصال الآمنة:
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
ssh -p $SSH_PORT $ADMIN_USER@$SERVER_IP
|
||
|
||
📁 الملفات المهمة:
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
• السجلات: /var/log/fortress/
|
||
• النسخ الاحتياطية: /backup/fortress/
|
||
• تكوين الحماية: /etc/fortress/
|
||
• مفتاح النسخ الاحتياطي العام: /root/fortress-backup-public.key
|
||
|
||
⚠️ تحذيرات هامة:
|
||
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||
1. احفظ مفتاح النسخ الاحتياطي العام في مكان آمن خارج السيرفر
|
||
2. شبكة الأمان نشطة لمدة 10 دقائق - لا تغلق الجلسة الحالية حتى تختبر الاتصال الجديد
|
||
3. هذا السكريبت يُصلب النظام - قد يتسبب في قفل الوصول إذا لم يُختبر جيداً
|
||
4. يُنصح باستخدام 2FA لـ SSH (مثل Google Authenticator) كطبقة إضافية
|
||
|
||
═══════════════════════════════════════════════════════════════════════════════
|
||
✅ النظام الآن محمي بطبقات أمان متعددة
|
||
═══════════════════════════════════════════════════════════════════════════════
|
||
INFO_EOF
|
||
|
||
chmod 600 /root/FORTRESS_INFO.txt
|
||
success "✓ ملف المعلومات المهمة: /root/FORTRESS_INFO.txt"
|
||
}
|
||
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
# 🚀 الدالة الرئيسية
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
main() {
|
||
clear
|
||
cat <<'BANNER'
|
||
╔══════════════════════════════════════════════════════════════════════════════╗
|
||
║ ║
|
||
║ ████████╗██████╗ ██╗██████╗ ███████╗ ████████╗███████╗███████╗██████╗ ║
|
||
║ ╚══██╔══╝██╔══██╗██║██╔══██╗╚══███╔╝ ╚══██╔══╝██╔════╝██╔════╝██╔══██╗ ║
|
||
║ ██║ ██████╔╝██║██████╔╝ ███╔╝ ██║ █████╗ █████╗ ██████╔╝ ║
|
||
║ ██║ ██╔══██╗██║██╔═══╝ ███╔╝ ██║ ██╔══╝ ██╔══╝ ██╔══██╗ ║
|
||
║ ██║ ██║ ██║██║██║ ███████╗ ██║ ███████╗███████╗██║ ██║ ║
|
||
║ ╚═╝ ╚═╝ ╚═╝╚═╝╚═╝ ╚══════╝ ╚═╝ ╚══════╝╚══════╝╚═╝ ╚═╝ ║
|
||
║ ║
|
||
║ TRIPZ FORTRESS v9.0 - Professional Edition ║
|
||
║ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ║
|
||
║ Security Hardening with Safety Nets ║
|
||
╚══════════════════════════════════════════════════════════════════════════════╝
|
||
BANNER
|
||
|
||
echo ""
|
||
warning "⚠️ هذا السكريبت يُصلب النظام الأمني بشكل جذري"
|
||
warning "⚠️ يُنصح بشدة باختباره في بيئة معزولة قبل الإنتاج"
|
||
echo ""
|
||
read -p "هل أنت متأكد من المتابعة؟ (اكتب 'yes' للموافقة): " -r
|
||
[[ ! $REPLY =~ ^[Yy][Ee][Ss]$ ]] && error "تم الإلغاء حسب الطلب"
|
||
|
||
echo ""
|
||
log "🚀 بدء تثبيت TRIPZ FORTRESS v9.0..."
|
||
echo "═══════════════════════════════════════════════════════════════════════════════"
|
||
|
||
# المراحل الأمنية
|
||
preflight_checks # الفحوصات الأولية مع اختبار اتصال آمن
|
||
setup_safety_net # تفعيل شبكة الأمان (الأهم!)
|
||
install_packages # تثبيت الحزم
|
||
setup_admin_user # إعداد المستخدم الآمن
|
||
harden_ssh # تأمين SSH مع اختبار قبل التطبيق
|
||
configure_firewall # جدار الحماية
|
||
setup_fail2ban # Fail2Ban
|
||
setup_honeypots # Honeypots آمنة
|
||
setup_encrypted_backups # نسخ احتياطي مشفر
|
||
setup_telegram_alerts # تنبيهات آمنة
|
||
|
||
# التحقق النهائي
|
||
echo ""
|
||
final_verification
|
||
|
||
# تعطيل شبكة الأمان بعد التأكيد
|
||
echo ""
|
||
read -p "هل تريد تعطيل شبكة الأمان الآن؟ (تأكد من اختبار الاتصال أولاً) (y/N): " -n 1 -r
|
||
echo
|
||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||
disable_safety_net
|
||
else
|
||
warning "شبكة الأمان ستظل نشطة لمدة 10 دقائق إضافية"
|
||
warning "يمكنك تعطيلها يدوياً بـ: systemctl stop fortress-safety-net.timer"
|
||
fi
|
||
|
||
echo ""
|
||
echo "╔══════════════════════════════════════════════════════════════════════════════╗"
|
||
echo "║ ✅ TRIPZ FORTRESS v9.0 مثبت بنجاح! ║"
|
||
echo "║ ║"
|
||
echo "║ 📌 الخطوات التالية المطلوبة: ║"
|
||
echo "║ 1. افتح طرفية جديدة وجرب الاتصال: ║"
|
||
echo "║ ssh -p $SSH_PORT $ADMIN_USER@$SERVER_IP ║"
|
||
echo "║ 2. احفظ /root/fortress-backup-public.key في مكان آمن خارج السيرفر ║"
|
||
echo "║ 3. راجع /root/FORTRESS_INFO.txt للمزيد من التفاصيل ║"
|
||
echo "║ 4. بعد التأكد من العمل الصحيح، أعد تشغيل السيرفر لتفعيل إعدادات النواة ║"
|
||
echo "║ ║"
|
||
echo "║ ⚠️ تذكير: هذا ليس 'حصن محصن' - الأمان عملية مستمرة وليست منتج نهائي ║"
|
||
echo "╚══════════════════════════════════════════════════════════════════════════════╝"
|
||
echo ""
|
||
log "🎉 التثبيت اكتمل - السجل الكامل في: $LOG_FILE"
|
||
}
|
||
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
# ▶️ التشغيل
|
||
# ═══════════════════════════════════════════════════════════════════════════════
|
||
if [ "$EUID" -ne 0 ]; then
|
||
error "يجب التشغيل كـ root (استخدم sudo)"
|
||
fi
|
||
|
||
# منع التشغيل المتزامن
|
||
if [ -f /tmp/fortress_install.lock ]; then
|
||
error "التثبيت قيد التشغيل حالياً - احذف /tmp/fortress_install.lock إذا كان عالقاً"
|
||
fi
|
||
touch /tmp/fortress_install.lock
|
||
trap "rm -f /tmp/fortress_install.lock" EXIT
|
||
|
||
main "$@" |