複数のディレクトリの夜間バックアップを作成するスクリプトがあります。
tar -czf
を使用して作成され、宛先tar.gzファイルパスはマウントされたネットワークディレクトリにあります。結果のファイルのサイズは約1.2Gbです。
ネットワーク速度はかなり高速です(ネットワークドライブからローカルへのコピーは約28MB /秒で行われます)。
ここで、公開キー暗号化を使用してtar.gzファイルを暗号化してからネットワークドライブに転送したいのですが、そのための最善の方法を知りたいと思います。
最初にファイルをローカルで作成し、暗号化してからコピーする必要がありますか?または、暗号化プロセスを介してtar出力を「ストリーミング」し、結果をネットワークドライブに直接書き込む方法はありますか?
次のプロセスは、最初にローカルディスク上のファイルを暗号化してから、ネットワーク経由で送信(または必要に応じて保存)できます
最初に、公開鍵と秘密鍵を生成します(一度だけ実行):
openssl genrsa -out key.pem 2048
openssl rsa -in key.pem -out key-public.pem -outform PEM -pubout
次に、各バックアップで:
長いランダムパスフレーズを生成し、ファイルに保存する
echo -n "Tl4R6dnvWXiDeXr1LtpCNkyLG1" > key.txt
パスフェーズでファイルを暗号化する
openssl enc -aes-256-cbc -pass file:key.txt < UNENCRYPTED_FILE > encrypted.dat
公開鍵でパスフレーズを暗号化する
openssl rsautl -encrypt -pubin -inkey key-public.pem < key.txt > enc.key.txt
次に、encrypted.datおよびenc.key.txtを必要な場所に保存します。
復号化するには:
秘密鍵で暗号化されたパスフレーズを解読する
openssl rsautl -decrypt -inkey key.pem < enc.key.txt > key.txt
ファイルを解読する
openssl enc -aes-256-cbc -d -pass file:key.txt < encrypted.dat > UNENCRYPTED_FILE
これはFlorianのanwserよりもはるかに長いですが、プロセスをよりよく理解できるように、サーバー依存のGPG構成変数などに依存しないように使用することにしました。また、有用なGPGドキュメントも見つかりませんでした。
your_dir
を暗号化されたアーカイブにパックyour_archive.tgz.gpg
(対称暗号化):
tar -cz your_dir | gpg -c -o your_archive.tgz.gpg
開梱:
gpg -d your_archive.tgz.gpg | tar xz
対称暗号化の代わりに非対称暗号化を使用する方法については、GPGのドキュメントを参照してください。
これを非対称キー暗号化で行います。つまり、公開キー(暗号化されたパッケージを送りたい人と共有できる)を持っているため、パッケージを暗号化できます。また、パッケージを復号化できるようにする秘密キー(共有しない)も持っています。
現在の作業ディレクトリを暗号化するための私のコマンド:暗号化する-e、使用する「受信者」またはキーを指定する-r、出力ファイルを指定する-o。
$ tar -cvz . | gpg -e -r ABCD1234 -o backup.tgz.gpg
そして、現在の作業ディレクトリに復号化するには:
$ gpg -d backup.tgz.gpg | tar -xz
または、後で解凍するために標準のtgzファイルに復号化するには:
$ gpg -o backup.tgz -d backup.tgz.gpg
もちろん、これはすでに公開鍵と秘密鍵のペアを生成し、gpgでインストールした場合にのみ機能します。私の場合、私は https://www.digitalocean.com/community/tutorials/how-to-use-gpg-to-encrypt-and-sign-messages-onのDigital Oceanのガイドを使用してそうしました。 -an-ubuntu-12-04-vps 。暗号化コマンドのABCD1234は、システムにインストールされている公開キーのいずれかを指します。このガイドでは、公開鍵を共有し、他の公開鍵をインストールして暗号化されたファイルを送受信する方法についても説明しています。
GnuPGは私がこのプロセスに使用することを選択したものであり、解読手順が不透明になる場所を述べているため(この使用例では同意します)、私も問題のその側面に取り組みました。プロジェクトの Travis-CI が現在設計されているとおりに機能するログを作成し、 travis.yml ファイルをログの出力とともに追跡します。基本的に、このプロジェクトの3つのスクリプトが必要です。 keygenスクリプト、復号化ヘルパースクリプト、および名前付きパイプリスナースクリプト。 keygenスクリプトと復号化ヘルパースクリプトは、復号化を実行するデバイスで使用する必要があり、名前付きパイプリスナースクリプトは、暗号化を実行するデバイスで使用する必要があります。
暗号化された名前付きパイプリスナースクリプトは、文字列、ファイルパス、またはディレクトリパスを一度セットアップし、暗号化された結果を予測可能な形式で出力します。
以下は、暗号化およびディレクトリの圧縮と暗号化のために夜間バックアップスクリプトに配置できるコマンドの例です。
echo "some messages text" > /path/to/named.pipe
## Message text is ASCII armor encrypted and appended to specified file when script was stated
echo "${HOME}/Documents" > /path/to/named.pipe
## Directories are compressed with tar and encrypted with output to time stamped file in bulk output directory
echo "${HOME}/.bash_history" > /path/to/named.pipe
復号化については、暗号化されたデータの追加文字列の回復方法とバルクファイル/ディレクトリの復元方法について、ビルドスクリプト.travis-ci/script_decrypt.sh
&.travis-ci/test_search_script_decrypt.sh
を確認する必要があります。
もちろん、この実験的なものでは、主キーペア(keygenスクリプトが書かれた理由)を使用しないことが最善であり、読み取り可能な形式に復元する方法が確信できるまで、重要なデータには使用しないでください。