概要
機密データを置いたS3バケットでは、「誤って消される」「意図的に消される」「気づかないうちに上書きされる」という3つのリスクに備える必要があります。アクセス許可を絞るだけでは、権限を持つ人が誤操作した場合や、認証情報が漏えいした場合を防げません。
S3にはこれらに対応する保護機能が3段階で用意されています。バージョニングでオブジェクトの変更履歴を残し、MFA削除でバージョンの完全削除に多要素認証を要求し、Object Lockで保持期間中は誰も消せない状態にします。3つは重ねて使うもので、どれか1つを選ぶものではありません。
この記事では、それぞれが何を防ぐのかを整理したうえで、バージョニングと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 条件キーを使うと、指定できる保持期間の上限・下限を強制できます。





ガバナンスモードは s3:BypassGovernanceRetention を持つプリンシパルなら例外を通せるが、コンプライアンスモードはルートユーザーでも解除できぬのでござる。猿山でたとえるなら、長老会の許しがあれば開けられる封と、長老でも期日まで開けられぬ封の違いでござるな。コンプライアンスモードは取り消せないので、試すときは短い保持期間にするでござるぞ。
どう組み合わせるか
要件から機能を選ぶときの対応は次のとおりです。
| 要件 | 使う機能 |
|---|---|
| 誤って上書き・削除したものを戻したい | バージョニング |
| 変更履歴を追跡したい | バージョニング(+ CloudTrailのデータイベント) |
| バージョンの完全削除を止めたい | MFA削除 |
| 一定期間、誰にも消させたくない | Object Lock(リテンション期間) |
| 規制対応で改変不能を証明したい | Object Lock(コンプライアンスモード) |
| 調査が終わるまで消させたくない | Object Lock(リーガルホールド) |
実践
バージョニングと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が並んでいることを確認します。


手順3: 削除して復元する
「バージョン」のトグルを「非表示」に戻し、オブジェクトを選択して「削除」をクリックします。オブジェクトロックが有効なバケットでは、確認画面の上部に s3:BypassGovernanceRetention アクセス許可に関する情報ボックスが表示されます。削除 と入力して削除を実行します。
一覧からオブジェクトが消えたことを確認します。
「バージョン」のトグルを「表示」に切り替えます。削除マーカーという種別のバージョンが最新として載っており、実体のバージョンはその下に残っていることを確認します。


削除マーカーの行を選択し、「削除」をクリックします。確認画面で 完全に削除 と入力して実行します。
「バージョン」のトグルを「非表示」に戻すと、オブジェクトが一覧に戻っていることを確認できます。削除マーカーを取り除くと、その下のバージョンが最新に戻るためです。





削除マーカーを取り除いたら、その下のバージョンが最新に戻って sample.txt が一覧に帰ってきたでござるな。一覧から消えて見えても、バージョンを表示すれば実体が残っていたのでござる。
手順4: バケットのデフォルト保持期間を設定する
バケットの「プロパティ」タブを開き、「オブジェクトロック」セクションの「編集」をクリックします。
以下を設定します。
- デフォルトの保持:
有効にする - デフォルトの保持モード:
ガバナンス - デフォルトの保持タイプ:
固定保持 - デフォルトの保持期間:
1Days
「デフォルトの保持タイプ」で 固定保持 を選ぶまで、保持期間の入力欄は表示されません。もう一方の選択肢である「イベントホールド付き可変保持期間」は、イベントホールドがオフになってから指定した期間だけ保護する方式です。


「変更の保存」をクリックします。
[!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を持つ人には効かない。コンプライアンスモードは取り消せないため、検証するときは必ず短い保持期間にする - バージョンはストレージ料金がかかるため、ライフサイクルルールによる整理とセットで運用する
参照先
- S3 バケットでのバージョニングの使用 – Amazon Simple Storage Service
- MFA 削除の設定 – Amazon Simple Storage Service
- S3 オブジェクトロックの使用 – Amazon Simple Storage Service
- S3 オブジェクトロックの仕組み – Amazon Simple Storage Service
- オブジェクトの削除 – Amazon Simple Storage Service










