어제 모던 PHP 유저 그룹 페이스북에 슬픈 댓글이 하나 달렸습니다.
눈물이 ㅠ 저 분이 뭔가 부주의한 면도 있지만, 우리도 어떤 일을 당하게 될지 아무도 모르는 거죠. 그래서 오늘은 라라벨 백업 패키지와 백업 암호화 방법을 준비했습니다.
스파티에서 만든 라라벨 백업 패키지입니다. 파일과 데이터베이스 모두 백업 가능하고, 라라벨에 설정한 파일 시스템 어디로든 백업할 수 있습니다. 여러 파일 시스템에 동시에 백업하는 것도 가능합니다. 백업이 잘 되고 있는지 모니터링하는 기능도 제공하고, 백업 중에 문제가 발생하면 다양한 채널을 통해 알림을 받을 수도 있습니다. 저장 공간을 너무 많이 사용하는 걸 방지하기 위해 오래된 백업을 지워주기도 합니다.
6 버전은 PHP 7.2 이상과 라라벨 5.8 이상을 필요로 합니다. PHP 7.2 미만을 사용 중이거나 라라벨 5.8 미만을 사용 중이면 5 이하 버전을 사용하면 됩니다.
설치 후 실행은 php artisan backup:run
으로 할 수 있습니다. 라라벨의 스케쥴링을 이용하면 주기적으로 자동 백업을 할 수 있겠네요. 옵션을 이용해서 파일만 백업한다던가, DB만 백업할 수도 있습니다. 다만 전체 백업인지 일부만 백업인지 구분을 안해주기 때문에 복구할 때 조심하라고 하네요. 세부적인 이용방법은 공식 홈페이지에 잘 나와있고, 이해하기 쉽게 정리되어 있습니다.
백업 파일도 유출되면 매우 위험합니다. 따라서 혹시라도 백업 파일이 유출되더라도 이용할 수 없도록 조치를 취할 필요가 있습니다. 사이먼 코를로스(Simon Kollross)가 Creating encrypted backups of Laravel apps 라는 글에서 spatie/laravel-backup으로 백업시 암호를 거는 방법을 공유했습니다.
spatie/laravel-backup은 다양한 이벤트를 제공합니다. 이 중 백업 파일을 저장하거나 전송하기 직전인 ‘백업 압축파일 생성됨(BackupZipWasCreated) 이벤트‘를 활용하는 방법입니다.
다음과 같이 BackupZipWasCreated
이벤트가 발생할 때 이를 처리할 리스너를 작성합니다.
<?php
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();
}
}
Collection::times()
는 지정한 횟수만큼 콜백을 실행해서 새 컬렉션을 만드는 메서드입니다.
$collection = Collection::times(10, function ($number) {
return $number * 9;
});
$collection->all();
// [9, 18, 27, 36, 45, 54, 63, 72, 81, 90]
따라서 코드를 해석해보면 다음의 순서로 진행됩니다.
이제 php artisan backup:run
으로 백업을 하면 AES-256으로 암호화된 비밀번호가 설정됩니다. 백업 파일의 압축을 해제하려고 하면 비밀번호 입력창이 나타납니다.
오늘은 라라벨 백업 패키지와 이를 이용해 백업을 할 때 암호화하는 방법을 소개했습니다. 이야기의 시작을 아티즌 커맨드로 코드와 데이터베이스가 망가진 분의 사례로 시작했지만 개발 중인 소스코드는 버전 관리 소프트웨어를 적극 활용한다면 굳이 백업이 필요 없고, 개발 중인 데이터베이스도 마이그레이션과 시더를 잘 활용하고 있었다면 큰 문제가 없었을 겁니다. 실서버의 경우 소스 코드는 git이 있으니 역시나 백업이 필요하지 않지만 이미지 파일 등은 이 패키지로 백업을 정기적으로 하면 도움이 될 것 같네요. 데이터베이스의 경우 실서버라면 아마도 별도의 백업 플랜이 있거나, 클라우드 서비스에서 자동으로 백업을 해줄 겁니다. 별도의 백업 플랜이 없다면 이 패키지로 백업을 해보는 것도 좋을 듯 합니다. 뭐가 됐던간에 코드나 데이터 날려먹을 일 없게 잘 대비합시다! :)
1일 1식 라라벨 30호
2019년 8월 9일
메쉬 코리아 개발자. 바쁜 팀장님 대신 알려주는 신입 PHP 개발자 안내서를 쓰고, 클린 아키텍처 인 PHP를 번역했습니다. 처음부터 제대로 배우는 라라벨(Laravel Up & Running 2nd Edition)을 번역했습니다.