スマートスタイル TECH BLOG

データベース&クラウド技術情報

ストアドファンクションを使った暗号鍵の守り方(MySQL Enterprise Encryption版)

ストアドファンクションを使った暗号鍵の守り方(MySQL Enterprise Encryption版)

始めに

以前の記事でストアドファンクションを使って暗号鍵をアプリケーションに渡さずに暗号化/復号化を行うサンプルを例を取り上げました。そこで用いたのは、MySQL Community Editionでも使える共通鍵暗号方式のAES暗号化関数でしたが、今回はMySQL Enterprise Editionで使える公開鍵暗号方式のRSA暗号化関数を使った例の紹介になります。

Oracle Cloud Infrastructure (以下OCI)で提供されているMySQLのPaaSサービスではEnterprise Editionが提供されています。そのためEnterprise Editionの機能を追加費用無しで利用可能です。今回のサンプルはOCI上で動作検証をしているので、Enterprise Editionのライセンスが無い方でもOCIが使えれば今回のサンプル例を試すことが可能です。

暗号化データの保存方法

2つのアプリケーション用DBアカウントを作成して、2つのアプリケーション間のデータのやり取りの暗号化と署名検証も行うサンプルです。

アプリケーション用データベース & 暗号化データ保存テーブル

データの受け渡し用のテーブル定義です。

アプリケーション用DB接続ユーザーの作成

サンプルとして2つのDBアカウントを作成ます。

RSAの秘密鍵と公開鍵の保存用データベース & テーブル作成

RSAの秘密鍵の保管用なのでアクセス権の付与には十分注意を払ってください。

暗号化/復号化ストアドファンクション専用ユーザーの作成

多くのクラウドのDBaaSがそうですが、OCIでもMySQLインスタンスを作成時に作った管理者ユーザーにはSUPER権限やSET_USER_ID権限が与えられていません。そのためストアドファンクションの実行ユーザーを指定して作成できません。

そのためencrypt_func_userアカウントでMySQLにログインをして、ストアドファンクションを作成します。ストアドファンクションを作成するときに実行権限の指定を行わない場合、ストアドファンクションを作成したアカウントが持っている権限で実行されます。

encrypt_func_userアカウントには、rsa_keysテーブルの読み取り権限とshare_dbデータベースでストアドファンクションの作成と実行する権限のみを与えます。

ストアドファンクション作成

encrypt_func_userアカウントでMySQLにログインをして各ストアドファンクションを作成します。

ストアドファンクションの作成が終わればencrypt_func_userアカウントでログインする必要がなくなるのでストアドファンクションを作成する権限を削除してアカウントをロックします。

ストアドファンクションの使い方

これで準備ができたので、app_aアカウントからapp_bアカウントへ暗号化をして安全にデータを受け渡してみましょう。

各DBアカウント用の鍵ペアを作成

管理者アカウントなどで、各アプリケーションのDBアカウントに紐づく鍵ペアを登録します。

app_aからapp_bへ渡す暗号化したデータの作成

app_aアカウントで暗号化したデータを登録します。

暗号化したデータ(@enc_data)に対してapp_aの秘密鍵で署名をしているので、このデータの送信元がapp_aだと検証可能になります。

app_bがapp_aからの暗号化したデータを復号化

暗愚化されたデータを平文に戻せて、署名の検証も成功しました。

それ以外のDBアカウントでアクセスした場合

app_eというDBアカウントの作成と鍵ペアを登録して、先ほど作成したapp_bへの平文の読み取りと偽メッセージの作成を試みます。

app_aやapp_bのDBアカウントでは無い他のユーザーでも署名の検証は成功しますが、暗号データの復号化には失敗してNULLが返ってきています。

app_bの秘密鍵で暗号化されているデータは復号化して平文に戻せましたが、署名の検証に失敗しているので署名元を偽っていると判断できます。

終わりに

DBに接続するアプリケーションが悪意を持った挙動をする可能性は低いですが、RSA暗号に代表される公開鍵暗号方式の利点が必要とされるアプリケーションは多くあります

例えば、Web上の様々なサービスと連携するのに使われるJSON Web tokenなどでは認証/認可/署名/検証などでRSA暗号方式が必要とされ、適切な鍵管理が求められるアプリケーションは増えています。

この記事がアプリケーションごとに必要とされる適切な鍵の管理を行う際に参考になれば幸いです。

Return Top