ディスクの完全消去/ヒントとテクニック
メインの記事はディスクの完全消去を見てください。
この記事では素早く消去することができる特殊なユーティリティを使用する消去方法について説明します。
目次
単体ファイルの消去
単一ファイルのワイプは、2つの基本的な方法と1つの高度なアンチフォレンジック時間がかかる方法で構成されており、専用のツールでのみ可能ですが、最後の1つの方法はこの記事でカバーしません。
- 削除する前にランダムなデータで上書きしたり、同じサイズの別のファイルで内容を置き換える。
- 特殊なツールを使ってファイルシステムに保存されているファイルとメタデータを消去する。
- ディスク全体を検索して、削除された残骸の部分を探し、他のファイルやその痕跡に変更を加えることなく、それらも消去することができます。
一般的な Linux ユーティリティを使うことでサイズを変更することなくファイルを上書きすることができます:
shred -x file
を実行すると file ファイルの中身が擬似乱数のデータに置き換わります。ファイルサイズは変わりません (-x
)-u
オプションを使うと上書きした後に file が削除されます。
mkfs
を使うと、ファイルをファイルシステムに変換して、その中のすべてを変更したり、マウントしたり、他のコンテンツで埋めて上書きしたりすることができます。
dd
は、あらかじめ設定したサイズと内容のファイルを作成し、保存先のファイル名が存在する場合は上書きします。dd
はskip
とseek
オプションを組み合わせて、ファイル全体または一部だけを別の内容に置き換えることができます。ファイルの拡張を避けるために、ファイルのサイズを知る必要がありますが、du -b file_name | cut -f1
やstat -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
参照:
- テキストファイルの文字セットを変換する
- Advanced Bash-Scripting Guide - bash スクリプトからファイルを作成する方法について、より高度な方法について説明します。
- sed alternatives - ファイル内のコンテンツを置き換えるための sed よりもうまく機能する perl の例
対象の上書き
マウントされているパーティションを消去しない
注意して消去するデバイスを選択してください。間違えるとシステムを破損してしまう恐れがあります。危険を避けるために、消去ツールをラッピングするスクリプトを使うことができます。例:
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 を使うと、skip
と seek
オプションをランダムまたは固定値で組み合わせて、ファイルのどの部分を復元するかを選択することができるようになります。
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
参照:
- sector size - ファイルの作成とセクターサイズ
空き領域の消去
空き領域は複数の方法で消去できます:
- パーティションやデバイスではなくファイルに 出力をリダイレクト
- たとえば
cp
コマンドを使用して、空き領域がなくなるまで、ランダムなファイル名または宛先ディレクトリを使用してループで複数のファイルをコピーします。
- ランダムなパスワードとファイル名で暗号化されたファイルを作成するユーティリティを使用します。ファイル圧縮ユーティリティの中には、圧縮方法、ファイルタイプのオプションがあり、作成時にファイルをプリセットサイズのボリュームに分割できるものもあります。いくつかのオプションをランダムに使用してループさせることで、空き領域全体を暗号化されたデータで満たし、以前のデータを上書きすることができます。
- 次のような空き領域消去専用のプログラムを使用する。
wipefreespace — Wipe Free Space は、ファイルシステムの空き領域を安全に消去して、削除された機密データの回復を防ぎます。
zerofree — ファイルシステム内のゼロ以外の空きブロックをスキャンし、それらをゼロで埋めます
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"
を指定でき、その上で、見られても大丈夫なデータなら削除したファイルも圧縮先に送られることになります。
timeout コマンドを利用して複数のファイルを作成
loop で使用されるランダムな待ち時間を持つ timeout
コマンドは、ランダムなサイズのファイルを残すため、コマンドを中断します。これは遅い方法ですが、可能な代替案の1つです。また、ランダム部分の前にあらかじめ定義されたファイル名を持つ配列を使うこともできます。
AA=${RANDOM/0/1}; timeout $((AA/100)) cat /dev/urandom > filename${RANDOM}.tmp;
参照:
- limits 異なるファイルシステムでのファイル作成用。
- meta-data ファイルシステム内のファイルは、削除された後もファイルに関する情報を保持する場合があります。
- forensic software メタデータを使用して回復し、メタデータを消去するために何をする必要があるか。