まず初めに、SQL Server 2014までの各種暗号化の機能には以下のような特徴があります。
それぞれ特徴があるため、よりセキュリティ強度の高いシステムを実現するためには各種機能を組み合わせて実装いただくことを推奨しておりますが、それでもDBAの権限が悪用されると、データを暗号化していても、その意味をなさなくなってしまう可能性があります。SQL Serverに限らず一般的な商用データベースでは、職務分掌を実現しDBAがユーザーデータにアクセスできないように制御することも可能な製品が多いですが、現実的には非常に運用面に負担がかかるためにそういった制御を実装していないシステムが多いのも事実です。そういったジレンマを解消するために、SQL Server 2016 では Always Encrypted という機能を実装いたしました。Always Encrypted はアプリケーション側で(正確にはドライバーが透過的に)データの暗号化・復号化を行うことにより、データベースは暗号化されたデータを管理するのみとなります。データベース側ではデータを復号化するためのキーを使用することができないために、DBA権限を悪用された際にもデータの漏えいを防ぐことができるという仕組みとなっています。
以下ではAlways Encryptedをご利用いただくにあたり理解しておいていただきたいポイントをお伝えします。
まず、一般的なお話として暗号化については大きく以下三点について把握しておく必要があります。
- キーを使用してデータはどのように暗号化されるか
- 暗号化するためのキーはどのように保護されているか
- キーを交換する際にはどのように対処すべきか
一つ一つをAlways Encryptedに照らし合わせながら見ていきたいと思います。なお、厳密には”暗号化”の対になるのは”復号”と思いますが、本記事では SQL Server のマニュアルに合わせるために”暗号化”、”復号化”と表現させていただきます。
1.キーを使用してデータはどのように暗号化されるか
Always Encrypted では、列暗号化キー(対称キー)を用いてデータを暗号化しますが、データを暗号化・復号化する箇所はアプリケーション側のドライバー部分となります。データベース側で、どのテーブルの、どの列に対し、どの列暗号化キーを使って暗号化するかを定義し、ドライバーはその情報をデータベース側から取得し、必要な列に対してドライバー内にキャッシュした列暗号化キーを使ってデータの暗号化・復号化を実施します。
特徴的なのは、データベース側で暗号化・復号化を実施せずにアプリケーション側にあるドライバーで実施する点です。これによりデータベース 側はあくまでも暗号化されたデータを格納、取り出すだけとなり、データベース側にてデータを復号化することはできません。そのため、DBAがデータを抜き出したとしても、そのデータはあくまでも暗号化されたデータであるために情報漏えいを防ぐことが可能となっています。また、暗号化・復号化による負荷をデータベース側ではなくアプリケーション側にオフロードすることにより、データベースに余分な負荷がかかることもありません。