dc3ddでEBSのディスクイメージをS3に保管する

2021.07.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、杉金です。

AWSのセキュリティについて勉強しているときに「AWS Digital Forensics Automation at Goldman Sachs」という、デジタル・フォレンジック自動化についての動画を見つけました。
その中でdc3ddでディスクイメージをダイレクトにS3に保管するという手法が紹介されていたのですが、具体的な方法が載っていませんでした。そこで今回試しにやってみようと思います。

AWS Digital Forensics Automation at Goldman Sachs - AWS Online Tech Talks

dc3ddとは

デジタル・フォレンジックでは、証拠保全を目的としたディスクのコピーを作成しますが、dc3ddはそのツールの一つです。Linuxに標準的に備わっているddコマンドをベースにデジタル・フォレンジック向けに機能拡張したものです。類似ツールとしてdcflddがあります。国防省サイバー犯罪センター(Department of Defense Cyber Crime Center(DC3))で働いていた作者によってdc3ddという名前がつけられました。

ディスクイメージをどうやってS3に保管するか

dc3ddでディスクイメージを作成して、それをどうやってS3に保管するか。以下3つの方法が考えられます。

  • goofys等のツールを使ってS3の領域をマウントしてコピーする
  • 別ディスクにディスクイメージを出力して、その後にaws cliでS3にコピー
  • aws cliを使ってダイレクトにS3に出力する

今回は手っ取り早く、3番目のダイレクトにS3に出力してみます。

やってみた

環境はAmazon Linux2を使用します。aws cliのバージョンはデフォルトでインストールされていた1.18.147を使います。まずはdc3ddをインストールします。

wget https://download-ib01.fedoraproject.org/pub/epel/testing/7/x86_64/Packages/d/dc3dd-7.2.646-9.el7.x86_64.rpm
sudo rpm -ivh dc3dd-7.2.646-9.el7.x86_64.rpm

S3書き込み権限を持ったIAMロールをEC2に付与します。 コピーを作成するディスクを選択しましょう。lsblk -pコマンドでパーティション名を控えます。

NAME               MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
/dev/nvme0n1       259:0    0  20G  0 disk
├─/dev/nvme0n1p1   259:1    0  20G  0 part /
└─/dev/nvme0n1p128 259:2    0   1M  0 part

今回はルート領域である/dev/nvme0n1p1を対象にします。 それではdc3ddを実行しましょう。ハッシュ生成ではsha256を使用します。

sudo dc3dd if=/dev/nvme0n1p1 hash=sha256 | aws s3 cp - s3://<出力先s3バケット名>/disk-nvme0n1p1.img

このコマンドを解説すると、dc3ddコマンドではddと同じように入力デバイス(if)と出力デバイス(of)を指定しますが、ofを指定せずにパイプでaws s3コマンドに渡します。s3 cpではコピー元とコピー先を指定しますが、コピー元をハイフンにして、コピー先に出力先のS3バケットを指定します。今回は分かりやすいようオプション少なめにしておりますが、必要に応じてs3 cpで暗号化オプションを付与したり、dc3ddのファイル分割やログ出力のオプションを追加ください。

成功するとコマンド結果の最終行に以下のように表示されます。

dc3dd completed at 2021-07-05 11:41:21 +0000

例えば、IAMロールを付与し忘れていると失敗するのですが、一見すると上記のメッセージが出ており成功しているように見えますが、以下のようにdc3dd completedの下にS3アップロード失敗のメッセージが表示されます。

dc3dd completed at 2021-07-05 11:36:08 +0000

upload failed: - to s3://<出力先s3バケット名>/disk-nvme0n1p1.img Unable to locate credentials

インスタンスストアの場合

インスタンスストアの場合も同様の手順でコピー可能です。揮発性のためEC2を再起動する前に取得しましょう。

EBSスナップショットについて

EBSのコピーならEBSスナップショットでよくない?という疑問を持たれた方もいるかと思われますが、EBSスナップショットも合わせて取得しておくと良いです。注意点としては、SSDが持つトリミングやウェアレベリング機能など様々な操作によってハッシュ値が変わる可能性があります。

紹介した動画ではスナップショットからリストアする際に、gp2(汎用SSD)ではなくstandard(マグネティック)タイプでボリュームを作成してハッシュ値変化を回避しています。このあたり検証してみたのですが、残念ながらSSDでハッシュ値が変わってしまうことは確認できませんでした。

検証してみて

動画で明らかにされていない部分のため、実際にこの方法で取得しているかは不明ですが、ひとつの方法ではあります。
ディスク収集の次はメモリ収集をやってみたくなってきました。分析もやってみたいしWindows Serverの場合はどうか、RDSやサーバレスってどう考えるのかなど興味は尽きません。メモリ収集は書籍を購入したので、試してみたらいずれまた紹介できればと思います。

参考資料