「ディスクの完全消去」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
181行目: 181行目:
 
{{Note|物理的に限られた領域、例えば {{ic|sd "XY"}} や {{ic|sd "X"}} を最初から最後まで消去する場合は {{ic|1=count=}} オプションは必要ありませんが、制限外の書き込みをしようとすると空き容量不足のエラーが表示されることがあります。}}
 
{{Note|物理的に限られた領域、例えば {{ic|sd "XY"}} や {{ic|sd "X"}} を最初から最後まで消去する場合は {{ic|1=count=}} オプションは必要ありませんが、制限外の書き込みをしようとすると空き容量不足のエラーが表示されることがあります。}}
   
== データソース選択 ==
+
== データソース選択 ==
   
先に述べた通り、重要なデータを消去いときは必要応じ手段選ぶことができます。
+
機密データを消去するめにニーズ合わせ任意のデータパターン使用することができます。
   
  +
=== ゼロ ===
消去した後にブロックデバイスの暗号化をセットアップしたい場合、データソースとして暗号を使用して消去を行うべきでしょう。最低でも擬似乱数によるデータを使って下さい。
 
   
  +
{{ic|/dev/zero}} や単純なパターンによる上書きは、ほとんどの状況で安全であると考えられています。今日のHDDでは、ディスクの消去には適切で高速だと判断されます。
ランダムなデータを使わない場合、ディスクの書き込み速度によって実行時間が変わります。ランダムなデータが必要な場合、ランダムデータを生成するシステムの性能とエントロピーのソースによって実行時間は変わります。
 
   
  +
しかし、書き込みパターンや0化が異常に速いドライブは、透過的圧縮を行っている可能性があります。すべてのブロックがこの方法で消去されるわけではないことは明らかです。一部の [[ディスクの完全消去#フラッシュメモリー|フラッシュメモリー]] デバイスでは、そのような "機能" を備えています。
=== ランダムではないデータ ===
 
大抵は {{ic|/dev/zero}} などのシンプルなパターンで上書きするので安全です。高速にディスク消去をしたい場合は十分でしょう。
 
   
  +
その後、ブロックデバイスの暗号化を設定するには、暗号化を弱めないようにランダムなデータで領域を消去する必要があります (次章参照)
{{Warning|異常に高速にドライブに書き込みが行われる場合、透過圧縮がされている可能性があります。この場合、全てのブロックが消去されるとは限りません。[[#フラッシュメモリ|フラッシュメモリ]]デバイスはこの"機能"を持っていることが多々あります。}}
 
   
  +
{{Warning|圧縮の対象であり、フラッシュメモリや SSD との併用に注意が必要、ブロック暗号化準備には上記の通り避けるべきです。}}
==== パターン書き込みのテスト ====
 
[[#Badblocks|Badblocks]] はシンプルなパターンをデバイスのブロックに書き込むことができ、壊れた領域がないか検索してチェックすることができます (memtest86* がメモリで行うのと同じようなテストです)。
 
 
アクセス可能なブロック全てにパターンが書き込まれるため、効率的にデバイスを消去することができます。
 
   
 
=== ランダムデータ ===
 
=== ランダムデータ ===
   
ランダムたは擬似的にランダムデータソースとして使う場合、[[乱数生成]]をさい。
+
{{ic|/dev/random}} を使った真のランダムデータソースは、エントロピー生成を待つのに時間がかかりすぎるめ、大容量のワイプには非現実的です。{ic|/dev/urandom}} は擬似ランダムデータの妥当なソースとして使うことができます。ソースとしてのランダムデータと擬似ランダムデータの違いについては、[[乱数生成]] 参照しください。
 
{{Note|[[#ランダムではないデータ]] の警告に書いたようにデバイスが透過的に圧縮している場合、圧縮しづらいデータ (ランダムデータ) は書き込みが遅くなります。しかしながら、ランダムなデータは [[#データの残留]] がありません。最大書き込み速度がボトルネックにならないのであれば、ランダムデータによるディスク消去で残留を完全に無視できます。}}
 
 
=== 暗号データ ===
 
   
フルディスク暗号化用にドイブを準備する際に、高品質なエトロピを使用する必要ありません。暗号化されたデータストリームを使ことで間に合います。例えば、AES 使ってパーティションを暗号化する場合、ファイルシステムを作成する前に同暗号を使ってディスクを消去することで、使用している領域と領域を判断することができなくなります。
+
疑似ランダムデタ生成のもう一つの方法暗号化されたデータストリームを使用することである。例えば、ブロック暗号化用のデバイス用意し、暗号化パーティションにAES使用する場合、ファイルシステムを作成する前に同様の暗号消去空き領域が使用領域と区別でないようにすることが適切です。
   
 
== 対象の上書き ==
 
== 対象の上書き ==

2023年2月11日 (土) 02:22時点における版

関連記事

ディスクワイプを行うには全てのビットに新しいデータを書き込みます。

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

一般的なユースケース

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

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

ディスク上の全てのデータを素早く消去したいという場合、/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 を使った真のランダムデータソースは、エントロピー生成を待つのに時間がかかりすぎるため、大容量のワイプには非現実的です。{ic|/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

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 を見て下さい。

secure-delete

AURsecure-deleteAUR パッケージには安全な消去のためのユーティリティが複数含まれています。例えば sfill は特定のマウントポイントの空き領域だけを消去します。例:

# sfill -v /

詳しくは ツールのリスト を見て下さい。

参照