Создание шифрованных бэкапов

Создание шифрованных резервных копий в Ларавел

Безопасность бэкапов очень важна, особенно если вы работаете с конфиденциальными данными. Никто, кроме вас, не должен иметь возможность читать ваши резервные копии и вы должны быть уверены, что в случаем проблем не потеряете данные.

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

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

Представляем spatie/laravel-backup

Пакет lativel-backup от Spatie является идеальной отправной точкой для создания бэкапов вашего проекта на Laravel. Он создает снимок вашей базы данных и файлов вашего приложения и запаковывает их в ZIP-файл, который пересылается в указанное место для хранения. Пакет полностью конфигурируется, просто настройте его под свои нужды и используйте планировщик задач Laravel для создания регулярных бэкапов. Узнать больше о том, как настраивается пакет мы можете в документации.

Шифруйте бэкапы с помощью AES-256

Единственное, чего не хватает в этом пакете: шифрование. Но пакет запускает различные события, которые мы можем слушать, и добавить шифрование становится очень просто. Интересующее нас событие — BackupZipWasCreated. Оно запускается, как только создастся ZIP-файл с бэкапом, сразу перед его копированием в место назначения. По сути, идеальное время для шифрование файла.

Если вы имеете дело с конфиденциальными данными, то вам следует использовать безопасный алгоритм, например, такой как AES-256. К счастью, PHP 7.2 имеет встроенную поддержку шифрования в ZipArchive.

Давайте создадим слушателя события BackupZipWasCreated, который будет шифровать бэкап.

namespace App\Listeners;

use ZipArchive;
use Illuminate\Support\Collection;
use Spatie\Backup\Events\BackupZipWasCreated;

class EncryptBackupZip
{
    public function handle(BackupZipWasCreated $event)
    {
        $zip = new ZipArchive;
        $zip->open($event->pathToZip);
        $zip->setPassword(config('app.backup.password'));

        Collection::times($zip->numFiles, function ($i) use ($zip) {
            $zip->setEncryptionIndex($i - 1, ZipArchive::EM_AES_256);
        });

        $zip->close();
    }
}

Начиная с Laravel 5.8.9, вы можете использовать обнаружение событий (Event Discovery), поэтому не нужно регистрировать слушателя вручную в EventServiceProvider. Просто объявите тип события, которое надо прослушивать и Laravel все сделает сам.

Я вынес пароль для бэкапов в переменную .env, которая доступна через config(‘app.backup.password’). Ваш пароль не используется для шифрования напрямую. Он передается в функцию вывода ключа, которая генерирует 32-х байтный ключ, необходимый для шифрования AES-256. Только добавьте достаточно энтропии к паролю.

Теперь, когда у нас все готово, мы можем запустить php artisan backup:run. Чтобы убедиться, что шифрование работает правильно, попробуйте открыть файл резервной копии — у вас должны спросить пароль.

Запомните свой свой пароль и храните его в безопасности. Если вы его потеряете, то не сможете расшифровать свои бэкапы и потеряете данные навсегда!

Я надеюсь, вам понравилась эта статья. Защита данных это не так сложна, как кажется, но отнеситесь к ней серьезно и начните с малого.

 

Автор: Simon Kollross
Перевод: Demiurge Ash