AWS S3 デフォルト暗号化をやってみた

デフォルト暗号化を有効に設定すると、暗号化オプションなしでアップロードしても、ちゃんと暗号化されて保存されます。
ただし、バケットポリシーに暗号化なしのPUTリクエストを拒否するバケットポリシーがある場合、それは拒否されます。
というのも、以前はデフォルト暗号化がなかった時は、バケットポリシーで暗号化されていないオブジェクトを拒否するようにする必要がありました。
[Amazon S3 で管理された暗号化キーによるサーバー側の暗号化 (SSE-S3) を使用したデータの保護](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/dev/UsingServerSideEncryption.html)
そのため、バケットポリシーを確認するようにしましょう。

SSE-S3とSSE-KMSのデフォルト暗号化の動作を中心に操作していきます。
↓のページ参考になります。
[SSE-S3とSSE-KMSの違いを知る](https://ktrysmt.github.io/blog/difference-between-sse-s3-and-sse-kms/)



##1.SSE-S3##

AES-256でとりあえず設定してみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/db696663-b784-bc60-82ee-c80c9baebe7a.png)

とりあえず適当なファイルをアップロード。

"ServerSideEncryption": "AES256" 暗号化されていることが確認できた。

```
[root@ip-172-31-43-135 ~]# aws s3api head-object --bucket naata-encryption --key test.txt
{
    "AcceptRanges": "bytes",
    "ContentType": "text/plain",
    "LastModified": "Thu, 09 May 2019 01:05:46 GMT",
    "ContentLength": 5,
    "ETag": "\"d8e8fca2dc0f896fd7cb4cb0031ba249\"",
    "ServerSideEncryption": "AES256",
    "Metadata": {}
}
```



##2.SSE-KMS##

**ステップ 1 エイリアスと説明の追加**
キーのエイリアスと説明を入力します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/2e522bd4-d751-f8db-96f8-bb26179eaee5.png)

**ステップ 2 タグの追加**
タグを追加できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/c4f624d1-2f8c-da41-5632-e4d737d7e62e.png)

**ステップ 3 キーの管理アクセス許可を定義**
【鍵の管理者】のユーザーあるいはRoleを指定します。
ここでは、EC2(Amazon Linux2)からIMAロールでS3を使って操作しているため、そのIMAロールを指定しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/7779038a-ac4b-cc36-d53b-c1ed41493b7b.png)

**ステップ 4 キーの使用アクセス許可を定義**
【鍵の利用者】のユーザーあるいはRoleを指定します
他のAWSアカウントも指定できるみたいですが、今回は管理者と利用者を同一にしています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/77b85f75-99a6-48ca-fc54-b0e054b1ffcd.png)

**ステップ 5 キーポリシーの確認と編集**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/4a69b0a2-c047-3ee3-544c-a29d17e09153.png)

```
{
    "Id": "key-consolepolicy-3",
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::************:root"
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow access for Key Administrators",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::************:role/naata-s3-access"
            },
            "Action": [
                "kms:Create*",
                "kms:Describe*",
                "kms:Enable*",
                "kms:List*",
                "kms:Put*",
                "kms:Update*",
                "kms:Revoke*",
                "kms:Disable*",
                "kms:Get*",
                "kms:Delete*",
                "kms:TagResource",
                "kms:UntagResource",
                "kms:ScheduleKeyDeletion",
                "kms:CancelKeyDeletion"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::************:role/naata-s3-access"
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Allow attachment of persistent resources",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::************:role/naata-s3-access"
            },
            "Action": [
                "kms:CreateGrant",
                "kms:ListGrants",
                "kms:RevokeGrant"
            ],
            "Resource": "*",
            "Condition": {
                "Bool": {
                    "kms:GrantIsForAWSResource": "true"
                }
            }
        }
    ]
}
```

適当なファイルをアップロードし、暗号化されているか確認する。

```
[root@ip-172-31-43-135 ~]# aws s3api head-object --bucket naata-encryption --key
 test2.txt
{
    "AcceptRanges": "bytes",
    "ContentType": "text/plain",
    "LastModified": "Thu, 09 May 2019 02:23:32 GMT",
    "ContentLength": 12,
    "ETag": "\"932897aa0794109c3a8da9ea61d9a264\"",
    "ServerSideEncryption": "aws:kms",
    "SSEKMSKeyId": "arn:aws:kms:ap-northeast-1:**********:key/515339c7-8419-4377-aaba-12ece413c076",
    "Metadata": {}
}
```