ファイルをキレイに削除する

あーはいはいshredでしょ、そんな当たり前のエントリすんなよ、とそんなこと言わず読んどくれ。そんだけじゃないように書くからよ。

さて、shredコマンドはファイルを消すにあたって、データを何度も変なデータで上書きしてから消すので、残留磁気からデータを読み取ろうったって難しくなるので安全、とかそういうもの。

しかし、ヘルプにはとてもとても大事なことが書いてある。時々見かけるshredがらみの話には抜けてることもあって危ないなーと思う。

CAUTION: shred は非常に重大な過程に基づいていることに注意してください。
ファイルシステムがデータの場所に上書きするということ。これは伝統的な
方法ですが、近年のファイルシステムではこの仮定を満たさない事も多いです。
shred を使う意味がないファイルシステムは以下の通りです。

* log-structured or journaled filesystems, such as those supplied with
  AIX and Solaris (and JFS, ReiserFS, XFS, Ext3, etc.)

* filesystems that write redundant data and carry on even if some writes
  fail, such as RAID-based filesystems

* filesystems that make snapshots, such as Network Appliance's NFS server

* NFS バージョン 3 クライアントの様に、一時的な場所にキャッシュを行う様な
  ファイルシステム

* 圧縮ファイルシステム

さらに、ファイルシステムのバックアップやリモートのミラーがファイルのコピーを
含んでいるかも知れませんが、こういったファイルは削除できませんし、寸断された
ファイルを後で復元することは造作もない事でしょう。

つまり、最近のシステムでは本質的な意味は失われているっていうこと。ジャーナリングもついてないファイルシステムって最近じゃ普通ないでしょ。
というわけで、ディスクを消去する場合は、HDDを接続した機材で(ネットワークを介することなく)だいたい以下の手順で消している。

shred -f -v /dev/hda
とか
shred -f -v /dev/sda
とか

ここで、/dev/hda は消去したいハードディスクのデバイス名。こうすると、ジャーナリングも関係ないし、NFSみたいなもの通さないし、ファイルシステムも関係ないし、ちゃんと消えます。/dev/hdaが妙なRAIDアレイでなければね(ここ重要)。

さて、shredの話はここまで。

shredのヘルプにも名前が出ているNetwork Appliance社のNFSサーバ、要するにNetAppのデータをちゃーんと消そうと思うとそれなりに苦労することになる、というか昨日まで苦労してた。
普通のコマンドとして、ディスク上のデータをキレイに消すコマンドは用意されていない。近しいコマンドとしてはvol destroyがあるが、これはデータブロックを消すわけではないので、完全でない。
とりうる手段はNetAppがそういうものを実装しない限りは俺が思うに1つしかなくて

  • vol offline & vol destroy & vol create を実施、ファイルシステムをキレイな状態にする
  • snap reserve を 0 に設定し、snapshot 取得をナシに設定する
  • NFSごしに/dev/zeroやら/dev/randomを書き出してFilesystem Fullの状況を作る
  • これを何回もやる

という具合に、NetAppのディスクすべてに何か別なものを書き込む!ということをしないと、以前書いたデータが上書きされずに残ってしまう。
snapshotのようなものにデータを他にコピーされたり、ディスク領域を占有されたり、そういう事があると完全なデータ消去とはほど遠い。

とはいえ。

唯一とも言える一番確実なデータ消去は物理的に粉砕することだけどな。