GreenSQLは、MySQLデータベースのプロキシとして利用するように作られている。MySQLデータベースとWebサイトを直接つながずに、GreenSQLを間に置くわけだ。GreenSQLは、正当なSQLをMySQLデータベースに転送し、その結果を返す。ホワイトリストになく、かつ危険または疑わしい命令を含むSQLを検出した場合は、そのSQLをブロックし、MySQLデータベースとのやりとりを行わずに空の結果を返す。GreenSQLによるSQLインジェクション攻撃の阻止については、デモ用のページがWebに用意されている。
GreenSQLは、Fedora、openSUSE、Ubuntuのいずれのリポジトリにも入っていないが、Fedora 8とopenSUSE 10.3には、ワンクリックでインストール可能なパッケージがある。また、GreenSQLのダウンロードページには、Fedora 7、openSUSE 10.2、FreeBSD、Feisty Fawn以前のUbuntuに対応したパッケージが用意されている。ここでは、greensql-fwのバージョン0.8.4のインストールを64ビット版Fedora 9マシンで行う。
autotoolsはインストールに使われておらず、設定ファイル、システムユーザ、MySQL、ログファイル、「/etc/init.d」ファイルなどの設定は自力で行うことになるが、その手順は「install.txt」にしっかりと記されている。また、こうした設定の大半は、「scripts」ディレクトリにあるいくつかのシェルスクリプトの実行で済ませることができる。コンパイルは、トップディレクトリ内でmakeを実行するだけでよい(下記のコマンドを参照)。私のFedora 9では、コンパイルを開始してすぐに次のエラーが出たが、これはlibevent-develがインストールされていないためだった。
$ tar xzf /.../greensql-fw-0.8.4.tar.gz $ cd greensql-fw-0.8.4/ $ make ... connection.hpp:29: error: field 'proxy_event' has incomplete type connection.hpp:30: error: field 'client_event' has incomplete type
libevent-develをインストールしたあと、イベントコードをコンパイルするために、次のように「/usr/include/event.h」を編集して「sys/types.h」をインクルードする必要があることに気付いた。
vi /usr/include/event.h ... #include <sys/time.h> #include <sys/types.h> #include <stdint.h> #include <stdarg.h>
この段階でも、ヘッダファイル「string.h」をインクルードしていなかったため、strcasecmpのような文字列関数を呼び出すいくつかのファイルで「make -k」の実行に失敗した。利用するgccのバージョンによっては、こうした問題がGreenSQLのコンパイル時に起こらない場合もある。
| gccの問題 |
|---|
本文に書いたようなビルドの問題が生じるのは、「string.h」内の特定の関数を利用するコードのコンパイル時にgccのチェックがかなり厳しくなっているためだ。以前はこのヘッダファイルをインクルードしなくてもstrlenが使えたが、今はこれをインクルードしないとgccによるコンパイルができない。また、64ビット版のライブラリパスの変更は、そうした変更を自動的に処理するautotoolsのようなシステムによる検出方法が使われていないこと、Makefileが32ビット版のディストリビューション向けに作られていることに起因する。どちらもあまり注目されていないが、GreenSQLを64ビット版Fedora 9マシンにインストールしようとする場合には面倒な事態を引き起こす。 |
$ cd src $ vi mysql/mysql_con.cpp ... // License: GPL v2 (http://www.gnu.org/licenses/gpl.html) // #include <string.h> #include "mysql_con.hpp" ... $ vi config.hpp ... #ifndef GREEN_SQL_CONFIG_HPP #define GREEN_SQL_CONFIG_HPP #include <string.h> ... $ vi ../src/parser/expression.hpp ... #ifndef _SQL_EXPRESSION_HPP_ #define _SQL_EXPRESSION_HPP_ #include <string.h> ...
GreenSQLのビルドを64ビット版のディストリビューションで行う場合は、次のように、ビルド時に「lib」ディレクトリだけでなく「lib64」ディレクトリもチェックするようにMakefileの変更も行う必要がある。
$ vi src/Makefile ... LIBS:=-L/usr/local/lib -L/usr/local/lib/mysql -L/usr/lib64/mysql -lmysqlclient -levent -lpcre greensql-fw: $(OBJS) ... $ make
