KMSを使ってS3バケットを暗号化してみた！

# はじめに

BeeX営業の田中です:smiley:
まだ4月ですが、東京はあっという間に初夏の陽気です:sunflower:
昨年12月のアドベントカレンダー以来の記事執筆です。
今回は、「KMSを使ってS3バケットを暗号化してみた！」というタイトルで実際にKMSを使って暗号化にトライしたので、その記録を残したいと思います。

今回、KMSの学習及びハンズオンの参考にさせて頂いた教材は以下です↓
Udemy：https://www.udemy.com/
[AWS Key Management Service - KMS Fundamentals](https://www.udemy.com/course/aws-key-management-service-kms-fundamentals/)
全編英語の講座ですが、数少ないKMSに特化した映像教材ですので、おすすめです。

# KMSを使ってS3バケットを暗号化する

## 暗号化とは？
ハンズオンに入る前に、「暗号化」とは何か整理したいと思います。
元のデータを別のデータに変換することを「暗号化」といいます。
変換には、鍵となるデータが必要で暗号化のアルゴリズムに従って変換処理が実行されます。

具体例は以下です。
元のデータを「BeeX」とし、鍵のデータを「1a」とします。
暗号化のアルゴリズムは、「各文字を1文字シフトし、aを1文字おきに挿入する」とします。

![暗号化の図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1818929/c0735bfa-373a-0dc6-5caa-503d4b6a3228.png)

元の「BeeX」から暗号化されたデータ「CafafaYa」を生成することができました。
「CafafaYa」から逆の動作をすることで「BeeX」を生成することができます（復号)。

~~「BeeX」を暗号化して何か格好いい英単語にしようと思ったけど、出来なかった・・・~~



## 大まかな流れ

今回は、AWSのS3バケットをKMSのCustomer Managed Keyを使って暗号化します。

1.暗号化するS3バケットを用意する
2.KMSで今回のデモに利用する暗号化キーを用意する
3.S3バケットのデフォルト暗号化を「AWS-KMS」に変更する
4.デフォルト暗号化が有効になっていることを確認する

## 1.暗号化するS3バケットとファイルを用意する

demo-2204というバケットを用意し、そこにdemobachi.txtというデモ用のテキストファイルをアップデートします。
![S3バケットキャプチャー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1818929/3315bb2c-13f2-0fcc-0de7-7caa2cfb9d53.png)

## 2.KMSで今回のデモに利用する暗号化キーを用意する

マネジメントコンソールからKMSを検索し、KMSのサービスページに入ります。
今回は東京リージョンでキーを作ります。
KMSのリージョン間のレプリケートは、昨年6月よりKMS マルチリージョンキーを使って実施することができるようです。
https://aws.amazon.com/jp/about-aws/whats-new/2021/06/kms-multi-region-keys/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1818929/474c33ce-691c-471f-1fc9-d871b306d3e2.png)

「キーの作成」を押して、実際のキーを作成していきます。
今回は、暗号と復号が同一キーで実施される「対称キー」を選択します。
「次へ」を押します。
この画面で「マルチリージョンキー」を選ぶと、他のリージョンへのレプリケートを許可されたキーの作成ができるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1818929/7a710cd3-b467-ed2e-1b9e-c78006497376.png)

次のページでキーのエイリアスや説明を追加します。
今回は、「demo/secretbee」というキーをデモ用に作成します。
![鍵のエイリアス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1818929/1272c020-cdbe-33a1-1762-afea0c00ca24.png)

エイリアスを設定するとき、aws/ではじまるエイリアスはAWS管理CMKで利用されるエイリアスのため設定できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1818929/d427e95e-55cf-c41b-17b4-6add90e69017.png)

続いて、キーの管理者を選択します。
今回は、あらかじめadmin権限が付与された「demo-hacchi」というIAMユーザーをデモ用に用意しておいたので、こちらを選択します。
キーの管理者が削除もできるようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1818929/38cf8305-b55d-84ca-1768-6b75378ec32d.png)

次に、暗号化操作でKMSキーを使用できるIAMユーザー/ロールを選択しますが、今回はデモなので、先ほどと同じ「demo-hacchi」を選びます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1818929/a9f000a3-0aa2-9a8c-5313-ce9949cae84f.png)

最後に今回の作成するキーの設定内容を確認し、「完了」します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1818929/b1754580-7d24-1558-d1f2-7ce7ff5366b2.png)

「demo-secretbee」というKMSキーができあがりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1818929/57271335-0362-fda7-bed9-a523cc6173bc.png)

## 3.S3バケットのデフォルト暗号化を「AWS-KMS」に変更する

先ほど作成した「demo-secretbee」というKMSキーを使ってS3のファイルを暗号化する前に、S3バケットのデフォルト暗号化を「AWS-KMS」に変更する必要があります。
最初に作ったs3のdemo-2204バケットに入ります。
プロパティから「デフォルト暗号化」を編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1818929/1dfed0ed-9c15-fcd6-a8bb-07f82a8e677b.png)

今回は、KMSを使った暗号化を実施するので、画像の通り選択します。
「AWS-KMSキーから選択する」を選ぶと、先ほど作成した「demo-secretbee」のKMSキーが選択候補に出てくるので、選択し、変更の保存をします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1818929/1ede51f4-2e4b-5d93-a004-fc07a246b07b.png)

## 4.デフォルト暗号化が有効になっていることを確認する

それでは、S3のdemo-2204にファイルをアップロードしてデフォルト暗号化がきちんと効いているか確認してみます。
demo-2204に「demo_orangebee」というファイルを新たにアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1818929/cc076cd2-36ef-5e79-1863-1ace9ddef47a.png)

デフォルト暗号化が有効になっていることが確認できました。

できました・・・？
できました・・・？？
できました・・・？？？

ぶっちゃけ本当にこれでデフォルト暗号化に成功した実感がないので、KMSのアクセス権限がないIAMユーザーでログインして、本当にデフォルト暗号化が効いている確認します。
S3のFullAccess権限のみ付与された「Suzume-bachi」というIAMユーザーを新たに作りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1818929/e6b21dda-6c9f-ed39-84e4-02cbe69c22d0.png)

この「Suzume-bachi」というIAMユーザーでログインをし、S3バケットにアクセスします。
「demo_orangebee」のオブジェクトの詳細画面まではアクセスできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1818929/309e261e-a976-fd36-ddcf-a8f8e97f3298.png)

しかし、ダウンロードしようとすると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1818929/08b5e926-595b-78f6-df8e-d86c21a37180.png)

KMSの権限が付与されていないIAMユーザーのため、復号ができず、ダウンロードができません。
これでdemo-2204にデフォルト暗号化が効いていることが確認できました！

# おわりに

久しぶりにQiitaの記事執筆しました。
執筆するまでは腰が重いのですが、いざ書き始めると、わかったつもりでわかっていないことが出てきて、やっぱり実際に操作してみるのが一番の勉強になるなと思います:writing_hand:
営業の初歩的なハンズオン記事なので、回りくどかったり、物足りない部分も多々あるかと思いますが、生暖かい目でこれからも見守っていただけると嬉しいです:joy:
アドバイスなどのコメント大歓迎です:relaxed: