S3の削除防止と変更履歴 ── バージョニング・MFA削除・Object Lockの使い分け

目次

概要

機密データを置いたS3バケットでは、「誤って消される」「意図的に消される」「気づかないうちに上書きされる」という3つのリスクに備える必要があります。アクセス許可を絞るだけでは、権限を持つ人が誤操作した場合や、認証情報が漏えいした場合を防げません。

S3にはこれらに対応する保護機能が3段階で用意されています。バージョニングでオブジェクトの変更履歴を残し、MFA削除でバージョンの完全削除に多要素認証を要求し、Object Lockで保持期間中は誰も消せない状態にします。3つは重ねて使うもので、どれか1つを選ぶものではありません。

この記事では、それぞれが何を防ぐのかを整理したうえで、バージョニングとObject Lockを実際に設定し、「削除したはずのオブジェクトを復元する」「保持中のオブジェクトの削除が拒否される」という挙動を確認します。

S3の3段階のデータ保護(バージョニングによる履歴保持・MFA削除による完全削除の抑止・Object Lockによる保持期間中の削除禁止)の全体像
S3の3段階のデータ保護(バージョニングによる履歴保持・MFA削除による完全削除の抑止・Object Lockによる保持期間中の削除禁止)の全体像
クラウドおさる

バージョニング、MFA削除、Object Lock は、どれか 1 つを選ぶのではなく重ねて使う守りでござる。この記事では、消したはずのオブジェクトが戻ることと、保持中のオブジェクトの削除が拒否されることを、弊猿と一緒に確かめるでござるな。

この記事のメリット

  • バージョニング・MFA削除・Object Lockがそれぞれ何を防ぐのかを区別できるようになる
  • 削除マーカーの仕組みを理解し、削除されたオブジェクトを復元できるようになる
  • Object Lockのガバナンスモードとコンプライアンスモードの違いを、運用への影響込みで把握できる
  • リーガルホールドと保持期間の使い分けを理解できる
  • SCS試験で「データの削除防止と変更履歴の追跡」を問う設問に正確に答えられるようになる

執筆者とキャラクター紹介

執筆者:土肥(とひ)

株式会社ジェニュインの代表であり元エンジニア。これまでオンプレミスと AWS 環境のインフラ業務を担当。AWS 認定資格の学習で得た知識を、ハンズオンとともに解説するのが得意。直近では新人の教育も行っており、これから技術を学ぶ方が納得できる解説を心がけています。基礎編・Cloud Practitioner の記事では、解説役としても登場します。

土肥

クラウドおさる

クラウドおさる

はじめましてでござる。弊猿はクラウドおさる。IT インフラが異常に発達した猿山から、雲に乗って地上の AWS を学びに降りてきたのでござる。

クラウドおさる

基礎編や Cloud Practitioner の記事では、とひさんに素朴な疑問をぶつける役でござるな。Security - Specialty などの記事では、要所でワンポイントや注意点をひとこと添えるでござる。

クラウドおさる

猿山にもデータセンターや監視当番があって、地上で起きることはだいたい猿山にも同じ仕組みがあるのでござる。例え話がつい猿山に寄るのは、弊猿の癖でござる。

技術解説

3つの機能が防ぐもの

3つの機能は保護のレイヤーが違います。まず対応関係を整理します。

機能防げること防げないこと
バージョニング上書き・削除による内容の喪失(旧バージョンが残る)権限を持つ人がバージョンごと完全削除すること
MFA削除バージョンの完全削除、バージョニングの無効化通常の削除(削除マーカーの作成)自体
Object Lock保持期間中の上書き・削除(ルートユーザーを含む)保持期間が切れた後の削除

バージョニングは「履歴を残す」機能であって「消させない」機能ではない、という点が重要です。バージョニングだけを有効にしても、s3:DeleteObjectVersion を持つプリンシパルはバージョンを指定して完全に削除できます。

バージョニング有効時のオブジェクト削除の流れ(通常の削除は削除マーカーが載るだけ・バージョン指定の削除は実体が消える)の比較図
バージョニング有効時のオブジェクト削除の流れ(通常の削除は削除マーカーが載るだけ・バージョン指定の削除は実体が消える)の比較図

バージョニングと削除マーカー

バージョニングを有効にしたバケットでは、同じキーにアップロードするたびに新しいバージョンIDが採番され、以前のバージョンも残ります。

削除の挙動は2種類あります。

操作実際に起きること復元
バージョンIDを指定しない削除最新バージョンの上に削除マーカーが載る。実体は残る削除マーカーを削除すれば復元できる
バージョンIDを指定した削除そのバージョンの実体が消える復元できない

一覧画面ではオブジェクトが消えたように見えても、「バージョンの表示」を有効にすると削除マーカーと旧バージョンが見えます。これが「誤って消した」を取り消せる仕組みです。

バージョニングは一度有効にすると、無効(Disabled)には戻せません。停止(Suspended)にはできますが、それまでに作られたバージョンは残り続けます。保存しているバージョンの分だけストレージ料金がかかるため、ライフサイクルルールで古いバージョンを整理する運用とセットで考えます。

クラウドおさる

バージョンIDを指定しない削除は、削除マーカーが載るだけで実体は残るのでござる。ただしバージョニングは履歴を残す機能で、s3:DeleteObjectVersion を持つプリンシパルならバージョンを指定して完全に消せてしまう。「消させない」機能ではない点を押さえておくでござる。

MFA削除

MFA削除を有効にすると、次の2つの操作に多要素認証(MFAデバイスのシリアル番号と現在のコード)が必要になります。

  • オブジェクトバージョンの完全削除
  • バケットのバージョニング状態の変更

運用上、次の制約を押さえておく必要があります。

項目内容
前提条件バージョニングが有効であること
有効化できる人バケット所有者(ルートユーザー)のみ
有効化の手段AWS CLI / API のみ(マネジメントコンソールからは設定できない)
保存場所バージョニングと同じサブリソース(VersioningConfiguration の MfaDelete)

有効化のコマンドは次の形になります。--mfa にはMFAデバイスのシリアル番号(仮想MFAならARN)と、そのとき表示されているコードをスペース区切りで渡します。

aws s3api put-bucket-versioning \
    --bucket <バケット名> \
    --versioning-configuration Status=Enabled,MFADelete=Enabled \
    --mfa "arn:aws:iam::111122223333:mfa/root-account-mfa-device 123456"

ルートユーザーの認証情報を使う必要があるため、日常運用で気軽に試せる機能ではありません。この記事の実践でもMFA削除の設定は行わず、仕組みの理解にとどめます。「バージョンの完全削除を止めたい」という要件に対してMFA削除が答えになる、という対応関係を覚えておくのが試験対策としては重要です。

Object Lock

Object Lockは、指定した期間オブジェクトバージョンをWrite Once Read Many(WORM)で保護する機能です。バージョニングが有効であることが前提で、保護は個々のオブジェクトバージョンに対してかかります。

保持の方法は2系統あります。

保護概要解除
リテンション期間「いつまで保護するか」を日付で指定する。バケットのデフォルト保持期間として自動適用もできる期間の満了を待つ(延長はできるが短縮はできない)
リーガルホールド期限のない保護。訴訟や監査で「終わるまで消さない」用途s3:PutObjectLegalHold の権限を持つ人が明示的に解除する

リテンション期間には2つのモードがあります。この違いはSCS試験で頻出です。

モード上書き・削除保持期間の短縮・モード変更想定用途
ガバナンスモードs3:BypassGovernanceRetention を持つプリンシパルは、バイパスを明示すれば可能同上の権限があれば可能社内ルールとしての保護。運用で例外を通したい場合
コンプライアンスモードルートユーザーを含め誰もできないできないSEC 17a-4 などの規制対応

コンプライアンスモードは、設定を間違えても保持期間が切れるまで取り消せません。検証では必ずガバナンスモードか、ごく短い保持期間で試します。

なお、オブジェクト単位の設定はバケットのデフォルト保持期間より優先されます。バケットポリシーで s3:object-lock-remaining-retention-days 条件キーを使うと、指定できる保持期間の上限・下限を強制できます。

Object Lockの2つのモードとリーガルホールドの関係(ガバナンスはバイパス可能・コンプライアンスは誰も解除不可・リーガルホールドは期限なし)
Object Lockの2つのモードとリーガルホールドの関係(ガバナンスはバイパス可能・コンプライアンスは誰も解除不可・リーガルホールドは期限なし)
クラウドおさる

ガバナンスモードは s3:BypassGovernanceRetention を持つプリンシパルなら例外を通せるが、コンプライアンスモードはルートユーザーでも解除できぬのでござる。猿山でたとえるなら、長老会の許しがあれば開けられる封と、長老でも期日まで開けられぬ封の違いでござるな。コンプライアンスモードは取り消せないので、試すときは短い保持期間にするでござるぞ。

どう組み合わせるか

要件から機能を選ぶときの対応は次のとおりです。

要件使う機能
誤って上書き・削除したものを戻したいバージョニング
変更履歴を追跡したいバージョニング(+ CloudTrailのデータイベント)
バージョンの完全削除を止めたいMFA削除
一定期間、誰にも消させたくないObject Lock(リテンション期間)
規制対応で改変不能を証明したいObject Lock(コンプライアンスモード)
調査が終わるまで消させたくないObject Lock(リーガルホールド)
フリーランス案件
クラウドおさる
クラウドキャリアフリーランス

AWS の実務経験があるなら、単価を上げにいく

AWS に特化したフリーランスエージェントです。以下は取り扱い案件の一例です。設計・SRE・セキュリティ・生成 AI の領域で、専門を掛け合わせるほど単価が上がります。

横にスクロールできます。掲載時点の情報のため、募集が終了している場合があります。条件の近い案件をご紹介しますので、お気軽にご相談ください。

実践

バージョニングとObject Lockを有効にしたバケットを作成し、削除したオブジェクトの復元と、保持期間中の削除が拒否される挙動を確認します。

前提条件

  • リージョン: ap-northeast-1(東京)
  • S3のバケット作成・オブジェクト操作の権限を持つIAMユーザーまたはロールでコンソールにログイン済みであること
  • 動作確認用の小さなテキストファイルを手元に用意しておくこと(内容は任意)

このハンズオンで作成するリソースは以下のとおりです。

リソース種別リソース名用途
S3バケットs3-protection-lab-<アカウントID>バージョニングとObject Lockの検証用
オブジェクトsample.txtバージョニングと削除マーカーの確認用
オブジェクトprotected.txtガバナンスモードの確認用
オブジェクトprotected2.txtコンプライアンスモードとリーガルホールドの確認用

[!NOTE] Object Lockのコンプライアンスモードは、設定すると保持期間が切れるまでルートユーザーでも削除できません。保持期間中はそのオブジェクトを含むバケットも削除できないため、この実践では保持期間をいずれも1日にして検証します。

手順1: バージョニングとObject Lockを有効にしてバケットを作成する

AWSマネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。

上部の検索バーに S3 と入力し、表示された「S3」を選択します。

左側ナビゲーションの「汎用バケット」を選択し、「バケットを作成」をクリックします。

以下を設定します。

  • バケットタイプ: 汎用
  • バケット名: s3-protection-lab-<アカウントID>(グローバルに一意な名前にします)
  • オブジェクト所有者: ACL 無効(推奨)
  • このバケットのブロックパブリックアクセス設定: すべてブロック(デフォルトのまま)

「バケットのバージョニング」で「有効にする」を選択します。

バケット作成画面のバージョニング設定(「有効にする」を選択した状態)
バケット作成画面のバージョニング設定(「有効にする」を選択した状態)

「詳細設定」を展開し、「オブジェクトロック」で「有効にする」を選択します。確認のチェックボックスが表示されるので、内容を読んでチェックを入れます。

詳細設定のオブジェクトロック(「有効にする」を選択し確認チェックを入れた状態)
詳細設定のオブジェクトロック(「有効にする」を選択し確認チェックを入れた状態)

ページ下部の「バケットを作成」をクリックします。

手順2: オブジェクトをアップロードして上書きする

作成したバケットを開き、「アップロード」から sample.txt という名前でテキストファイルをアップロードします。

同じファイル名のまま内容を書き換えて、もう一度アップロードします。一覧上はオブジェクトが1つに見えます。

オブジェクト一覧の上部にある「バージョン」のトグルを「表示」に切り替えます。同じキーに対して2つのバージョンIDが並んでいることを確認します。

バージョンを表示したオブジェクト一覧(同一キーに2つのバージョンが存在する状態)
バージョンを表示したオブジェクト一覧(同一キーに2つのバージョンが存在する状態)

手順3: 削除して復元する

「バージョン」のトグルを「非表示」に戻し、オブジェクトを選択して「削除」をクリックします。オブジェクトロックが有効なバケットでは、確認画面の上部に s3:BypassGovernanceRetention アクセス許可に関する情報ボックスが表示されます。削除 と入力して削除を実行します。

一覧からオブジェクトが消えたことを確認します。

「バージョン」のトグルを「表示」に切り替えます。削除マーカーという種別のバージョンが最新として載っており、実体のバージョンはその下に残っていることを確認します。

削除後のバージョン一覧(削除マーカーが最新バージョンとして存在する状態)
削除後のバージョン一覧(削除マーカーが最新バージョンとして存在する状態)

削除マーカーの行を選択し、「削除」をクリックします。確認画面で 完全に削除 と入力して実行します。

「バージョン」のトグルを「非表示」に戻すと、オブジェクトが一覧に戻っていることを確認できます。削除マーカーを取り除くと、その下のバージョンが最新に戻るためです。

削除マーカーを削除した後のオブジェクト一覧(オブジェクトが復元されている状態)
削除マーカーを削除した後のオブジェクト一覧(オブジェクトが復元されている状態)
クラウドおさる

削除マーカーを取り除いたら、その下のバージョンが最新に戻って sample.txt が一覧に帰ってきたでござるな。一覧から消えて見えても、バージョンを表示すれば実体が残っていたのでござる。

手順4: バケットのデフォルト保持期間を設定する

バケットの「プロパティ」タブを開き、「オブジェクトロック」セクションの「編集」をクリックします。

以下を設定します。

  • デフォルトの保持: 有効にする
  • デフォルトの保持モード: ガバナンス
  • デフォルトの保持タイプ: 固定保持
  • デフォルトの保持期間: 1 Days

「デフォルトの保持タイプ」で 固定保持 を選ぶまで、保持期間の入力欄は表示されません。もう一方の選択肢である「イベントホールド付き可変保持期間」は、イベントホールドがオフになってから指定した期間だけ保護する方式です。

オブジェクトロックのデフォルト保持設定(ガバナンス・固定保持・1日を指定した状態)
オブジェクトロックのデフォルト保持設定(ガバナンス・固定保持・1日を指定した状態)

「変更の保存」をクリックします。

[!NOTE] デフォルト保持期間は、設定した後にアップロードされたオブジェクトに適用されます。手順2でアップロード済みのオブジェクトには適用されません。

手順5: 保護されたオブジェクトのプロパティを確認する

「オブジェクト」タブに戻り、「アップロード」から protected.txt という名前で任意のファイルをアップロードします。

アップロードしたオブジェクトを開き、「プロパティ」タブの「オブジェクトロックの保持」セクションを確認します。保持モードが「ガバナンスモード」、保持タイプが「固定保持」、保持期日が翌日の日時になっていることを確認します。

オブジェクトのプロパティ(ガバナンスモードの保持期日が設定されている状態)
オブジェクトのプロパティ(ガバナンスモードの保持期日が設定されている状態)

手順6: ガバナンスモードとコンプライアンスモードで結果が変わることを確認する

オブジェクト一覧に戻り、「バージョン」のトグルを「表示」に切り替えます。protected.txt のバージョンを選択し、「削除」をクリックします。

確認画面に「オブジェクトロックが有効になっているバケットからのオブジェクトの削除」という情報ボックスが表示され、削除には s3:BypassGovernanceRetention アクセス許可が必要である旨が案内されます。完全に削除 と入力して実行します。

ここで結果は、操作しているプリンシパルの権限によって変わります。

プリンシパル結果
s3:BypassGovernanceRetention を持たない「アクセスが拒否されました」となり削除できない
s3:BypassGovernanceRetention を持つ(管理者権限など)コンソールが自動的にバイパスを付けて呼び出すため、削除が成功する

これがガバナンスモードの性質です。保持期間中でも、権限を持つプリンシパルは例外を通せます。「社内ルールとして保護するが、必要なら管理者が消せる」という位置づけになります。

誰にも消させないことを確かめるには、コンプライアンスモードを使います。「アップロード」から protected2.txt をアップロードし、オブジェクトを開いて「プロパティ」タブの「オブジェクトロックの保持」で「編集」をクリックします。以下を設定して保存します。

  • 保持モード: コンプライアンスモード
  • 保持期日: 翌日の日付

同じようにバージョンを選んで完全削除を試すと、今度は権限にかかわらず「削除の失敗」となり、エラー列に「アクセスが拒否されました」と表示されます。

バージョン削除の失敗結果(保持中のためアクセス拒否となった状態)
バージョン削除の失敗結果(保持中のためアクセス拒否となった状態)

[!WARNING] コンプライアンスモードは、保持期間が切れるまでルートユーザーでも解除・削除できません。保持期間中はそのオブジェクトを含むバケットも削除できないため、検証では必ず 1 日程度の短い保持期間で試します。

手順7: リーガルホールドを設定して解除する

protected2.txt を開き、「プロパティ」タブの「オブジェクトロックのリーガルホールド」セクションで「編集」をクリックします。

「リーガルホールド」で「有効にする」を選択し、「変更の保存」をクリックします。リーガルホールドが「有効」になったことを確認します。

リーガルホールドを有効にした状態のオブジェクトプロパティ
リーガルホールドを有効にした状態のオブジェクトプロパティ

リーガルホールドは保持期間とは独立していて、期限がありません。解除するときは同じ画面で「無効にする」を選択します。検証が終わったら無効に戻しておきます。

クラウドおさる

「誤削除を戻したい」「完全削除を止めたい」「期間中は誰にも消させたくない」という要件ごとに、バージョニング、MFA削除、Object Lock のどれが対応するかを見分けるのが観点でござる。ガバナンスとコンプライアンスの違い、リーガルホールドと保持期間の違いも、取り違えやすいところでござるな。

まとめ

機能役割押さえるポイント
バージョニング上書き・削除の履歴を残す通常の削除は削除マーカーが載るだけ。取り消せる
MFA削除バージョンの完全削除とバージョニング変更にMFAを要求ルートユーザー + CLI/APIでのみ有効化できる。コンソール不可
Object Lock(ガバナンス)保持期間中の削除を禁止(例外あり)s3:BypassGovernanceRetention を持つプリンシパルは削除できる。管理者権限では素通りする
Object Lock(コンプライアンス)保持期間中の削除を完全に禁止ルートユーザーでも解除できない。期間の短縮も不可
リーガルホールド期限のない保護保持期間とは独立。権限があれば解除できる
  • バージョニングは「履歴を残す」機能であり、それだけでは完全削除を防げない
  • 「消させない」要件にはObject Lock、「完全削除にひと手間かけさせる」要件にはMFA削除が対応する
  • ガバナンスモードは s3:BypassGovernanceRetention を持つ人には効かない。コンプライアンスモードは取り消せないため、検証するときは必ず短い保持期間にする
  • バージョンはストレージ料金がかかるため、ライフサイクルルールによる整理とセットで運用する

参照先

フリーランス案件
クラウドおさる
クラウドキャリアフリーランス

AWS の実務経験があるなら、単価を上げにいく

AWS に特化したフリーランスエージェントです。以下は取り扱い案件の一例です。設計・SRE・セキュリティ・生成 AI の領域で、専門を掛け合わせるほど単価が上がります。

横にスクロールできます。掲載時点の情報のため、募集が終了している場合があります。条件の近い案件をご紹介しますので、お気軽にご相談ください。

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社ジェニュイン(https://genuine-pt.jp)の代表取締役.

2018年〜インフラエンジニアとしてキャリアをスタートし、オンプレミスのネットワーク・サーバ環境で3年半、クラウド環境で4年半の8年間エンジニアとして従事。
2021年に佐藤氏の創業した株式会社Luxyを引き継ぎ、代表に就任。
その後アガルートグループ内の株式会社ジェニュインと合併。
合併後同社代表に就任。

目次