Предлагается использовать внешние жесткие диски с питанием от умной розетки для защиты от ransomware. Это разумное предложение, так как физическое отключение питания делает диск недоступным для атак.

Основные моменты, которые нужно осветить:

  1. Преимущества такого подхода: полная физическая изоляция, простота реализации, низкая стоимость.

  2. Технические детали: как правильно выбрать и настроить оборудование, какие скрипты использовать для автоматизации.

  3. Важные нюансы: задержки при включении/выключении, безопасное извлечение диска, мониторинг состояния.

Нужно дать практические рекомендации по выбору умной розетки и внешнего диска, а также примеры скриптов для автоматизации процесса. Особое внимание следует уделить безопасности: как избежать повреждения диска при частых отключениях питания и как обеспечить надежность бэкапа.

Также стоит предупредить о возможных проблемах: Wi-Fi соединение, совместимость программного обеспечения, необходимость регулярного тестирования восстановления.

 

Это эффективный способ физической изоляции диска от ransomware. Рассмотрим все аспекты реализации:

1. Типы внешних HDD и их совместимость

A. Диски с отдельным блоком питания (рекомендуется)

text
220В → Умная розетка → Блок питания HDD (12V/2A) → HDD

Преимущества:

  • Меньше нагрузки на USB-порт компьютера

  • Более стабильное питание

  • Можно использовать диски 3.5" (которые требуют отдельного питания)

Популярные модели:

  • WD Elements Desktop (3.5")

  • Seagate Expansion Desktop (3.5")

  • Toshiba Canvio Desktop

  • Любой внутренний HDD + внешний бокс (например, Orico 3528US3)

B. Диски с питанием от USB

text
USB-порт компьютера → Y-кабель (2 USB) → HDD
           ↓
      Умная розетка → USB-хаб с питанием

Решение для портативных дисков:

  1. Подключите диск к USB-хабу с внешним питанием

  2. Хаб подключите к умной розетке

  3. При отключении розетки хаб и диск обесточиваются

C. Диски с автономным питанием

  • HDD с аккумулятором (редко, обычно SSD)

  • Сетевые хранилища (NAS) с поддержкой Wake-on-LAN

2. Схемы подключения

Схема 1: Простая (для одного диска)

text
Розетка 220В → Умная розетка (Shelly/Tapo)
                      ↓
           Блок питания HDD → Внешний HDD 3.5"
                      ↓
           USB-кабель → Компьютер

Схема 2: Для нескольких дисков (ротация)

text
Розетка 220В → Умной удлинитель (4 розетки)
    ├→ Розетка 1 → HDD для бэкапа 1
    ├→ Розетка 2 → HDD для бэкапа 2  
    ├→ Розетка 3 → HDD для бэкапа 3
    └→ Розетка 4 → Резерв

Схема 3: С ИБП для компьютера

text
Сеть 220В → ИБП → Компьютер + Wi-Fi роутер
          ↓
    Умная розетка → HDD

Важно: Wi-Fi роутер должен оставаться под питанием для управления розеткой!

3. Автоматизация процесса бэкапа

Полный PowerShell скрипт:

powershell
# Backup-With-SmartPlug.ps1
param(
    [string]$PlugIP = "192.168.1.100",
    [string]$DriveLetter = "E",
    [int]$PowerOnDelay = 45,
    [int]$RetryCount = 3
)

# Функции управления
function Invoke-ShellyCommand {
    param($Action)
    $url = "http://$PlugIP/relay/0?turn=$Action"
    return (Invoke-RestMethod -Uri $url -Method Get -TimeoutSec 5).ison
}

function Test-DriveReady {
    param([string]$Letter)
    $path = "${Letter}:\"
    if (Test-Path $path) {
        # Пробуем записать тестовый файл
        $testFile = Join-Path $path "test_$(Get-Random).tmp"
        try {
            [System.IO.File]::WriteAllText($testFile, "test")
            Remove-Item $testFile -Force
            return $true
        } catch { return $false }
    }
    return $false
}

function Safe-EjectDrive {
    param([string]$Letter)
    # 1. Закрыть все открытые файлы на диске
    $handleOutput = & "C:\SysInternals\handle64.exe" -p explorer.exe -a -nobanner | Select-String $Letter
    if ($handleOutput) { Stop-Process -Name explorer -Force }
    
    # 2. Удалить букву диска
    $disk = Get-WmiObject Win32_LogicalDisk | Where-Object {$_.DeviceID -eq "${Letter}:"}
    if ($disk) {
        $diskPartScript = @"
select volume ${Letter}
remove letter=${Letter}
exit
"@
        $diskPartScript | diskpart.exe | Out-Null
    }
    
    # 3. Остановить USB-устройство
    $device = Get-PnpDevice | Where-Object {$_.FriendlyName -like "*USB Mass Storage*"} | Select-Object -First 1
    if ($device) { Disable-PnpDevice -InstanceId $device.InstanceId -Confirm:$false }
}

# Основной процесс
Write-Host "=== Управляемый бэкап через умную розетку ===" -ForegroundColor Cyan

# ШАГ 0: Проверяем, что диск не подключен
if (Test-DriveReady -Letter $DriveLetter) {
    Write-Host "ВНИМАНИЕ: Диск $DriveLetter уже подключен!" -ForegroundColor Red
    Write-Host "Отключаем для безопасной процедуры..." -ForegroundColor Yellow
    Safe-EjectDrive -Letter $DriveLetter
    Start-Sleep -Seconds 10
}

# ШАГ 1: Включаем питание диска
Write-Host "`n[1/5] Включаем умную розетку..." -ForegroundColor Yellow
$plugState = Invoke-ShellyCommand -Action "on"
if ($plugState -ne $true) {
    throw "Не удалось включить розетку"
}

# ШАГ 2: Ждем инициализации диска
Write-Host "`n[2/5] Ожидание диска ($PowerOnDelay сек)..." -ForegroundColor Yellow
Start-Sleep -Seconds $PowerOnDelay

$retry = 0
while ($retry -lt $RetryCount) {
    if (Test-DriveReady -Letter $DriveLetter) {
        Write-Host "Диск $DriveLetter готов к работе" -ForegroundColor Green
        break
    }
    $retry++
    Write-Host "Попытка $retry/$RetryCount..." -ForegroundColor Gray
    Start-Sleep -Seconds 10
}

if (-not (Test-DriveReady -Letter $DriveLetter)) {
    Write-Host "Диск не обнаружен. Отключаем розетку." -ForegroundColor Red
    Invoke-ShellyCommand -Action "off" | Out-Null
    throw "Диск не инициализировался"
}

# ШАГ 3: Выполняем бэкап
Write-Host "`n[3/5] Выполняем резервное копирование..." -ForegroundColor Green
try {
    # Ваша команда бэкапа здесь
    $backupDest = "${DriveLetter}:\Backup_$(Get-Date -Format 'yyyy-MM-dd')"
    New-Item -Path $backupDest -ItemType Directory -Force | Out-Null
    
    # Пример: копирование важных папок
    $sources = @("C:\Users\$env:USERNAME\Documents", "C:\Users\$env:USERNAME\Pictures")
    foreach ($src in $sources) {
        if (Test-Path $src) {
            Write-Host "Копирую $src..." -ForegroundColor Gray
            Copy-Item -Path "$src\*" -Destination $backupDest -Recurse -Force
        }
    }
    
    # Или запуск вашей программы бэкапа
    # Start-Process "C:\BackupSoftware\backup.exe" -Wait -NoNewWindow
    
    Write-Host "Бэкап завершен успешно" -ForegroundColor Green
} catch {
    Write-Host "Ошибка при бэкапе: $_" -ForegroundColor Red
}

# ШАГ 4: Безопасное отключение диска
Write-Host "`n[4/5] Безопасное отключение диска..." -ForegroundColor Yellow
Safe-EjectDrive -Letter $DriveLetter
Start-Sleep -Seconds 15  # Ждем завершения всех операций записи

# ШАГ 5: Отключаем питание
Write-Host "`n[5/5] Отключаем умную розетку..." -ForegroundColor Yellow
$plugState = Invoke-ShellyCommand -Action "off"
if ($plugState -ne $false) {
    Write-Host "Предупреждение: Розетка может остаться включенной" -ForegroundColor Magenta
}

Write-Host "`n=== Процедура завершена ===" -ForegroundColor Cyan

# Проверяем, что диск действительно отключился
if (Test-DriveReady -Letter $DriveLetter) {
    Write-Host "ВНИМАНИЕ: Диск все еще доступен!" -ForegroundColor Red
} else {
    Write-Host "Диск успешно отключен и физически обесточен" -ForegroundColor Green
}

4. Интеграция с популярным ПО

Для Veeam Agent:

xml
<!-- Настройки pre-job и post-job скриптов в Veeam -->
<PreScript>C:\Scripts\power_on_drive.ps1</PreScript>
<PostScript>
    <Script>C:\Scripts\safe_eject.ps1</Script>
    <Timeout>300</Timeout>
    <SuccessReturnCodes>0</SuccessReturnCodes>
</PostScript>

Для Duplicati:

json
// В настройках JSON Duplicati:
"run-script-before": "powershell.exe -File C:\\Scripts\\power_on.ps1",
"run-script-after": "powershell.exe -File C:\\Scripts\\power_off.ps1",
"run-script-timeout": 600

Для Bacula/BackupPC:

bash
#!/bin/bash
# Bacula Director configuration
Job {
  Name = "Backup_With_SmartPlug"
  Client = "filedaemon-fd"
  PreJobScript = "/scripts/power_on.sh"
  PostJobScript = "/scripts/power_off.sh"
}

5. Готовые решения и устройства

A. Комплекты "всё включено":

  1. QNAP TR-004 + QNAP Smart Plug — NAS с поддержкой управления питанием

  2. Synology DS120j + WiFi Plug — аналогичное решение

  3. WD My Cloud Home + Smart Plug — облачный диск с локальным контролем

B. Специализированные контроллеры:

arduino
// Arduino-контроллер для управления питанием
#include <Ethernet.h>
#include <SD.h>

#define RELAY_PIN 7
#define STATUS_LED 13

void setup() {
  pinMode(RELAY_PIN, OUTPUT);
  pinMode(STATUS_LED, OUTPUT);
  digitalWrite(RELAY_PIN, LOW); // Выключено по умолчанию
  
  // Ждем сигнал от компьютера по Ethernet
  if (waitForBackupSignal()) {
    digitalWrite(RELAY_PIN, HIGH);
    delay(30000); // 30 секунд на инициализацию диска
    sendReadySignal();
  }
}

void loop() {
  // Мониторим температуру диска
  float temp = readHDDTemperature();
  if (temp > 50) { // Если перегрев
    digitalWrite(RELAY_PIN, LOW);
    emergencyShutdown();
  }
}

6. Важные технические нюансы

A. Задержки и тайминги:

powershell
# Оптимальные задержки для разных дисков:
$delays = @{
    "SSD" = 10  # секунд
    "HDD_2.5" = 20
    "HDD_3.5" = 45
    "RAID_Array" = 90
}

# Факторы, влияющие на время инициализации:
# 1. Самодиагностика диска (SMART) - 5-10 сек
# 2. Раскрутка пластин (HDD) - 5-15 сек
# 3. Инициализация USB-контроллера - 2-5 сек
# 4. Монтирование файловой системы - 1-3 сек

B. Мониторинг здоровья диска:

powershell
# Проверка SMART перед бэкапом
function Test-HDDHealth {
    param([string]$DriveLetter)
    
    # Используем smartctl (требует установки smartmontools)
    $smart = & "C:\smartmontools\smartctl.exe" -a ("\\.\" + $DriveLetter + ":") 
    
    if ($smart -match "SMART overall-health self-assessment test result: PASSED") {
        return $true
    } else {
        # Логируем ошибку и не включаем диск
        Add-Content -Path "C:\BackupLogs\health.log" -Value "$(Get-Date): Диск $DriveLetter не прошел проверку SMART"
        return $false
    }
}

7. Расширенные сценарии

Сценарий 1: Ротация 4 дисков по дням недели

powershell
$dayOfWeek = (Get-Date).DayOfWeek
$diskMap = @{
    "Monday"    = @{IP="192.168.1.101"; Letter="E"}
    "Tuesday"   = @{IP="192.168.1.102"; Letter="F"}
    "Wednesday" = @{IP="192.168.1.103"; Letter="G"}
    "Thursday"  = @{IP="192.168.1.104"; Letter="H"}
    "Friday"    = @{IP="192.168.1.101"; Letter="E"} # Начало новой ротации
}

$today = $diskMap[$dayOfWeek.ToString()]
.\Backup-With-SmartPlug.ps1 -PlugIP $today.IP -DriveLetter $today.Letter

Сценарий 2: Резервное копирование при обнаружении ransomware

powershell
# Мониторинг событий безопасности
$query = @"
SELECT * FROM __InstanceModificationEvent WITHIN 2 
WHERE TargetInstance ISA 'Win32_Process' 
AND TargetInstance.Name LIKE '%crypt%'
OR TargetInstance.CommandLine LIKE '%vssadmin%'
"@

Register-CimIndicationEvent -Query $query -Action {
    # Немедленно отключаем все диски бэкапа
    $plugs = @("192.168.1.100", "192.168.1.101", "192.168.1.102")
    foreach ($plug in $plugs) {
        Invoke-RestMethod "http://$plug/relay/0?turn=off"
    }
    
    # Отправляем оповещение
    Send-MailMessage -To "Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript." -Subject "ALERT: Ransomware detected" -Body "Backup drives powered off"
}

8. Риски и ограничения

⚠️ Потенциальные проблемы:

  1. Частые включения/выключения сокращают срок службы HDD

  2. Сбой питания во время записи может повредить файловую систему

  3. Wi-Fi помехи могут нарушить управление розеткой

  4. Забытый включенный диск остается уязвимым

✅ Меры защиты:

powershell
# Дополнительные проверки в скрипте
function Add-SafetyMeasures {
    # 1. Проверка файловой системы при каждом включении
    chkdsk ${DriveLetter}: /f
    
    # 2. Ограничение частоты бэкапов (не чаще раза в день)
    $lastBackup = Get-ChildItem "C:\BackupLogs" | Sort-Object LastWriteTime | Select-Object -Last 1
    if ((New-TimeSpan -Start $lastBackup.LastWriteTime -End (Get-Date)).TotalHours -lt 24) {
        Write-Host "Слишком частый бэкап. Пропускаем." -ForegroundColor Yellow
        exit 0
    }
    
    # 3. Контроль температуры
    $temp = Get-HDDTemperature
    if ($temp -gt 45) {
        Write-Host "Диск перегрет: ${temp}°C" -ForegroundColor Red
        exit 1
    }
}

9. Альтернативные подходы

A. Диски с аппаратным выключателем:

  • ORICO 2.5/3.5 External Enclosure с кнопкой питания

  • Yottamaster FS2U3 — бокс с отдельным выключателем

B. USB-контроллеры с реле:

python
# Управление через USB-реле (например, NILETONG)
import usb.core
import usb.util

# Найти устройство
dev = usb.core.find(idVendor=0x16c0, idProduct=0x05df)
if dev is not None:
    dev.ctrl_transfer(0x21, 0x09, 0x0200, 0, [0xFF, 0x01])  # Включить
    # ... бэкап ...
    dev.ctrl_transfer(0x21, 0x09, 0x0200, 0, [0xFD, 0x01])  # Выключить

10. Рекомендации по реализации

  1. Для домашнего использования:

    • Shelly Plug S + WD Elements 4TB

    • Скрипт PowerShell с расписанием в Планировщике задач

    • Проверка раз в месяц восстановлением тестового файла

  2. Для малого бизнеса:

    • TP-Link Tapo P110 (с мониторингом энергии)

    • 2+ диска для ротации

    • Интеграция с существующим ПО бэкапа

  3. Для максимальной защиты:

    • Умная розетка + ИБП для нее

    • Диск с аппаратным шифрованием

    • Физический замок на корпусе диска

Итог: Внешние HDD с питанием от умной розетки — эффективное и недорогое решение для защиты бэкапов от ransomware. Ключевые факторы успеха: правильные задержки, безопасное извлечение и регулярное тестирование восстановления.