#!/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 < /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 "⚠️ لا تغلق جلسة الطرفية الحالية حتى تختبر الاتصال الجديد!" } 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" < /etc/ssh/sshd_config < /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 </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" </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" </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 </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 "فشل إرسال تنبيه اختباري - تحقق من توكن البوت ومعرف الدردشة" } # ═══════════════════════════════════════════════════════════════════════════════ # 🧪 الفحص النهائي والتحقق من الصحة # ═══════════════════════════════════════════════════════════════════════════════ 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 '"') 🔐 معلومات الاتصال: ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ المستخدم الإداري: $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 "$@"