クラウドでの利用も安心! SQL Server におけるデータ暗号化
今回はSQL Server 2016 で機能強化されたAlways Encryptedという機能について掘り下げてご紹介したいと思います。ただ、弊社プレミアフィールドエンジニアである本間が以前「Always Encrypted登場!(前編)(後編)」と題しまして細かな設定等については記事を載せておりますので、本記事ではもう少し俯瞰的な観点でAlways Encryptedについてご紹介いたします。
まず初めに、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がデータを抜き出したとしても、そのデータはあくまでも暗号化されたデータであるために情報漏えいを防ぐことが可能となっています。また、暗号化・復号化による負荷をデータベース側ではなくアプリケーション側にオフロードすることにより、データベースに余分な負荷がかかることもありません。
この記事は参考になりましたか?
- 今さら聞けないSQL Serverのメモリ最適化テクノロジーと、押さえておきたいSQL Serverのデータベースセキュリティ連載記事一覧
-
- クラウドでの利用も安心! SQL Server におけるデータ暗号化
- 今さら聞けない列ストアインデックスの仕組みと進化・活用シーン(後編)
- 今さら聞けない列ストアインデックスの仕組みと進化・活用シーン(前編)
- この記事の著者
-
中川(ナカガワ)
日本マイクロソフト株式会社
クラウド&ソリューションビジネス統括本部
データプラットフォーム技術部日本マイクロソフトでSQL Serverを中心としたデータプラットフォーム製品群の技術営業を担当しているチームに所属しています。国内SIer、外資系データベースベンダーを経てMSに入社し、データベースとしてSQL Server、およびOracle Databaseのスキルを擁し、最近ではHadoopや機械学習なども担当しています。学生の頃に少しか...※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア