一般的な SQL データベース (SQL Server、MySQL、Oracle など) の前に配置され、SQL クエリをリッスンするアプリケーションを作成するにはどうすればよいでしょうか?
アプリケーションは、特定のクエリの種類に基づいて、クエリをインターセプト (SQL データベースに渡すのを防ぐ) または渡す (SQL データベースに送信する) ことができる必要があります。
特定のデータベース バックエンドに結び付けられないように、これを一般的に行う方法はありますか?
基本的なシステムは特に簡単ではありませんが、非常に難しいわけでもありません。ポート (または一連のポート) で接続試行をリッスンするデーモンを作成します。これらの接続を受け入れてから、DBMS への独自の接続を確立し、中間者リレー/傍受ポイントを形成します。主な問題は、次のように構成する方法にあります。
ただし、まだ問題が発生する可能性があります。特に、GSL が DBMS リスナーと同じマシン上にある場合、GSL が DBMS に接続すると、リモート接続ではなくローカル接続のように DBMS に見えます。GSL が別のマシン上にある場合、すべての接続は GSL が実行されているマシンから来ているように見えます。
さらに、情報が暗号化されて送信されている場合、GSL は暗号化された通信のみを傍受できます。暗号化に問題がなければ、ログに記録できません。Diffie-Hellman 交換を処理できるかもしれませんが、何をしようとしているのか、インターセプトしている DBMS が何をしているのかを知る必要があります。彼らはあなたの仲介者システムを通過します。もちろん、「クライアント」が管理下にある Web サーバーであれば、これらすべてに対処できます。
接続の詳細は、コードが単にクエリを送信してログに記録するだけである限り、単純明快です。各 DBMS には、SQL 要求の処理方法に関する独自のプロトコルがあり、操作をインターセプトして変更または拒否するには、各 DBMS のプロトコルを理解する必要があります。
この種のことを行う商用製品があります。私は IBM で働いており、IBM の Guardium 製品には多くの DBMS に対するこれらの機能が含まれていることを知っています (上記のすべての DBMS を含むと思います。問題がある場合、サポートが最も少ないのは MySQL である可能性があります)。暗号化された通信の処理は、Guardium のようなシステムであっても依然として難しいものです。
特定の DBMS に適合した Unix で動作するデーモンを入手しました。この大部分を処理しますが、暗号化された通信を妨害しようとはしません。2 つのエンド パーティが互いに何を話しているかを記録するだけです。コードが必要な場合は、私に連絡してください — 私のプロフィールをご覧ください。多くの部分は、おそらく他の DBMS で再利用できます。他の部分は、設計された特定の DBMS に完全に固有のものです。