ディスクの完全消去

提供: ArchWiki
2023年12月15日 (金) 16:03時点におけるKgx (トーク | 投稿記録)による版 (序文を更新)
ナビゲーションに移動 検索に移動

関連記事

ディスクのワイプは、すべてのビットに新しいデータを書き込むことによって行われます。

ヒント: この記事における"ディスク"にはループバックデバイスも含めます。

一般的なユースケース

デバイス上に残っているデータを全て消去

デバイスを完全に、二度と復旧できないように消去する最も一般的な理由としては、デバイスを廃棄するまたは売り飛ばす場合が考えられます。デバイス上に (暗号化されていない) データが残っている可能性を考えると、簡単にデータをとり出される前に対処しておいたほうが良いでしょう。データを盗むことは ファイルリカバリ ソフトウェアなどを使えば朝飯前です。

ディスク上の全てのデータを素早く消去したいという場合、/dev/zero のようなシンプルなパターンを使うのが一番効率がよく、それでいて十分なランダム性を確保できます。詳しくは データの残存性 で説明しています。

ビットを全て上書きしてデータを消去すると通常のシステムの機能 (標準の ATA/SCSI コマンドなど) やハードウェアのインターフェイスでリカバリすることはできなくなります。上で述べたようなファイルリカバリソフトウェアがデータを復旧させようとしたら、プロプライエタリなストレージハードウェアの機能を使う必要が出てきます。

HDD の場合、ドキュメントになってないドライブコマンドが存在するとか、デバイスのコントローラやファームウェアを弄って再配置セクタ (S.M.A.R.T. が使用を止めた不良セクタ) を読み出すなどしないかぎり、データの復旧は不可能になります。

ディスク消去には物理ストレージの形式によって様々な問題が存在します。中でもフラッシュメモリデバイスや旧式の磁気ストレージ (古い HDD や、フロッピーディスク、テープなど) は注意する必要があります。

ブロックデバイス暗号化の準備

完全に消去した領域に ディスク暗号化 を設定したいという場合、暗号強度が高い乱数生成器 (Random Number Generator、以下 RNG と呼称します) による、ランダムデータを使用するべきでしょう。

Wikipedia:Random number generation を参照してください。

警告: ブロックデバイス暗号化が使われているパーティションにランダムなデータや暗号化されたデータ以外が含まれている場合、暗号化ドライブの使用パターンを解析することができ、ファイルシステムレベルの暗号化と大して変わらなくなります。真剣にブロックデバイス暗号化をセットアップしたい場合はランダムではない /dev/zero やシンプルなパターン (badblocks など) を使ってはいけません。

データの残存性

データの完全消去 も参照。データを削除したり消去したりしようとした後でも、データの表現が残っていることがあります。

オペレーティングシステム、プログラム、およびファイルシステム

オペレーティングシステム、実行されるプログラム、ジャーナリングファイルシステム は暗号化されていないデータをブロックデバイス全体にコピーする可能性があります。プレーンディスクに書き込む場合、これは上記のいずれかと関連している場合に限ります。

データがディスク上に正確に配置され、他の場所にコピーされていない場合、プールに十分なエントロピーがある限り、ランダムデータによるワイプは徹底的かつ驚くほど迅速に実行できます。

良い例は、/dev/urandom を使用した LUKS キースロットの消去 を使用した cryptsetup です。

ハードウェア固有の問題

フラッシュメモリー

ライトアンプリフィケーション などの特性により、SSD を含むフラッシュメモリは信頼性の高いワイプの対象としては頑強なものとなっています。 デバイスのコントローラチップとオペレーティングシステムから見たデータの間には、多くの透明な抽象化が存在するため、光景データがその場で上書きされることはなく、特定のブロックやファイルをワイプすることは信頼性がありません。

透過的な圧縮 (すべての SandForce SSD) などの他の "機能" は、ゼロまたは反復パターンを圧縮できるため、消去が信じられないほど高速である場合、これが原因である可能性があります。

シンプルなハードウェア を使用すると、コントローラを介さずにフラッシュ メモリデバイスを分解し、チップのはんだを外し、データコンテンツを分析することが問題なく実行できます。データ復旧会社は安いお金でそれを行います。

詳細については、次を参照してください:

マークされた不良セクタ

ハードディスクは、あるセクターを不良と判断すると、その部分をコードで封鎖し、ソフトウェアでの書き込みを不可能にします。そのため、完全な上書きをすることはできません。しかし、ブロックサイズの関係で、これらのセクションは理論上回復可能な数キロバイトにしかならない。

残留磁気

ゼロやランダムなデータで1回だけ完全に上書きしても、最近の高密度ストレージデバイスでは復元可能なデータにはなりません。この操作を繰り返すことは、現在では必要ないことに注意してください。[1] [2] [3] また、[4][5][6]を参照してください。

対象の選択

ノート: Fdisk は GPT でフォーマットされたデバイスでは動作しません。代わりに gdisk (gptfdisk) を使って下さい。

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" コマンドでもストレージデバイスやパーティションのサイズを取得することができます。

ノート:
  • 以下の例では、論理セクタサイズを使用します。
  • 1つのパーティションの終わりと次のパーティションの始まりの差を計算することで、dd コマンドで未割り当てのディスク領域を消去することも可能です。

/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
ノート: 物理的に限られた領域、例えば sd "XY"sd "X" を最初から最後まで消去する場合は count= オプションは必要ありませんが、制限外の書き込みをしようとすると空き容量不足のエラーが表示されることがあります。

データソースを選択

機密データを消去するために、ニーズに合わせて任意のデータパターンを使用することができます。

ゼロ

/dev/zero や単純なパターンによる上書きは、ほとんどの状況で安全であると考えられています。今日のHDDでは、ディスクの消去には適切で高速だと判断されます。

しかし、書き込みパターンや0化が異常に速いドライブは、透過的圧縮を行っている可能性があります。すべてのブロックがこの方法で消去されるわけではないことは明らかです。一部の フラッシュメモリー デバイスでは、そのような "機能" を備えています。

その後、ブロックデバイスの暗号化を設定するには、暗号化を弱めないようにランダムなデータで領域を消去する必要があります (次章参照)

警告: 圧縮の対象であり、フラッシュメモリや SSD との併用に注意が必要、ブロック暗号化準備には上記の通り避けるべきです。

ランダムデータ

/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

巨大なドライブを高速に消去する方法は、以下を見て下さい:

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

警告: USB で接続したデバイスで Secure Erase ATA コマンドを実行してはいけません。詳しくは https://ata.wiki.kernel.org/index.php/ATA_Secure_Erasehttp://www.tomshardware.co.uk/answers/id-1984547/secure-erase-external-usb-hard-drive.html を参照。

hdparmATA Secure Erase をサポートしています。これはディスクをゼロで埋めるのと機能的には同一です。ただし、ハードドライブのファームウェアによって処理されるのが違っていて、"隠しデータ領域"も含まれます。そのため、今日における"ローレベルフォーマット"コマンドとして考えても良いでしょう。このコマンドを実行することで SSD ドライブは生産時のパフォーマンスを発揮することができると言われていますが、十分な消去とまでは言えない可能性もあります (#フラッシュメモリを参照)。

ドライブによっては、メーカーによって定義されたパターンを使用する Enhanced Secure Erase がサポートされていることがあります。hdparm -I の出力で Enhanced 消去が利用できると表示される場合、デバイスにはハードウェア暗号化機能が備わっており、消去は暗号鍵だけで実行されます。

ATA Secure Erase の使用法に関する詳細はソリッドステートドライブ/メモリセルの消去Linux ATA wiki を見て下さい。

blkdiscard

こちらを参照 ソリッドステートドライブ/メモリセルの消去#blkdiscard による一般的な方法

参照