“SI視点”に立って、システム担当者が考慮すべきセキュリティについて、身近な例を参考に解説する本連載。第2回のテーマは、前回に引き続き「データベースセキュリティ」です。特に、重要なデータを保護するために欠かせない「暗号化」について解説します。
システム開発・運用担当者の視点から考慮すべき「セキュリティ」について解説する本連載。第2回のテーマは、前回に引き続き「データベースセキュリティ」です。
前回は「ユーザー管理」「監査証跡(ログ)」について解説し、これらの対策を適切に実施することでデータベース上での不正な操作を行いにくい環境を作ることができると説明しました。しかし、それだけでは、データファイルやDBバックアップファイルを“丸ごと盗み出す”ような不正行為には対処できません。
そこで必要となるのが、今回のテーマである「データベースの暗号化」です。大切なデータを守る“最後の砦”である暗号化について見ていきましょう。
データベースを暗号化することで、情報の「盗難」と「盗聴」を防ぐことができるようになります。より具体的に言えば、以下の3つの脅威を防ぐことができます。
なお、盗難には、HDDやバックアップメディアを持ち去る「物理的な盗難」と、OSレベルでデータを抜き取り、外部メディアへコピーするといった「電子データの盗難」の2パターンがあります。
一般的に、データベースの暗号化を行うと、SQL処理のパフォーマンスに多少の影響を与えます。暗号化/復号の処理に多少のリソースを割くことになるからです。従って、パフォーマンスへの影響を最小限にするために、ただやみくもに暗号化するのではなく、個人情報など、本当に守るべき機密性の高いデータに絞って暗号化を行う必要があります。
さて、以下ではデータベースの3つの暗号化について、「Oracle Database」を例に説明します。もちろん、他のRDBMSをお使いの方も、自分のRDBMSが持っている暗号化機能と照らし合わせることで、参考にしていただけるはずです。
Oracle Databaseでは、バージョン8iのころから暗号化機能が用意されています。当初はデータをテーブルに挿入する度に暗号化し、参照の度に復号を行っていたため、オーバーヘッドが非常に大きく、また、暗号化/復号関数をSQL文に埋め込む必要があったため、導入ハードルの高い機能でした。しかし、11g以降では、「Oracle Advanced Security」と呼ばれる有償のオプション製品が提供されるようになり、以前よりも暗号化機能が扱いやすくなっています。
Oracle Advanced Securityが備えている特徴的な機能の1つに、「表領域暗号化」があります。これは、列単位で暗号化を行う「列暗号化方式」と違い、テーブル全体を暗号化する機能です。この機能では、パフォーマンス低下やデータの肥大化を防ぐ各種の仕組みが組み込まれていることに加えて、以前のように暗号化/複合する際に関数を呼び出す必要がないため、既存アプリケーションのソース改修が不要です。ただし、特定の表領域(SYSTEM、SYSAUX、UNDO、TEMP)に対しては利用できないことや、データのインポート/エクスポートに一部制約があるなど、使用に際してはいくつかの条件があります。
ここで参考までに、Oracle Databaseにおける「表領域暗号化」の設定例をご紹介しましょう。以下の3ステップで表領域の暗号化を設定できます。
1.sqlnet.oraファイルにWallet(マスターキー)を作成する場所を指定する
ENCRYPTION_WALLET_LOCATION= (SOURCE=(METHOD=FILE)(METHOD_DATA= (DIRECTORY=場所)))
2.Walletを生成(SYSユーザーで実行)
ALTER SYSTEM SET ENCRYPTION KEY IDENTIFIED BY "パスワード";
3.暗号化表領域を作成
CREATE TABLESPACE 表領域名 DATAFILE 'データファイル' SIZE ○○M ENCRYPTION USING '暗号アルゴリズム' DEFAULT STORAGE (ENCRYPT);
Oracle DatabaseではWalletというマスターキーを使用しますが、Walletファイルやパスワードを紛失した場合、暗号化されたデータを復旧できなくなります。Walletは紛失に備えてセキュアな場所へ保管し、定期的にバックアップを取得することが推奨されます。
さて、ここまではデータベース上の格納データの暗号化について説明しました。次は、「データベースバックアップ」や「ネットワーク」の暗号化について紹介しましょう。
Copyright © ITmedia, Inc. All Rights Reserved.