ゾンビ化したS3バケットを復旧する

# はじめに
S3でバケットポリシーを使ったことがある方は、1回は以下のような光景を見たことがあるんじゃないでしょうか。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/f08ad052-f399-09e5-d2b0-bb893139cad0.png)

経験ある方は原因をご存じだと思いますが、これはバケットポリシーの設定ミスによって引き起こされる誰もアクセスできないS3バケットになります。
[この記事](https://dev.classmethod.jp/articles/delete-access-denied-bucket-policy/)だと、この状態のS3バケットを"ゾンビバケット"と呼んでいるようです。

今回はこのS3バケットを復旧させる手順を試してみました。

# 作業内容
## 前提
S3バケットポリシーには元々以下のポリシーが設定されていましたが、そこから間違ってCondition部分だけを削除してしまった、という想定とします。

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Principal": "*",
            "Action": [
                "s3:*"
            ],
            "Resource": [
                "arn:aws:s3:::test-deny-error-bucket",
                "arn:aws:s3:::test-deny-error-bucket/*"
            ],
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "XXX.XXX.XXX.XXX/32"
                    ]
                }
            }
        }
    ]
}
```

## 復旧作業
どのように復旧したらよいかは以下のページに記載があります。
https://repost.aws/ja/knowledge-center/s3-accidentally-denied-access

手順部分だけ抜粋します。

1. アカウントルートユーザーとして AWS マネジメントコンソールにサインインします。
2. Amazon S3 コンソールを開きます。
3. 正しく設定されていないバケットに移動します。
4. [権限] タブを選択します。
5. [バケットポリシー] を選択します。
6. [削除] を選択します。
7. バケットポリシーの削除ページで、テキストフィールドに「delete」と入力して、バケットポリシーの削除を確認します。
8. [削除] を選択します。
9. AWS マネジメントコンソールからサインアウトします。

実際に作業を行う前に以下の部分はよく読んでおきます。
今回の作業はルートユーザーを使用しますが、ルートユーザーは通常作業に使用するべきでないユーザーですので、今回のような"ルートユーザーを使わないとどうしようもなくなってしまった"時だけ十分に気を付けて作業を行います。

>**重要:**ルートユーザーを日常業務に使用しないでください。これらの認証情報の使用は、ルートユーザーとしてサインインする必要があるタスクのみに制限してください。ルート認証情報は、完全な管理者アクセス権を持つ AWS Identity Access Management (IAM) ユーザーまたはロールとは異なります。許可または拒否の権限を持つ IAM ポリシーをルートアカウントにアタッチすることはできません。

### ルートユーザー以外で削除
まずはルートユーザー以外でバケットポリシーの操作ができないか試してみます。
検証にはSSOユーザーを利用し、AdministratorAccess権限を付与しています。

コンソールからアクセスしてみますがバケットポリシーで拒否されているので何も操作ができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/6b41ce59-9f07-102e-8292-b7e04315d65b.png)

もちろんAWSCLIからもアクセスできません。
```
$ aws s3 ls test-deny-error-bucket
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
```

### ルートユーザーで削除
では、ルートユーザーでマネジメントコンソールにログインして、S3バケットポリシーの削除を行います。
S3コンソールから見た限りは先ほどの表示と特に変わりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/292ffd21-fb7d-a992-ef75-6169c7b9504b.png)

S3バケットにアクセスして権限タブからバケットポリシーを確認すると、先ほどはエラーになっていましたが、エラーが出ずにポリシーが表示されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/472e1873-a371-df5e-ccc1-9ef69f2f7b9e.png)

※今回はポリシー自体を削除しますが、編集ボタンを押下するとポリシーの編集も可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/955fd9a0-e5a1-4f99-bb8c-76171be4af21.png)

バケットポリシーの削除ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/b968267d-e8e9-46c6-a105-b082de41e5cd.png)

"削除"と入力して、削除ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/17f4196d-88c6-8bea-bdb3-ca260734cdf0.png)

無事バケットポリシーが削除されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/a9bf3871-ee5d-26f6-5d9c-907327c985a1.png)

### アクセス確認
最初にアクセスしていたSSOユーザー側のコンソールで確認するとエラーの文字が消えていることがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/7bf47c7b-e513-17a1-d175-f2b05e454fd8.png)

バケットポリシーが存在していないことが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/c99cb708-7471-123a-fdbe-03b79af45064.png)

正しいバケットポリシーを設定し直して復旧完了です。
ルートユーザーは忘れずにサインアウトしておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440403/a17cde9a-c96f-10a3-f265-240e3173edda.png)

# おわりに
ルートユーザーを使用すればアクセスできなくなったS3バケットポリシーを削除できることは知っていましたが、試したことはなかったので実施してみました。

弊社は希望すれば1人に対してAWSの検証環境をもらえるんですが、ルートユーザーは流石にもらえないので、今回は個人で保有しているAWSアカウントで試してみました。
会社でAWSアカウントを利用しているのであれば、恐らくルートユーザーを管理する人が社内にいると思いますので、本作業はその方に依頼して対応していただくことになるかと思います。

この記事がどなたかの参考になれば幸いです。