Symfoware Analytics Serverでは、セキュリティを強化するためにカラムナテーブルのカラム単位での暗号化を提供します。
暗号化には、128ビットのアルゴリズムおよび暗号化キーを使用します。データの判読は不可能であり、暗号化キーがなければ解読できません。
データ秘匿化は返却データを改訂することにより、データ表示に対するセキュリティを強化します。これに対して、暗号化では物理データそのものを物理的に暗号化するため、データベースを直接参照されたとしても解読は不可能であり、より強固なセキュリティを確保できます。
ポイント
本機能は、Symfoware Analytics Server Advanced Security Optionを利用することで実現できます。
データベースの暗号化を利用すると、以下のようなメリットがあります。
物理ファイルに対するセキュリティの強化
カラムナテーブルを暗号化することで、直接参照しても参照されても解読は不可能であり、重要なデータの流出リスクを軽減します。
バックアップ、ログなどの関連資産に対する強固なセキュリティ
バックアップデータを暗号化することにより、データベースの管理下から離れた場合にも同じレベルのセキュリティを維持できます。
利用者による暗号化キーを用いた表示/非表示のコントロール
暗号化キーを使用できるかどうかにより、表示できる範囲をコントロールするという運用が可能です。
暗号化キーを利用してデータの暗号化および復号化を行います。暗号化したデータは、そのデータを暗号化した暗号化キーを用いてのみ復号化を行えます。
暗号化キーの値には、長さが16文字以上255文字以内の半角英数字で、大文字と小文字を含んだものを選びます。
注意
暗号化キーを紛失しないでください。暗号化キーを紛失した場合、暗号化したデータにアクセスできなくなります。また、データを修復する方法もありません。
暗号化可能なデータ型は、“H.3 暗号化が可能なデータ型”を参照してください。
カラム暗号化の手順について説明します。
注意
暗号化はバイパスモードのみ対応しています。
スーパーユーザーでDWHサーバにログインしたあと、環境変数を設定してから以下のコマンドを実行します。
例)
/opt/FJSVsymas/bin/symasstart.sh
参照
環境変数の設定の詳細は、“3.1.3 環境変数の設定”を参照してください。
symasstartコマンドの詳細は、“J.1.5 symasstart”を参照してください。
symassetcrptenvコマンドを実行して、Symfoware Analytics Server Advanced Security Optionを有効化します。
symassetcrptenvコマンドは、DWHサーバが起動していることを確認してから実行してください。
例
/opt/FJSVsymas/bin/symassetcrptenv.sh
Symfoware Analytics Server Advanced Security Optionを有効化すると、以下のシステム関数が利用できます。
pgxa_create_table_for_encrypt
pgxa_put_encryptdata
pgxa_get_decryptdata
Symfoware Analytics Server Advanced Security Optionを無効化する場合には、symasunsetcrptenvを実施してください。
参照
symassetcrptenvコマンドの詳細は、“J.1.14 symassetcrptenv”を参照してください。
symasunsetcrptenvコマンドの詳細は、“J.1.15 symasunsetcrptenv”を参照してください。
pgxa_create_table_for_encryptシステム関数の詳細は、“J.4.24 pgxa_create_table_for_encrypt”を参照してください。
pgxa_put_encryptdataシステム関数の詳細は、“J.4.22 pgxa_put_encryptdata”を参照してください。
pgxa_get_decryptdataシステム関数の詳細は、“J.4.23 pgxa_get_decryptdata”を参照してください。
以下の手順で暗号化の設定を行います。
データベースpostgresへの接続
psqlコマンドを使用して、データベースpostgresに接続します。
サーバのIPアドレスが“192.0.2.0”、ポート番号が“26500”の場合の例を示します。
例)
psql -d postgres -h 192.0.2.0 -p 26500 psql (9.2.8) Type "help" for help.
カラムナテーブルの作成
以下のように実行してカラムナテーブルを作成します。
例)
CREATE FOREIGN TABLE table1 ( username char(100), number1 integer, rate decimal(5,3) ) SERVER dwh_server options (database 'symfoas', schema 'symfoasuser' , table 'postgres_public_table1');
暗号化カラムナテーブルの格納構造の作成
暗号化したデータを格納するためのカラムナテーブルを作成します。
暗号化データは従来のデータ型では保存できないため、pgxa_create_table_for_encryptシステム関数を利用して暗号化データに適した形でカラムナテーブルを生成する必要があります。
参照
pgxa_create_table_for_encryptシステム関数の詳細は、“J.4.24 pgxa_create_table_for_encrypt”を参照してください。
以下の例では、“username”カラムおよび“rate”カラムを暗号化カラムとし格納構造を作成します。
例)
postgres=# SELECT pgxa_create_table_for_encrypt('table1', 'MODE_COLUMN', 'username, rate' );
データを暗号化して格納するには、pgxa_put_encryptdataシステム関数を使用します。
pgxa_put_encryptdataシステム関数で暗号化を行うには、データのほかに暗号化キーおよび暗号化するカラムのデータ型を指定する必要があります。
以下の例では、暗号化対象として設定したusernameカラムおよびrateカラムに対して、それぞれ暗号化キー“SecurityKey00001”および“SecurityKey00002”を用いてpgxa_put_encryptdataシステム関数で暗号化したあと、テーブルtable1に挿入しています。
また、暗号化するデータ(以下の例では、“富士通太郎”および“0.234”)に対して、CAST関数を使用して外部テーブルの表定義で指定したデータ型への明示的な型変換を実施する必要があります。
例
postgres=# INSERT INTO table1 (username, number1, rate) VALUES ( postgres(=# pgxa_put_encryptdata( CAST('富士通太郎' as char(100) ), 'SecurityKey00001'), postgres(=# 100, postgres(=# pgxa_put_encryptdata( CAST( 0.234 as decimal(5,3)), 'SecurityKey00002'));
注意
同じカラムに対して、CAST関数で通知するデータ型および暗号キーには常に同じ値を指定してください。
CAST関数で通知するデータ型および暗号キーに異なる値を指定した場合、復号化できなくなります。
暗号化を行ったカラムのデータは、判読できない形式のデータです。判読が可能なもとの形式のデータに復号化するためには、暗号化キーを使用して復号化を行ったあと参照します。
復号化には、pgxa_get_decryptdataシステム関数を使用します。
復号化を行うには、暗号化を行う場合と同様に暗号化キーおよび暗号化されたカラムのデータ型が必要です。暗号化キーおよび暗号化されたカラムのデータ型には、暗号化を行ったときに使用した値と同じものを使用する必要があります。暗号化キーおよび暗号化されたカラムのデータ型が異なっていた場合、復号化を行えずにSQL文の実行は異常終了します。
参照
pgxa_get_decryptdataシステム関数の詳細は、“J.4.23 pgxa_get_decryptdata”を参照してください。
ポイント
BIツールなどから暗号化されたカラムを参照する場合には、事前に復号化されたカラムを参照するviewを作成してそのviewを参照することをお勧めします。
viewの作成方法については、“J.4.11 pgxa_create_view”も合わせて参照してください。
復号化して参照する場合
以下の例では、usernameカラムおよびrateカラムの復号化を行ったあとデータを参照しています。
データ型には、暗号化データを格納するために定義した外部テーブルのカラムのデータ型“char(100)”および“decimal(5,3)”を指定しています。
例)
postgres=# SELECT pgxa_get_decryptdata( username, 'SecurityKey00001', 'char(100)' ) as username, number1, pgxa_get_decryptdata( rate, 'SecurityKey00002', 'decimal(5,3)') as rate FROM table1; username | number1 | rate ---------------+-------------+-------------------------- 富士通太郎 | 100 | 富士通次郎 | 75 | 0.345 富士通三郎 | | 0.456 神戸 花子 | | 0.567 神戸 未来 | 80 | 0.678 (5 row)
復号化せずに参照する場合
暗号化を行ったデータは、Symfoware Analytics Serverで独自のデータ型として保存されてデータ長も変わっているため、復号化を行わずに参照した場合の動作は保証されていません。SQL文の実行は異常終了します。
しかし、以下の方法を使用すると、復号化を行わずに暗号化されたままのデータを参照できます。
暗号化したカラムのデータ型がchar型またはvarchar型であるカラムを使用する
参照した結果の最大データ長が外部テーブルで指定したデータ長内に収まるように、left関数などで明示的な変換を行う
以下の例では、char型であるusernameカラムを復号化せずにもとのデータ型の大きさにおさまるように参照しています。
usernameカラムは暗号化されているため、判読できない形式のデータとして表示されます。
例)
postgres=# SELECT left(username, 10) as username_crpt , number1, pgxa_get_decryptdata( rate, 'SecurityKey00002', 'decimal(5,3)') as rate FROM table1; username_crpt | number1 | rate ---------------+-------------+-------------------------- A8ED2AA42E | 100 | C4A0C74321 | 75 | 0.345 DC84337B66 | | 0.456 5093953F7C | | 0.567 FC5417B211 | 80 | 0.678 (5 row)
注意
暗号化を行ったデータを結果カラムに設定する場合は、必ず復号化を行ってください。暗号化を行ったデータは、暗号前のデータとはデータ型や長さが異なるため、SQL文の実行の異常終了や正しくない値を参照して誤動作する可能性があります。
暗号化キーを紛失しないでください。暗号化キーを紛失した場合、暗号化したデータにアクセスできなくなります。また、データを修復する方法もありません。
検索条件への暗号化カラムの設定について説明します。検索条件への暗号化カラムの設定は、以下の2つの方法で行えます。
暗号化カラムを検索条件およびソート条件とする場合には、そのカラムを復号化したうえで評価できます。
以下の例では、暗号化されたrateカラムを復号化したあと、大小比較を行ってrateカラムの降順でソートしています。
例)
postgres=# SELECT pgxa_get_decryptdata( username, 'SecurityKey00001', 'char(100)' ) AS username, postgres-# number1, postgres-# pgxa_get_decryptdata( rate, 'SecurityKey00002', 'decimal(5,3)' ) AS rate_clr postgres-# FROM table1 postgres-# ORDER BY rate_clr DESC; username | number1 | rate_clr -----------------+---------+---------- 神戸 未来 | 80 | 0.678 神戸 花子 | | 0.567 富士通三郎 | | 0.456 富士通次郎 | 75 | 0.345 富士通太郎 | 100 | (5 row)
以下の例では、暗号化されたrateカラムを復号化したあと、Null評価を行っています。
例)
postgres=# SELECT pgxa_get_decryptdata( username, 'SecurityKey00001', 'char(100)' ) as username, number1, pgxa_get_decryptdata( rate, 'SecurityKey00002', 'decimal(5,3)') as rate_clr FROM table1 WHERE pgxa_get_decryptdata( rate, 'SecurityKey00002', 'decimal(5,3)') IS NULL; username | number1 | rate_clr --------------+--------------+-------------------------- 富士通太郎 | 100 | (1 row)
暗号化カラムのNull評価を行う場合には、そのカラムの復号化を行うことなく評価できます。
以下の例では、暗号化されたrateカラムの復号化を行わずに、Null評価を行っています。
例)
postgres=# SELECT pgxa_get_decryptdata( username, 'SecurityKey00001', 'char(100)' ) as username, number1, pgxa_get_decryptdata( rate, 'SecurityKey00002', 'decimal(5,3)') as rate_clr FROM table1 WHERE rate IS NOT NULL; username | number1 | rate_clr ---------------+-------------+-------------------------- 富士通次郎 | 75 | 0.345 富士通三郎 | | 0.456 神戸 花子 | | 0.567 神戸 未来 | 80 | 0.678 (4 row)
注意
1つの暗号化カラムに対して、同じ暗号化キーで復号化を行ってください。
暗号化データは暗号化を行ったあとのデータのみで管理されているため、暗号化を行ったカラムを検索条件およびソート条件にした場合は、復号化を行いながら評価します。そのため、暗号化を行っていないカラムを検索条件およびソート条件にした場合と比較して、処理時間が数倍から数十倍程度遅くなる場合があります。
暗号化キーを紛失しないでください。暗号化キーを紛失した場合、暗号化したデータにアクセスできなくなります。また、データを修復する方法もありません。