我有兴趣在合理的时间内准确删除 git 存储库。
但要做到这一点需要相当长的时间。在这里,我有一个小型测试存储库,其中.git
文件夹 < 5MiB。
$ du -ac ~/tmp/.git | tail -1
4772 total
$ find ~/tmp/.git -type f | wc -l
991
使用 的shred
默认选项,这需要相当长的时间。在下一个命令中,我用来--force
更改权限并--zero
在粉碎后用零覆盖。默认的粉碎方法是用随机数据覆盖3次(-n3
)。
我还想稍后删除这些文件。根据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
,它花了很多时间做无用的事情而错过了本质。
shred
通过用随机数据多次覆盖文件来擦除文件(“古特曼擦除”),因为使用 20-30 年前的磁盘技术和一些昂贵的实验室设备,可以(至少在理论上)恢复被覆盖的数据。现代磁盘技术不再是这种情况:用零覆盖一次也同样好,但多次随机传递的想法在过时后仍然存在。看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
shred
我认为由于 Git 存储库中有如此多的小文件,删除它们并覆盖旧数据将需要很长时间。我建议做一些不同的事情,并将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
存储库中的所有小文件花费更少的时间。您可以将其另存为两个 shell 脚本。 (您需要编辑它们以使它们与您的实际存储库一起使用。)
笔记:我们正在使用赖塞尔夫斯因为它不会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