ディスクの完全消去
ディスクのワイプは、すべてのビットに新しいデータを書き込むことによって行われます。
一般的なユースケース
デバイス上に残っているデータを全て消去
デバイスを完全に、二度と復旧できないように消去する最も一般的な理由としては、デバイスを廃棄するまたは売り飛ばす場合が考えられます。デバイス上に (暗号化されていない) データが残っている可能性を考えると、簡単にデータをとり出される前に対処しておいたほうが良いでしょう。データを盗むことは ファイルリカバリ ソフトウェアなどを使えば朝飯前です。
ディスク上の全てのデータを素早く消去したいという場合、/dev/zero
のようなシンプルなパターンを使うのが一番効率がよく、それでいて十分なランダム性を確保できます。詳しくは データの残存性 で説明しています。
ビットを全て上書きしてデータを消去すると通常のシステムの機能 (標準の ATA/SCSI コマンドなど) やハードウェアのインターフェイスでリカバリすることはできなくなります。上で述べたようなファイルリカバリソフトウェアがデータを復旧させようとしたら、プロプライエタリなストレージハードウェアの機能を使う必要が出てきます。
HDD の場合、ドキュメントになってないドライブコマンドが存在するとか、デバイスのコントローラやファームウェアを弄って再配置セクタ (S.M.A.R.T. が使用を止めた不良セクタ) を読み出すなどしないかぎり、データの復旧は不可能になります。
ディスク消去には物理ストレージの形式によって様々な問題が存在します。中でもフラッシュメモリデバイスや旧式の磁気ストレージ (古い HDD や、フロッピーディスク、テープなど) は注意する必要があります。
ブロックデバイス暗号化の準備
完全に消去した領域に ディスク暗号化 を設定したいという場合、暗号強度が高い乱数生成器 (Random Number Generator、以下 RNG と呼称します) による、ランダムデータを使用するべきでしょう。
Wikipedia:Random number generation を参照してください。
データの残存性
データの完全消去 も参照。データを削除したり消去したりしようとした後でも、データの表現が残っていることがあります。
オペレーティングシステム、プログラム、およびファイルシステム
オペレーティングシステム、実行されるプログラム、ジャーナリングファイルシステム は暗号化されていないデータをブロックデバイス全体にコピーする可能性があります。プレーンディスクに書き込む場合、これは上記のいずれかと関連している場合に限ります。
データがディスク上に正確に配置され、他の場所にコピーされていない場合、プールに十分なエントロピーがある限り、ランダムデータによるワイプは徹底的かつ驚くほど迅速に実行できます。
良い例は、/dev/urandom
を使用した LUKS キースロットの消去 を使用した cryptsetup です。
ハードウェア固有の問題
フラッシュメモリー
ライトアンプリフィケーション などの特性により、SSD を含むフラッシュメモリは信頼性の高いワイプの対象としては頑強なものとなっています。 デバイスのコントローラチップとオペレーティングシステムから見たデータの間には、多くの透明な抽象化が存在するため、光景データがその場で上書きされることはなく、特定のブロックやファイルをワイプすることは信頼性がありません。
透過的な圧縮 (すべての SandForce SSD) などの他の "機能" は、ゼロまたは反復パターンを圧縮できるため、消去が信じられないほど高速である場合、これが原因である可能性があります。
シンプルなハードウェア を使用すると、コントローラを介さずにフラッシュ メモリデバイスを分解し、チップのはんだを外し、データコンテンツを分析することが問題なく実行できます。データ復旧会社は安いお金でそれを行います。
詳細については、次を参照してください:
マークされた不良セクタ
ハードディスクは、あるセクターを不良と判断すると、その部分をコードで封鎖し、ソフトウェアでの書き込みを不可能にします。そのため、完全な上書きをすることはできません。しかし、ブロックサイズの関係で、これらのセクションは理論上回復可能な数キロバイトにしかならない。
残留磁気
ゼロやランダムなデータで1回だけ完全に上書きしても、最近の高密度ストレージデバイスでは復元可能なデータにはなりません。この操作を繰り返すことは、現在では必要ないことに注意してください。[1] [2] [3] また、[4]、[5]、[6]を参照してください。
対象の選択
fdisk を使うことでユーザーが読み取りアクセスできる全ての読み書きデバイスを見つけることができます。
/dev/sdX
などのデバイスで始まる行の出力をチェックしてください。
以下は Linux システムを起動するようにフォーマットされた HDD の例です:
# fdisk -l
Disk /dev/sda: 250.1 GB, 250059350016 bytes, 488397168 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00ff784a Device Boot Start End Blocks Id System /dev/sda1 * 2048 206847 102400 83 Linux /dev/sda2 206848 488397167 244095160 83 Linux
4GB USB メモリードライブに書き込まれた Arch のインストールメディアの例:
# fdisk -l
Disk /dev/sdb: 4075 MB, 4075290624 bytes, 7959552 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x526e236e Device Boot Start End Blocks Id System /dev/sdb1 * 0 802815 401408 17 Hidden HPFS/NTFS
コンピュータの重要なデータが間違って破損してしまうのが心配であれば、仮想環境などの分離された環境 (VirtualBox, VMWare, QEMU など) を使用してディスクドライブを直接接続するか、あるいは消去する必要があるストレージディスクだけを接続してライブメディア (USB, CD, PXE など) から起動してください。
ブロックサイズの選択
Wikipedia:Dd (Unix)#Block size, blocksize io-limits も見て下さい。
Advanced Format のハードドライブを使用している場合、ブロックサイズをデフォルトの512バイトよりも大きく指定することを推奨します。高速に書き換え処理を行うために、あなたの使用しているドライブの物理的なジオメトリにブロックサイズを合わせて下さい。dd コマンドにブロックサイズオプションを追加することで指定できます (例: 4KB の場合 bs=4096
)
fdisk は全てのディスクの物理セクタと論理セクタのサイズを出力します。
もしくは sysfs によっても情報を得ることができます:
/sys/block/sdX/size /sys/block/sdX/queue/physical_block_size /sys/block/sdX/queue/logical_block_size /sys/block/sdX/sdXY/alignment_offset /sys/block/sdX/sdXY/start /sys/block/sdX/sdXY/size
消去するブロックを手動で計算
以下では消去するべきデータ領域を決定する例を示します。
ブロックストレージデバイスにはセクタがあり、1つのセクタのサイズはデバイス全体のサイズをバイト単位で計算するために使用することができます。セクタとセクタの大きさを掛け合わせることで計算できます。
dd コマンドを使ってパーティションを消去するパラメータの例:
# dd if=data_source of=/dev/sdX bs=sector_size count=sector_number seek=partitions_start_sector
ここでは、root で fdisk -l /dev/sdX
の出力の一部だけを表示し、パーティション情報の例を示しています。
Device Boot Start End Sectors Size Id Type /dev/sdXA 2048 3839711231 3839709184 1,8T 83 Linux /dev/sdXB 3839711232 3907029167 67317936 32,1G 5 Extended
fdisk の出力の最初の行からディスク容量と論理セクタがわかります:
Disk /dev/sdX: 1,8 TiB, 2000398934016 bytes, 3907029168 sectors
論理セクタのサイズを計算するには echo $((2000398934016 / 3907029168))
を実行するか fdisk の出力の2行目のデータを利用してください:
Units: sectors of 1 * 512 = 512 bytes
物理セクタの計算については3行目を使います:
Sector size (logical/physical): 512 bytes / 4096 bytes
ディスクサイズを物理セクタ単位で取得するには、既知のディスクサイズをバイト単位で1物理セクタのサイズに分割する必要があります echo $((2000398934016 / 4096))
, blockdev --getsize64 /dev/sd "XY"
コマンドでもストレージデバイスやパーティションのサイズを取得することができます。
/dev/sdXA
パーティションを消去する場合、使用する論理セクタのパラメータは以下のようになります:
Start=2048 End=3839711231 BytesInSector=512
seek=
オプションでデバイスのパーティションの開始アドレスを使ってください:
# dd if=data_source of=/dev/sd"X" bs=${BytesInSector} count=${End} seek=${Start}
パーティションの名前を使用:
LogicalSectors=3839709184
# dd if=data_source of=/dev/sd"XA" bs=${BytesInSector} count=${LogicalSectors}
もしくは、ディスク全体を消去するには:
AllDiskPhysicalSectors=488378646 PhysicalSectorSizeBytes=4096
# dd if=data_source of=/dev/sd"X" bs=${PhysicalSectorSizeBytes} count=${AllDiskPhysicalSectors} seek=0
データソースを選択
機密データを消去するために、ニーズに合わせて任意のデータパターンを使用することができます。
ゼロ
/dev/zero
や単純なパターンによる上書きは、ほとんどの状況で安全であると考えられています。今日のHDDでは、ディスクの消去には適切で高速だと判断されます。
しかし、書き込みパターンや0化が異常に速いドライブは、透過的圧縮を行っている可能性があります。すべてのブロックがこの方法で消去されるわけではないことは明らかです。一部の フラッシュメモリー デバイスでは、そのような "機能" を備えています。
その後、ブロックデバイスの暗号化を設定するには、暗号化を弱めないようにランダムなデータで領域を消去する必要があります (次章参照)
ランダムデータ
/dev/random
を使った真のランダムデータソースは、エントロピー生成を待つのに時間がかかりすぎるため、大容量のワイプには非現実的です。/dev/urandom
は擬似ランダムデータの妥当なソースとして使うことができます。ソースとしてのランダムデータと擬似ランダムデータの違いについては、乱数生成 を参照してください。
疑似ランダムデータ生成のもう一つの方法は、暗号化されたデータストリームを使用することである。例えば、ブロック暗号化用のデバイスを用意し、暗号化パーティションに AES を使用する場合、ファイルシステムを作成する前に同様の暗号で消去し、空き領域が使用領域と区別できないようにすることが適切です。
対象の上書き
選択したドライブをユーティリティを使って上書きします。都合に合わせて選択してください。単一のファイルだけ削除したい場合、ディスクの完全消去/ヒントとテクニック#単体ファイルの消去 に以下で説明しているユーティリティの追加説明があります。
出力のリダイレクト
出力をリダイレクトすることで空き領域にファイルを作成するだけでなく、デバイスやパーティションを消去することもできます。
以下の例では他のユーティリティの stdout をリダイレクトしてパーティションやブロックデバイスを書き換えています:
$ cat /dev/urandom > /dev/sd"XY"
cat: write error: No space left on device
$ xz -z0 /dev/urandom -c > /dev/sd"XY"
xz: (stdout): Write error: No space left on device
$ dd if=/dev/urandom > /dev/sd"XY"
dd: writing to ‘standard output’: No space left on device 20481+0 records in 20480+0 records out 10485760 bytes (10 MB) copied, 2.29914 s, 4.6 MB/s
ファイルコピーコマンド cp
でもデバイスを書き換えられます:
$ cp /dev/urandom /dev/sd"XY"
cp: error writing ‘/dev/sd"XY"’: No space left on device cp: failed to extend ‘/dev/sd"XY"’: No space left on device
書き込み速度や残り時間を表示するには pv を使用:
# pv --timer --rate --stop-at-size -s "$(blockdev --getsize64 /dev/sd"XY" )" /dev/zero > /dev/sd"XY"
dd
Core Utilities#dd を参照してください。
/dev/zero ストリームを使用してディスク上の全ての領域をゼロバイトで埋める:
# dd if=/dev/zero of=/dev/sdX bs=4096
もしくは /dev/urandom ストリームを使用:
# dd if=/dev/urandom of=/dev/sdX bs=4096
dd が No space left on device
と報告したら処理は完了です:
dd: writing to ‘/dev/sdb’: No space left on device 7959553+0 records in 7959552+0 records out 4075290624 bytes (4.1 GB) copied, 1247.7 s, 3.3 MB/s
巨大なドライブを高速に消去する方法は、以下を見て下さい:
- ディスクの完全消去/ヒントとテクニック#dd - 高度な例では OpenSSL を使用します。
- ディスクの完全消去/ヒントとテクニック#テンプレートファイルを使うではランダムではないデータによって高速にデータを消去します。
- Dm-crypt/ドライブの準備#インストール前に dm-crypt で消去では dm-crypt を使います。
wipe
ファイルの消去に特化しているツールで、wipe パッケージでインストールできます。クイックワイプを実行するには以下のようなコマンドを使用します:
$ wipe -r -q /path/to/wipe
参照: man ページ
shred
shred は個別のファイルやデバイスを安全に消去することができる Unix コマンドです。たとえ特殊な機械を使っても復元するのは難しく、あるいは不可能になります。shred は3つのパスを使って、擬似乱数データをデバイスに書き込みます。パスは増やしたり減らしたりできます。
以下のコマンドはデフォルト設定で shred を実行して進捗を表示します:
# shred -v /dev/sdX
もしくは /dev/urandom
のエントロピーだけを使って1つのパスで shred を実行することも可能です:
# shred --verbose --random-source=/dev/urandom -n1 /dev/sdX
scrub
scrub は、データの取得をより困難にするために、ファイルまたはディスクデバイスにパターンを繰り返し書き込みます。
次のコマンドは、モード 1 のデフォルト設定でスクラブを呼び出し、NNSA ポリシーレター NAP-14.x に準拠したパターンを使用してターゲットデバイスを上書きします。これが最も効果的な方法です。
$ scrub /dev/sdX
次のコマンドは、モード 2 のデフォルト設定でスクラブを呼び出し、NNSA ポリシーレター NAP-14.x に準拠したパターンを使用してターゲットファイルを上書きし、書き込まれたバイトを切り捨てて最後のファイルシステムブロックを埋めます。このモードには注意事項があります。詳細については、manual を参照してください。
$ scrub /path/to/file # where file is a regular file
次のコマンドは、モード 3 のデフォルト設定でスクラブを呼び出し、ディレクトリを作成し、ファイルシステムがいっぱいになるまでそのディレクトリにファイルを埋め込みます。次に、NNSA ポリシーレター NAP-14.x に準拠したパターンを使用してファイルが scrub され、書き込まれたバイトが丸められて最後のファイルシステムブロックが埋められます。このモードには注意事項があります。詳細については、manual を参照してください。
$ scrub /path/to/dir # where dir is a new directory name.
詳しい使用方法と情報については、manual を参照してください。
Badblocks
badblocks でディスク消去を行うには、破壊的な read-write テストを実行します:
# badblocks -c <NUMBER_BLOCKS> -wsv /dev/<drive>
hdparm
hdparm は ATA Secure Erase をサポートしています。これはディスクをゼロで埋めるのと機能的には同一です。ただし、ハードドライブのファームウェアによって処理されるのが違っていて、"隠しデータ領域"も含まれます。そのため、今日における"ローレベルフォーマット"コマンドとして考えても良いでしょう。このコマンドを実行することで SSD ドライブは生産時のパフォーマンスを発揮することができると言われていますが、十分な消去とまでは言えない可能性もあります (#フラッシュメモリを参照)。
ドライブによっては、メーカーによって定義されたパターンを使用する Enhanced Secure Erase がサポートされていることがあります。hdparm -I
の出力で Enhanced 消去が利用できると表示される場合、デバイスにはハードウェア暗号化機能が備わっており、消去は暗号鍵だけで実行されます。
ATA Secure Erase の使用法に関する詳細はソリッドステートドライブ/メモリセルの消去や Linux ATA wiki を見て下さい。
blkdiscard
こちらを参照 ソリッドステートドライブ/メモリセルの消去#blkdiscard による一般的な方法