今週のSecurity Check(第183回)

 前回,データベース管理システムのアカウント管理の重要性について解説した(関連記事)。しかしセキュリティを確保するためには,それだけでは十分とは言えない。Webシステムのような階層構造になると,データベース・サーバーへのアクセス元はWebサーバー(あるいはアプリケーション・サーバー)になり,操作の内容を把握しなければ不正を見分けられないためである。
 そこで重要になるのが,不正な操作を見付ける「監査」である。ただそのためには,例えばテーブルへのアクセス履歴やSQL分の実行履歴といった監査ログの記録が欠かせない。そこで今回は,OracleとSQL Serverを例に,監査ログ記録のポイントを解説する。

Oracleの監査機能

 Oracleの場合,監査を実行するにはAudit Trail機能を使用する。ログイン,データベースに対する操作など,Oracleに関わるすべての行動を監査対象とすることができるため,重要度に応じて柔軟に選択可能だ。
 監査ログの記録には,SYS.AUD$テーブルに保存する方法とテキストファイルに出力する方法がある。SYS.AUD$テーブルに出力した場合は,SYSTEMテーブル領域の問題とOracle自体のパフォーマンス問題が発生する可能性があるため,特にトランザクション量が大きいシステムではテキストファイルへの出力が利用されるケースが多い。AUD$テーブルを使用する場合は,SYSTEMテーブル領域の問題を回避するため,以下のような手順を取る。この手順はSYSで行う。

  1. Audit情報を保存するテーブル領域を新規作成
  2. 新規テーブル領域に新しいAuditテーブルを作成
  3. AUD$テーブルの内容をコピー
  4. 元のAUD$テーブルを削除し,新しいAuditテーブルをAUD$として使用
  5. 新しいAUD$テーブルに対する権限を最小化
  6. SYS.AUD$テーブルを使用しているビュー,ストアド・プロシージャを再コンパイル
  7. INIT.ORAへのAUDIT_TRAIL = DB記述の追加
  8. インスタンスの再起動
  9. AUDITコマンドによる監査対象項目の設定(AUDIT all on SYS.AUD$ by accessコマンドにより,AUD$テーブルへのアクセス自体も必ず監査対象とすること)

SQL Serverの監査機能

 これに対してSQL Serverの監査ログは,Windowsのイベント・ログに出力される。しかしOracleとは異なり,基本的にはSQL Serverへのログイン成功と失敗しか記録できない。Webシステムではデータベースに接続するのはWebアプリケーション・サーバーであり,多くの場合にコネクション・プーリングを利用するため,ログイン履歴だけでは監査の意味がなくなってしまう。操作内容の記録は重要である。


図1 SQL Serverのプロパティ


図2 イベントのプロパティ

 当然,SQLインジェクションのような不正操作も発見できない。以下はIIS 6.0サイトがSQLインジェクション攻撃を受けた際の監査ログだが,SQLインジェクション攻撃の痕跡は何も残っていないことがわかる。

図3 IIS6.0の監査ログの例
#Software: Microsoft Internet Information Services 6.0
#Version: 1.0
#Date: 2005-01-24 21:00:37
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(Cookie) sc-status sc-substatus sc-win32-status sc-bytes cs-bytes
2005-01-24 21:01:11 192.168.35.52 POST /hacmebank/Login.aspx - 80 - 192.168.35.217 CookieLoginAttempts=5;+ASP.NET_SessionId=4nhskaykui2jor45oqjzpm55 302 0 0 539 753
2005-01-24 21:01:11 192.168.35.52 GET /hacmebank/welcome.aspx - 80 - 192.168.35.217 CookieLoginAttempts=4;+ASP.NET_SessionId=4nhskaykui2jor45oqjzpm55 200 0 0 6657 529

SQL Server上で不正な操作を監査する

 SQL Serverでも別の機能を使えば,前述したOracleと同様の詳細な監査を実施することができる。それがSQLトレース機能だ。SQLとレース機能は二つの手法で利用できる。GUIツールのSQLプロファイラを使用する方法と,システム・ストアド・プロシージャによりストアド・プロシージャに直接トレース機能を組み込む方法だ。本稿ではSQLプロファイラを使用したSQLインジェクションの発見について説明しよう。トレース結果は次の図のように表示される。


図4 SQLプロファイラでトレースした結果

SQLプロファイラでは,トレース開始時に,どの様な操作をトレースするのか,GUIで選択することができる。


図5 SQLプロファイラ:トレース対象の選択