웹사이트 검색

Ubuntu에서 백업을 안전하게 자동화하기 위해 GPG와 함께 Duplicity를 사용하는 방법


소개

Duplicity는 다양한 전송 프로토콜과 타사 스토리지 솔루션을 구현할 수 있는 다용도 로컬 및 원격 백업 프로그램입니다.

이 가이드에서는 Ubuntu 12.04 VPS에 이중성을 설치하는 방법에 대해 설명합니다. 소스에서 설치한 다음 GPG 암호화를 활용하도록 구성합니다.

계속 진행하려면 백업할 Ubuntu 12.04 VPS와 SSH로 액세스할 수 있는 다양한 Linux 시스템 또는 VPS 등 두 대의 시스템에 액세스해야 합니다.

Ubuntu의 소스에서 Duplicity를 설치하는 방법

이 가이드에는 Ubuntu 12.04 VPS를 사용하고 있습니다. 기본 리포지토리의 duplicity 패키지는 오래되었으며 실제로 백엔드 변경으로 인해 원격 호스트에 연결하는 데 몇 가지 문제가 있습니다.

소스 파일을 가져와서 수동으로 설치하면 이러한 문제를 피할 수 있습니다.

백업할 Ubuntu 12.04 VPS에 루트로 로그인합니다.

전제 조건 패키지 설치

소스에서 duplicity를 설치하고 있지만 기본 Ubuntu 리포지토리에서 필수 구성 요소를 가져옵니다.

원본 데이터베이스를 업데이트한 다음 다음 두 명령을 사용하여 필요한 패키지를 설치합니다.

apt-get update
apt-get install ncftp python-paramiko python-pycryptopp lftp python-boto python-dev librsync-dev

이렇게 하면 데이터를 원격 컴퓨터로 전송하기 위한 다양한 핸들러가 설치됩니다. 우리는 이 가이드에서 이들 중 대부분을 사용하지 않을 것이지만, 가지고 있으면 좋은 옵션입니다.

소스에서 Duplicity 다운로드 및 설치

이중성 소스 파일은 launchpad.net에 있습니다. 루트 사용자의 홈 디렉토리에 다운로드합니다.

cd /root
wget http://code.launchpad.net/duplicity/0.6-series/0.6.22/+download/duplicity-0.6.22.tar.gz

소스의 압축을 풀고 생성된 패키지 디렉터리로 이동합니다.

tar xzvf duplicity*
cd duplicity*

다음으로 다음 명령으로 실제 설치를 완료합니다.

python setup.py install

이것은 소스에서 설치되는 패키지이므로 /usr/local/bin/ 디렉토리에 배치됩니다.

SSH 및 GPG 키 생성

우리의 이중성 구성은 두 가지 다른 종류의 키를 사용하여 편리함과 보안 사이의 좋은 교차점을 달성합니다.

SSH 키를 사용하여 암호를 제공하지 않고도 원격 시스템에 안전하게 인증할 것입니다. 또한 데이터를 백업 위치로 전송하기 전에 GPG를 사용하여 데이터를 암호화합니다.

SSH 키 생성

루트 사용자가 백업을 호스팅할 시스템에 암호 없이 로그인할 수 있도록 RSA 암호화 SSH 키를 생성합니다.

아직 수행하지 않은 경우 데이터를 전송할 시스템에 루트 암호가 구성되어 있는지 확인하십시오. 루트로 시스템에 로그인하고(VPS인 경우 SSH 또는 드롭릿 페이지의 콘솔 액세스 버튼을 통해) 다음 명령을 실행하여 이를 수행할 수 있습니다.

passwd

이중성이 있는 드롭릿으로 돌아가서 다음 명령을 사용하여 키 쌍을 생성합니다.

ssh-keygen -t rsa

프롬프트에서 Enter 키를 눌러 기본 설정으로 암호가 없는 SSH 키를 만듭니다.

다음 명령을 사용하여 백업을 호스팅할 시스템으로 전송합니다.

ssh-copy-id root@backupHost

확인되지 않은 호스트를 수락하려면 예라고 답한 다음 원격 시스템의 루트 비밀번호를 입력하여 공개 키를 전송하십시오.

이제 다음을 실행하여 duplicity droplet에서 암호 없이 로그인할 수 있는지 테스트합니다.

ssh root@backupHost

추가 자격 증명을 제공하지 않고 로그인해야 합니다.

SSH를 통해 로그인하는 동안 백업 파일을 보관할 디렉터리 구조를 만듭니다.

mkdir -p /remotebackup/duplicityDroplet

디렉터리 이름은 원하는 대로 지정할 수 있지만 나중에 지정할 수 있도록 값을 기억해 두십시오.

완료되면 duplicity droplet으로 다시 종료합니다.

exit

GPG 키 생성

추가 보안 및 암호화를 위해 GPG를 사용할 것입니다. 명령은 /root/.gnupg/의 숨겨진 디렉토리에 키를 저장합니다.

gpg --gen-key

키 쌍의 매개변수를 구성하는 일련의 질문을 받게 됩니다.

Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 
Key does not expire at all
Is this correct? (y/N) y

기본 "RSA 및 RSA\ 키를 수락하려면 Enter 키를 누르십시오. 만료 날짜 없이 기본 키 크기를 수락하려면 Enter 키를 다시 두 번 누르십시오.

매개변수를 확인하려면 y를 입력하십시오.

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Real name: Your Name
Email address: your_email@example.com
Comment: 
You selected this USER-ID:
    "Your Name <your_email@example.com>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o

이름, 이메일 주소를 입력하고 선택적으로 이 키와 관련된 설명을 입력합니다. 정보를 확인하려면 O를 입력하십시오.

다음으로 GPG에서 사용할 암호를 설정합니다. 암호가 백그라운드에서 작동하도록 기본적으로 허용하지 않는 SSH 키와 달리 데이터의 안전한 암호화 및 암호 해독을 허용하려면 이 단계에서 암호를 제공해야 합니다.

Enter passphrase:
Repeat passphrase:

이 시점에서 엔트로피를 생성하라는 메시지가 표시됩니다. 엔트로피는 기본적으로 시스템에 얼마나 많은 예측 불가능성이 있는지를 설명하는 단어입니다. VPS는 실제로 무작위인 키를 생성하기 위해 엔트로피가 필요합니다.

We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 280 more bytes)

엔트로피를 생성하는 데 도움이 필요한 경우 Haveged를 사용하여 엔트로피를 생성하는 방법에 대한 가이드가 있습니다. 내 경험상 apt에서 일부 패키지를 설치하는 것만으로도 필요한 엔트로피를 생성하기에 충분합니다. 이를 위해 새 터미널로 SSH를 연결합니다.

임의의 정보를 충분히 생성하면 키가 생성됩니다.

gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 05AB3DF5 marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
pub   2048R/05AB3DF5 2013-09-19
      Key fingerprint = AF21 2669 07F7 ADDE 4ECF  2A33 A57F 6998 05AB 3DF5
uid                  Your Name <your_email@example.com>
sub   2048R/32866E3B 2013-09-19

위에서 강조 표시된 부분은 공개 키 ID입니다. 나중에 전송할 데이터를 암호화하려면 이 정보가 필요합니다.

공개 키 ID를 기록하는 것을 잊은 경우 gpg 키링을 쿼리하여 다시 가져올 수 있습니다.

gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub   2048R/05AB3DF5 2013-09-19
uid                  Your Name <your_email@example.com>
sub   2048R/32866E3B 2013-09-19

이제 이중성을 사용하여 안전하게 백업하는 데 필요한 모든 구성 요소가 준비되었습니다.

이중성을 사용하는 방법

초기 테스트 실행

백업할 더미 파일 폴더를 생성하여 이중성 시스템의 초기 테스트를 실행합니다. 다음 명령을 실행합니다.

cd ~
mkdir test
touch test/file{1..100}

이렇게 하면 루트 홈 디렉토리에 test라는 디렉토리가 생성됩니다. 그런 다음 1-100까지 번호가 매겨진 파일로 디렉토리를 채웁니다.

먼저 생성한 GPG 키 없이 파일을 원격 서버로 이동합니다. ftp의 기능을 복제하는 SSH에 포함된 보안 프로토콜인 "sftp\를 사용합니다.

duplicity /root/test sftp://root@backupHost//remotebackup/duplicityDroplet

원격 호스트와 파일 경로 사이에 이중 슬래시가 있습니다. 이는 절대 경로를 지정하기 때문입니다. sftp가 우리를 넣는 기본 디렉토리의 상대 경로라면 슬래시 하나만 사용할 수 있습니다.

원격 호스트를 수락하라는 메시지가 표시되고 데이터를 암호화하는 데 사용할 키를 만들고 확인하라는 메시지가 표시됩니다. 보시다시피 GPG는 특별히 사용하지 말라고 지시하지 않는 한 여전히 사용됩니다. 유일한 차이점은 우리가 생성한 키를 사용하지 않고 여기에 암호를 입력할 수 있다는 것입니다.

Import of duplicity.backends.dpbxbackend Failed: No module named dropbox
The authenticity of host '162.243.2.14' can't be established.
SSH-RSA key fingerprint is 1f:4b:ae:1c:43:91:aa:2b:04:5b:a4:8e:cd:ea:e6:60.
Are you sure you want to continue connecting (yes/no)? yes
Local and Remote metadata are synchronized, no sync needed.
Last full backup date: none
GnuPG passphrase: 
Retype passphrase to confirm:

그런 다음 백업이 실행되고 프로세스가 완료되면 통계가 표시됩니다.

No signatures found, switching to full backup.
--------------[ Backup Statistics ]--------------
StartTime 1379614581.49 (Thu Sep 19 18:16:21 2013)
EndTime 1379614581.60 (Thu Sep 19 18:16:21 2013)
ElapsedTime 0.11 (0.11 seconds)
SourceFiles 101
SourceFileSize 4096 (4.00 KB)
NewFiles 101
NewFileSize 4096 (4.00 KB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 101
RawDeltaSize 0 (0 bytes)
TotalDestinationSizeChange 1022 (1022 bytes)
Errors 0
-------------------------------------------------

원격 시스템에 SSH를 통해 연결하면 백업이 성공적으로 완료된 것을 확인할 수 있습니다.

ssh root@backupHost
cd /remotebackup/duplicityDroplet
ls

duplicity-full.20130919T181705Z.manifest.gpg
duplicity-full.20130919T181705Z.vol1.difftar.gpg
duplicity-full-signatures.20130919T181705Z.sigtar.gpg

이 파일에는 백업 정보가 포함되어 있습니다. 이것은 테스트일 뿐이므로 다음을 실행하여 삭제할 수 있습니다.

rm duplicity*

이중성 드롭릿으로 다시 종료합니다.

exit

이제 테스트 디렉터리와 그 내용을 모두 제거할 수 있습니다.

rm -r /root/test

첫 번째 백업 만들기

다음 일반 구문을 사용하여 첫 번째 실제 백업을 생성합니다.

duplicity --encrypt-key key_from_GPG --exclude files_to_exclude --include files_to_include path_to_back_up sftp://root@backupHost//remotebackup/duplicityDroplet

/proc, /sys/tmp를 제외한 전체 루트 디렉토리를 백업합니다. 생성한 GPG 키를 사용합니다. 명령 내에서 ID를 지정하고 명령 앞에 암호를 입력하여 이를 수행합니다.

PASSPHRASE="passphrase_for_GPG" duplicity --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityDroplet

위의 명령은 약간의 시간이 걸립니다. 백업을 처음 실행하기 때문에 이중화로 인해 전체 백업이 생성됩니다. Duplicity는 파일 전송을 단순화하기 위해 데이터 청크를 볼륨으로 나눕니다.

--------------[ Backup Statistics ]--------------
StartTime 1379621305.09 (Thu Sep 19 20:08:25 2013)
EndTime 1379621490.47 (Thu Sep 19 20:11:30 2013)
ElapsedTime 185.38 (3 minutes 5.38 seconds)
SourceFiles 33123
SourceFileSize 813465245 (776 MB)
NewFiles 33123
NewFileSize 813464221 (776 MB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 33123
RawDeltaSize 802133584 (765 MB)
TotalDestinationSizeChange 369163424 (352 MB)
Errors 0
-------------------------------------------------

새로운 드롭릿에서 내 구성은 원격 시스템으로 전송된 15개의 볼륨을 생성했습니다.

이제 원격 시스템에 전체 백업이 있으므로 다음 백업은 자동으로 증분 백업이 됩니다. 더 빠르고 데이터 전송이 덜 필요합니다. 첫 번째 실행은 3분이 넘게 걸렸지만 증분 백업은 8초도 채 걸리지 않았습니다.

--------------[ Backup Statistics ]--------------
StartTime 1379621776.23 (Thu Sep 19 20:16:16 2013)
EndTime 1379621783.80 (Thu Sep 19 20:16:23 2013)
ElapsedTime 7.57 (7.57 seconds)
SourceFiles 33128
SourceFileSize 820560987 (783 MB)
NewFiles 11
NewFileSize 12217723 (11.7 MB)
DeletedFiles 3
ChangedFiles 1
ChangedFileSize 600 (600 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 15
RawDeltaSize 12197851 (11.6 MB)
TotalDestinationSizeChange 12201207 (11.6 MB)
Errors 0
-------------------------------------------------

또 다른 전체 백업을 강제로 수행하려면 모든 옵션 전에 duplicity 호출에 "full\ 명령을 추가할 수 있습니다.

PASSPHRASE="passphrase_for_GPG" duplicity full --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityDroplet

백업 복원

이중성은 복원을 쉽게 만듭니다. 원격 및 로컬 매개변수를 반대로 바꾸면 복원할 수 있습니다.

데이터만 해독하기 때문에 암호화 키 옵션이 필요하지 않습니다. 또한 제외 매개변수는 애초에 백업에 포함되지 않기 때문에 필요하지 않습니다.

예를 들어 방금 백업한 데이터를 전체적으로 복원하려면 다음 명령을 사용할 수 있습니다.

PASSPHRASE="passphrase_for_GPG" duplicity sftp://root@backupHost//remotebackup/duplicityDroplet /

아마도 더 안전한 옵션은 필요한 파일이나 디렉터리만 복원하는 것입니다. 위 명령에 옵션을 추가하여 이 작업을 수행할 수 있습니다.

PASSPHRASE="passphrase_for_GPG" duplicity --file-to-restore /path/to/file sftp://root@backupHost//remotebackup/duplicityDroplet /path/to/restore/file

심각한 상황에 처했을 때 문제가 발생하지 않도록 올바르게 복원하는 능력을 테스트해야 합니다.

백업 자동화

크론 작업 몇 개를 생성하여 이중화를 자동화할 수 있습니다. cron 구성 방법에 대한 자세한 내용을 보려면 여기를 클릭하십시오.

암호 파일 만들기

자동화 스크립트에 직접 입력할 필요가 없도록 GPG 암호를 저장할 보호된 파일을 생성합니다.

루트 사용자의 홈 디렉토리로 이동하여 텍스트 편집기로 새로운 숨겨진 파일을 만듭니다.

cd /root
nano .passphrase

이 파일에 입력해야 하는 유일한 것은 이중성 명령 앞에 다음과 같이 사용했던 암호 사양입니다.

PASSPHRASE="passphrase_for_GPG"

파일을 저장하고 닫습니다.

다음을 실행하여 루트에서만 읽을 수 있도록 만드십시오.

chmod 700 /root/.passphrase

일일 증분 백업 설정

매일 증분 백업을 생성하도록 이중성을 설정합니다. 이렇게 하면 백업이 최신 상태로 유지됩니다.

/etc/cron.daily에 나열된 스크립트는 하루에 한 번 실행되므로 여기가 백업 스크립트를 만들기에 완벽한 장소입니다.

해당 폴더로 이동하여 duplicity.inc라는 파일을 만듭니다.

cd /etc/cron.daily
nano duplicity.inc

다음 bash 스크립트를 파일에 복사합니다. duplicity 명령을 시스템 백업에 사용할 명령으로 바꾸십시오.

#!/bin/sh

test -x $(which duplicity) || exit 0
. /root/.passphrase

export PASSPHRASE
$(which duplicity) --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityDroplet

파일을 저장하고 닫습니다.

다음 명령을 입력하여 실행 가능하게 만드십시오.

chmod 755 duplicity.inc

다음을 호출하여 테스트합니다.

./duplicity.inc

오류 없이 완료되어야 합니다.

주간 전체 백업 설정

증분 백업은 전체 백업을 기반으로 합니다. 이는 변경 사항이 누적됨에 따라 점점 더 다루기 어려워진다는 것을 의미합니다. 기반을 새로 고치기 위해 매주 전체 백업을 구성합니다.

/etc/cron.weekly 디렉토리 내에 유사한 스크립트를 생성하여 이를 수행합니다.

디렉토리로 이동하여 새 파일을 만듭니다.

cd /etc/cron.weekly
nano duplicity.full

다음 bash 스크립트를 파일에 복사합니다. 이중성이 전체 백업을 실행하도록 강제하기 위해 "full\ 명령을 포함시켰습니다.

#!/bin/sh

test -x $(which duplicity) || exit 0
. /root/.passphrase

export PASSPHRASE
$(which duplicity) full --encrypt-key 05AB3DF5 --exclude /proc --exclude /sys --exclude /tmp / sftp://root@backupHost//remotebackup/duplicityDroplet

또한 마지막에 duplicity 명령을 추가하여 오래된 백업 파일을 정리할 예정입니다. 총 3개의 전체 백업과 관련 증분 백업을 보관합니다.

이것을 파일 끝에 추가하십시오.

$(which duplicity) remove-all-but-n-full 3 --force sftp://root@backupHost//remotebackup/duplicityDroplet

파일을 저장하고 닫습니다.

다음 명령을 사용하여 실행 가능하게 만드십시오.

chmod 755 duplicity.full

다음을 호출하여 테스트합니다.

./duplicity.full

전체 백업을 수행한 다음 필요한 모든 파일을 제거해야 합니다.

결론

이제 완벽하게 작동하는 자동화된 백업 솔루션이 있어야 합니다. 잘못된 보안 감각에 희생되지 않도록 정기적으로 백업을 확인하십시오.

사용할 수 있는 다른 많은 백업 도구가 있지만 이중성은 많은 사용자의 요구를 충족시키는 유연하고 간단한 솔루션입니다.