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

2016.03.09

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

この記事は、下記記事の内容をPowerShellで実行しようとした際、さくっと行かなかったのでいろいろ調べたりしたちょっとした冒険譚になります。
Amazon S3 MFA Deleteでファイル削除を保護する

すぐに本編(PowerShellでのS3 MFA Deleteの方法)をご覧になりたい方はページ下部の「本編:S3 MFA DeleteをPowerShellで有効化してみた」まですぐに移動して下さい!

S3 MFA DeleteでCloudTrailのログを保護したい

先日、S3 MFA Deleteを用いてCloudTrailのログが保存されているバケットを保護したいというご要望がお客様から有りました。自分の作業環境はG-Tune(Windows PC)なので、PowerShellを用いて作業を行おうと思いました。

そもそも実行したいコマンドレットは何かを調べる

最初にAWS CLIでS3 MFA Deleteを有効にする方法を調べました。弊社ブログを参照するとAWS CLI版のコマンドは「put-bucket-versioning」であることがわかりました。これに対応するAWS SDK for PowerShellのコマンドレット名は何かを下記コマンドで調べました:

PS > Get-AWSCmdletName PutBucketVersioning

CmdletName               ServiceOperation    ServiceName                   CmdletNounPrefix
----------               ----------------    -----------                   ----------------
Write-S3BucketVersioning PutBucketVersioning Amazon Simple Storage Service S3

PowerShell版のコマンドレット名が「Write-S3BucketVersioning」とわかったのでこれを実行していきます。

AWS CLIのコマンド名とAWS SDK for PowerShellのコマンドレット名の命名規則は少し異なるので、上記コマンドで調べると良いでしょう

コマンドレットの使い方を調べる

次に、コマンドレットのヘルプを表示して使い方を調べました。

PS > Write-S3BucketVersioning -?

名前
    Write-S3BucketVersioning

概要
    Invokes the PutBucketVersioning operation against Amazon Simple Storage Service.


構文
    Write-S3BucketVersioning [
    [-BucketName] <System.String>] 
    [-MfaCodes_AuthenticationValue <System.String>] 
    [-VersioningConfig_EnableMfaDelete <System.Boolean>] 
    [-MfaCodes_SerialNumber <System.String>] 
    [-VersioningConfig_Status <Amazon.S3.VersionStatus>] 
    [-PassThru <System.Management.Automation.SwitchParameter>] 
    [-Force <System.Management.Automation.SwitchParameter>] 
    [<CommonParameters>]


説明
    Sets the versioning state of an existing bucket. To set the versioning state, you must be the bucket owner.


関連するリンク
    Online version: http://docs.aws.amazon.com/powershell/latest/reference/index.html?page=Write-S3BucketVersioning.html&tocid=Write-S3BucketVersioning
    Common credential and region parameters: http://docs.aws.amazon.com/powershell/latest/reference/items/pstoolsref-commonparams.html
    Getting Started Guide: http://docs.aws.amazon.com/AmazonS3/latest/gsg/
    Developer Guide: http://docs.aws.amazon.com/AmazonS3/latest/dev/
    Service API Reference: http://docs.aws.amazon.com/AmazonS3/latest/API/

注釈
    例を参照するには、次のように入力してください: "get-help Write-S3BucketVersioning -examples".
    詳細を参照するには、次のように入力してください: "get-help Write-S3BucketVersioning -detailed".
    技術情報を参照するには、次のように入力してください: "get-help Write-S3BucketVersioning -full".
    オンライン ヘルプを参照するには、次のように入力してください: "get-help Write-S3BucketVersioning -online"

このヘルプを見ても、特に構文のパラメータを指定する部分がどうしていいかよくわかりません。下の方にオンラインヘルプのリンクがあるので、次にオンラインヘルプを見てみることにしました。 (URLを直接ブラウザで参照してもよいですし、コマンドを用いてオンラインヘルプを呼び出し(ブラウザ起動)ても良いです。)

コマンドレットのオンラインヘルプを確認する

Write-S3BucketVersioningのオンラインヘルプを見ると少し詳細にパラメータの説明が書いてありました。特に今回利用した下記パラメータに関して確認しました(カッコは心の声)

  • -BucketName:バケット名(わかりやすい)
  • -VersioningConfig_Status :バージョニングの有効無効サスペンドの指定(3つ値があるのでBooleanではないのか)
  • -VersioningConfig_EnableMfaDelete :MFA Deleteを有効化するかどうか(わかりやすい)
  • -MfaCodes_SerialNumber :Documentation for this parameter is not currently available; please refer to the service API documentation.(むむむ?!)
  • -MfaCodes_AuthenticationValue :Documentation for this parameter is not currently available; please refer to the service API documentation.(むむむ?!)

最後の2つのパラメータはドキュメントが無く、APIドキュメントを参照してくださいとのことでした。そのため、引き続きAPIドキュメントを探索することにしました(この時点で筆者のHPはかなり減り始めていました)

AWS APIドキュメントを読む

PutBucketVersioningで検索するとAPIドキュメントがすぐに見つかると思います。

APIドキュメントとはAWSのREST APIのドキュメントになります。

PutBucketVersioningのAPIドキュメントの「Request Headers」の項にそれらしい解説がありました。

The value is the concatenation of the authentication device's serial number, 
a space, and the value displayed on your authentication device.

(訳)

この値は「認証デバイスのシリアルナンバー」、(半角)スペース、認証デバイス上に
表示される値をつなげたもの。

-MfaCodes_AuthenticationValueは例の6桁の数字と思われますが、シリアルナンバーというのが何かよくわかりませんでした(S3 MFA DeleteのAWS CLI版のブログには書いてあるのですが。。。)

MFAデバイスのシリアルナンバーとは何を指すのか

物語の全容がもう少しで明らかになりそうです。「AWS MFA serial number」で検索してみました。すると「list-virtual-mfa-devices」のコマンドリファレンスがヒットしました。Serial Numberの定義は書いていないのですが、コマンド実行結果例に見覚えのある値が表示されていました。

{
  "VirtualMFADevices": [
    {
      "SerialNumber": "arn:aws:iam::123456789012:mfa/ExampleMFADevice"
    },
    {
      "SerialNumber": "arn:aws:iam::123456789012:mfa/Fred"
    }
  ]
}

これはどこかで見たことが有ります!AWS Management ConsoleのIAMユーザー画面やルートアカウントのYour Security Credentials画面に出てくるARNではないでしょうか!

mfa-delete04

これでS3 MFA DeleteをPowerShellで実行する際の準備が整いました!(まだDeveloper.IOで通常語られるいわゆる冒険(プログラムやコマンドの実行)は始まっていない)

本編:S3 MFA DeleteをPowerShellで有効化してみた

※この作業はルートアカウントのみで実行可能です。 まずはS3 MFA Deleteを有効化したいS3 Bucketの状態を調べてみましょう。下記コマンドレットを実行します:

PS > Get-S3BucketVersioning -BucketName target_bucket_name
Status EnableMfaDelete
------ ---------------
Off    False

Statusの列がバージョニングの状況、EnableMfaDeleteの列がS3 MFA Deleteの有効化の状態を表しています。

では、早速S3 MFA Deleteを有効化してみましょう。下記のようにコマンドを実行します(パラメータ毎に改行していますが、1行で実行して下さい)

PS > Write-S3BucketVersioning -BucketName target_bucket_name 
     -VersioningConfig_EnableMfaDelete $TRUE 
     -VersioningConfig_Status Enabled 
     -MfaCodes_SerialNumber "arn:aws:iam::123456789012:mfa/root-account-mfa-device" 
     -MfaCodes_AuthenticationValue 777777

※簡単な注意点。PowerShellではBooleanは最初にドルマークを付けて下さい。777777のところにはMFAデバイス(スマホや1Password)に表示される6桁の数字を入力して下さい。

特に実行結果は表示されないので、先ほどのS3 Bucketの状態を調べるコマンドレットを実行します。

PS > Get-S3BucketVersioning -BucketName target_bucket_name
Status  EnableMfaDelete
------  ---------------
Enabled True

上記のようにバージョニングが有効化(Status=Enabled)され、S3 MFA Deleteも有効化(EnableMfaDelete=True)されました。

今回のお客様の要望のようにCloudTrailのログバケットの保護の場合は上記コマンドレット例の「target_bucket_name」にログバケットのバケット名を指定すればOKです。

※バケットの状態検査はIAMユーザーでも実行可能です。

最後に

S3 Deleteできない バケットは MFAで 保護するが吉