ABOUT
DETAIL
PCデータの証拠保全についてのまとめです。
もっとも簡単な保全方法はKali bootable USBをForensicsモードで起動し、外付けのHDDにddコマンドで書き出します。
1. 対象の確認
fdisk -l で対象のHDDパーティションの構成を確認します。
/dev/sdaX, /dev/sdbXなどが対象です。
ディスクを丸ごとバックアップするのであれば、/dev/sdaか/dev/sdbかを把握できれば十分です。
2. ディスクコピー(クローン)する場合
物理ディスク /dev/sda のパーティション1を、物理ディスク /dev/sdb のパーティション1に複製します。
# dd if=/dev/sda1 of=/dev/sdb1 bs=64K conv=noerror,sync
物理ディスク /dev/sdX を物理ディスク /dev/sdY に複製します。
# dd if=/dev/sdX of=/dev/sdY bs=64K conv=noerror,sync
オプションについて:
- noerror は読み取りエラーを全て無視して操作を続行します。dd のデフォルトの挙動ではエラーがあると dd は動作を停止します。
- sync は読み取りエラーが存在した場合、入力ブロックをゼロで埋めるため、データのオフセットも同期します。
- bs= はブロックサイズをセットします。デフォルトはハードドライブの「古典的な」ブロックサイズである 512 バイトですが、64K や 128K など大きな値を使ったほうが最近の事情には即しています。また、以下の警告も読んでください。これはブロックサイズを変えるだけでなく、読み取りエラーがどのように伝播するかにも関係しています。
3. バックアップする場合
保全対象のPCと同じか大きいサイズのHDDを確保できなかった場合、バックアップすることがあります。
3.1 バックアップデータ保存先をマウントします。
NTFSフォーマットされたローカルディスクをマウントします。
# mkdir /mnt/backup
# mount -t ntfs-3g /dev/sdb1 /mnt/backup
NASなどにバックアップする場合(Windowsファイル共有の場合)
# mkdir /mnt/backup
# mount -t cifs //nas_ipaddr/share /mnt/backup -o username=user1
3.2 バックアップ
拡張子等は自由です。ディスクが破損していた場合は、エラーで停止されます。
# dd if=/dev/sda bs=64k | gzip -c > /mnt/backup/sda.ddimg.gz
3.3 リストア
# gunzip -c /tmp/backup/sda.ddimg.gz | dd of=/dev/sda bs=64k
4. データ消去・破壊について
4.1 shredを使う場合
乱数で3回上書きする方法
# shred -n 3 -v /dev/sda
NSA方式である乱数2回上書き後に0で上書きであれば以下のコマンド。
# shred -n 2 -z -v /dev/sda
4.2 ddを使う場合
ゼロで一回上書きします。
# dd if=/dev/zero of=/dev/sda bs=64k conv=noerror
ランダムで一回上書きします。
# dd if=/dev/urandom of=/dev/sda bs=64k conv=noerror
/dev/urandom を使用する方法は非常に時間がかかるため、ある程度のサイズのファイルを作成してそれを使って書き込むほうが高速です。
# dd if=/dev/urandom of=/tmp/rand1GB bs=1024k count=1024
# dd if=/tmp/rand1GB of=/dev/sda bs=1024k conv=noerror
# dd if=/tmp/rand1GB of=/dev/sda bs=1024k conv=noerror seek=1024
# dd if=/tmp/rand1GB of=/dev/sda bs=1024k conv=noerror seek=2048
# dd if=/tmp/rand1GB of=/dev/sda bs=1024k conv=noerror seek=3072
-----
ディバイスなどへファイルコピーや変換を行う
■-- 文法 --■
dd [入力元] [ 出力先]
例)
dd▲if=/boot/vmlinuz▲of=/dev/fd0
コピーや変換を行う(起動ディスクを作成する)
※▲はスペースを表してます。
■ 説明
ddコマンドは入力から出力へデータをコピーするコマンドです。
cpコマンドはファイルからファイルにコピーするだけですが、
ddコマンドはファイルからデバイス、デバイスからファイル、
デバイスからデバイスへのコピーも可能なため、ディスクの
バックアップやダンプにも使用でき、cpコマンドよりも汎用性が
高いのが特徴です。
■ 主なオプション
if=[file] 入力ファイルfile から読み込む
of=[file] 出力ファイルfile へ書き出す
bs=[size] 入出力のブロックサイズを指定
ibs=[size] 入力のブロックサイズを指定
obs=[size] 出力のブロックサイズを指定
count=[block] コピーするブロック数を指定
conv=変換オプション 変換オプションを指定
seek=[block] 出力の開始位置を指定されたブロックに移動してからコピーする
skip=[block] 入力の開始位置を指定されたブロックに移動してからコピーする
■ 実行例
▼ ハードディスク上のパーティションを、別のディスクにコピーする
[root@Tiger ~]# dd if=/dev/sda2 of=/dev/sdb2 bs=4096 conv=notrunc,noerror
▼ ハードディスク全体を完全消去する
[root@Tiger ~]# dd if=/dev/urandom of=/dev/hda
▼CDをiso仮想イメージファイルに変換する
[root@Tiger ~]# dd if=/dev/cdrom of=/home/sam/myCD.iso bs=2048 conv=sync,notrunc
▼ ハードディスクのMBRをバックアップする
[root@Tiger ~]# dd if=/dev/sda of=/home/sam/MBR.image bs=446 count=1
▼ 起動ディスクを作成する
[root@Tiger ~]# dd if=/boot/vmlinuz of=/dev/fd0
MACの注意点
MACの場合、ddコマンドを実行する前にボリュームをアンマウントする必要があります。
Diskutil listで認識している状態を確認する。
Sudo diskutil unmount /Volume/XXXXでアンマウントする。
改めてdiskutil listを実行し、/dev/diskYは認識しているけど、ボリュームはマウントされていないことを確認します。
これでddを実行できる状態になりました。
robocopyコマンドとは
2つのフォルダの内容を同期させ、ファイルやフォルダの内容を同じ状態に保つ機能は、ファイルサーバのバックアップや個人的なデータのバックアップ、リモートオフィス同士でのデータの同期など、システム管理のさまざまな場面で利用される。
このような用途に利用できるコマンドとして、copyやxcopyコマンドがある。
-
TIPS「xcopyでファイルをバックアップする」
フォルダの同期に利用できるツールとしては、この他にも「robocopy.exe」というコマンドラインツールがある。
robocopyは、もともとはリモートのファイルサーバ同士でファイルやフォルダ、ユーザープロファイルデータなどを同期させるために作られたコマンドである。その名前は「Robust File Copy」の略であり、堅固(robust)で確実なファイルコピーという意味を持つ。具体的な機能の例を以下に記す。
-
エラー時の再試行回数の制限や待ち時間の指定
-
ネットワーク切断時のコピーの中断と再開
-
属性やセキュリティ設定のコピー
-
ファイルサイズや変更時刻などを限定してのコピー
-
コピー先にある余分なファイルの削除
-
256文字を超える長いパス名の処理
-
動作ログの記録
-
作業内容やオプション設定などをジョブとして保存
robocopyコマンドの動作
フォルダ間で更新コピーするには、「xcopy /e /d……」コマンドも利用できる。だがxcopyと比較すると、robocopyコマンドは、コピー先だけにあるファイルやフォルダ(EXTRA File)を削除できる他、サイズや更新日付を限定してのコピー、再試行回数制限、ログの記録、ジョブ定義、ファイルやフォルダの(コピーではなく)移動ができるなど、機能が豊富である。
このようにrobocopyは多くの機能を備えている。本TIPSではrobocopyの基本的な使い方として、2つのフォルダを同期させる機能と、ログや設定を保存する機能について解説しておく。それ以外の機能については次のTIPS記事を参照していただきたい。
より高度なrobocopyの使い方については、今後別TIPSで紹介する。
robocopyのヘルプを参照するには
robocopyコマンドの使い方やオプションは、コマンドプロンプトで「robocopy /?」を実行すると表示される。
robocopyのヘルプ
robocopyの基本的な使い方
robocopyでは、copyやxcopyコマンドのように、引数としてコピー元とコピー先、オプションなどを指定する。
robocopyコマンドの書式
2つのフォルダ間でファイルをコピーする
コピー元フォルダの内容を、指定したフォルダへコピーする。何もオプションを付けないと、コピー元フォルダにある「ファイルのみ」がコピーされる。フォルダは対象外。
コピー元もコピー先もフォルダであり(ファイル名やワイルドカードは指定不可)、指定されたフォルダ間で、その中にあるファイルがコピーされる。コピー先として指定されているフォルダが存在しない場合は、フォルダが新規作成され、その中へコピーされる。
コピー元やコピー先には、ローカルのフォルダだけでなく(例:c:\srcfolder)、UNCによるリモートのサーバ上の共有フォルダも指定できる(例:\\server1\drivec\destfolder)。
ただしデフォルトではサブフォルダはコピーされず、さらに次の種類のファイルだけが上書きでコピーされる。
-
コピー先に存在しないファイル
-
名前が同じでも、更新日付が異なるファイル(新しいファイルだけではなく、コピー元の方が古くてもコピー対象となる)
-
名前と日付が同じでも、サイズが異なるファイル
robocopyでコピーされるファイルの種類
デフォルトでは、このような条件に一致するファイルがコピーされる。オプションを指定すれば、新しいファイルだけをコピーさせたり、同じファイルでも強制上書き再コピーさせたりできる。
xcopyコマンドに/dオプションを付けると更新されたファイルだけをコピーするが(TIPS「xcopyでファイルをバックアップする」参照)、robocopyではコピー元の方が古くてもコピーされるなど、少し挙動が異なる。
どのような種類のファイルをコピーするかは、ファイルの「クラス」に基づいて決まる。クラスとは例えば、日付が新しいか古いか、サイズが異なるか、属性が異なるか、などの状態のことを指す。どのクラスに該当するファイルをコピーするかはオプションで指定できる。
実際に利用する例を次に示す。
ファイルのコピー
オプションなしでrobocopyを実行すると、コピー元のフォルダにあるファイルが、コピー先フォルダへコピーされる。フォルダはコピーされない。
特定の拡張子やワイルドカード指定に一致するファイルのみをコピーする
robocopyをオプション指定なしで実行すると、デフォルトでは「*.*」、つまり全てのファイルがコピーの対象となる。オプションとしてファイルのパターンを指定すると、そのパターンに合うファイルのみがコピーの対象となる。例えばJPG/JPEG画像ファイルだけをコピーするには、次のようワイルドカード指定を追加する(パターンは複数指定可能)。
※2つのフォルダ間でJPG/JPEGファイルをコピーする例
robocopy c:\src d:\dest *.jpg *.jpeg
サブフォルダまで含めて再帰的にコピーする
robocopyに何もオプションを付けないと、指定されたフォルダ中にあるファイルだけがコピーの対象となる。これをサブフォルダも含めて全部コピー(上書き更新)するには「/s」オプションを付ける。ただし/sだけでは、空のフォルダはコピーされない。空フォルダも含めてサブフォルダをコピーするには「/e」(/s /eでも同じ)を付けて実行する。これらのオプション名はxcopyコマンドと同じである。
サブフォルダも含めてコピーするためのオプション
/sを付けるとサブフォルダもコピーされるが、空フォルダは除外される。空フォルダもコピーしたい場合は、/sの代わりに/eを付ける(/s /eのように両方付けても問題ない)。
実行すると次のようになる。
サブフォルダのコピー
/sや/eオプションを付けると、サブフォルダもコピー対象となる。
2つのフォルダを完全に同期させて、ミラーコピーを作る
/sオプションを使うと、コピー元のファイルやサブフォルダがコピー先へ上書き更新されるが、この場合、もしコピー先に余分なファイル(コピー元にはないファイル)があっても、そのファイルは何もされずに(削除されずに)、そのまま残ることになる。
この挙動を変更して、2つのフォルダの内容をサブフォルダも含めて完全に同期させる(同じ状態にする)には、「/mir」(ミラー)オプションを指定する。
ミラーコピーするためのオプション指定
/mirを付けると、ファイルを上書き更新するだけでなく、コピー先に不要な(=コピー元にない)ファイルやフォルダがあれば削除される。
/mirオプションを付けると、コピー元フォルダと同じ状態になるように、コピー先フォルダへファイルがコピーされる。コピー先に不足するものがあれば新規作成されるし、日付やサイズが相違するファイルがあれば上書き更新される。さらに、コピー先に余分なファイルやフォルダがあれば、それらは削除される。サブフォルダの内容もコピーされる(/sや/eオプションは不要。実際には、サブフォルダをコピーする/sと、余分なファイルを削除する/purgeを組み合わせたものが/mirオプション)。
robocopyでミラーコピーを作る
/mirオプションを付けると、不足するファイルやフォルダをコピーするとともに、日付やサイズが異なるファイルをコピーし、さらにコピー元には存在しない余分なファイルやフォルダを削除する。コピー後は、コピー元とコピー先が同じ状態になる。
/sや/eだけでは、同じコピー先に対して何度もコピーすると、コピー先に不要なファイル(=コピー元にすでに存在しないファイル)がどんどん増えていく可能性がある。だが/mirオプションを付ければ、それを抑止できる。robocopyを単なるバックアップ用途で利用するなら、このオプションが便利だろう。
実行すると次のようになる。
/mirによるフォルダの完全同期
/mirオプションを付けると、ファイルとサブフォルダをコピーするだけでなく、コピー先にのみ存在するファイル(EXTRA File)を削除する。
●ドライブ間のミラーコピーに注意
【2017/12/04追記】
/mirオプション(もしくは/purgeオプション)を使う場合、2つのドライブ全体をコピーさせるなら注意が必要である。例えばG:の内容をすべてH:にコピーするなら、次のようなコマンドを実行するだろう(/zもしくは/zbオプションは、ユーザーのアクセス権がないファイルもバックアップするためのオプション)。
※問題のあるドライブ間コピーのコマンド
robocopy g:\ h:\ /mir /zb
これを実行すると、H:のルートにある「\System Volume Information」というフォルダの内容をいったん削除してG:\からコピーしてきたファイルで上書きしようとする。だがこのフォルダには、各ボリュームごとの重要なメタデータ(ボリュームシャドウコピーや復元、重複除去機能などのデータ)が保存されているので、これを削除・上書きすると、ファイルシステム上のデータが壊れるなどの障害が発生することがある。
これを避けるには、ドライブのルートをミラーコピーする場合には、System Volume Informationフォルダを除外するように/xdオプションも指定する。
※正しいドライブ間コピーのコマンド
robocopy g:\ h:\ /mir /zb /xd "System Volume Information"
詳細については以下のページを参照していただきたい。
-
「FSRM and Data Deduplication may be adversely affected when you use Robocopy /MIR in Windows Server 2012」[英語](サポート技術情報)
ログの保存
以上の例のように、robocopyを実行すると、デフォルトではコピーしているファイルの状況や転送量、何ファイルコピーしたかなど、詳細なコピーの状況が画面に表示される。「コピー済み」が実際にコピーした数、「Extras」は/mirや/purgeオプションによって削除された数である。
このログはファイルなどに残すこともできるので、タスクスケジューラに登録して自動実行する場合でも、後で実行状況を確認でき、便利である。ログをファイルに残すには「/log」オプションを指定する。
ログオプション
/logオプションを使うと、robocopyのコピー結果のログを残しておける。タスクスケジューラで自動実行させる場合は、このオプションを使えば動作結果を後で確認できる。
/log以外にも、幾つかのログオプションが利用できる。
オプション名
意味
/log:<ファイル名>
指定したファイルにログを書き込む。ファイルが存在する場合は、既存の内容は破棄され、新規作成される
/log+:<ファイル名>
指定したファイルの末尾にログを追加する
/tee
ログファイルに出力するとともに、画面にも表示する
主なログ出力オプション
robocopyのオプションをジョブとして登録・保存する
robocopyで何度も同じコピー作業を繰り返すつもりなら(バックアップタスクとして登録する場合など)、robocopyで行う作業を「ジョブ」として用意しておくとよいだろう。
「/save」オプションを使うと、robocopy実行時に指定したフォルダやパターン指定、オプション設定などがジョブとして.RCJファイルに保存される。保存された.RCJファイルを「/job」オプションで呼び出すことにより、同じコマンドを再実行できる。
robocopyジョブ
robocopyのパラメーターとして指定したコピー元やコピー先情報、オプション指定などをジョブファイル(.RCJファイル)として保存しておくと、以後は、ジョブファイルを指定するだけで同じ動作を行わせることができる。
/saveオプションを付けると、その左側にあるすべてのパラメーターが指定した.RCJファイルに書き込まれる。.RCJファイルはテキストファイルなので、メモ帳などで開けば、オプション設定を変更できる。
なお/saveオプションだけだと、/saveによる保存後に、指定したパラメーターでrobocopyが1回実行される(コピーが行われる)。コピーさせずに.RCJファイルの作成だけを行いたい場合は、最後に「/quit」オプションを付加すること。
※ジョブの定義例
robocopy c:\src d:\dest /mir /save:copyjob /quit
※ジョブの実行例
robocopy /job:copyjob
ファイルの「クラス」に基づいてコピー対象を選択/変更する
robocopyのオプションの説明の前に、robocopyで扱うファイル(やフォルダ)の「クラス」について説明しておく。クラスとは、転送元と転送先のファイルの状態や属性情報などを比較して、2つのファイルがどのような関係にあるかを判断する基準のことである。robocopyには次のような8つのクラスがある。
クラス
コピー元
コピー先
更新時刻
サイズ
属性
Lonely
ある
ない
-
-
-
Tweaked
ある
ある
一致
一致
不一致
Same
ある
ある
一致
一致
一致
Changed
ある
ある
一致
不一致
-
Newer
ある
ある
元>先
-
-
Older
ある
ある
元<先
-
-
Extra
ない
ある
-
-
-
Mismatched
ある*
ある*
-
-
-
robocopyのファイル・クラス
「ある」「ない」は、ファイルが存在するかどうか、「一致」「不一致」は更新時刻やサイズが同じかどうか、「元>先」はコピー元ファイルの方が新しい、「元<先」はコピー先ファイルの方が新しい、という意味。例えば「Lonely」はコピー元にしかないファイル、「Extra」はコピー先にしかないファイル、「Tweaked」はサイズも更新時刻も同じだが、属性情報が異なるファイル。「Mismatched*」は、ファイルとフォルダのように、名前は同じだが種類が違う場合のクラス。
デフォルトでは、robocopyは「Changed」「Newer」「Older」となっているファイルだけをコピーするようになっている。つまり、内容が変更されているか、コピー元の方が新しいか、逆にコピー元の方が古い(コピー先の方が新しい)ファイルだけをコピーする。
この挙動を変更するには、robocopyに次のオプション・スイッチを付加する。
オプション
動作
/xc
Changed(変更されたファイル)を除外する
/xn
Newer(新しいファイル)を除外する
/xo
Older(古いファイル)を除外する
/xx
Extra(コピー先にしかないファイル)を無視する(処理しない)
/xl
Lonely(コピー元にしかないファイルやフォルダ)を除外する
/is
Same(同一のファイル)もコピーする
/it
Tweaked(日付やサイズが同一だが属性が一部異なるファイル)もコピーする。ただしこのオプションを付けない場合は、SameとTweakedは区別されず、TweakなファイルはSameと同じ扱いになる。このオプションがある場合にのみTweakなクラスが識別され、コピー対象となる
コピーするクラスの変更オプション
■古いファイルをコピーさせない
xcopyの「/d」オプションでは、コピー元の方が古いファイルはコピーしないが、robocopyはデフォルトではこのようなファイルでもコピーする。これを変更してxcopyのようにするには「/xo」オプションを付ける。
■強制的に上書き更新する
「/is」オプションを付けると同じファイルでもコピーされるので、全ファイルを強制的に上書き更新できる。
■存在するファイルのみを更新する
「/xl」オプションを付けると、コピー先にすでにファイルが存在する場合にのみ上書き更新できる。なので、例えばコピー元にある一時的なファイルや、あらかじめコピー先に用意していないようなファイル(つまり、コピーさせたくないファイル)を間違って送ってしまうことがなくなる。
●時間計算における許容範囲の指定
FATファイル・システムでは、ファイルの作成や更新時刻などは2秒の精度でしか記録できない。そのため、ほかのファイル・システムとの間でファイルをコピーさせると、更新時刻が一致しないという問題が発生することがある(例えば「1時2分3秒」という時刻情報を持つファイルをFATへコピーすると「1時2分2秒」になってしまい、Sameクラスにならない)。これらを防ぐため、2秒以内の誤差や夏時間の1時間の時差を無視するオプションも用意されている。
オプション
動作
/fft
2秒以内の誤差なら、時刻情報は一致していると見なす
/dst
1時間以内の誤差なら、時刻情報は一致していると見なす。これは夏時間制を使っている地域のためのオプション
時間計算における許容範囲の指定
●特定のファイルやフォルダをコピー対象から除外する
名前やワイルドカード指定を使って、コピー対象から除外させるには、「/xf 名前」や「/xd 名前」オプションを使う。前者は特定のファイルの除外、特定のフォルダの除外をそれぞれ表す。
●ファイルの属性に基づいてコピー対象を選択/変更する
コピー元のファイルの属性情報に基づいてコピー対象を選択するには、「/ia:属性」か「/xa:属性」オプションを使用する。前者は指定した属性を含むもの、後者は指定した属性を含まないものがマッチする。「属性」には次の文字を組み合わせて指定する。複数組み合わせた場合は、1つでも属性が含まれていればマッチする。
属性名
意味
R
読み取りのみ属性
A
アーカイブ属性
S
システム属性
H
隠し属性
C
圧縮属性
N
インデックス抑止属性
E
暗号化属性
T
一時ファイル属性
O
オフライン属性
コピーするファイルの属性
これらの属性を持つファイルをコピーさせたり、コピーから除外させたりする。属性は複数組み合わせ可能。「N」はインデックス対象から除外するという属性。TIPS「エクスプローラにおけるファイルのN属性とは?」参照
例えば「/xa:sh」オプションを指定すると、システム属性か隠し属性を持つファイルがコピー対象から除外される。「/ia:~」と「/xa:~」の両方を指定すると、先に「/ia:~」が処理され、その後「/xa:~」で除外する属性が決定される。
●アーカイブ属性を持つファイルをコピーする
アーカイブ属性とは、ファイルに何かデータを書き込んだときに自動的にセットされる特別な属性情報であり、通常はバックアップ・プログラムが利用する。ユーザーやアプリケーションがファイルにデータを書き込むとアーカイブ属性がセットされるので、バックアップ・プログラムはこの属性がセットされているファイルのみを選択してバックアップする。そしてバックアップ後にアーカイブ属性をクリアするとバックアップ済みということになり、次回のバックアップからは除外される。差分バックアップで使うための属性である。
robocopyで「/a」オプションを付けると、アーカイブ属性を持ったファイルだけがコピーされるが、アーカイブ属性はセットされたままになる。「/a」ではなく「/am」を付けると、、アーカイブ属性を持ったファイルをコピー後、アーカイブ属性をクリアするので、次回からはコピーされなくなる。
●ジャンクションをコピー対象から除外する
robocopyはデフォルトでは「ジャンクション(ファイルやフォルダへのリンク)」を通常のフォルダとしてコピーしようとするが、場合によっては無限にコピーが行われることになる。これを避けるためには、ジャンクションをコピー対象から除外するオプションを指定する。このオプションは必ず付けるようにした方がいいだろう。
オプション
意味
/xj
ジャンクションを除外する
/xjd
フォルダへのジャンクションを除外する
/xjf
システム属性
ジャンクションの除外指定オプション
●特定のサイズや更新日時のファイルをコピー対象から除外する
コピーするファイルのサイズや更新時間(何日アクセスしていないか、など)に基づいて、コピーから除外させるには次のオプションを使う。
オプション
意味
/max:サイズ
指定したサイズよりも大きいファイルは除外
/min:サイズ
指定したサイズよりも小さいファイルは除外
/maxage:日付
指定した日付よりも古いファイルは除外
/minage:日付
指定した日付よりも新しいファイルは除外
/maxlad:日付
最終アクセス日付(Last Access Date:LAD)が指定した日付よりも古いファイル(x日以上使っていないファイル)は除外
/minlad:日付
最終アクセス日付(Last Access Date:LAD)が指定した日付よりも新しいファイル(x日以内に使用したファイル)は除外
サイズや日付による除外オプション
「サイズ」にはファイルのサイズをbytes単位で記述する。「日付」には、1900までの数値か(これは日数と見なされる)、「YYYYMMDD」形式の西暦の年月日を指定する。