企業システムやWebアプリケーションの根幹を支えるデータベース。
その安全性が脅かされると、顧客情報の流出やサービス停止など重大なリスクを引き起こします。
本記事では、データベースを守るためのアクセス制御、SQLインジェクション対策、そして暗号化技術について、現場で役立つ実践的な知識をわかりやすく解説します。
アクセス制御とロールベースのセキュリティ
アクセス制御とは、誰が、どのデータに、どのような操作ができるかを定義・制限する仕組みです。最も代表的な方法が ロールベースアクセス制御(RBAC:Role-Based Access Control) です。
RBACの基本概念
- ユーザー:システムにアクセスする個人やサービス
- ロール:職務や機能に基づいた権限の集合
- 権限:データへの操作(SELECT, INSERT, UPDATE, DELETE など)
例えば、経理部と開発部では扱うデータが異なるため、次のように制御します:
-- 経理部用ロール CREATE ROLE accounting; GRANT SELECT, UPDATE ON transactions TO accounting; -- 開発部用ロール CREATE ROLE developers; GRANT SELECT ON logs TO developers;
ユーザーが部署を移動した場合、ロールを付け替えるだけで権限変更が可能となり、メンテナンス性とセキュリティの両立が実現できます。
SQLインジェクションの防止策
SQLインジェクションは、ユーザー入力を通じて意図しないSQL文を実行させ、データの読み出しや改ざんを行う攻撃です。以下のようなコードは極めて危険です:
-- 危険な例(直接SQLに文字列結合)
sql = "SELECT * FROM users WHERE name = '" + userInput + "'";
主な防止策
- プリペアドステートメント(バインド変数)の使用
- 入力値の検証・エスケープ
- 最小限のDB権限付与(例:WebアプリにはSELECTのみ許可)
安全なSQL実行の例(Java JDBC):
PreparedStatement stmt = conn.prepareStatement( "SELECT * FROM users WHERE name = ?" ); stmt.setString(1, userInput); ResultSet rs = stmt.executeQuery();
このようにバインド変数を使えば、SQL文構造が固定されるため、悪意あるコードの注入を防ぐことができます。
暗号化とデータ保護
データベース内に保存される情報が外部に漏洩した場合、暗号化していなければ即座に情報が悪用されるリスクがあります。そこで、保存時の暗号化(静的データの暗号化)と、通信中の暗号化(動的データの暗号化)の2つの観点が重要です。
保存時の暗号化(At Rest)
代表的な手法として、以下が挙げられます:
- カラム単位の暗号化:パスワードやカード番号など機微情報に限定
- 全ディスク暗号化(TDE:Transparent Data Encryption)
例:MySQLのAES暗号を使った暗号化
-- 暗号化して保存
INSERT INTO users (name, email) VALUES ( '山田太郎', AES_ENCRYPT('taro@example.com', 'secret_key') );
-- 復号して取得 SELECT AES_DECRYPT(email, 'secret_key') FROM users;
※暗号鍵の管理には特に注意が必要であり、キーマネジメントシステム(KMS)を活用するのが望ましいです。
通信中の暗号化(In Transit)
クライアントとDBサーバ間の通信を盗聴されないよう、SSL/TLSで保護することが必須です。たとえば、PostgreSQLでは以下のように設定します:
# postgresql.conf の設定例
ssl = on ssl_cert_file = 'server.crt' ssl_key_file = 'server.key'
これにより、ユーザー認証やクエリ情報が暗号化され、外部からのスニッフィングを防止できます。
まとめ
データベースセキュリティは、単一の対策ではなく、多層的な防御(Defense in Depth)が鍵となります。
- ロールベースでアクセスを制限し、最小権限の原則を守る
- SQLインジェクションを防ぐために、プリペアドステートメントを活用
- 暗号化により、データ漏洩の被害を最小化する
これらの対策を組み合わせることで、外部からの攻撃だけでなく、内部不正からもデータを守る堅牢なシステムが構築できます。