diff --git a/tripz_fortress_v8.2_generator.sh b/tripz_fortress_v8.2_generator.sh index 395ac30..2bbcf11 100644 --- a/tripz_fortress_v8.2_generator.sh +++ b/tripz_fortress_v8.2_generator.sh @@ -1,247 +1,448 @@ #!/bin/bash -# ════════════════════════════════════════════════════════════════ -# 🛡️ TRIPZ FORTRESS v9.0 - PRODUCTION-SAFE EDITION -# ════════════════════════════════════════════════════════════════ -# الإصدار: 9.0 (Advanced Hardening) -# التاريخ: 2025-02-05 -# التحديثات: Safety Net, Sandboxing, Key Management -# ════════════════════════════════════════════════════════════════ +# ═══════════════════════════════════════════════════════════════════════════════ +# 🛡️ TRIPZ FORTRESS v9.0 - Professional Security Hardening +# ═══════════════════════════════════════════════════════════════════════════════ +# الإصدار: 9.0 (آمن للإنتاج بعد الاختبار) +# التاريخ: 2026-02-05 +# المطور: مُحسّن بناءً على مراجعة أمنية مستقلة +# الترخيص: مفتوح المصدر - استخدام مسؤول فقط +# ⚠️ تحذير: هذا السكريبت يُصلب النظام الأمني - اختبره في بيئة معزولة أولاً +# ═══════════════════════════════════════════════════════════════════════════════ +set -euo pipefail +IFS=$'\n\t' -set -euo pipefail # Exit on error, undefined vars, pipe failures -IFS=$'\n\t' # Safe word splitting - -# ════════════════════════════════════════════════════════════════ -# ⚙️ CONFIGURATION SECTION - يتم ملؤها ديناميكياً -# ════════════════════════════════════════════════════════════════ - -# معلومات السيرفر (REQUIRED) +# ═══════════════════════════════════════════════════════════════════════════════ +# ⚙️ CONFIGURATION (يتم تمريرها كمتغيرات بيئة أو مطالبة المستخدم) +# ═══════════════════════════════════════════════════════════════════════════════ SERVER_IP="${SERVER_IP:-}" -ADMIN_USER="${ADMIN_USER:-tripzadmin}" -SSH_PORT="${SSH_PORT:-2200}" +ADMIN_USER="${ADMIN_USER:-fortress-admin}" +SSH_PORT="${SSH_PORT:-2222}" # لا يستخدم 2200 (شائع للمسح الضار) SSH_PUBLIC_KEY="${SSH_PUBLIC_KEY:-}" -# Port Knocking Sequence (3 منافذ عشوائية) -KNOCK_PORT_1="${KNOCK_PORT_1:-$(shuf -i 7000-9000 -n 1)}" -KNOCK_PORT_2="${KNOCK_PORT_2:-$(shuf -i 7000-9000 -n 1)}" -KNOCK_PORT_3="${KNOCK_PORT_3:-$(shuf -i 7000-9000 -n 1)}" +# 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)}" -# Telegram Integration (OPTIONAL) -TELEGRAM_BOT_TOKEN="${TELEGRAM_BOT_TOKEN:-}" -TELEGRAM_CHAT_ID="${TELEGRAM_CHAT_ID:-}" - -# Security Features (TOGGLES) +# Honeypots (لصرف الانتباه - لا يعتمد عليها كطبقة أمان رئيسية) ENABLE_HONEYPOT="${ENABLE_HONEYPOT:-true}" ENABLE_FAKE_SERVICES="${ENABLE_FAKE_SERVICES:-true}" -ENABLE_PORT_KNOCKING="${ENABLE_PORT_KNOCKING:-true}" -ENABLE_WIREGUARD="${ENABLE_WIREGUARD:-false}" + +# الحماية الأساسية (مطلوبة) ENABLE_FAIL2BAN="${ENABLE_FAIL2BAN:-true}" +ENABLE_AUDITD="${ENABLE_AUDITD:-true}" +ENABLE_AIDE="${ENABLE_AIDE:-true}" ENABLE_AUTO_BACKUP="${ENABLE_AUTO_BACKUP:-true}" -# WireGuard Configuration (if enabled) -VPN_NETWORK="${VPN_NETWORK:-10.8.0.0/24}" -VPN_SERVER_IP="${VPN_SERVER_IP:-10.8.0.1}" +# التنبيهات +TELEGRAM_BOT_TOKEN="${TELEGRAM_BOT_TOKEN:-}" +TELEGRAM_CHAT_ID="${TELEGRAM_CHAT_ID:-}" +TELEGRAM_RATE_LIMIT="${TELEGRAM_RATE_LIMIT:-300}" # 5 دقائق بين التنبيهات -# ════════════════════════════════════════════════════════════════ -# 🎨 COLORS & STYLING -# ════════════════════════════════════════════════════════════════ - -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -CYAN='\033[0;36m' -NC='\033[0m' # No Color - -# ════════════════════════════════════════════════════════════════ -# 📝 LOGGING FUNCTIONS -# ════════════════════════════════════════════════════════════════ +# المستخدمون الأمنيون +SCAN_USER="fortress-scanner" +BACKUP_USER="fortress-backup" +HONEYPOT_USER="nobody" +# المجلدات LOG_DIR="/var/log/fortress" -LOG_FILE="${LOG_DIR}/install_$(date +%Y%m%d_%H%M%S).log" +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"; return 1; } - -# ════════════════════════════════════════════════════════════════ -# 🔍 PRE-FLIGHT CHECKS -# ════════════════════════════════════════════════════════════════ - -preflight_checks() { - log "\n🔍 تشغيل الفحوصات الأولية..." - if [ "$EUID" -ne 0 ]; then error "يجب تشغيل هذا السكريبت كـ root"; exit 1; fi - if ! ping -c 2 8.8.8.8 &>/dev/null; then error "لا يوجد اتصال بالإنترنت"; exit 1; fi - - local required_vars=("SERVER_IP" "SSH_PUBLIC_KEY") - for var in "${required_vars[@]}"; do - if [ -z "${!var}" ]; then error "المتغير $var مطلوب ولكنه فارغ!"; exit 1; fi - done - - mkdir -p "$LOG_DIR" - mkdir -p /root/backup_before_fortress_$(date +%Y%m%d) - cp -r /etc/ssh /root/backup_before_fortress_$(date +%Y%m%d)/ 2>/dev/null || true - - success "✓ الفحوصات الأولية مكتملة" -} - -# ════════════════════════════════════════════════════════════════ -# 📦 SYSTEM PREPARATION -# ════════════════════════════════════════════════════════════════ - -system_preparation() { - log "\n📦 تحضير النظام..." - export DEBIAN_FRONTEND=noninteractive - apt-get update -qq - apt-get install -y -qq curl wget git ufw fail2ban openssh-server sudo htop net-tools knockd openssl cron bc jq netcat-openbsd at - success "✓ تحضير النظام مكتمل" -} - -# ════════════════════════════════════════════════════════════════ -# 🛟 SAFETY NET (NEW in v9.0) -# ════════════════════════════════════════════════════════════════ +error() { echo -e "${RED}❌ ERROR: $*${NC}" | tee -a "$LOG_FILE"; exit 1; } +# ═══════════════════════════════════════════════════════════════════════════════ +# 🔒 SAFETY NET - آلية استرداد تلقائية (أهم تحسين) +# ═══════════════════════════════════════════════════════════════════════════════ setup_safety_net() { - log "\n🛟 إعداد شبكة الأمان (Safety Net)..." + log "🛡️ تفعيل شبكة الأمان (استرداد تلقائي خلال 10 دقائق إذا فشل الاتصال بـ SSH)..." - # سكريبت استعادة الطوارئ - cat > /usr/local/bin/fortress_emergency_reset.sh </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 -# 🆘 EMERGENCY RESET triggered by Safety Net -ufw disable -iptables -F -systemctl stop knockd -# إعادة SSH للوضع الافتراضي مؤقتاً -if [ -d "/root/backup_before_fortress_$(date +%Y%m%d)" ]; then - cp /root/backup_before_fortress_$(date +%Y%m%d)/ssh/sshd_config /etc/ssh/sshd_config 2>/dev/null - systemctl restart sshd +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 -echo "⚠️ تم تفعيل استعادة الطوارئ بسبب فقدان الاتصال!" >> /var/log/fortress/emergency.log -EOF - chmod +x /usr/local/bin/fortress_emergency_reset.sh - # جدولة المهمة بعد 15 دقيقة - if command -v at &>/dev/null; then - echo "/usr/local/bin/fortress_emergency_reset.sh" | at now + 15 minutes - info "تم ضبط مؤقت طوارئ (15 دقيقة). سيتم إلغاؤه عند نجاح التثبيت." - else - (crontab -l 2>/dev/null; echo "*/15 * * * * /usr/local/bin/fortress_emergency_reset.sh # SAFETY_NET") | crontab - - warning "تم استخدام Cron للطوارئ. سيتم إلغاؤه عند النجاح." - 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 < /etc/systemd/system/fortress-safety-net.service </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 "⚠️ لا تغلق جلسة الطرفية الحالية حتى تختبر الاتصال الجديد!" } -remove_safety_net() { - log "\n✅ إلغاء شبكة الأمان (نجح التثبيت)..." - if command -v atq &>/dev/null; then - for job in $(atq | awk '{print $1}'); do atrm $job; done - fi - crontab -l 2>/dev/null | grep -v "SAFETY_NET" | crontab - - success "✓ تم تعطيل مؤقت الطوارئ." +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 "✓ شبكة الأمان معطلة - التصلب الأمني مكتمل بنجاح" } -# ════════════════════════════════════════════════════════════════ -# 👤 USER MANAGEMENT -# ════════════════════════════════════════════════════════════════ +# ═══════════════════════════════════════════════════════════════════════════════ +# 🔍 الفحوصات الأولية (مع اختبار اتصال 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 "✓ الفحوصات الأولية اكتملت - جاهز للبدء" +} -create_admin_user() { - log "\n👤 إنشاء المستخدم الإداري..." +# ═══════════════════════════════════════════════════════════════════════════════ +# 📦 تثبيت الحزم الأساسية +# ═══════════════════════════════════════════════════════════════════════════════ +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 - passwd -l "$ADMIN_USER" + # تعطيل تسجيل الدخول بكلمة المرور لـ 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" - echo "$ADMIN_USER ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/"$ADMIN_USER" + # ⚠️ تحسين أمني حاسم: صلاحيات sudo محدودة (ليس NOPASSWD:ALL) + cat > /etc/sudoers.d/"$ADMIN_USER" < /etc/ssh/sshd_config < /etc/ssh/sshd_config < /etc/ssh/banner.txt +# السجلات +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 /root/backup_before_fortress_$(date +%Y%m%d)/ssh/sshd_config /etc/ssh/sshd_config + error "تكوين SSH غير صالح - تم استعادة النسخة الاحتياطية" + cp /etc/ssh/sshd_config.fortress-backup /etc/ssh/sshd_config exit 1 fi - systemctl reload sshd - success "✓ SSH محمي (Port: $SSH_PORT)" -} - -# ════════════════════════════════════════════════════════════════ -# 🔥 FIREWALL & FAIL2BAN -# ════════════════════════════════════════════════════════════════ - -configure_firewall() { - log "\n🔥 تكوين جدار الحماية..." - ufw default deny incoming - ufw default allow outgoing - ufw allow 80/tcp - ufw allow 443/tcp - if [ "$ENABLE_PORT_KNOCKING" != "true" ]; then - ufw allow "$SSH_PORT/tcp" + # ⚠️ اختبار اتصال قبل إعادة التشغيل (لتجنب القفل الخارجي) + 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 - if [ "$ENABLE_HONEYPOT" == "true" ]; then ufw allow 22/tcp; fi - if [ "$ENABLE_FAKE_SERVICES" == "true" ]; then ufw allow 3306/tcp; fi + # إعادة تشغيل SSH بأمان + systemctl reload sshd || systemctl restart sshd - echo "y" | ufw enable - success "✓ جدار الحماية نشط" + # التحقق من التشغيل + sleep 2 + if ! ss -tulpn | grep -q ":$SSH_PORT "; then + error "SSH لم يبدأ على المنفذ $SSH_PORT - تم تفعيل شبكة الأمان للاسترداد" + fi + + success "✓ SSH آمن على المنفذ $SSH_PORT (مصادقة عبر المفتاح فقط)" } -setup_fail2ban() { - if [ "$ENABLE_FAIL2BAN" != "true" ]; then return 0; fi - log "\n🚫 تكوين Fail2Ban..." +# ═══════════════════════════════════════════════════════════════════════════════ +# 🔥 جدار الحماية (UFW) مع قواعد ذكية +# ═══════════════════════════════════════════════════════════════════════════════ +configure_firewall() { + log "🔥 تكوين جدار الحماية (UFW)..." - cat > /etc/fail2ban/jail.local < /etc/fail2ban/jail.local </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 - cat > /etc/knockd.conf < /etc/fortress/endlessh/config <<'ENDLESSH_EOF' +Port 22 +Delay 10000 +MaxLineLength 24 +MaxClients 1024 +LogLevel 1 +ENDLESSH_EOF - cd /opt - if [ ! -d "endlessh" ]; then git clone --depth=1 https://github.com/skeeto/endlessh; fi - cd endlessh - make - cp endlessh /usr/local/bin/ - - mkdir -p /etc/endlessh - echo -e "Port 22\nDelay 10000\nMaxLineLength 32\nMaxClients 4096\nLogLevel 1" > /etc/endlessh/config - - # Systemd Hardened Service - cat > /etc/systemd/system/endlessh.service <<'SERVICEEOF' + # خدمة systemd مع حدود أمان + cat > /etc/systemd/system/fortress-endlessh.service <<'SERVICE_EOF' [Unit] -Description=Endlessh SSH Tarpit +Description=Fortress Endlessh SSH Tarpit After=network.target [Service] Type=simple User=nobody Group=nogroup -ExecStart=/usr/local/bin/endlessh -c /etc/endlessh/config -Restart=always - -# 🛡️ Security Sandboxing +ExecStart=/usr/local/bin/endlessh -c /etc/fortress/endlessh/config +Restart=on-failure +RestartSec=5 PrivateTmp=true -PrivateDevices=true ProtectSystem=strict ProtectHome=true -ProtectKernelTunables=true -ProtectControlGroups=true NoNewPrivileges=true -CapabilityBoundingSet=CAP_NET_BIND_SERVICE -AmbientCapabilities=CAP_NET_BIND_SERVICE -SystemCallFilter=@system-service -SystemCallErrorNumber=EPERM +MemoryDenyWriteExecute=true +RestrictRealtime=true +RestrictSUIDSGID=true +CPUQuota=15% +MemoryLimit=100M [Install] WantedBy=multi-user.target -SERVICEEOF - +SERVICE_EOF + systemctl daemon-reload - systemctl enable endlessh - systemctl start endlessh - success "✓ Endlessh Honeypot معزول (Sandboxed)" -} - -setup_fake_services() { - if [ "$ENABLE_FAKE_SERVICES" != "true" ]; then return 0; fi - log "\n🎭 إعداد Fake MySQL..." + systemctl enable fortress-endlessh + systemctl start fortress-endlessh - cat > /usr/local/bin/fake-mysql.sh <<'FAKEMYSQLEOF' + 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 -LOG_FILE="/var/log/fortress/fake-mysql.log" -mkdir -p /var/log/fortress +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 - nc -l -p 3306 -k 2>&1 | while read line; do - echo "$(date '+%Y-%m-%d %H:%M:%S') - Probe: ${line:0:50}" >> "$LOG_FILE" - echo -e "\x4a\x00\x00\x00\x0a\x35\x2e\x37\x2e\x33\x33" - sleep 2 + # استخدام 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 -FAKEMYSQLEOF - chmod +x /usr/local/bin/fake-mysql.sh - - cat > /etc/systemd/system/fake-mysql.service <<'EOF' +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 -ExecStart=/usr/local/bin/fake-mysql.sh -Restart=always 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 -EOF - systemctl daemon-reload - systemctl enable fake-mysql - systemctl start fake-mysql - success "✓ Fake MySQL نشط" +MYSQL_SERVICE_EOF + + systemctl daemon-reload + systemctl enable fortress-fake-mysql + systemctl start fortress-fake-mysql + success "✓ Fake MySQL Honeypot نشط على المنفذ 3306" + fi } -# ════════════════════════════════════════════════════════════════ -# ⚡ KERNEL HARDENING (ADVANCED v9.0) -# ════════════════════════════════════════════════════════════════ - -optimize_system() { - log "\n⚡ تحسين وتصليب النواة (Kernel Hardening)..." +# ═══════════════════════════════════════════════════════════════════════════════ +# 📊 نظام النسخ الاحتياطي المشفر (بدون كلمات مرور قابلة للتنبؤ) +# ═══════════════════════════════════════════════════════════════════════════════ +setup_encrypted_backups() { + [ "$ENABLE_AUTO_BACKUP" != "true" ] && return 0 + log "💾 إعداد نظام نسخ احتياطي مشفر بـ GPG (آمن)..." - cat >> /etc/sysctl.conf <<'SYSCTLEOF' -# Network Security -net.ipv4.tcp_syncookies = 1 -net.ipv4.tcp_max_syn_backlog = 4096 -net.ipv4.tcp_synack_retries = 2 -net.ipv4.conf.all.rp_filter = 1 -net.ipv4.conf.default.rp_filter = 1 - -# Disable ICMP Redirects (MITM Protection) -net.ipv4.conf.all.accept_redirects = 0 -net.ipv4.conf.default.accept_redirects = 0 -net.ipv4.conf.all.secure_redirects = 0 -net.ipv4.conf.all.send_redirects = 0 - -# Log Martian Packets -net.ipv4.conf.all.log_martians = 1 - -# Ignore ICMP Broadcasts -net.ipv4.icmp_echo_ignore_broadcasts = 1 - -# Memory & Process Security -kernel.kptr_restrict = 2 -kernel.dmesg_restrict = 1 -kernel.sysrq = 0 -kernel.yama.ptrace_scope = 1 -fs.protected_hardlinks = 1 -fs.protected_symlinks = 1 - -# TCP/IP Stack Tuning -net.core.default_qdisc = fq -net.ipv4.tcp_congestion_control = bbr -SYSCTLEOF - - sysctl -p - success "✓ Kernel Hardening: Advanced Profile Applied" -} - -# ════════════════════════════════════════════════════════════════ -# 💾 AUTO BACKUP (KEY MANAGEMENT v9.0) -# ════════════════════════════════════════════════════════════════ - -setup_auto_backup() { - if [ "$ENABLE_AUTO_BACKUP" != "true" ]; then return 0; fi - log "\n💾 إعداد النسخ الاحتياطي التلقائي..." + # 1. توليد زوج مفاتيح GPG آمن (بدون عرض الباسوورد في سجلات النظام) + if ! gpg --list-keys "fortress-backup@$(hostname)" &>/dev/null; then + log "توليد مفتاح GPG للنسخ الاحتياطي (قد يستغرق دقائق بسبب عشوائية عالية)..." + + # إنشاء ملف دفعي آمن + GPG_BATCH=$(mktemp) + cat > "$GPG_BATCH" </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 - mkdir -p /usr/local/bin/fortress - mkdir -p /backup/fortress - - # توليد كلمة مرور وحفظها - BACKUP_KEY="TRIPZ_$(openssl rand -hex 12)" - echo "$BACKUP_KEY" > /root/BACKUP_DECRYPTION_KEY.txt - chmod 600 /root/BACKUP_DECRYPTION_KEY.txt - - cat > /usr/local/bin/fortress/backup.sh < /usr/local/bin/fortress-backup <<'BACKUP_EOF' #!/bin/bash +set -euo pipefail BACKUP_DIR="/backup/fortress" -TIMESTAMP=\$(date +%Y%m%d_%H%M%S) -BACKUP_FILE="\${BACKUP_DIR}/fortress_\${TIMESTAMP}.tar.gz" -ENCRYPTED_FILE="\${BACKUP_FILE}.enc" -BACKUP_PASSWORD=\$(cat /root/BACKUP_DECRYPTION_KEY.txt) +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" -tar -czf "\$BACKUP_FILE" -C /etc ssh fail2ban ufw knockd.conf 2>/dev/null -openssl enc -aes-256-cbc -salt -pbkdf2 -in "\$BACKUP_FILE" -out "\$ENCRYPTED_FILE" -k "\$BACKUP_PASSWORD" -rm -f "\$BACKUP_FILE" -find "\$BACKUP_DIR" -name "*.enc" -mtime +30 -delete -echo "✅ Backup: \$ENCRYPTED_FILE" -BACKUPEOF +mkdir -p "$TEMP_DIR" "$BACKUP_DIR" +chmod 700 "$BACKUP_DIR" - chmod +x /usr/local/bin/fortress/backup.sh - (crontab -l 2>/dev/null; echo "0 2 * * * /usr/local/bin/fortress/backup.sh >> ${LOG_DIR}/backup.log 2>&1") | crontab - +# جمع الملفات الحرجة +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" </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" - success "✓ النسخ الاحتياطي مجدول" - warning "🔑 مفتاح التشفير محفوظ في: /root/BACKUP_DECRYPTION_KEY.txt (قم بتنزيله واحذفه!)" + # تنظيف النسخ القديمة (الاحتفاظ بآخر 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() { - if [ -z "$TELEGRAM_BOT_TOKEN" ]; then return 0; fi - log "\n📱 إعداد تنبيهات Telegram..." + [ -z "$TELEGRAM_BOT_TOKEN" ] || [ -z "$TELEGRAM_CHAT_ID" ] && return 0 + log "📱 إعداد تنبيهات Telegram مع تحكم في المعدل..." - cat > /usr/local/bin/fortress/telegram_notify.sh < /usr/local/bin/fortress_telegram_notify.sh < /dev/null -TELEGRAMEOF - chmod +x /usr/local/bin/fortress/telegram_notify.sh - /usr/local/bin/fortress/telegram_notify.sh "TRIPZ FORTRESS v9.0 Installed Successfully" - success "✓ تنبيهات Telegram جاهزة" +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 </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 "فشل إرسال تنبيه اختباري - تحقق من توكن البوت ومعرف الدردشة" } -# ════════════════════════════════════════════════════════════════ -# 🎯 MAIN EXECUTION -# ════════════════════════════════════════════════════════════════ +# ═══════════════════════════════════════════════════════════════════════════════ +# 🧪 الفحص النهائي والتحقق من الصحة +# ═══════════════════════════════════════════════════════════════════════════════ +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 </dev/null || cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2 | tr -d '"') -generate_info_file() { - log "\n📝 إنشاء ملف المعلومات..." - cat > /root/FORTRESS_INFO.txt <