理系学生日記

おまえはいつまで学生気分なのか

ファイル、ディスクをクリアするための shred コマンドの注意点

ハードディスクとか廃棄したり、別の人に譲渡するときに、ハードディスクの中身を綺麗に消したい、復旧させられないようにしたいっていうことがあります。
たとえば rm file で file を消すことができますが、これはあくまでインデックスが消えているだけであって、書き込まれたデータは(上書きされるまで)そのままだったりします。なので、がんばれば復旧できます。
ただ、意図せず第三者に復旧されてしまうと嫌なこともよくあって、復旧させられないような処理を行いたい。

巷ではこれを shred 処理だとか言うみたいで、ぼくはその実装が気になっていたわけですけど、別に個別に実装する必要もなく、coreutils に含まれていたのでした。

で、このドキュメントを読んでたら色々と注意しなきゃなっていうことが書いてあったので紹介しておきます。

Please note that shred relies on a very important assumption: that the file system overwrites data in place. This is the traditional way to do things, but many modern file system designs do not satisfy this assumption. Exceptions include:

  • Log-structured or journaled file systems, such as those supplied with AIX and Solaris, and JFS, ReiserFS, XFS, Ext3 (in data=journal mode), BFS, NTFS, etc., when they are configured to journal data.
  • File systems that write redundant data and carry on even if some writes fail, such as RAID-based file systems.
  • File systems that make snapshots, such as Network Appliance's NFS server.
  • File systems that cache in temporary locations, such as NFS version 3 clients.
  • Compressed file systems.

(意訳)
shred コマンドが前提としていることがあって、それはファイルシステムがデータを上書きするってことだ。これは昔からの方法なんだけど、モダンなファイルシステムだと、この前提を満たさないものも多い。例えば、

  • AIX, Solaris で提供されていたり、JFS, ReiserFS, XFS, journal mode の Ext3, BFS, NTFS といった、log-structured あるいはジャーナルを書き込むファイルシステム。
  • RAID-based なファイルシステムのように、冗長にデータを書き込み、書き込みが失敗したとしても継続するようなファイルシステム。
  • アプライアンス上の NFS サーバのように、スナップショットを取得するようなファイルシステム。
  • NFS ver.3 のクライアントのように、一時領域にキャッシュを作成するファイルシステム。
  • 圧縮ファイルシステム。

特に、ジャーナリングを行うファイルシステムだと安全にファイルを消去できないっていうのは注意したほうが良さげだと思いました。
ただ、ここでの注意点は、あくまでファイルの消去にのみ適用されるようです。というのも、その後に、以下の記述があります。

Generally speaking, it is more reliable to shred a device than a file, since this bypasses the problem of file system design mentioned above.

(意訳)
一般的に言えば、ファイルを shred 処理するよりもデバイスごと shred 処理を行ったほうが信頼性が高い。というのも、そうすれば上述のようなファイルシステムの設計に起因する問題を回避できるためだ。

ただ、これには続きがあって、

However, even shredding devices is not always completely reliable. For example, most disks map out bad sectors invisibly to the application; if the bad sectors contain sensitive data, shred won't be able to destroy it.

(意訳)
ただし、デバイスごとの shred 処理が完全に信頼できるというわけではない。たとえば、ほとんどのディスクは故障したセクタをアプリケーションから見えなくする。もし、そのセクタが消去したいようなデータを保持していた場合、shred コマンドはそれを破壊できない。

ということです。

完璧を望むというのはなかなかに難しいものですね。