Techfirm Cloud Architect Blog

テックファーム株式会社クラウドインフラグループのブログ

S3 MFA Deleteでオブジェクトの削除保護を有効化する

S3 MFA Deleteとは

S3 MFA DeleteとはAmazon S3オブジェクトの誤削除を防止するセキュリティ機能の1つで、バケットからオブジェクトを削除する際にMFAデバイスによる二段階認証を必須にできます。
なおこの機能を使用する際に以下の制限を考慮する必要があります。

  • Amazon S3バケットでバージョニングを有効にする必要がある。
  • S3 MFA DeleteはAWSアカウントのルートユーザーのみ有効にすることができ、IAMユーザーでは有効にすることはできない。
  • AWSアカウントに認証に使用するMFAデバイスを関連付ける必要がある。
  • S3 MFA Deleteは オブジェクトのバージョン削除操作バケットのバージョニング設定変更操作のみ適用され、他の操作には適用されない。
  • AWS CLIまたはAPIで設定可能。 AWSマネジメントコンソールでは設定できない
  • S3 MFA Deleteを適用しているS3バケットに対してライフサイクル設定を使用することはできない。

設定方法

それでは実際の設定作業に移ります。
前提として、使用するMFAデバイスの登録とS3バケットの作成およびバージョニング設定の有効化は実施済みのものとします。

S3 MFA Deleteの適用

AWS CloudShellから設定を適用します。
rootアカウントでログイン後、画面上部バーにあるアイコンをクリックします。

cloudshell起動

以下を実行し、設定適用前にS3バケットのバージョニング設定が有効になっているか確認します。
バケット名にはあらかじめ作成しておいたS3バケット名を入力してください。 今回は"s3-mfa-delete-test-bucket"を作業対象のバケット名とします。

aws s3api get-bucket-versioning --bucket [バケット名]

以下のようにEnableが出力されていれば、バージョニング設定が有効になっています。

$ aws s3api get-bucket-versioning --bucket s3-mfa-delete-test-bucket
{
    "Status": "Enabled"
}

以下を実行し、S3 MFA Deleteを有効化します。

aws s3api put-bucket-versioning --bucket [バケット名] \
--versioning-configuration MFADelete=Enabled,Status=Enabled \
--mfa 'arn:aws:iam::[アカウントID]:mfa/[MFAのデバイス名] [MFAの数値]'

再度設定状況を確認します。
以下を実行し、MFADeleteがEnableになっていれば設定完了です。

$ aws s3api get-bucket-versioning --bucket s3-mfa-delete-test-bucket
{
    "Status": "Enabled",
    "MFADelete": "Enabled"
}

動作確認

今回は確認のためtest.txtファイルをS3バケットにアップロードしました。

$ aws s3api list-object-versions \
--bucket s3-mfa-delete-test-bucket \
--prefix test.txt \
--query "Versions[].Key"
[
    "test.txt"
]

バージョンを削除するにはバージョンIDが必要なので、以下を実行してバージョンIDを確認します。

$ aws s3api list-object-versions \
--bucket s3-mfa-delete-test-bucket \
--query "DeleteMarkers[?Key=='test.txt'].VersionId"
[
    "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
]

削除したいバージョンIDとMFA情報を指定して削除します。

$ aws s3api delete-object \
--bucket s3-mfa-delete-test-bucket \
--key test.txt \
--version-id XXXXXXXXXXXXXXXXXXXXXXXXXXXXX \
--mfa 'arn:aws:iam::[アカウントID]:mfa/[MFAのデバイス名] [MFAの数値]'

削除が成功すると以下が出力されます。

{
    "DeleteMarker": true,
    "VersionId": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}

ちなみにMFA情報を指定せずに削除しようとすると以下が出力され削除に失敗します。

$ aws s3api delete-object \
--bucket s3-mfa-delete-test-bucket \
--key test.txt \
--version-id XXXXXXXXXXXXXXXXXXXXXXXXXXXXX

An error occurred (AccessDenied) when calling the DeleteObject operation: Mfa Authentication must be used for this request

まとめ

本稿ではS3 MFA Deleteの設定方法についてご紹介しました。
S3 MFA Deleteはデータの誤削除を防止する方法として有用なものですが、一方でオブジェクトの削除またはバージョニング設定の変更に追加のステップが発生し、操作が複雑になります。
似たような機能にS3オブジェクトロックがありますが、こちらはS3 MFA Deleteと比較すると容易に実装することができ(非ルートユーザーでも設定できる、MFAデバイスを必要としない等)、保持期間を設定できたりライフサイクルを設定できたりと柔軟な設定が可能なため、MFAデバイスを使用したい等の要件がなければS3オブジェクトロックを採用するのが良いかと思います。