Files
servers_security_sys/tripz_fortress_v8.2_generator.sh
2026-02-05 14:46:08 +03:00

923 lines
45 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 "$@"