S3 MFA delete とは

## 勉強前イメージ

S3の機能で、MFAで消せる的な？

## 調査

### S3 MFA delete とは

s3のバージョニング機能のオプションで、
オブジェクトのバージョンを削除する際にMFAの数値の入力が必要になります。

また、以下のような制限があります。

- s3バケットがバージョニング設定が有効になっている必要がある
- 設定できるのはルートアカウントのみ(フル権限を持ったIAMユーザでも不可能)
- ルートアカウントに2段階認証の設定がされている必要がある
- AWS CLI または API で、設定可能。(マネジメントコンソールでは不可能)
- MFA DELETEが設定されている場合はバージョニング設定の無効化は不可能。


### 設定してみる

#### 適当なバケットの作成

- バケットの作成

test-backet-202109 を作成しました。
バージョニングは有効にしておきます。

![2021-09-011S3 Management Console - Google Chrome 2021-09-01 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/4926d419-0bcd-ce0a-7c04-fe7f07ecc91f.png)


#### rootアカウントで設定を行う

- ログイン

rootアカウントでログインします。

#### アクセスキーの作成

- セキュリティ情報へ進む

`マイセキュリティ資格情報` へ進みます

![2021-09-022IAM Management Console - Google Chrome 2021-09-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/9e0263c5-35f6-53e3-aefd-e55f0392934c.png)


- アクセスキーの作成を行う

アクセスキーIDとシークレットアクセスキーをメモします。

![2021-09-023IAM Management Console - Google Chrome 2021-09-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/858f093b-0d86-1509-ad76-5c7c36be174a.png)


#### MFA deleteの設定を行う

- AWS CloudShellを実行

上のバーから簡単にいけます。

![2021-09-024S3 Management Console - Google Chrome 2021-09-02 0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/3b975710-ff5f-8447-0d5d-44f22df183d6.png)


- アカウントの認証情報を設定

先程取得した、アクセスキーIDとシークレットアクセスキーを記載し実行します。

```
export AWS_DEFAULT_REGION=ap-northeast-1
export AWS_ACCESS_KEY_ID=[アクセスキーID]
export AWS_SECRET_ACCESS_KEY=[シークレットアクセスキー]
```

- MFA有効化前に確認

`aws s3api get-bucket-versioning --bucket [バケット名]` で現在の状況を確認できます。
Enabledになってるのは、バージョニング設定です。

```
aws s3api get-bucket-versioning --bucket test-backet-202109
{
    "Status": "Enabled"
}
```

- MFA有効化を行う

```
aws s3api put-bucket-versioning --bucket test-backet-202109[バケット名] \
  --versioning-configuration MFADelete=Enabled,Status=Enabled \
  --mfa 'arn:aws:iam::XXXXXXXXXXXX[アカウントID]:mfa/root-account-mfa-device XXXXXX[MFAの数値]'
```

- MFA有効化後に確認

MFADeleteが追加されました。

```
aws s3api get-bucket-versioning --bucket test-backet-202109
{
    "Status": "Enabled",
    "MFADelete": "Enabled"
}
```

#### MFA DELETE設定を確認

- てきとうなファイルをアップしました

`test-s3.txt` ファイルです。

```
aws s3api list-object-versions \
--bucket test-backet-202109 \
--prefix test-s3.txt \
--query "Versions[].Key"
[
    "test-s3.txt"
]
```

- 消してみます

あれ？MFA聞かれずに消せちゃいました・・・

```
aws s3 rm s3://test-backet-202109/test-s3.txt
delete: s3://test-backet-202109/test-s3.txt
```

- 確認

削除フラグがついてただけで、実際は消えてないようでした。

```
aws s3api list-object-versions \
--bucket test-backet-202109 \
--prefix test-s3.txt \
--query "DeleteMarkers[].Key"
[
    "test-s3.txt"
]
```


- 実体も消す

vertionIDをしてしないといけないため、確認

```
aws s3api list-object-versions \
--bucket test-backet-202109 \
--key test-s3.txt \
--query "DeleteMarkers[].VersionId"
[
    "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
]
```

vertionIDをしてして削除。
MFA DELETE設定が有効になってるので、意図通りエラーになりました。

```
aws s3api delete-object \
--bucket test-backet-202109 \
--key test-s3.txt \
--version-id XXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

以下でMFAを追加し、消えます。

```
aws s3api delete-object \
--bucket test-backet-202109 \
--key test-s3.txt \
--version-id XXXXXXXXXXXXXXXXXXXXXXXXXXXXX \
--mfa 'arn:aws:iam::XXXXXXXXXXXX:mfa/root-account-mfa-device 580229'
{
    "VersionId": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}
```

### バージョニング設定

無効化出来ないことを確認
コンソールを確認するとすでに記載がありました。

![2021-09-0210test-backet-202109 - S3 bucket - Google Chrome 202.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/40be66c6-a3e7-cd04-5f08-c84d82036087.png)


#### 削除

- MFA DELETE設定を削除

```
aws s3api put-bucket-versioning --bucket test-backet-202109[バケット名] \
  --versioning-configuration MFADelete=Disabled,Status=Enabled \
  --mfa 'arn:aws:iam::XXXXXXXXXXXX[アカウントID]:mfa/root-account-mfa-device XXXXXX[MFAの数値]'
```

- バケットの削除

- ルートアカウントでのアクセスキー無効化 → 削除

- rootアカウントからログアウト


## 勉強後イメージ

絶対消せないファイルとかだったらこれやってもいいかも

## 参考

- [S3 MFA Delete を有効にして CloudTrail ログを保護する](https://blog.manabusakai.com/2015/09/s3-mfa-delete-cloudtrail/)
- [Amazon S3 MFA Deleteでファイル削除を保護する](https://dev.classmethod.jp/articles/s3-mfa-delete/)