Amazon S3 MFA Deleteでファイル削除を保護する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。
大事なファイルを誤って消してしまった経験、誰しもありますよね。AWSのオブジェクトストレージサービス S3には、ファイルの誤削除を防ぐ仕組みとしてバージョニングという機能があります。バージョニングはその名の通り、ファイルごとにバージョンIDを付与し、ファイルを上書き・削除するときに元のファイルを保持する機能です。ただしバージョニングを有効にしても、バージョンIDを指定して削除操作を行うとそのデータは削除されてしまう恐れがあります。そこで、S3 MFA Delete機能を利用しデータを保護することができます。

S3 MFA Deleteとは

S3 MFA Deleteは、バージョニング機能のオプションとして動作します。バージョンIDを指定しない通常のファイル操作(作成、変更、削除)は通常通りで、バージョンIDを指定する削除操作のみ、MFAデバイスによる認証を必須とするオプションです。現在のMFA Deleteには、以下の要件があります。

  • Management Consoleでのオプション表示およびMFA認証付きの削除操作は未サポート
  • 利用できるMFAデバイスは、ルートアカウント(非IAMユーザー)に登録したもののみ

では、設定し動作を確認してみましょう。ドキュメントではAPIを直接コールする例が示されていますが、手軽に試すために今回はAWS CLIでやってみます。

設定方法と動作確認

まずは、ルートアカウントの[Security Credentials]ページでMFAデバイスを登録します。
仮想MFAデバイスの場合、シリアルナンバーは登録画面に表示されるarn:から始まる文字列になります。

mfa-delete04

続いて、AWS CLIでS3バケットでMFA Deleteを有効にします。通常のバージョニングの操作(aws s3api put-bucket-versioning --versioning-configuration)にMFA Deleteを有効化するMfaDelete=Enabledという指定と、MFAデバイスの認証情報(--mfaオプションにデバイスIDと6桁のトークンをスペース区切りで記述)を付与します。

$ aws s3api put-bucket-versioning --bucket takipone-mfa-test \
  --versioning-configuration Status=Enabled,MfaDelete=Enabled \
  --mfa 'arn:aws:iam::XXXXXXXXXXXX:mfa/root-account-mfa-device XXXXXX'

$

MFA Deleteが有効になっているかどうかの確認は、aws s3api get-bucket-versioningで確認します。

$ aws s3api get-bucket-versioning --bucket takipone-mfa-test
{
    "Status": "Enabled",
    "MfaDelete": "Enabled"
}
$

有効になっていますね。ちなみに、Managent ConsoleのS3バケットのプロパティ画面は通常のバージョニングが有効になっている表示となり、MFA Deleteの有効/無効は区別できません。

mfa-delete02

cloud.pngファイルの特定バージョンの削除操作をしてみたところ、以下の通りエラーになりました。
Management Consoleでの削除操作はMFAデバイスの認証に対応していないため、バージョンID指定で削除を行うことができません。

mfa-delete01

それでは、AWS CLIでMFAデバイスの認証付き削除を試してみます。aws s3api delete-objectコマンドに--mfaオプションを付与します。

--mfaオプションなし: 削除失敗

$ aws s3api delete-object --bucket takipone-mfa-test --key cloud.png --version-id 123456789012345678901234567890
A client error (AccessDenied) occurred when calling the DeleteObject operation: Mfa Authentication must be used for this request
$

--mfaオプションあり: 削除成功

$ aws s3api delete-object --bucket takipone-mfa-test --key cloud.png --version-id  123456789012345678901234567890 \
  --mfa 'arn:aws:iam::XXXXXXXXXXXX:mfa/root-account-mfa-device XXXXXX'
{
    "VersionId": "123456789012345678901234567890"
}
$

Managent Consoleを確認すると、特定バージョンのオブジェクトが削除されていることが確認できます。

mfa-delete03

まとめ

MFAによるS3のファイル削除保護機能をご紹介しました。バージョニングと組み合わせる点、ルートアカウントのMFAのみという制限から実際に利用することはあまり多くないとは思いますが、S3のちょっと変わった機能として知っておくと良いかもしれません。