ディスクの完全消去/ヒントとテクニック
メインの記事はディスクの完全消去を見てください。
この記事では素早く消去することができる特殊なユーティリティを使用する消去方法について説明します。
目次
単体ファイルの消去
単一ファイルのワイプは、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 - ファイルの作成とセクターサイズ
空き領域の消去
空き領域は複数の方法で消去できます:
- パーティションやデバイスではなくファイルに出力をリダイレクト。
- Create multiple file copies by using e.g.
cp
command in loops with random file names or destination directories until no free space will be left.
- Use an utility that creates encrypted files with random password and file names.
- Use a specialized program for the free space wiping such as wipefreespaceAUR.
Some of the file compression utilities use to have many types of the compression methods, file types and can even split file into volumes of the preset size upon creation. By using all options at random and into the loop you will be able to fill the whole free space up with a useless encrypted data that will overwrite everything else that was deleted. Just do not forget to remove created files and run it many times to ensure that even forensic specialists will get harder to restore very sensitive data on it.
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) を参照してください。
The source
can be a predefined file with random data or a device, e.g. /dev/urandom
or another block device or partition on it, e.g. /dev/sd"XY"
, with data you are not afraid to be found then even deleted files on it will be compressed to the destination.
timeout コマンドを利用して複数のファイルを作成
The timeout
command with randomized waiting time used it in a loop will break the command that will leave a file with random size. This is a slow method but is one of the possible alternatives. You can also use an array with predefined file names before the random part of it.
AA=${RANDOM/0/1}; timeout $((AA/100)) cat /dev/urandom > filename${RANDOM}.tmp;
参照:
- limits for the file creation on the different file systems.
- meta-data in the filesystem may keep information about file after it was deleted.
- forensic software uses meta-data to recovery and what need to do for wiping of the meta-data.