S3レプリケーションの暗号化設定について（実際に試してみた）


# サマリ
## この記事で得られること
* S3レプリケーションの暗号化の実際についてわかる
* レプリケーション元の暗号化設定によってレプリケーション先の暗号化に制約があることがわかる

## 読むのにかかる時間
10分

# はじめに
## S3レプリケーションとは
あるS3バケットから別のS3バケットへデータをレプリケーションできる機能のこと。
リージョン内だけでなく、クロスリージョンでのレプリケーションも可能である。
ログを保管するバケットを1つに集約してい場合や、DR対策として他のリージョンへレプリケーションする場合に利用されることが多いのではないかと思う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759531/0f26052e-02da-49f5-afb6-b1cd71bdcd41.png)


## 本記事の差別化ポイント
クロスリージョンレプリケーションやそのKMS暗号化については、以下の通りすでに記事があるが、本記事ではレプリケーション元の暗号化方式によってレプリケーション先で取りうる暗号化方式が変わることを解説および実践する。

* [SSE-KMS暗号化したS3バケットのクロスアカウントレプリケーションをやってみた@DevelopersIO](https://dev.classmethod.jp/articles/s3-bucket-replication-with-encryption/)
* [【初心者向け】Amazon S3 SSE-KMS暗号化バケットのクロスアカウントレプリケーション@Zenn](https://zenn.dev/smori/articles/b7b9b4f84a33bb)

# 暗号化されたオブジェクトのレプリケートについて（座学）
AWSドキュメント（[暗号化されたオブジェクトのレプリケート (SSE-S3、SSE-KMS、DSSE-KMS、SSE-C)](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/replication-config-for-kms-objects.html)）を要約した結果は以下（一部実践結果を反映している部分あり）。

| レプリケート元バケットの暗号化方式 | レプリケート先バケットの暗号化方式 |
|:-:|:-:|
| 非暗号化 | レプリケート先バケットのデフォルト暗号化が採用される。ETagが異なることに注意する。※この記載があるものの現在は非暗号化オブジェクトを保管できないため、この動作となることはない。 |
| SSE-S3 | レプリケート元オブジェクトと同じタイプの暗号化。 |
| SSE-KMS | レプリケート元オブジェクトと同じタイプの暗号化。暗号化に使うKMSキーはレプリケート元、レプリケート先で変更可能。 |
| DSSE-KMS | レプリケート元オブジェクトと同じタイプの暗号化。暗号化に使うKMSキーはレプリケート元、レプリケート先で変更可能。 |
| SSE-C | レプリケート元オブジェクトと同じタイプの暗号化。 |

意外だったのが、SSE-S3で暗号化したオブジェクトはS3レプリケーションではSSE-KMSに変更できないところである。
ALBのアクセスログは現時点ではSSE-S3しかサポートされていない（[AWSドキュメント](https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/enable-access-logging.html)）ため、すべてのログをSSE-KMSでの暗号化が必要な場合は考慮が必要である。

# 暗号化されたオブジェクトのレプリケートについて（実践）
座学で読み解いた暗号化方式を実際にAWSで設定してみて挙動を確認する。

## レプリケート元バケットが非暗号化
現在、非暗号化でバケットを作ることができないため、本動作は検証不可。
[デフォルトの暗号化のよくある質問](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/default-encryption-faq.html)

## レプリケート元バケットがSSE-S3
### 検証１（SSE-S3 to SSE-KMS）
#### 設定内容
| レプリケート元バケットの暗号化方式 | レプリケート先バケットの暗号化方式 |
|:-:|:-:|
| SSE-S3 | SSE-KMS(sse-kms-01) |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759531/a6c8b405-f8b8-4193-be6a-024c58508575.png)

#### 実施結果
レプリケート元バケットのオブジェクトの暗号化方式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759531/c1e8c417-48da-4785-b48d-efc42287acf4.png)

レプリケート先バケットのオブジェクトの暗号化方式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759531/e267df39-e061-4640-ae67-fbe488d16333.png)

結論としては、座学の通り、レプリケート先でもSSE-S3暗号化で保管される。

### 検証２（SSE-S3 to SSE-KMS: レプリケーションルールでKMS暗号化を設定）
#### 設定内容
| レプリケート元バケットの暗号化方式 | レプリケート先バケットの暗号化方式 |
|:-:|:-:|
| SSE-S3 | SSE-KMS(sse-kms-01) |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759531/b3936fc5-fcfa-42fb-824b-671c682c469e.png)

#### 実施結果
レプリケート元バケットのオブジェクトの暗号化方式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759531/215f445e-c48a-4316-ac2e-1c4928cbe8c5.png)

レプリケート先バケットのオブジェクトの暗号化方式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759531/c016cbf8-aff1-420e-94b1-85711f29b726.png)

結論としては、レプリケーションルールに関わらず、レプリケート先でもSSE-S3暗号化で保管される。


## レプリケート元バケットがSSE-KMS
### 検証３（SSE-KMS to SSE-KMS: 同じ暗号鍵）
#### 設定内容
| レプリケート元バケットの暗号化方式 | レプリケート先バケットの暗号化方式 |
|:-:|:-:|
| SSE-KMS(sse-kms-01) | SSE-KMS(sse-kms-01) |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759531/5a78b1d7-9cb7-4572-a675-164d9dcf6eb5.png)

#### 実施結果
レプリケート元バケットのオブジェクトの暗号化方式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759531/393810e3-1a33-4db6-9bfc-1c16c64c702e.png)

レプリケート先バケットのオブジェクトの暗号化方式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759531/ab692b99-333a-4d2a-9819-2bc2b542e75a.png)


結論としては、座学の通り、レプリケート先でもSSE-KMS暗号化で保管される。

### 検証４（SSE-KMS to SSE-KMS: レプリケーション設定で異なる暗号鍵を指定）
#### 設定内容
| レプリケート元バケットの暗号化方式 | レプリケート先バケットの暗号化方式 |
|:-:|:-:|
| SSE-KMS(sse-kms-01) | SSE-KMS(sse-kms-01) |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759531/fd689fda-38d6-422d-a945-4eb6b66a371c.png)


#### 実施結果
レプリケート元バケットのオブジェクトの暗号化方式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759531/d9592861-1af3-47b3-bf82-c3ae2c1fc69d.png)

レプリケート先バケットのオブジェクトの暗号化方式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759531/bb008f11-737a-4677-8ab3-b46aa78bf1ac.png)


結論としては、座学の通り、レプリケート先でもSSE-KMS暗号化で保管され、かつレプリケート時に暗号化鍵を指定することができる。


## レプリケート元バケットがDSSE-KMS
ドキュメント上SSE-KMSと同じ記載のため検証省略


## レプリケート元バケットがSSE-C
### 検証５（SSE-KMS to SSE-KMS: レプリケーション設定で異なる暗号鍵を指定）
#### 設定内容
| レプリケート元バケットの暗号化方式 | レプリケート先バケットの暗号化方式 |
|:-:|:-:|
| SSE-KMS(sse-kms-01) | SSE-KMS(sse-kms-01) |

※バケットのデフォルト暗号化は上記の通りSSE-KMSであるが、本検証ではSSE-Cでオブジェクトを格納する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759531/0a996288-4eb0-4e7f-a4ce-1630e9c5f8ec.png)


#### 実施結果
レプリケート元バケットのオブジェクトの暗号化方式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759531/63431235-7640-4bf5-b310-e18db15e4cce.png)

レプリケート先バケットのオブジェクトの暗号化方式
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3759531/79d16a26-1359-46d1-a42b-1ae457deb83b.png)

結論としては、座学の通り、レプリケート先でもSSE-C暗号化で保管される。検証時にわかったが、少なくともマネジメントコンソールのS3オブジェクトのレプリケーションステータスはSSE-Cの場合更新されない。


# まとめ
* S3レプリケーションでは、オブジェクトの暗号化方式は変更できない
* SSE-KMSのオブジェクトは、別のKMS暗号化キーにてレプリケーション先で暗号化できる
* SSE-S3、SSE-Cのオブジェクトは、そのままの暗号方式でレプリケーションされる


# 補足：SSE-S3のオブジェクトをSSE-KMSに変更してレプリケーションする場合の方式案
SSE-S3のオブジェクト（ALBのアクセスログを想定）を定期的あるいはニアリアルタイムにSSE-KMSのオブジェクトに変更する方式案を以下に列挙する。

| 方式案 | メリット/デメリット |
|:-:|:-:|
| S3バッチオペレーション | 定期的なジョブの作成にはマネージドサービスだけでは対応できない。 |
| S3イベント通知　→　Lambda　→　Firehose　→　ターゲットのS3バケット | マネージドサービスだけで組めない。Lambdaの開発が必要。 |

所感としては、ジョブ定期実行の部分に一部作りこみが必要だが、S3バッチオペレーションを選択するのが良いと感じた。[Encrypting objects with Amazon S3 Batch Operations](https://aws.amazon.com/jp/blogs/storage/encrypting-objects-with-amazon-s3-batch-operations/)

その他のおすすめ方法があればコメントください