ディスクの完全消去/ヒントとテクニック

提供: ArchWiki
ナビゲーションに移動 検索に移動

メインの記事はディスクの完全消去を見てください。

この記事では素早く消去することができる特殊なユーティリティを使用する消去方法について説明します。

警告: 予約ブロックはファイルの作成では消去されません。tune2fs ユーティリティを使うことで無効にできます。

単体ファイルの消去

警告: パーティションが 断片化 している場合や、パーティションをリサイズあるいは移動したことがある場合、もしくは同一デバイス上にファイルが 重複 している場合、単体ファイルの消去は効率的ではありません。データ暗号化 コンテナを消去した場合、リカバリするのが難しくなりますが暗号化の ディスクパフォーマンス は低くなります。ハードウェアによる暗号化 の場合は性能には影響ありません。ディスクの完全消去#データの残留 を参照してください。
ノート: ファイルのアクセス時刻や変更時刻を残したくない場合、touch(1) コマンドを使って時刻を変更したり stat(1) コマンドでファイルにアクセスする前に時刻情報を読み込むことができます。サポートされているメタデータとタイムスタンプについてはファイルシステムの比較を見てください。

単一ファイルのワイプは、2つの基本的な方法と1つの高度なアンチフォレンジック時間がかかる方法で構成されており、専用のツールでのみ可能ですが、最後の1つの方法はこの記事でカバーしません。

  • 削除する前にランダムなデータで上書きしたり、同じサイズの別のファイルで内容を置き換える。
  • 特殊なツールを使ってファイルシステムに保存されているファイルとメタデータを消去する。
    • ディスク全体を検索して、削除された残骸の部分を探し、他のファイルやその痕跡に変更を加えることなく、それらも消去することができます。

一般的な Linux ユーティリティを使うことでサイズを変更することなくファイルを上書きすることができます:

  • shred -x file を実行すると file ファイルの中身が擬似乱数のデータに置き換わります。ファイルサイズは変わりません (-x) -u オプションを使うと上書きした後に file が削除されます。
  • mkfs を使うと、ファイルをファイルシステムに変換して、その中のすべてを変更したり、マウントしたり、他のコンテンツで埋めて上書きしたりすることができます。
  • dd は、あらかじめ設定したサイズと内容のファイルを作成し、保存先のファイル名が存在する場合は上書きします。ddskipseek オプションを組み合わせて、ファイル全体または一部だけを別の内容に置き換えることができます。ファイルの拡張を避けるために、ファイルのサイズを知る必要がありますが、 du -b file_name | cut -f1stat -c "%s" file_name で可能です。ファイルに対して正しく動作させるためには、iflag=fullblock オプションを使用することが必須です。
  • perl ユーティリティで行えるサイズ変更を避けるため、ファイル内のコンテンツを単一のシンボルに置き換えます。

メタデータを消去したい場合、パーティションをファイルで一杯にすることでファイルに関する古いエントリを新しいエントリでファイルシステムに置き換えさせることができます。あるいは特殊なユーティリティを使用する方法もあります。下の 空き領域の消去 セクションを見てください。

すべての Linux ファイル作成および変換ツールをどのように組み合わせて、ファイルの回復を防止したり、回復ツールと、ランダムに書き換えたり、事前定義されたコンテンツに置き換えたりして回復ツールを使用する人を誤解させたりするかは、あなた次第です。

ノート:
  • 単純な上書きでは、空き容量がある場合、ファイルのずれた部分が残ってしまう可能性があります。
  • ディスク上の位置を変えずに特定のファイルの内容を書き換えるには、まずパーティションを一杯にするファイルを作成し、その後、好みのユーティリティで隠したいファイルの内容を書き換えたり、置き換えたりします。空き容量が大きく、ファイル数が少ない場合は、作業時間が長くなります。

例:

ファイルの中身を全て . に置き換える Perl コマンド:

$ perl -p -i -e 's\[^*]\.\g' file_name

dd:

$ source_content | dd bs=size_in_bytes count=1 iflag=fullblock of=destination_file seek=0

または、stdout リダイレクトを使用すると、作成がわずかに高速になりますが、seek オプションを使用して宛先の一部をスキップすることはできません。

$ source_content | dd bs=size_in_bytes count=1 iflag=fullblock > destination_file
ヒント: ソースファイルがデスティネーションより低い場合は、以下のセクションで説明する while ループと組み合わせる必要があります。

参照:

対象の上書き

マウントされているパーティションを消去しない

注意して消去するデバイスを選択してください。間違えるとシステムを破損してしまう恐れがあります。危険を避けるために、消去ツールをラッピングするスクリプトを使うことができます。例:

if [[ -e "$1" && -b "$1" ]];then 
NOT_safe="$(lsblk -o "NAME,MOUNTPOINT" ${1//[0-9]/} | grep -e / -e '\]')";
 if [[ -z "$NOT_safe" ]];then
# Here you can use any of your favourite wiping tools 
# to wipe destination passed on command line and stored in variable "$1"
# 
  else
  echo 'Not allowed to destroy if any of the partitions is mounted: '"$NOT_safe"
 fi
fi 

dd - 高度な例

以下のコマンドは OpenSSL によるランダムなシードの AES 暗号を使ってドライブやパーティションをランダム化します (pv で進捗メーターが表示されます):

# openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt </dev/zero \
    | pv -bartpes <DISK_SIZE> | dd bs=64K of=/dev/sd"X"

(オプションの) バイト単位の合計ディスク サイズ (DISK_SIZE) は、次の方法で取得できます。

# blockdev --getsize64 /dev/sd"X"
250059350016

上のコマンドは、/dev/urandom からシードされた128バイトの暗号鍵を作成します。CTR モードの AES-256 は、urandom キーで /dev/zero の出力を暗号化するために使用されます。疑似ランダムソースの代わりに暗号を利用することで、非常に高い書き込み速度が得られ、結果としてデバイスがAES暗号文に埋め尽くされます。

ブロックサイズは、通常デフォルトの512バイトより高速で、さまざまなハードウェアでほぼ最適な転送速度が得られるため、上記では64Kに設定されています。 [1] こちらも参照。

Dm-crypt/ドライブの準備#dm-crypt で空のディスクまたはパーティションを消去に同じような方法が載っています。

テンプレートファイルを使う

ゼロの代わりに、見つけて欲しいファイルの束や、mkfs フォーマットされたファイルで作られたパーティションプリントが使えますが、コンテンツやお好みのユーティリティから繰り返し出力されるものでマウントして埋める必要があります。

デバイスが終了するまでワイプするという方法もありますが、デバイス終了に関するエラーが表示されたときに stop keys を使って while ループを中断しなければならないので、この種のリダイレクトは推奨されません。

$ while [ 1 -lt 2 ];do cat file1-to-use.as-template file2-to-use.as-template /tmp/templatefiles/* ;done > /dev/sd"XY"

dd を使うと、オプションでワイプするサイズを正しく設定すれば、スペースエラーなしに安全にワイプを繰り返すことができます。stdout の while ループの中で dd を使うと、skipseek オプションをランダムまたは固定値で組み合わせて、ファイルのどの部分を復元するかを選択することができるようになります。

while [ 2 -gt 1 ]; do 
 if [ -z "$(pidof dd)"  ];then 
  break ;
 fi;
cat file1-to-use.as-template file2-to-use.as-template /tmp/templatefiles/* ;
done | dd of=/dev/sd"XY" seek=start_sector bs=sector_size count=sectors_to_wipe
ヒント: 同じ箇所を繰り返し書き換える場合。また、while ... done | dd ... のあたりの2回目のループの変数を使用して、新しいループごとに使用するソーステンプレートファイルの行き先を変更することができます。
ノート: 上書きに使用する定義済みデータが本当に大量にある場合は、SquashFS の機能を使用してファイルやフォルダを圧縮することができます。マウントされた ramdisk に圧縮すれば、物理的な読み込みは少なくなりますが、CPU使用率は高くなります。または、圧縮されたアーカイブを作成し、ramdiskにコピーして、標準出力に展開できるファイル展開ユーティリティを使用することもできます。欠点は、各実行ですべて同じ内容を使用したくない場合、フォルダとファイルの間を移動するのが難しくなることです。利点は、アーカイブが作成時にボリュームに分割されている場合、アーカイブの生の部分でも使用することができることです。

参照:

  • sector size - ファイルの作成とセクターサイズ

空き領域の消去

警告: ブロックデバイス暗号化の準備 をする前に以下を使うのは適切ではありません。

空き領域は複数の方法で消去できます:

  • たとえば cp コマンドを使用して、空き領域がなくなるまで、ランダムなファイル名または宛先ディレクトリを使用してループで複数のファイルをコピーします。
  • ランダムなパスワードとファイル名で暗号化されたファイルを作成するユーティリティを使用します。ファイル圧縮ユーティリティの中には、圧縮方法、ファイルタイプのオプションがあり、作成時にファイルをプリセットサイズのボリュームに分割できるものもあります。いくつかのオプションをランダムに使用してループさせることで、空き領域全体を暗号化されたデータで満たし、以前のデータを上書きすることができます。
  • 次のような空き領域消去専用のプログラムを使用する。

wipefreespace — Wipe Free Space は、ファイルシステムの空き領域を安全に消去して、削除された機密データの回復を防ぎます。

https://sourceforge.net/projects/wipefreespace/ || wipefreespaceAUR

zerofree — ファイルシステム内のゼロ以外の空きブロックをスキャンし、それらをゼロで埋めます

https://frippery.org/uml/ || zerofreeAUR

dd を使う

dd を使用して、空のスペースを埋めるファイルを作成できます。

dd if=source of=junk
sync
rm junk

source には /dev/urandom または /dev/zero ストリームを指定することができます。 データはディスク上で同期されたことを確認した後、ファイルは削除されます。

7zip を使う

Password="$(dd if=/dev/urandom bs=128 count=1)"
DestinationFile="$((${RANDOM/0/1}$(date "+%s")/${RANDOM/0/1}))"
7z a -t7z -mhe=on -p"${Password}" -mx=0 -v1m ${DestinationFile} source

使用しているオプションの説明は 7z(1) を参照してください。

source には、ランダムなデータを含む定義済みのファイルや、デバイス、例えば /dev/urandom やその上の別のブロックデバイスやパーティション、例えば /dev/sd "XY" を指定でき、その上で、見られても大丈夫なデータなら削除したファイルも圧縮先に送られることになります。

ノート:
  • CPU 使用率を抑えるためのデータ保存と、空き容量を早く埋めるための圧縮レベルの設定は必要ありません。
  • また、RAM をある程度確保する tmpfs を使用しているため、読み込みが高速化されます。

timeout コマンドを利用して複数のファイルを作成

loop で使用されるランダムな待ち時間を持つ timeout コマンドは、ランダムなサイズのファイルを残すため、コマンドを中断します。これは遅い方法ですが、可能な代替案の1つです。また、ランダム部分の前にあらかじめ定義されたファイル名を持つ配列を使うこともできます。

AA=${RANDOM/0/1};
timeout $((AA/100)) cat /dev/urandom > filename${RANDOM}.tmp;

参照:

  • limits 異なるファイルシステムでのファイル作成用。
  • meta-data ファイルシステム内のファイルは、削除された後もファイルに関する情報を保持する場合があります。
  • forensic software メタデータを使用して回復し、メタデータを消去するために何をする必要があるか。