作成時にtar.gzファイルを暗号化する


33

複数のディレクトリの夜間バックアップを作成するスクリプトがあります。

を使用して作成されtar -czf、宛先tar.gzファイルパスはマウントされたネットワークディレクトリにあります。結果のファイルのサイズは約1.2Gbです。

ネットワーク速度はかなり高速です(ネットワークドライブからローカルへのコピーは約28MB /秒で行われます)。

ここで、公開キー暗号化を使用してtar.gzファイルを暗号化してからネットワークドライブに転送したいのですが、そのための最善の方法を知りたいと思います。

最初にファイルをローカルで作成し、暗号化してからコピーする必要がありますか?または、暗号化プロセスを介してtar出力を「ストリーミング」し、結果をネットワークドライブに直接書き込む方法はありますか?

回答:


34

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のドキュメントを参照してください。


2
GPGを使用すると、ユーザーのホームホルダーにキーが作成され、パスフレーズの入力が求められるようです。基本的に、このプロセスは私の好みには不透明すぎるようです…
ジョエルL

代わりにtar xz2番目のコマンドセットを使用する必要がありますtar -xzか?
ケニーエビット

1
@KennyEvitt:あなたはの有無にかかわらず、それを使用することができます-
フロリアンDiesch

これはgpg-zipで暗号化されたファイルでも機能します!
Trefex

2
gpgはすでにファイルを圧縮していますが、このzオプションが多くを追加するとは思わない
feklee

12

次のプロセスは、最初にローカルディスク上のファイルを暗号化してから、ネットワーク経由で送信(または必要に応じて保存)できます


最初に、公開鍵と秘密鍵を生成します(一度だけ実行):

openssl genrsa -out key.pem 2048
openssl rsa -in key.pem -out key-public.pem -outform PEM -pubout

次に、各バックアップで:

  1. 長いランダムパスフレーズを生成し、ファイルに保存する

    • echo -n "Tl4R6dnvWXiDeXr1LtpCNkyLG1" > key.txt
  2. パスフェーズでファイルを暗号化する

    • openssl enc -aes-256-cbc -pass file:key.txt < UNENCRYPTED_FILE > encrypted.dat
  3. 公開鍵でパスフレーズを暗号化する

    • openssl rsautl -encrypt -pubin -inkey key-public.pem < key.txt > enc.key.txt

次に、encrypted.datおよびenc.key.txtを必要な場所に保存します。


復号化するには:

  1. 秘密鍵で暗号化されたパスフレーズを解読する

    • openssl rsautl -decrypt -inkey key.pem < enc.key.txt > key.txt
  2. ファイルを解読する

    • openssl enc -aes-256-cbc -d -pass file:key.txt < encrypted.dat > UNENCRYPTED_FILE

これは、Florianのanwserよりもかなり長いですが、プロセスをよりよく理解できるように、サーバー依存のGPG構成変数などに依存しないように使用することにしました。また、有用なGPGドキュメントも見つかりませんでした。


1
ランダムなパスフレーズもそうのようなのopensslで簡単に作成することができます openssl rand 32 -out key.txt
ヴォルフガング・

@Wolfgang —私は実際に(バックアッププロセスを実行する)Pythonスクリプトからパスフェーズを生成していますが、ヒントをありがとう!
ジョエルL

2
FYI:あなたは、OpenSSLを使用してファイルを暗号化するべきではない理由:stackoverflow.com/questions/28247821/...
ダニエル・ヒラーを

このファイル「enc.key.txt」とは正確には何ですか?サーバーファイルをバックアップし、サーバーに保存されていないキーを使用してのみ復号化できるようにするプロセスを探しています。
アレックススチュワート

6

これを非対称キー暗号化で行います。つまり、公開キー(暗号化されたパッケージを送信したい人と共有できる)を持っているため、パッケージを暗号化できます。また、パッケージを復号化できる秘密キー(共有しない)を持っています。

現在の作業ディレクトリを暗号化するための私のコマンド:暗号化する-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-an-ubuntuにある Digital Oceanのガイドを使用してそうしました。 -12-04-vps。暗号化コマンドのABCD1234は、システムにインストールされている公開キーのいずれかを指します。このガイドでは、公開キーを共有し、他の公開キーをインストールして暗号化されたファイルを送受信する方法についても説明しています。


0

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スクリプトが書かれた理由)を使用しないことが最善であり、読み取り可能な形式に復元する方法が確信できるまで、重要なデータには使用しないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.