身辺整理というか、開発用機材の入れ替えだ。新しいPCに移行するので、返却する古いPCのHDDデータを削除する必要があるのだ。
今まではWindowsだけで、しかも1回に1台のPCだけで済ましていたというのに、なぜか今回はWindows・Mac・Linuxのオールスター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ディストリビューションはext3やext4がデフォルトで、どちらもジャーナリングファイルシステムだ。shred(1)との相性は悪い(本当に削除されたことを保証できない)。
あとNFSやRAIDベースのファイルシステムとの相性も悪いらしい。
こういう事情があるので、私はshred(1)でファイルを削除するよりも、デバイスファイルを指定してHDD丸ごと上書きするようにしている。
# /dev/sdbを丸ごと削除(3回上書き + 0x00で1回上書き) sudo shred -n3 -z -v /dev/sdb