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

提供: ArchWiki
ナビゲーションに移動 検索に移動
(文字列「http://linux.die.net/」を「https://linux.die.net/」に置換)
(他言語へのリンクを追加)
 
(3人の利用者による、間の12版が非表示)
2行目: 2行目:
 
[[Category:ファイルシステム]]
 
[[Category:ファイルシステム]]
 
[[en:Securely wipe disk]]
 
[[en:Securely wipe disk]]
  +
[[es:Securely wipe disk]]
 
{{Related articles start}}
 
{{Related articles start}}
 
{{Related|ディスクの完全消去/ヒントとテクニック}}
 
{{Related|ディスクの完全消去/ヒントとテクニック}}
10行目: 11行目:
 
{{Related|dm-crypt}}
 
{{Related|dm-crypt}}
 
{{Related articles end}}
 
{{Related articles end}}
ディスクワイプを行うにてのビットに新しいデータを書き込ます。
+
ディスクワイプは、すべてのビットに新しいデータを書き込むことによって行われます。
   
{{Note|この記事における"ディスク"にはループバックデバイスも含めます。}}
+
{{Tip|この記事における"ディスク"にはループバックデバイスも含めます。}}
   
 
== 一般的なユースケース ==
 
== 一般的なユースケース ==
  +
 
=== デバイス上に残っているデータを全て消去 ===
 
=== デバイス上に残っているデータを全て消去 ===
デバイスを完全に、二度と復旧できないように消去する最も一般的な理由としては、デバイスを廃棄するまたは売り飛ばす場合が考えられます。デバイス上に (暗号化されていない) データが残っている可能性を考えると、簡単にデータをとり出される前に対処しておいたほうが良いでしょう。データを盗むことは[[ファイルリカバリ]]ソフトウェアなどを使えば朝飯前です。
 
   
  +
デバイスを完全に、二度と復旧できないように消去する最も一般的な理由としては、デバイスを廃棄するまたは売り飛ばす場合が考えられます。デバイス上に (暗号化されていない) データが残っている可能性を考えると、簡単にデータをとり出される前に対処しておいたほうが良いでしょう。データを盗むことは [[ファイルリカバリ]] ソフトウェアなどを使えば朝飯前です。
ディスク上の全てのデータを素早く消去したいという場合、{{ic|/dev/zero}} のようなシンプルなパターンを使うのが一番効率がよく、それでいて十分なランダム性を確保できます。詳しくは[[#データの残留|データの残留]]で説明しています。
 
  +
  +
ディスク上の全てのデータを素早く消去したいという場合、{{ic|/dev/zero}} のようなシンプルなパターンを使うのが一番効率がよく、それでいて十分なランダム性を確保できます。詳しくは [[#データの残存性|データの残存性]] で説明しています。
   
 
ビットを全て上書きしてデータを消去すると通常のシステムの機能 (標準の ATA/SCSI コマンドなど) やハードウェアのインターフェイスでリカバリすることはできなくなります。上で述べたようなファイルリカバリソフトウェアがデータを復旧させようとしたら、プロプライエタリなストレージハードウェアの機能を使う必要が出てきます。
 
ビットを全て上書きしてデータを消去すると通常のシステムの機能 (標準の ATA/SCSI コマンドなど) やハードウェアのインターフェイスでリカバリすることはできなくなります。上で述べたようなファイルリカバリソフトウェアがデータを復旧させようとしたら、プロプライエタリなストレージハードウェアの機能を使う必要が出てきます。
27行目: 30行目:
   
 
=== ブロックデバイス暗号化の準備 ===
 
=== ブロックデバイス暗号化の準備 ===
  +
完全に消去した領域に[[ディスク暗号化#ブロックデバイスの暗号化|ディスク暗号化]]を設定したいという場合、暗号強度が高い乱数生成器 (Random Number Generator、以下 RNG と呼称します) による、[[#ランダムデータ|ランダムデータ]]を使用するべきでしょう。
 
  +
完全に消去した領域に [[ディスク暗号化#ブロックデバイスの暗号化|ディスク暗号化]] を設定したいという場合、暗号強度が高い乱数生成器 (Random Number Generator、以下 RNG と呼称します) による、[[#ランダムデータ|ランダムデータ]]を使用するべきでしょう。
   
 
[[Wikipedia:Random number generation]] を参照してください。
 
[[Wikipedia:Random number generation]] を参照してください。
   
 
{{Warning|ブロックデバイス暗号化が使われているパーティションにランダムなデータや暗号化されたデータ以外が含まれている場合、暗号化ドライブの使用パターンを解析することができ、ファイルシステムレベルの暗号化と大して変わらなくなります。真剣にブロックデバイス暗号化をセットアップしたい場合はランダムではない {{ic|/dev/zero}} やシンプルなパターン (badblocks など) を使ってはいけません。}}
 
{{Warning|ブロックデバイス暗号化が使われているパーティションにランダムなデータや暗号化されたデータ以外が含まれている場合、暗号化ドライブの使用パターンを解析することができ、ファイルシステムレベルの暗号化と大して変わらなくなります。真剣にブロックデバイス暗号化をセットアップしたい場合はランダムではない {{ic|/dev/zero}} やシンプルなパターン (badblocks など) を使ってはいけません。}}
  +
  +
== データの残存性 ==
  +
  +
[[Wikipedia:ja:データの完全消去|データの完全消去]] も参照。データを削除したり消去したりしようとした後でも、データの表現が残っていることがあります。
  +
  +
=== オペレーティングシステム、プログラム、およびファイルシステム ===
  +
  +
オペレーティングシステム、実行されるプログラム、[[Wikipedia:ja:ジャーナリングファイルシステム|ジャーナリングファイルシステム]] は暗号化されていないデータをブロックデバイス全体にコピーする可能性があります。プレーンディスクに書き込む場合、これは上記のいずれかと関連している場合に限ります。
  +
  +
データがディスク上に正確に配置され、他の場所にコピーされていない場合、プールに十分なエントロピーがある限り、ランダムデータによるワイプは徹底的かつ驚くほど迅速に実行できます。
  +
  +
良い例は、{{ic|/dev/urandom}} を使用した [[dm-crypt/デバイスの暗号化#キーの管理|LUKS キースロットの消去]] を使用した cryptsetup です。
  +
  +
=== ハードウェア固有の問題 ===
  +
  +
==== フラッシュメモリー ====
  +
  +
[[Wikipedia:ja:ライトアンプリフィケーション|ライトアンプリフィケーション]] などの特性により、SSD を含むフラッシュメモリは信頼性の高いワイプの対象としては頑強なものとなっています。
  +
デバイスのコントローラチップとオペレーティングシステムから見たデータの間には、多くの透明な抽象化が存在するため、光景データがその場で上書きされることはなく、特定のブロックやファイルをワイプすることは信頼性がありません。
  +
  +
透過的な圧縮 (すべての SandForce SSD) などの他の "機能" は、ゼロまたは反復パターンを圧縮できるため、消去が信じられないほど高速である場合、これが原因である可能性があります。
  +
  +
[http://www.flash-extractor.com/manual/reader_models/ シンプルなハードウェア] を使用すると、コントローラを介さずにフラッシュ メモリデバイスを分解し、チップのはんだを外し、データコンテンツを分析することが問題なく実行できます。データ復旧会社は安いお金でそれを行います。
  +
  +
詳細については、次を参照してください:
  +
  +
* [[ソリッドステートドライブ/メモリセルの消去]]
  +
* [https://www.usenix.org/events/fast11/tech/full_papers/Wei.pdf フラッシュベースのソリッドステートドライブから確実にデータを消去]
  +
* [[ディスクの完全消去#ターゲットを選択|ターゲットを選択]]
  +
  +
==== マークされた不良セクタ ====
  +
  +
ハードディスクは、あるセクターを不良と判断すると、その部分をコードで封鎖し、ソフトウェアでの書き込みを不可能にします。そのため、完全な上書きをすることはできません。しかし、ブロックサイズの関係で、これらのセクションは理論上回復可能な数キロバイトにしかならない。
  +
  +
==== 残留磁気 ====
  +
  +
ゼロやランダムなデータで1回だけ完全に上書きしても、最近の高密度ストレージデバイスでは復元可能なデータにはなりません。この操作を繰り返すことは、現在では必要ないことに注意してください。[https://www.howtogeek.com/115573/htg-explains-why-you-only-have-to-wipe-a-disk-once-to-erase-it/] [https://web.archive.org/web/20120102004746/] [http://www.h-online.com/newsticker/news/item/Secure-deletion-a-single-overwrite-will-do-it-739699.html] また、[https://www.google.com/search?tbs=bks:1&q=isbn:9783540898610]、[https://security.stackexchange.com/questions/26132/is-data-remanence-a-myth/26134#26134]、[https://www.nber.org/sys-admin/overwritten-data-guttman.html]を参照してください。
   
 
== 対象の選択 ==
 
== 対象の選択 ==
68行目: 109行目:
 
[[Wikipedia:Dd (Unix)#Block size]], [https://people.redhat.com/msnitzer/docs/io-limits.txt blocksize io-limits] も見て下さい。
 
[[Wikipedia:Dd (Unix)#Block size]], [https://people.redhat.com/msnitzer/docs/io-limits.txt blocksize io-limits] も見て下さい。
   
[[Advanced Format]] のハードドライブを使用している場合、ブロックサイズをデフォルトの512バイトよりも大きく指定することを推奨します。高速に書き換え処理を行うために、あなたの使用しているドライブの物理的なジオメトリにブロックサイズを合わせて下さい。''dd'' コマンドにブロックサイズオプションを追加することで指定できます (例: 4KB の場合 {{ic|<nowiki>bs=4096</nowiki>}})
+
[[Advanced Format]] のハードドライブを使用している場合、ブロックサイズをデフォルトの512バイトよりも大きく指定することを推奨します。高速に書き換え処理を行うために、あなたの使用しているドライブの物理的なジオメトリにブロックサイズを合わせて下さい。''dd'' コマンドにブロックサイズオプションを追加することで指定できます (例: 4KB の場合 {{ic|<nowiki>bs=4096</nowiki>}})
   
 
''fdisk'' は全てのディスクの物理セクタと論理セクタのサイズを出力します。
 
''fdisk'' は全てのディスクの物理セクタと論理セクタのサイズを出力します。
84行目: 125行目:
 
以下では消去するべきデータ領域を決定する例を示します。
 
以下では消去するべきデータ領域を決定する例を示します。
   
  +
ブロックストレージデバイスにはセクタがあり、1つのセクタのサイズはデバイス全体のサイズをバイト単位で計算するために使用することができます。セクタとセクタの大きさを掛け合わせることで計算できます。
A block storage devices contains sectors and a size of a single sector that can be used to calculate the whole size of device in bytes. You can do it by multiplying sectors with size of the sector.
 
   
 
''dd'' コマンドを使ってパーティションを消去するパラメータの例:
 
''dd'' コマンドを使ってパーティションを消去するパラメータの例:
90行目: 131行目:
 
# dd if=''data_source'' of=/dev/sdX bs=''sector_size'' count=''sector_number'' seek=''partitions_start_sector''
 
# dd if=''data_source'' of=/dev/sdX bs=''sector_size'' count=''sector_number'' seek=''partitions_start_sector''
   
  +
ここでは、root で {{ic|fdisk -l /dev/sdX}} の出力の一部だけを表示し、パーティション情報の例を示しています。
Here you will see only a part of output of {{ic|fdisk -l /dev/sdX}} with root, showing the example partition information:
 
   
 
{{bc|Device Boot Start End Sectors Size Id Type
 
{{bc|Device Boot Start End Sectors Size Id Type
109行目: 150行目:
 
Sector size (logical/physical): 512 bytes / 4096 bytes
 
Sector size (logical/physical): 512 bytes / 4096 bytes
   
  +
ディスクサイズを物理セクタ単位で取得するには、既知のディスクサイズをバイト単位で1物理セクタのサイズに分割する必要があります {{ic|echo $((2000398934016 / 4096))}}, {{ic|blockdev --getsize64 /dev/sd "XY"}} コマンドでもストレージデバイスやパーティションのサイズを取得することができます。
To get disk size in the physical sectors you will need the known disk size in bytes divided with size of a single physical sector {{ic|echo $((2000398934016 / 4096))}}, you can get size of the storage device or partition on it even with the {{ic|blockdev --getsize64 /dev/sd"XY"}} command.
 
   
 
{{Note|
 
{{Note|
  +
* 以下の例では、論理セクタサイズを使用します。
* In the examples below we will use the logical sector size.
 
  +
* 1つのパーティションの終わりと次のパーティションの始まりの差を計算することで、{{ic|dd}} コマンドで未割り当てのディスク領域を消去することも可能です。
* You can even wipe unallocated disk space with a {{ic|dd}} command by calculating the difference between the end of one and start of the next partition.
 
 
}}
 
}}
   
139行目: 180行目:
 
# dd if=''data_source'' of=/dev/sd"X" bs=${PhysicalSectorSizeBytes} count=${AllDiskPhysicalSectors} seek=0
 
# dd if=''data_source'' of=/dev/sd"X" bs=${PhysicalSectorSizeBytes} count=${AllDiskPhysicalSectors} seek=0
   
  +
{{Note|物理的に限られた領域、例えば {{ic|sd "XY"}} や {{ic|sd "X"}} を最初から最後まで消去する場合は {{ic|1=count=}} オプションは必要ありませんが、制限外の書き込みをしようとすると空き容量不足のエラーが表示されることがあります。}}
{{Note|The {{ic|1=count=}} option not necessary when wiping the physical limited area e.g. {{ic|sd"XY"}} or {{ic|sd"X"}} from begin to the end but will show an error about out of free space when will try to write outside of limits.}}
 
   
== データソース選択 ==
+
== データソース選択 ==
   
先に述べた通り、重要なデータを消去いときは必要応じ手段選ぶことができます。
+
機密データを消去するめにニーズ合わせ任意のデータパターン使用することができます。
   
  +
=== ゼロ ===
消去した後にブロックデバイスの暗号化をセットアップしたい場合、データソースとして暗号を使用して消去を行うべきでしょう。最低でも擬似乱数によるデータを使って下さい。
 
   
  +
{{ic|/dev/zero}} や単純なパターンによる上書きは、ほとんどの状況で安全であると考えられています。今日のHDDでは、ディスクの消去には適切で高速だと判断されます。
ランダムなデータを使わない場合、ディスクの書き込み速度によって実行時間が変わります。ランダムなデータが必要な場合、ランダムデータを生成するシステムの性能とエントロピーのソースによって実行時間は変わります。
 
   
  +
しかし、書き込みパターンや0化が異常に速いドライブは、透過的圧縮を行っている可能性があります。すべてのブロックがこの方法で消去されるわけではないことは明らかです。一部の [[ディスクの完全消去#フラッシュメモリー|フラッシュメモリー]] デバイスでは、そのような "機能" を備えています。
=== ランダムではないデータ ===
 
大抵は {{ic|/dev/zero}} などのシンプルなパターンで上書きするので安全です。高速にディスク消去をしたい場合は十分でしょう。
 
   
  +
その後、ブロックデバイスの暗号化を設定するには、暗号化を弱めないようにランダムなデータで領域を消去する必要があります (次章参照)
{{Warning|異常に高速にドライブに書き込みが行われる場合、透過圧縮がされている可能性があります。この場合、全てのブロックが消去されるとは限りません。[[#フラッシュメモリ|フラッシュメモリ]]デバイスはこの"機能"を持っていることが多々あります。}}
 
   
  +
{{Warning|圧縮の対象であり、フラッシュメモリや SSD との併用に注意が必要、ブロック暗号化準備には上記の通り避けるべきです。}}
==== パターン書き込みのテスト ====
 
[[#Badblocks|Badblocks]] はシンプルなパターンをデバイスのブロックに書き込むことができ、壊れた領域がないか検索してチェックすることができます (memtest86* がメモリで行うのと同じようなテストです)。
 
 
アクセス可能なブロック全てにパターンが書き込まれるため、効率的にデバイスを消去することができます。
 
   
 
=== ランダムデータ ===
 
=== ランダムデータ ===
   
ランダムたは擬似的にランダムデータソースとして使う場合、[[乱数生成]]をさい。
+
{{ic|/dev/random}} を使った真のランダムデータソースは、エントロピー生成を待つのに時間がかかりすぎるめ、大容量のワイプには非現実的です。{{ic|/dev/urandom}} は擬似ランダムデータの妥当なソースとして使うことができます。ソースとしてのランダムデータと擬似ランダムデータの違いについては、[[乱数生成]] 参照しください。
 
{{Note|[[#ランダムではないデータ]] の警告に書いたようにデバイスが透過的に圧縮している場合、圧縮しづらいデータ (ランダムデータ) は書き込みが遅くなります。しかしながら、ランダムなデータは [[#データの残留]] がありません。最大書き込み速度がボトルネックにならないのであれば、ランダムデータによるディスク消去で残留を完全に無視できます。}}
 
 
=== 暗号データ ===
 
   
フルディスク暗号化用にドイブを準備する際に、高品質なエトロピを使用する必要ありません。暗号化されたデータストリームを使ことで間に合います。例えば、AES 使ってパーティションを暗号化する場合、ファイルシステムを作成する前に同暗号を使っtえディスクを消去することで、使用している領域と領域を判断することができなくなります。
+
疑似ランダムデタ生成のもう一つの方法暗号化されたデータストリームを使用することである。例えば、ブロック暗号化用のデバイス用意し、暗号化パーティションに AES 使用する場合、ファイルシステムを作成する前に同様の暗号消去空き領域が使用領域と区別でないようにすることが適切です。
   
 
== 対象の上書き ==
 
== 対象の上書き ==
   
選択したドライブをユーティリティを使って上書きします。都合に合わせて選択してください。単一のファイルだけ削除したい場合、[[ディスクの完全消去/ヒントとテクニック#単体ファイルの消去]]に以下で説明しているユーティリティの追加説明があります。
+
選択したドライブをユーティリティを使って上書きします。都合に合わせて選択してください。単一のファイルだけ削除したい場合、[[ディスクの完全消去/ヒントとテクニック#単体ファイルの消去]] に以下で説明しているユーティリティの追加説明があります。
   
 
=== 出力のリダイレクト ===
 
=== 出力のリダイレクト ===
231行目: 264行目:
 
$ wipe -r -q /path/to/wipe
 
$ wipe -r -q /path/to/wipe
   
参照: [https://linux.die.net/man/1/wipe man ページ]
+
参照: [https://linux.die.net/man/1/wipe man ページ]
   
 
=== shred ===
 
=== shred ===
243行目: 276行目:
 
# shred --verbose --random-source=/dev/urandom -n1 /dev/sd''X''
 
# shred --verbose --random-source=/dev/urandom -n1 /dev/sd''X''
   
=== Badblocks ===
+
=== scrub ===
   
  +
[https://github.com/chaos/scrub ''scrub''] は、データの取得をより困難にするために、ファイルまたはディスクデバイスにパターンを繰り返し書き込みます。
badblocks でディスク消去を行うには、破壊的な [[Badblocks#読み書きテスト (破壊的)|read-write テスト]]を実行します:
 
   
  +
次のコマンドは、モード 1 のデフォルト設定でスクラブを呼び出し、NNSA ポリシーレター NAP-14.x に準拠したパターンを使用してターゲットデバイスを上書きします。これが最も効果的な方法です。
# badblocks -c <NUMBER_BLOCKS> -wsv /dev/<drive>
 
   
  +
$ scrub /dev/sd''X''
=== hdparm ===
 
   
  +
次のコマンドは、モード 2 のデフォルト設定でスクラブを呼び出し、NNSA ポリシーレター NAP-14.x に準拠したパターンを使用してターゲットファイルを上書きし、書き込まれたバイトを切り捨てて最後のファイルシステムブロックを埋めます。このモードには注意事項があります。詳細については、[https://linux.die.net/man/1/scrub ''manual''] を参照してください。
{{warning|USB で接続したデバイスで Secure Erase ATA コマンドを実行してはいけません。詳しくは https://ata.wiki.kernel.org/index.php/ATA_Secure_Erase や http://www.tomshardware.co.uk/answers/id-1984547/secure-erase-external-usb-hard-drive.html を参照。}}
 
   
  +
$ scrub /path/to/''file'' # where ''file'' is a regular file
[[hdparm]] は [http://tinyapps.org/docs/wipe_drives_hdparm.html ATA Secure Erase] をサポートしています。これはディスクをゼロで埋めるのと機能的には同一です。ただし、ハードドライブのファームウェアによって処理されるのが違っていて、"隠しデータ領域"も含まれます。そのため、今日における"ローレベルフォーマット"コマンドとして考えても良いでしょう。このコマンドを実行することで [[SSD]] ドライブは生産時のパフォーマンスを発揮することができると言われていますが、十分な消去とまでは言えない可能性もあります ([[#フラッシュメモリ]]を参照)。
 
   
  +
次のコマンドは、モード 3 のデフォルト設定でスクラブを呼び出し、ディレクトリを作成し、ファイルシステムがいっぱいになるまでそのディレクトリにファイルを埋め込みます。次に、NNSA ポリシーレター NAP-14.x に準拠したパターンを使用してファイルが scrub され、書き込まれたバイトが丸められて最後のファイルシステムブロックが埋められます。このモードには注意事項があります。詳細については、[https://linux.die.net/man/1/scrub ''manual''] を参照してください。
ドライブによっては、メーカーによって定義されたパターンを使用する '''Enhanced Secure Erase''' がサポートされていることがあります。{{ic|hdparm -I}} の出力で '''Enhanced''' 消去が利用できると表示される場合、デバイスにはハードウェア暗号化機能が備わっており、消去は暗号鍵だけで実行されます。
 
   
  +
$ scrub /path/to/''dir'' # where ''dir'' is a new directory name.
ATA Secure Erase の使用法に関する詳細は[[ソリッドステートドライブ/メモリセルの消去]]や [https://ata.wiki.kernel.org/index.php/ATA_Secure_Erase Linux ATA wiki] を見て下さい。
 
   
  +
詳しい使用方法と情報については、[https://linux.die.net/man/1/scrub ''manual''] を参照してください。
=== secure-delete ===
 
   
  +
=== Badblocks ===
[[AUR]] の {{AUR|secure-delete}} パッケージには安全な消去のためのユーティリティが複数含まれています。例えば {{ic|sfill}} は特定のマウントポイントの空き領域だけを消去します。例:
 
   
  +
badblocks でディスク消去を行うには、破壊的な [[Badblocks#読み書きテスト (破壊的)|read-write テスト]]を実行します:
# sfill -v /
 
   
  +
# badblocks -c <NUMBER_BLOCKS> -wsv /dev/<drive>
詳しくは [https://superuser.com/questions/19326/how-to-wipe-free-disk-space-in-linux ツールのリスト] を見て下さい。
 
   
== データの残留 ==
+
=== hdparm ===
   
  +
{{warning|USB で接続したデバイスで Secure Erase ATA コマンドを実行してはいけません。詳しくは https://ata.wiki.kernel.org/index.php/ATA_Secure_Erase や http://www.tomshardware.co.uk/answers/id-1984547/secure-erase-external-usb-hard-drive.html を参照。}}
[[Wikipedia:Data remanence]] を参照してください。
 
   
  +
[[hdparm]] は [http://tinyapps.org/docs/wipe_drives_hdparm.html ATA Secure Erase] をサポートしています。これはディスクをゼロで埋めるのと機能的には同一です。ただし、ハードドライブのファームウェアによって処理されるのが違っていて、"隠しデータ領域"も含まれます。そのため、今日における"ローレベルフォーマット"コマンドとして考えても良いでしょう。このコマンドを実行することで [[SSD]] ドライブは生産時のパフォーマンスを発揮することができると言われていますが、十分な消去とまでは言えない可能性もあります ([[#フラッシュメモリ]]を参照)。
たとえデータの削除・消去を行った後でも、データが残留している可能性は存在します。
 
   
  +
ドライブによっては、メーカーによって定義されたパターンを使用する '''Enhanced Secure Erase''' がサポートされていることがあります。{{ic|hdparm -I}} の出力で '''Enhanced''' 消去が利用できると表示される場合、デバイスにはハードウェア暗号化機能が備わっており、消去は暗号鍵だけで実行されます。
一回だけでなく複数回、繰り返しディスクに(ランダムな)データを書き込むことで残留データを消去できるかもしれませんが、複数回書き換えることでハードディスクドライブのデータを復元できる可能性が劇的に減るわけではありません。[[#残留磁気]]を見て下さい。
 
   
  +
ATA Secure Erase の使用法に関する詳細は[[ソリッドステートドライブ/メモリセルの消去]]や [https://ata.wiki.kernel.org/index.php/ATA_Secure_Erase Linux ATA wiki] を見て下さい。
=== オペレーティングシステム、プログラム、ファイルシステム ===
 
   
  +
=== blkdiscard ===
オペレーティングシステムや実行プログラム、あるいは[[Wikipedia:Journaling file system|ジャーナリングファイルシステム]]は暗号化されていないデータをブロックデバイスの至る所にコピーする可能性があります。暗号化されていないディスクに書き込みを行う場合にのみ関係してきます。
 
   
  +
こちらを参照 [[ソリッドステートドライブ/メモリセルの消去#blkdiscard による一般的な方法]]
ディスク上のデータの位置を正確に把握することができるのであれば、エントロピープールさえ十分ならランダムデータによる消去は驚くほど高速に行われます。
 
   
  +
== 参照 ==
{{ic|/dev/urandom}} を使って [[Dm-crypt/デバイスの暗号化#キーの管理|LUKS キースロットを消去]]する cryptsetup が良い例です。
 
 
=== ハードウェア特有の問題 ===
 
 
==== フラッシュメモリ ====
 
 
[[Wikipedia:ja:ライトアンプリフィケーション|ライトアンプリフィケーション]]などの機能があるために、フラッシュメモリを完全に消去するのは厄介です。デバイスのコントローラチップから見えるデータと、オペレーティングシステムから見えるデータの間には、透過的な抽象レイヤーが多数存在しており、データの書き込まれる場所が食い違っているために、特定のブロックやファイルを消去したとしても確実にデータが書き換えられているとは限りません。
 
 
(SandForce の全ての SSD に搭載されている) 透過圧縮などの"機能"は {{ic|/dev/zero}} などのパターンストリームを圧縮してしまうことがあり、信じられないほど速く消去が終わってしまった場合、圧縮されてしまっている可能性があります。
 
 
Flash メモリデバイスを解体して、チップのハンダ付けを取り除き、中に入っているコントローラを使わずにデータの中身を解析することは [http://www.flash-extractor.com/manual/reader_models/ 単純なハードウェア] だけで簡単に行えてしまいます。データ復旧会社は安価にこれをしています。
 
 
詳細は次を参照: [http://www.usenix.org/events/fast11/tech/full_papers/Wei.pdf Reliably Erasing Data From Flash-Based Solid State Drives]。
 
 
==== 不良セクタ ====
 
 
ハードドライブが不良セクタを認識すると、セクタへのアクセスが遮断され、ソフトウェアからはその領域に書き込みできなくなります。それによって、完全な書き換えがその領域にまで及ばない可能性があります。ただし、ブロックサイズから考えて、理論上、その領域からリカバリできるサイズはあくまで数 KB ほどしかありません。
 
 
==== 残留磁気 ====
 
   
  +
* [https://superuser.com/questions/19326/how-to-wipe-free-disk-space-in-linux Linux の空き領域を消去する]
最近の高密度なストレージデバイスでは一回ゼロやランダムデータで上書きした時点でデータは全て消去されます [http://www.howtogeek.com/115573/htg-explains-why-you-only-have-to-wipe-a-disk-once-to-erase-it/]。残されたビットからバイトパターンを復元することは基本的に不可能です [https://web.archive.org/web/20120102004746/http://www.h-online.com/newsticker/news/item/Secure-deletion-a-single-overwrite-will-do-it-739699.html]。[https://www.google.com/search?tbs=bks:1&q=isbn:9783540898610], [https://security.stackexchange.com/questions/26132/is-data-remanence-a-myth/26134#26134], [http://www.nber.org/sys-admin/overwritten-data-guttman.html] も参照してください。
 

2023年12月15日 (金) 16:04時点における最新版

関連記事

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

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

一般的なユースケース

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

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

ディスク上の全てのデータを素早く消去したいという場合、/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 による一般的な方法

参照