身辺整理用ファイル削除ツールあれこれ

身辺整理というか、開発用機材の入れ替えだ。新しいPCに移行するので、返却する古いPCのHDDデータを削除する必要があるのだ。

今まではWindowsだけで、しかも1回に1台のPCだけで済ましていたというのに、なぜか今回はWindowsMacLinuxのオールスターPC軍団(5台ぐらい)のデータを削除する必要があるという。ツケってもんは、実に恐ろしいですなあ。

Windows

Windowsの標準機能では、セキュアにファイルを削除する方法はないようだ。そこでWindows SysinternalsのSDeleteを使う。

:: 指定したファイルを削除(7回上書き)
sdelete -p 7 target-file

:: x86-64向けにsdelete64もある
sdelete64 -p 7 target-file

:: 指定したフォルダの中のファイルを再帰的に削除(7回上書き)
sdelete -p 7 -r D:\path\to\target-dir

-pで上書き回数を指定している(規定値は1)。-rないし-sで再帰的に削除できるが、どうもフォルダ(ディレクトリ)は削除されないようだ(あと、どうも絶対パスで指定する必要がある模様)。

-cや-zでファイルではなく空き領域のデータを上書きできる。-cでランダム値、-zで0x00で上書きする。

:: Dドライブの空き領域のデータを消去(ランダム値で3回上書き)
sdelete -p 3 -c D:

:: Dドライブの空き領域のデータを消去(0x00で1回(?)上書き)
sdelete -z D:

0x00上書きは、仮想HDDのスリム化に有効なはず。

空き領域のデータ上書きは、Windows 2000ないしXPの頃から標準で付いているコマンドcipherでも可能だ。

:: Dドライブの空き領域のデータを消去(0x00、0xFF、ランダム値の順に3回上書き)
cipher /w:D:

ただし上書き回数3回に固定されていて変更不可能だし、書き込み順が0x00、0xFF、ランダムな値なので仮想HDDのスリム化には貢献しない。

macOS

macOSには標準でsrm(3)というコマンドがあるので、それでファイルを削除する。Finderの「確実にゴミ箱を空にする」の中身らしい。

基本的なオプションはrm(1)と同じ。2〜3の固有のオプションがあって、それで削除方法に関する指定を行う。

-s --simple ランダムな値で1回だけデータを上書きする。
-m --medium アメリカ合衆国国防総省の規格にもとづき7回上書きする(0xF6、0x00、0xFF、ランダム値、0x00、0xFF、ランダム値)
-z --zero 最後に0x00で1回だけ上書きする。
-n --nounlink データの上書きのみ。ファイル自体は削除しない。

-sや-mを指定しなかった場合、グートマン方式で35回上書きするらしい。

よくあるパターンは、こんな感じだろうか?

# 指定したファイルを削除(7回上書き + 0x00で1回上書き)
srm -m -z target-file

# 指定したフォルダ以下を再帰的に削除(7回上書き + 0x00で1回上書き)
srm -m -z -r target-dir

空き領域の残存データを消去したい場合は、ディスクユーティリティの「空き領域の消去」を使うのが一番分かりやすいだろう。上書き回数は1・7・35回の3種類だが、まあ通常は多くても7回で十分だろう。というか7回でも結構時間がかかるので、個人的には3回ぐらいのパラメータも用意しておいてほしかった。

ディスクユーティリティ自体はasr(8)・diskutil(8)・hdiutil(1)のラッパーなので、おそらく以下のコマンドでもいけるはず(未検証)。

# 指定したデバイスの空き領域のデータを消去(0x00で1回上書き)
diskutil secureErase freespace 0 target-device

# 指定したデバイスの空き領域のデータを消去(ランダム値で1回上書き)
diskutil secureErase freespace 1 target-device

# 指定したデバイスの空き領域のデータを消去(US DoEのアルゴリズムで3回上書き)
diskutil secureErase freespace 4 target-device

バイスを指定するには「diskutil list」で表示される識別名を使用すればよいらしい。

追記:2020-08-25

srm(3)はOS X 10.11 El Capitanで廃止された。Finderの「確実にゴミ箱を空にする」も無くなっている。

推測だが、廃止の理由は「SSD搭載モデルのラインナップが拡充したため」ではないかと思う。SSDはデータ復旧が非常に難しいデバイスであるので「セキュアなファイル削除」の重要度が低いこと、ウェアレベリングがあるため「同一ブロックに複数回上書き」という振る舞いをアプリケーション・レベルで実現できないこと、SSDに余計な書き込みを行うと寿命を縮めてしまうこと――などの要因より、廃止に至ったのではないだろうか。

srm(3)の代替ではないが、rm(3)にオプション-Pが追加されている。このオプションを付与した場合、ファイルを削除する前に「0xFF、0x00、0xFF」の順に3回上書きされる。HDD搭載モデルを使用しているなら、この機能を利用すれば良いだろう。

Linux

いわずと知れたshred(1)でファイルを削除する。基本的に-nで上書き回数を指定し、-zで最後に0x00で上書きするようにしている。

# 指定したファイルを削除(7回上書き + 0x00で1回上書き)
shred -n7 -z -u target-file

ただしshred(1)は「ファイルシステムが、ファイルの元データと同じ位置に上書きを行う」という前提のうえに成り立っているツールだ。伝統的なファイルシステムの実装はそうだったらしいけど、最近のファイルシステムは違う。

というか最近のLinuxディストリビューションext3ext4がデフォルトで、どちらもジャーナリングファイルシステムだ。shred(1)との相性は悪い(本当に削除されたことを保証できない)。

あとNFSRAIDベースのファイルシステムとの相性も悪いらしい。

こういう事情があるので、私はshred(1)でファイルを削除するよりも、デバイスファイルを指定してHDD丸ごと上書きするようにしている。

# /dev/sdbを丸ごと削除(3回上書き + 0x00で1回上書き)
sudo shred -n3 -z -v /dev/sdb