gitリポジトリを合理的にすばやく粉砕する方法は?

gitリポジトリを合理的にすばやく粉砕する方法は?

合理的な時間内にgitリポジトリを正確に削除したいと思います。

しかし、そうするには時間がかなりかかります。ここには5MiB未満のフォルダを持つ小さなテストリポジトリがあります.git

$ du -ac ~/tmp/.git | tail -1
4772    total
$ find ~/tmp/.git -type f | wc -l
991

デフォルトのオプションを使用するとshred時間がかなりかかります。次のコマンドは--force権限を変更し、--zeroスマッシング後に0で上書きされました。基本的な破砕方法は、任意のデータ(-n3)で3回上書きすることです。

後でこのファイルも削除したいと思います。man shredによると--remove=wipesync、(デフォルトで--remove使用されている場合)ディレクトリでのみ動作しますが、ファイルでのみ動作しても速度が遅くなるようです。比較してください(gitリポジトリを再初期化するたびに):

$ time find ~/tmp/.git -type f | xargs shred --force --zero --remove=wipesync
real    8m18.626s
user    0m0.097s
sys     0m1.113s

$ time find ~/tmp/.git -type f | xargs shred --force --zero --remove=wipe
real    0m45.224s
user    0m0.057s
sys     0m0.473s


$ time find ~/tmp/.git -type f | xargs shred --force --zero -n1 --remove=wipe
real    0m33.605s
user    0m0.030s
sys     0m0.110s

もっと良い方法がありますか?


編集する:はい、暗号化が重要です。今はただ使っています-n0

time find ~/tmp/.git -type f | xargs shred --force --zero -n0 --remove=wipe    
real 0m32.907s
user 0m0.020s
sys     0m0.333s

64本の平行線を使用するshreds

time find ~/tmp/.git -type f | parallel -j64 shred --force --zero -n0 --remove=wipe
real    0m3.257s
user    0m1.067s
sys     0m1.043s

答え1

忘れてくださいshred。無駄な仕事をしながら多くの時間を費やして本質を逃すことになります。

shred20~30年前のディスク技術と高価な実験室機器を使用すれば(少なくとも理論上は)上書きしたデータを回復することが可能なため、ランダムデータで何度も上書きしてファイルを削除します(「Gutterman削除」)。最新のディスク技術では、もはやそうではありません。ゼロで一度上書きすることもできますが、複数のランダムパスのアイデアは廃止された後も持続します。バラよりhttps://security.stackexchange.com/questions/10464/why-is-writing-zeros-or-random-data-over-a-hard-drive-multiple-times-better-th

一方、機密情報の消去は消去とshred指示されたファイルのデータのみを消去するため、完全に失敗します。以前に削除されたファイルに保存されているすべてのデータは、ファイルシステムを介さずにディスクに直接アクセスして回復できます。 Gitツリーのデータは再構成するのは簡単ではありませんが、これは実際の脅威です。

一部のデータをすばやく消去するには、データを暗号化してください。あなたはそれを使用することができます暗号化されたファイルシステム(ホームディレクトリ暗号化)または環境ファイルシステム(ディレクトリツリー暗号化)またはDMパスワード(フルパーティション暗号化)またはその他の方法。データを消去するには、キーを消去するだけです。

また、見ることができますディレクトリやファイルが実際に削除されたことをどのように確認できますか?

答え2

不要なマルチプレスを避けてくださいshred。たとえば、それを使用するために他のものは必要ありませんshred -n 1

セキュリティファイルの削除(通常)の問題は、git編集、複製、分岐の切り替えなどを行うたびに、新しいファイル(またはファイルセット)が別の物理的な場所に作成されることです。その結果、未知の数のコピーがファイルシステムの空き領域に漏れます。

ファイルシステムでさえ、これらのコピーがどこにあるのかわからないため、どのツールや方法を使用しても直接上書きすることはできません。代わりに、利用可能なスペース全体(ファイルシステムで許可されていない可能性があります)またはデバイス全体をカバーする必要があります。

ディスク全体を上書きするには時間がかかります(特にアーカイブするプロセスでファイルを前後にコピーする必要がある場合)、問題はセキュリティとスピードがどれほど重要であるかです。


最速の方法はおそらく直接使用することですrm。もちろん、これは何も扱いません。

ただし、すでにSSDを使用している場合は、インストールdiscardオプションを使用してfstrim空き容量の大部分をすばやく放棄することができ、失われたスペースを回復するための明確な方法はありません。

これは実用性を維持しながら、家庭用に使用するのに十分なセキュリティレベルでなければなりません。より強力なセキュリティが必要な場合は、暗号化を使用してください。

shred -n 1大量の(疑似)ランダムデータをすばやく書き込むことができ、ディスク全体を上書きするのに適しています。 SSDの場合でもディスク速度を活用できるほど高速です。したがって、ゼロに比べて欠点はありません。

ゼロの欠点は、リポジトリが実際に書き込みではなく使用可能または圧縮されているとマークすることを決定できることです。ストレージソリューションを実際に制御できなくなったときに考慮する必要があります。

答え3

shredGitリポジトリに小さなファイルが多すぎて削除して既存のデータを上書きするのに時間がかかると思います。他の作業を実行し、tmpfsデータをRAMに保存することをお勧めします。その後、作業が終わったら、保存したデータを心配せずに削除します。どこかに物理ストレージにあります。

bash $ mkdir $REPO_NAME
bash $ sudo mount -o uid=$YOUR_USERNAME,gid=$YOUR_GROUP_NAME,size=100m \
> -t tmpfs tmpfs $REPO_NAME
bash $ git clone git://$GIT_SERVER/$REPO_PATH/${REPO_NAME}.git

完了したら:

bash $ sudo umount $REPO_NAME
bash $ rmdir $REPO_NAME

再起動および停電後も維持される別のオプションは、ファイルシステムが接続されたディスクイメージファイルを生成することです。完了したら、shredファイルを送信してください。shredリポジトリ内のすべての小さなファイルを処理するよりも時間がかかりません。 2つのシェルスクリプトとして保存できます。 (実際のリポジトリで動作させるには編集する必要があります。)

メモ:私たちは使用していますレイセルフスlost+foundこれは、extファイルシステムのようにディレクトリを自動的に作成しないためです。あなたはそれを使用することができますBTFSあるいは、適切であると考えられる他のファイルシステムですが、それを生成またはマウントする構文がまったく同じでない可能性があります。

ストレージ.shの生成

#!/bin/bash
truncate --size 100M $IMAGE_FILE
/sbin/mkfs.reiserfs -fq $IMAGE_FILE
sudo mount -t reiserfs -o loop $IMAGE_FILE $REPO_NAME
chown $YOUR_USERNAME:$YOUR_GROUP_NAME $REPO_NAME
git clone git://$GIT_SERVER/$REPO_PATH/${REPO_NAME}.git

shred_repo.sh

#!/bin/bash
sudo umount $REPO_NAME
rmdir $REPO_NAME
shred $IMAGE_FILE

関連情報