1. 背景
ランサムウェア対策ではバックアップを取得するだけでは不十分です。近年のランサムウェアはバックアップデータの削除や暗号化を試みるためです。そのため、バックアップデータ自体を一度保存したら、変更・削除できない「イミュータブルバックアップ」が重要視されています。
AWSでは Amazon S3 Object Lock によりイミュータブルなバックアップを実現できます。
2. 目的
今回検討したバックアップ要件では、「常に30日前まで復旧可能な状態」を維持することが求められました。
S3 Object Lock によってバックアップデータの改ざん・削除を防ぐことはできますが、保持期間を固定で設定しただけでは長期的に要件を満たし続けることができません。そこで今回は Amazon S3 Object Lock の保持期間を自動延長する仕組みについて PoC 検証を行いました。
3. Amazon S3 Object Lock とは
Amazon S3 Object Lockは、S3オブジェクトに対してWORM(Write Once Read Many)を実現する機能です。
保持期間中は、保護対象となるオブジェクトバージョンの削除や変更を防止できるため、ランサムウェア対策として活用できます。
Object Lockにはガバナンスモードとコンプライアンスモードがあり、今回のPoCではコンプライアンスモードを使用しました。
コンプライアンスモードでは一度設定した保持期限を短縮できないため、この特性を踏まえて保持期間の自動延長を検証しました。
4. AWS公式ブログで紹介されている自動延長方式
Object Lock の保持期間自動延長について調査したところ、AWS公式ブログで以下のアーキテクチャが紹介されていました。
Amazon S3オブジェクトロックの保持期間を自動的に延長することで、オブジェクトの不変性を維持する
ここでは、以下の流れでObject Lock保持期間を延長しています。
1. ランサムウェア対策用S3バケットからS3 Inventoryでオブジェクト情報取得
2. Athenaで延長対象を抽出
3. Manifest CSV生成
4. Manifest CSV用S3バケットに格納(詳細は後述します)
5. S3 Batch OperationsでObject Lock延長
※本図はAWS公式ブログを参考に筆者が実機検証した結果、作成したものです。
5. 実際に検証してみました
検証の中で気づいた注意点は以下の通りです。
1. インベントリスコープ(オブジェクトのバージョン)について
過去バージョンを含めて保持期間延長の対象とするため、対象S3のインベントリ設定では「すべてのバージョン」を対象としました。

2. Athenaでの抽出項目について
S3 Inventoryの情報から、保持期間を延長するオブジェクトをAthenaで抽出します。
今回のPoCでは、S3 Batch OperationsのManifestに必要となるBucket、Key、VersionIDを以下のようなクエリで抽出しました。
SELECT
bucket,
key,
version_id
FROM objectlock_inventory
WHERE dt = 'YYYY-MM-DD-HH-MM'
AND is_latest = true -- 最新バージョン
AND is_delete_marker = false -- 削除マーカーを除外
AND object_lock_mode = 'COMPLIANCE'; -- コンプライアンスモード
※テーブル名やパーティション値はサンプル値に変更しています。また、実際のPoCでは検証対象のファイルを限定するため、Keyによる絞り込みも行っています。
3. ManifestファイルのCSV形式について
Athena抽出結果を単純にCSVエクスポートすると、ヘッダー(Bucket、Keyなどの項目名)も出力されますが、S3 Batch Operationsではヘッダーが付与されたままだとエラーになります。
今回はPoC検証のため、下記のように手動でヘッダーを削除しましたが、将来的に自動化するのであればLambda関数などを用いてヘッダーを削除する必要があります。

4. Manifestファイルの暗号化について
今回のPoC検証では、ランサムウェア対策用S3バケットをSSE-KMSにより暗号化することが必須となっていました。ところが、S3 Batch Operationsでは、SSE-KMSで暗号化されたユーザー作成のCSV Manifestファイルはサポートされていません。そのため今回のPoCでは、Manifest CSVの格納先としてSSE-S3で暗号化した専用のS3バケットを用意しました。
Amazon S3のバッチ操作に関する問題のトラブルシューティング方法を教えてください
5. S3 Batch Operationsのジョブ設定について
今回のPoCではコンプライアンスモードを選択し、既にObject Lockが設定されているオブジェクトに対して、検証時点から約2週間後の日付を保持期限として手動で設定しました。
その結果、Manifestに記載した複数のオブジェクトについて、S3 Batch Operationsを使用してObject Lockの保持期限を一括で延長できることを確認しました。
なお、今回のPoCでは保持期限を手動で指定しており、「常に30日前まで復旧可能な状態」を維持するための自動化までは検証していません。実運用では、AWS CLIなどを利用して実行時点から一定期間後の日付を指定し、S3 Batch Operationsのジョブを定期的に実行する仕組みを別途検討する必要があります。

6. ストレージクラスについて
大量データを長期保管する場合、S3 Standardに保存し続けるとストレージコストが高くなるため、今回の検証要件ではS3 Glacier Instant Retrievalの利用を想定していました。
AWS公式ブログではストレージクラスごとの動作について言及されていなかったため、AWS管理コンソールのオブジェクトアップロード画面で選択可能な、下図のすべてのストレージクラスにテストファイルを格納し、Object Lockの保持期間を延長できるか検証しました。
その結果、今回検証したすべてのストレージクラスでObject Lockの保持期間を延長できることを確認しました。

6. 検証結果とPoCで得られた知見
今回のPoCでは、S3 Inventoryによるオブジェクト情報の取得から、Athenaによる対象オブジェクトの抽出、Manifestの作成、S3 Batch OperationsによるObject Lockの保持期間延長まで、一連の処理を実行できることを確認しました。
また、実際に各リソースを構築して検証したことで、以下の点が重要であることが分かりました。
・過去バージョンを含めて処理する場合、VersionIDの扱いが重要となる
・S3 Inventoryでは、後続処理に必要となる項目を考慮して設定する必要がある
・S3 InventoryとAthenaを組み合わせることで、保持期間の延長対象となるオブジェクトを抽出できる
・S3 Batch Operationsを利用することで、複数オブジェクトのObject Lock保持期間を一括で延長できる
・SSE-KMSで暗号化されたユーザー作成のCSV ManifestはS3 Batch Operationsでサポートされていないため、今回のPoCではManifestをSSE-S3で暗号化して格納した
・今回検証したすべてのストレージクラスで、Object Lockの保持期間を延長できることを確認した
AWS公式ブログで紹介されているアーキテクチャを参考に各リソースを手動で構築したことで、各AWSサービスの役割だけでなく、実際に構築する際の注意点についても確認できました。
7. 特定日復旧への応用
今回のPoCでは保持期間の自動延長を検証対象としたため、特定日時点への復旧までは検証していません。
一方、S3 InventoryからAthenaで対象Versionを抽出し、作成したManifestを利用してS3 Batch OperationsのCopy処理を実行することで、過去Versionを復旧用バケットへコピーする構成が考えられます。
下図のように特定日時点のVersionを正しく特定できるか、実際に復旧用バケットへコピーしてデータを復元できるかについては、別途検証が必要です。

8. まとめ
・当初は単なるObject Lock期間延長の技術検証のつもりでしたが、実際には「特定日復旧」に必要な部品技術まで見通しを得ることができました。
・今後はAthenaクエリの最適化や大規模環境での性能検証を進めることで、より実運用に近い形へ発展できると考えています
BIPROGYグループの技術への取り組み
We Are Hiring!

