はじめに
SCSKの根岸です。
Amazon Simple Storage service (Amazon S3) はアマゾンウェブサービス (AWS) 内のサービスの中でも比較的よく利用されるサービスかと思います。オブジェクトを保管するという点で暗号化は気になるところになりますが、S3バケットに保管するオブジェクトの暗号化方法にはいくつか種類があり、違いが分かりにくいところもあるので今回まとめてみました。
そもそもSSEってなに?
SSEは「Server Side Encryption」の略です。意味は言葉のとおり”サーバ側の暗号化”ということになります。Amazon S3の暗号化の話題でSSEという言葉が出てきたら「あー、S3バケットの方でオブジェクトを暗号化してくれるんだなあ」と考えればいいと思います。
SSEと対になる言葉としてしてはCSE(Client Side Encryption)があります。これも言葉の通りで、S3バケットにアップロードする前にあらかじめクライアント側で暗号化しておいて、S3バケットにアップロードするという意味になります。CSEもいろいろと方式があるのですが今回の記事では割愛させていただきます。
S3バケットにおけるサーバサイド暗号化では、暗号化キーの管理方法によって下記の3種類に分類されます。
- SSE-S3
- SSE-KMS
- SSE-C
SSE-S3の特徴
SSE-S3の特徴は以下の通りです。
- Amazon S3がキーの生成・管理・保管を行う。
- SSE-S3の利用には料金は発生しない。(標準のS3バケットへのリクエスト料金は発生する)
- 事前の準備は必要なくオプションで有効化するとすぐ利用開始できるため手軽。
- 自分で暗号化に利用するキーを選択したり変更したりはできない。
SSE-S3は最も手軽なキーの管理方法で、ユーザはキーの管理を意識しないでS3を利用することができます。また、SSE-S3では透過的に暗号化・復号化されるため、ユーザは特に何か特別な手順を踏むことなくオブジェクトにアクセスすることができます。
一方で、透過的に複合できることから、S3バケットおよびオブジェクトにアクセスできる人はもれなくオブジェクトも復号化できるため注意が必要です。とりあえず暗号化しておきたいという時に選択されるオプションなのかなと思っています。
コンプライアンスなどの関係でより本格的に暗号化キーの管理をしたいという場合は、次に紹介するSSE-KMSが選択肢として挙がってきます。
SSE-KMSの特徴
SSE-KMSの特徴は以下の通りです。
※この項目での”キー”という単語はAWS Key Management Service (AWS KMS)でのCMKを意味しています。
- AWS KMS がキーの生成・管理・保管を行う。
- SSE-KMSの利用に料金が発生する。(標準のS3バケットへのリクエスト料金+AWS KMSへの暗号化・復号化のリクエスト料金)
- AWS KMSの設定が別途必要。
- AWS KMS自体の機能によってさらに細くキーの管理をすることができる。(後述)
SSE-KMSは暗号に用いるキーをAWS KMSで管理します。AWS KMSの詳細については公式ドキュメントを見ていただきたいのですが、AWS KMSの機能を利用することによってSSE-S3と異なりさらに以下のメリットが追加されます。
- 任意のキーを用いて暗号化することができる。
- キー自体へのアクセス制御により、暗号化・復号化できるユーザを制御できる。
- (キー種類によっては)キーの自動ローテーションができる。
- キーの利用状況をAWS CloudTrailで追跡することができる。
特に4つ目の利用状況の追跡については実現したい場合があるのではないかと思っています。SSE-KMSでは暗号化・復号化のたびにAWS KMSへのAPIコールが発生するのでAWS CloudTrailによる追跡が可能ということです。(このAPIコールが発生するために暗号化・復号化に料金が発生してしまうのですが…)
また、AWS KMSのAPIコール自体にリクエストの制限があるので、短い時間で大量のオブジェクトにアクセスする際には注意が必要になります。
SSE-KMSのオプションとして「バケットキー」というものがあるのですが、こちらを利用すると、上記の2つのデメリットを軽減することもできます。
透過的に複合できてしまうという点についてはSSE-S3と変わりありません。次に紹介するSSE-Cを選択するとたとえアクセスキーが流出しても意図せずS3バケットにアクセスされてしまっても、オブジェクトを守ることができます。
SSE-Cの特徴
SSE-Cの特徴は以下の通りです。
- ユーザ自身がキーの生成・管理・保管を行う。
- 暗号化・復号化に伴う料金は発生しない。(標準のS3バケットへのリクエスト料金は発生する)
- 任意のキーを用いて暗号化することができる。
- コンソールからアクセスできない。CLIなどを利用する必要がある。
- アクセスキーの流出や不正アクセスにも強い
SSE-Cではユーザ自身がキーを用意し、自分で管理・保管を行わなくてはなりません。SSEなので暗号化・復号化はS3バケット側で実施されるものの、AWSではキーを保管しません。また、どのキーでどのオブジェクトが暗号化されたという情報もAWSは管理しないので、それもちゃんと自分で管理できないといけません。
また、SSE-Cの暗号化・復号化はコンソール上では実施できず、CLIのgetコマンドやputコマンドのオプションとしてキーを指定するという感じになります。(見方によってはコンソールの利用が制限されるということもメリットにもなりますが)
他の管理方式と比較するといろいろと面倒な印象がありますが、「アクセスキーの流出や不正アクセスにも強い」という圧倒的メリットがあります。たとえコンソールのパスワードが突破されてもS3バケットポリシーの設定が甘くて不正アクセスされても、キーが盗まれさえしなければ容易にオブジェクトを複合されることはないということになります。
まとめ
今回は、Amazon S3の暗号キーの管理方法の違いについてまとめさせていただきました。管理コスト・利用コストも踏まえるとどれも一長一短といった感じなのでご利用の状況によって使い分けていただくのがいいかと思います。CSEについてもそのうちまとめられたらと思っています。
ちなみに他のエントリにてS3バケットのVPCエンドポイントの利用についてもまとめていますので、もしよろしければそちらも見ていっていただけると嬉しいです!