特定のIAMユーザーのみがアクセスできるS3バケットを作成してみた

# 目次
[1. はじめに](#1-はじめに)
[2. やりたいこと](#2-やりたいこと)
[3. 結論](#3-結論)
[4. 用語](#4-用語)
[5. やってみた](#5-やってみた)
[6. まとめ](#6-まとめ)
[7. 参考](#7-参考)
# 1. はじめに
こんにちは。
私は、普段はAWSの運用保守を担当しています。
最近の案件で、1つのAWSアカウントで複数のユーザーを管理することがありました。
その際に少しハマったS3バケットのアクセス権周りについて記載します。

# 2. やりたいこと
各ユーザーごとに専用のIAMユーザーと専用のS3バケットを作成。
その際に、他ユーザーからのアクセスをできないようにしたい。
（自分のS3バケットには、自分のみアクセスできるようにしたい）
また、ユーザー用のIAMユーザーは、S3への最小アクションのみを許可したい。
![yu-za- .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730351/833f6c99-994a-d5e4-b3cd-f67802dbbff9.png)

# 3. 結論
* **IAMポリシーでは、操作するバケットとS3で操作できるアクションを設定。** 

* **S3のバケットポリシーでは全ての操作を拒否し、例外として特定のIPアドレスおよび特定のIAMユーザー（管理者用のIAMユーザーとS3バケットに対応するユーザー用のIAMユーザー）のみ許可するように設定。**

# 4. 用語
:::note info
IAMポリシーとは
:::
「どのAWSサービスの」、「どのリソースに対して」、「どんな操作を」、「許可するか(許可しないか)」を権限とし、利用者（IAMユーザーなど）に対して設定することが出来る定義のこと。

:::note info
バケットポリシーとは
:::
バケットとその中のオブジェクトへのアクセス許可を付与できるリソースベースのポリシーのこと。
バケット所有者のみが、ポリシーをバケットに関連付けることができる。 
バケットに添付された許可は、バケット所有者が所有するバケットのすべてのオブジェクトに適用される。

# 5. やってみた
前提条件として、AWSのアカウントおよび管理者用IAMユーザーが作成されていること。
## 5-1. ユーザー用のIAMユーザーを作成
IAM Management Consoleから「ユーザー」➡「ユーザーを追加」をクリック。
今回は、ユーザー名を「S3-Test」としました。
![IAMユーザー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730351/7cede673-e47a-95db-8d57-2a9e16b9eb14.png)
アクセス権限は以下の内容のポリシーを作成し、アタッチします。ポリシー名はわかりやすい名前を設定してください。
```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:PutObject　＃バケットにオブジェクトを追加するアクセス許可",
                "s3:GetObject　＃S3からオブジェクトを取得するためのアクセス許可",
                "s3:ListBucket　＃S3バケット内のオブジェクトの一部またはすべてを一覧表示するアクセス許可",
                "s3:DeleteObject　＃オブジェクトのnullバージョンを削除し、削除マーカーを挿入する許可",
                "s3:GetBucketLocation　＃S3バケットが存在するリージョンを返すアクセス許可"
            ],
            "Resource": [
                "arn:aws:s3:::操作するS3バケット名",
                "arn:aws:s3:::操作するS3バケット名/*"
            ]
        }
    ]
}
```
タグは任意で追加してください。
確認画面で設定に問題がなければ「ユーザーの作成」をクリック。

## 5-2. ユーザー用のS3バケットを作成
S3 Management Consoleから「バケット」➡「バケットを作成」をクリック。
バケット名はわかりやすい名前を設定してください。
リージョンは任意の場所に作成してください。
![S3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730351/a8ddf280-5d50-65d3-0c92-7d152f9c03a2.png)
パブリックアクセスは**すべてブロック**で設定。
![パブリックアクセス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730351/d58fa64e-e608-e25c-2b39-1a3c1f535a27.png)
タグ、バージョニング等は、それぞれの環境に合わせて設定してください。
設定内容に問題がなければ「バケットを作成」をクリック。

## 5-3. バケットポリシーを追加
S3 Management Consoleから「バケット」➡「作成したバケット」を選択。
「アクセス許可」をクリックし、バケットポリシーの「編集」をクリック。![設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730351/02462e7c-e5bd-4389-0220-2c4a344b1926.png)
以下の内容のポリシーを作成し、アタッチします。ポリシー名はわかりやすい名前を設定してください。
```json
{
    "Version": "2012-10-17",
    "Id": "SourceIP",
    "Statement": [
        {
            "Sid": "SourceIP",
            "Effect": "Deny",
            "Principal": "*",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::操作するS3バケット名",
                "arn:aws:s3:::操作するS3バケット名/*"
            ],
            "Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                         "ユーザーが使用するIPアドレスを設定",
                         "管理者が使用するIPアドレスを設定"
                    ]
                }
            }
        },
        {
            "Sid": "IAMUser",
            "Effect": "Deny",
            "NotPrincipal": {
                "AWS": [
                    "arn:aws:iam::アカウントID:ユーザー用のIAMユーザー名（S3-Test）",
                    "arn:aws:iam::アカウントID:管理者用のIAMユーザー名",
                    "arn:aws:iam::アカウントID:管理者用のルートユーザー名"
                ]
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::操作するS3バケット名",
                "arn:aws:s3:::操作するS3バケット名/*"
            ]
        }
    ]
}
```

## 5-4. 動作確認
バケットポリシーで指定した「IPアドレス」および「IAMユーザー」でアクセスすると、以下のように「非公開のオブジェクト」と表示されアクセスすることができました。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730351/8a051498-f8ee-bd3c-0a38-75506bee7dab.png)
指定していない「IPアドレス」または「IAMユーザー」でアクセスすると、「エラー」と表示されアクセスできません。
![111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730351/b443e9cb-71f7-e861-0c35-e96b9effd530.png)

# 6. まとめ
IAMユーザーではS3の操作を、バケットポリシーでは指定したIPアドレスとIAMユーザーのみ許可することで強固なセキュリティーを担保できることがわかった。
S3バケットポリシーでは全てのS3操作を拒否しているため、必ず管理者用のIAMユーザーを例外として許可しないとバケットにアクセスすることができなくなるので注意が必要である。
（アクセスできなくなってしまった場合は、ルートユーザーでのみ対処可能）

# 7. 参考
* [IAMポリシーとは](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies.html)
* [バケットポリシーとは](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/example-bucket-policies.html)
* [特定のバケットまたはフォルダに対する Amazon S3 コンソールのアクセス権をユーザーに付与するには](https://aws.amazon.com/jp/premiumsupport/knowledge-center/s3-console-access-certain-bucket/)
* [特定の VPC エンドポイントまたは IP アドレスを使用して Amazon S3 バケットへのアクセスを制限するには](https://aws.amazon.com/jp/premiumsupport/knowledge-center/block-s3-traffic-vpc-ip/)