エムオーテックス株式会社が運営するテックブログです。

S3の「オブジェクトロック」機能を使用してオブジェクトを保護する

f:id:mo-nishida:20211126174728j:plain

こんにちは。インフラチームの倉橋です。

S3の「オブジェクトロック」を使用する機会がありましたので実施した内容を記事にして残しておこうと思います。

オブジェクトロックとは

以下AWS公式ドキュメントより、オブジェクトロックを使用するとオブジェクト保護が可能であることが分かります。

使用用途としては変更削除があっては困る「監査ログ」などが当てはまると思います。

S3 オブジェクトロックでは、Write Once Read Many (WORM) モデルを使用してオブジェクトを保存できます。 オブジェクトロックにより、オブジェクトが削除または上書きされることを、一定期間または無期限に防止できます。 オブジェクトロックを使用して、WORM ストレージを必要とする規制要件を満たしたり、オブジェクトの変更や削除に対する保護レイヤーを追加したりできます。

docs.aws.amazon.com

オブジェクトロックの対象

オブジェクトロックの対象は「バージョニングオブジェクト」です。

現行バージョンのオブジェクトは対象外となります。

バージョニングされたオブジェクトを保護することで復元、変更履歴の保持が可能となります。

オブジェクトロックを有効化するには

オブジェクトロックは「バケット作成時のみ」有効化できます。

既存のバケットを有効化するにはAWSサポートへ問い合わせ token の発行が必要となります。

既存バケットの有効化についてはクラスメソッドさんの記事が大変参考になります。

dev.classmethod.jp

既存バケットを有効化した場合、オブジェクトロックされるのは有効化後に追加/更新されたオブジェクトとなります。

オブジェクトロックに関連する設定

オブジェクトロックの設定にはどのようなものがあるか見ていきます。

保持期間

オブジェクトロックする期間を設定します。

保持期間をすぎたバージョニングオブジェクトは上書き/削除が可能になります。

保持期間が過ぎてもオブジェクトロックで保護したい場合は後述の「リーガルホールド」を設定する必要があります。

リテンションモード

「保持期限」内の挙動を決めるモードになり、以下2つのモードが存在します。

  1. ガバナンスモード
  2. コンプライアンスモード

1. ガバナンスモード

権限 s3:BypassGovernanceRetention ポリシーを持つユーザーのみロック設定の変更やバージョニングオブジェクトの上書き/削除が可能です。

特定のユーザー以外から保護したい場合に使用します。

2. コンプライアンスモード

全てのユーザーから保護したい場合に使用します。

AWSアカウントの rootユーザーでさえ、ロック設定の変更やバージョニングオブジェクトの上書き/削除が不可能になります。

保持期限が過ぎるまで何もできなくなるので、コンプライアンスモードは注意が必要です。

こちらもクラスメソッドさんの記事が大変参考になります。

dev.classmethod.jp

リーガルホールド

無期限でバージョニングオブジェクトを保護したい場合に使用します。

リテンションモードと合わせて設定することが可能です。

通常は一定期間でロック解除させるが、障害分析用など特定期間延長して保護したいものがあればリーガルホールドを有効化するといった使い方ができます。

リーガルホールドの解除には 権限 s3:PutObjectLegalHold ポリシーが必要です。

AWSコンソールからオブジェクトロックを有効化する

まずはオブジェクトロックを有効化した新規バケットを作成します。

オブジェクトロック有効化するとバージョニングも合わせて有効化されます。

f:id:mo-kurahashi:20211224142957p:plain
新規バケット作成時にオブジェクト有効化

作成したバケットのプロパティからオブジェクトロックの設定を確認できます。

f:id:mo-kurahashi:20211224143301p:plain
作成後バケットのプロパティ

この段階ではバケットの設定は有効化されていますが、オブジェクトロック自体は反映されておりません。

試しに1ファイルアップロードしてみましたが、通常通り削除が可能です。

オブジェクトロックを有効化するには「デフォルトの保持期間」を設定する必要があります。

バケットのプロパティからオブジェクトロックの「編集」を押下します。

今回は「コンプライアンスモード」で「1日」保護する設定にしてみます。

f:id:mo-kurahashi:20211224145433p:plain
デフォルトの保持期間設定

設定更新以降に追加/更新されたオブジェクトに対してロックが反映されます。

では、オブジェクトを追加してロック設定が有効になっているか確認しましょう。

オブジェクトを1つアップロードします。そしてオブジェクトの設定を見るとロックが有効化していることが確認できました。

f:id:mo-kurahashi:20211224145829p:plain
オブジェクトのロック設定

そして再度同名のオブジェクトをアップロードしてバージョニングオブジェクトを作成します。

f:id:mo-kurahashi:20211224152158p:plain
コンプライアンス-1日設定オブジェクト

では、本題のオブジェクトロックが有効になっているか確認するためにバージョニングオブジェクトを削除してみましょう。

削除しようとするとどうなるか、、、!!

f:id:mo-kurahashi:20211224152412p:plain
バージョニングオブジェクト削除失敗

見事に失敗しました!期待通りの動きですね!

ライフサイクルとの関係

「一定期間経過したバージョニングオブジェクトを削除」するライフサイクルが設定されている場合どうなるでしょうか?

その場合、オブジェクトロック期限内であればライフサイクルで削除されることはありません。

削除マーカーは通常通り作成されます。

docs.aws.amazon.com

料金

オブジェクトロックを有効にすることでの追加料金はありません。

お金をかけずオブジェクト保護が可能になります。

ユースケース別の設定

最後にユースケース別の設定まとめ表を作成しました。

ガッチガチな保護を求めるのであれば「コンプライアンスモード」かつ保持期限後は「リーガルホールド」を有効にするのが良いですね。

やりたいこと リテンションモード 保持期限 リーガルホールド
ロックしない - - -
一定期間完全ロック コンプライアンスモード 設定する 無効
一定期間ロック
特定ユーザーによりオブジェクト更新/削除およびロック解除可能
ガバナンスモード 設定する 無効
無期限でロック
特定ユーザーによりロック解除可能
- - 有効
一定期間完全ロック
保持期限後もロック継続
継続時は特定ユーザーにより解除可能
コンプライアンスモード 設定する 有効
一定期間ロック
特定ユーザーによりオブジェクト更新/削除およびロック解除可能
保持期限後もロック継続
継続時は特定ユーザーにより解除可能
ガバナンスモード 設定する 有効

おわりに

S3のオブジェクトロックについて見ていきました。

監査ログなどび証跡を定められた期間、確実に残しておくために是非とも本機能を活用したいところです。