Безопасность бэкапов очень важна, особенно если вы работаете с конфиденциальными данными. Никто, кроме вас, не должен иметь возможность читать ваши резервные копии и вы должны быть уверены, что в случаем проблем не потеряете данные.
Всегда нужно шифровать резервные копии своих приложений и безопасным способом передавать их в одно или несколько мест для хранения.
Если вы шифруете бэкап на своем сервере и передаете на хостинг для хранения уже зашифрованную версию, то даже хостер бекапов не сможет их прочесть.
Я рекомендую вам выбрать другого хостера для хранения резервных копий, не того же, что и для продакшн-сервера. Если по какой-либо причине у вашего хостера возникнут проблемы, то вы все равно сможете получить доступ к бэкапам, чтобы восстановить работу приложения как можно быстрее.
Представляем 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
Перевод: Алексей Широков
Наш Телеграм-канал — следите за новостями о Laravel.