Как защитить сервер от эксплойтов

1. Подготовка и обновление базовой системы (Ubuntu)

Перед настройкой защиты Minecraft-сервера приведите хост-систему в актуальное состояние. Выполняйте команды под пользователем с sudo (обычно root или созданный при заказе пользователь).

  1. Обновите списки пакетов и систему:
    apt update && apt upgrade -y
    
  2. Установите базовые утилиты для безопасности и мониторинга:
    apt install -y ufw fail2ban unattended-upgrades auditd logrotate curl wget gnupg2 software-properties-common
    
  3. Настройте автоматические обновления безопасности:
    dpkg-reconfigure --priority=low unattended-upgrades
    
    В диалоге выберите Yes. Отредактируйте /etc/apt/apt.conf.d/50unattended-upgrades, раскомментируйте строку "${distro_id}:${distro_codename}-security";.

2. Настройка SSH и доступа к панели proxify.cloud

Панель proxify.cloud (Proxmox) предоставляет KVM-консоль (VNC/NoVNC). Используйте её, если потеряете SSH-доступ после настройки фаервола.

  1. Создайте отдельного пользователя для управления сервером (не root):
    adduser mcadmin
    usermod -aG sudo mcadmin
    
  2. Настройте SSH-ключи для mcadmin (на локальной машине: ssh-keygen -t ed25519, затем ssh-copy-id mcadmin@<IP_СЕРВЕРА>).
  3. Жестко настройте /etc/ssh/sshd_config:
    Port 2222                          # Смените стандартный порт
    PermitRootLogin no                 # Запрет входа root
    PubkeyAuthentication yes           # Только ключи
    PasswordAuthentication no          # Запрет паролей
    AuthenticationMethods publickey    # Только публичный ключ
    AllowUsers mcadmin                 # Только конкретный пользователь
    MaxAuthTries 3
    ClientAliveInterval 300
    ClientAliveCountMax 2
    
  4. Проверьте конфиг и перезапустите:
    sshd -t && systemctl reload sshd
    
    Важно: Не закрывайте текущую сессию. Откройте новую вкладку и проверьте вход по ключу на порту 2222.

3. Настройка UFW (Uncomplicated Firewall)

Блокируйте всё входящее, кроме явно разрешенного. Панель proxify.cloud не требует открытых портов на Ubuntu для своей работы (управление идет через Proxmox API/панель).

  1. Политика по умолчанию:
    ufw default deny incoming
    ufw default allow outgoing
    ufw default deny routed
    
  2. Разрешите SSH (новый порт), Minecraft (игровой порт) и RCON (если используется, только для локальной сети/VPN):
    ufw allow 2222/tcp comment 'SSH Admin Access'
    ufw allow 25565/tcp comment 'Minecraft Game Port'
    # ufw allow from 10.0.0.0/8 to any port 25575 proto tcp comment 'RCON Internal/VPN Only'
    
  3. Включите логирование и фаервол:
    ufw logging medium
    ufw enable
    ufw status verbose
    

4. Жесткая настройка ядра и сети (sysctl)

Создайте файл /etc/sysctl.d/99-minecraft-hardening.conf для защиты от сетевых атак (SYN flood, IP spoofing, ICMP redirect):

cat << 'EOF' > /etc/sysctl.d/99-minecraft-hardening.conf
# IPv4 Hardening
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_rfc1337 = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# IPv6 Hardening (если не используется — отключите полностью через grub, иначе настройте аналогично)
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_source_route = 0
net.ipv6.conf.default.accept_source_route = 0

# Kernel Hardening
kernel.kptr_restrict = 2
kernel.dmesg_restrict = 1
kernel.yama.ptrace_scope = 1
vm.mmap_rnd_bits = 32
vm.mmap_rnd_compat_bits = 16
fs.protected_hardlinks = 1
fs.protected_symlinks = 1
EOF

Примените настройки:

sysctl --system

5. Настройка Fail2Ban для защиты SSH и Minecraft

Fail2Ban блокирует IP после неудачных попыток. Настраиваем под Minecraft (логи Paper/Spigot/Purpur).

  1. Создайте /etc/fail2ban/jail.local:
    cat << 'EOF' > /etc/fail2ban/jail.local
    [DEFAULT]
    bantime = 1h
    findtime = 10m
    maxretry = 3
    backend = systemd
    action = %(action_mwl)s
    ignoreip = 127.0.0.1/8 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 <ВАШ_СТАТИЧЕСКИЙ_IP>
    
    [sshd]
    enabled = true
    port = 2222
    filter = sshd
    logpath = %(sshd_log)s
    maxretry = 3
    
    [minecraft-auth]
    enabled = true
    port = 25565
    protocol = tcp
    filter = minecraft-auth
    logpath = /opt/minecraft/server/logs/latest.log
    maxretry = 5
    bantime = 30m
    
    [minecraft-exploit]
    enabled = true
    port = 25565
    protocol = tcp
    filter = minecraft-exploit
    logpath = /opt/minecraft/server/logs/latest.log
    maxretry = 1
    bantime = 1d
    EOF
    
  2. Создайте фильтр для брутфорса авторизации /etc/fail2ban/filter.d/minecraft-auth.conf:
    [Definition]
    failregex = ^.*\[User Authenticator #\d+/INFO\]: UUID of player .* is .* \(.*\)$
                ^.*\[Netty Server IO #\d+/ERROR\]: Failed to verify username.*<HOST>.*
                ^.*\[Server thread/WARN\]: Failed to handle packet for .*: .*<HOST>.*
    ignoreregex =
    
  3. Создайте фильтр для эксплойтов (логирование плагинами типа NoCheatPlus, AAC, Matrix или патчами Paper) /etc/fail2ban/filter.d/minecraft-exploit.conf:
    [Definition]
    failregex = ^.*\[(WARN|ERROR)\].*(Illegal|Invalid|Exploit|Crash|Overflow|Malformed|Cheat|Hack|Suspicious).*<HOST>.*
                ^.*\[AntiCheat\].*Violation.*<HOST>.*
    ignoreregex =
    
  4. Перезапустите и проверьте:
    systemctl enable --now fail2ban
    fail2ban-client status
    fail2ban-client status minecraft-auth
    

6. Изоляция Minecraft-сервера через systemd (Sandboxing)

Запускайте сервер от отдельного пользователя mcuser без прав sudo с жесткими ограничениями systemd.

  1. Создайте пользователя и директории:
    adduser --system --group --home /opt/minecraft --shell /bin/false mcuser
    mkdir -p /opt/minecraft/server/{world,plugins,mods,logs,backups}
    chown -R mcuser:mcuser /opt/minecraft
    chmod 750 /opt/minecraft/server
    
  2. Создайте юнит /etc/systemd/system/minecraft.service:
    [Unit]
    Description=Minecraft Paper Server
    After=network.target
    StartLimitIntervalSec=60
    StartLimitBurst=3
    
    [Service]
    Type=simple
    User=mcuser
    Group=mcuser
    WorkingDirectory=/opt/minecraft/server
    ExecStart=/usr/bin/java -Xms4G -Xmx4G -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -jar paper-1.21.1.jar nogui
    Restart=on-failure
    RestartSec=10
    TimeoutStopSec=60
    
    # === SECURITY HARDENING ===
    NoNewPrivileges=yes
    PrivateTmp=yes
    PrivateDevices=yes
    ProtectSystem=strict
    ProtectHome=yes
    ProtectKernelTunables=yes
    ProtectKernelModules=yes
    ProtectControlGroups=yes
    RestrictNamespaces=yes
    RestrictRealtime=yes
    RestrictSUIDSGID=yes
    LockPersonality=yes
    MemoryDenyWriteExecute=yes
    SystemCallFilter=@system-service
    SystemCallErrorNumber=EPERM
    CapabilityBoundingSet=CAP_DAC_OVERRIDE CAP_SETGID CAP_SETUID
    AmbientCapabilities=
    ReadWritePaths=/opt/minecraft/server
    ReadOnlyPaths=/opt/minecraft/server/plugins /opt/minecraft/server/mods
    # Ограничение ресурсов (DoS protection)
    LimitNOFILE=65535
    LimitNPROC=1024
    MemoryMax=6G
    CPUQuota=300%
    
    [Install]
    WantedBy=multi-user.target
    
    *Замените флаги Java и версию jar-файла на актуальные. Путь к Java: /usr/bin/java (провер