Firebird RDBMS データベース認証用 Apache DSO


2005/07/20更新 (Version 1.1 公開)

1. 概要

 本プログラム(mod_auth_fb.so)は、Apache Web サーバ上で実現される BASIC 認証等で、アカウントの認証処理をオープンソース RDBMS の Firebird を用いて 行うための Apache モジュール (DSO) です。
 本モジュールを Apache に組み込むことにより、ユーザ名とパスワードの 照合による認証を行うためのデータベースとして、Firebird を簡単に利用する ことが出来ます。 Borland 社の InterBase も同様にして使用できると思われますが、確認は出来て いません。
 対応するApacheのバージョンは、1.3 及び 2.0 となっています。

 ユーザ名とパスワードの照合方法は、以下の2つがあります。

(1) テーブルとカラム(列)名の指定による認証
  ユーザ名とパスワードをテーブルのデータと照合します。
(2) ストアドプロシージャによる認証
  ユーザ名とパスワードをストアドプロシージャに引渡し、そこで認証の判定 を行います。


 テーブル認証では Apache の htpasswd 互換の方式でパスワードの暗号化は 行えますが、Firebird のみで取り扱いやすい形式のパスワード暗号化をサポート する UDF も公開しました。
 詳しくは、 auth_support_udf.dll Firebird RDBMS データベース認証サポート用 UDF を参照してください。

2. 著作権などに関する注意事項

 このプログラムは、The Apache Software Foundation が著作権を保有する、 mod_auth_dbm.c を主なる参考として作成しました。また、データベース(Firebird RDBMS) アクセスのために、Firebird API とライブラリを使用しています。
 そのため、関連するソフトウェアのライセンスを知らずに不用意に商用販売などの 行為を行うと、著作権等の侵害に当たる場合もありますので注意して下さい。
 本プログラムで独自に作成した部分に関しては、著作権表示者が著作権を保持して おりますが、基本的な使用に関しては自由とします。ただし、販売や有料配布等の 商利用の場合は、部分的な再利用も含めて、可能な限り著作権者への連絡をお願い します。連絡先はアーカイブ付属のドキュメントを参照して下さい。
 本プログラムの使用によって生じたいかなる事故・損害などに対しても保証などの 行為は一切致しません(未保証)。
 不具合などの修正や使用に関するサポートの義務も権利者は一切負いません。
 再配布を行う場合、著作権表示と共に著作権や未保証などに関する文書の同時配布 が必要となります。

3. 使用方法

3.1 前準備

 前準備として、Apache の実行開始時に Firebird API 用クライアントライブラリを 探せるように、ライブラリのインストールと実行パスの設定を行います。 Windows の場合は、fbclient.dllをシステムディレクトリにインストール、もしくは DLLをインストールしたディレクトリへの実行パスを設定します。
 Firebird クライアントライブラリ自体のインストールは、データベースソフトの インストール、もしくはデータベースソフト付属のクライアントインストーラ(Windows の場合は "instclient.exe")により行います。  Firebirdデータベースのインストールやクライアントライブラリのインストール・ 設定に関しては、 Firebird Wiki などを参考にして下さい。

※※※ Windows バイナリ配布版での注意 ※※※
 モジュールの実行には、MS 配布のランタイムライブラリである "msvcr71.dll" が必要です。 (注意! コンパイラの変更によりランタイムのバージョンが変わりました)
 あらかじめ、別途入手してインストール、もしくはアーカイブに同梱してある msvcr71.dll を Windows システムディレクトリ (C:\WINDOWS\System32 等) または実行パスが通ったところにコピーしておいて下さい。ランタイムも含め、 Apache起動時のモジュールロード段階で必要な DLL を見つけられない場合は、 モジュールが見つからない等のエラーが発生します。

※※※ Apache をサービスで起動している場合の注意 ※※※
 Windows で Apache をサービスとして起動している場合、Apache サービスの 「ログオン」の設定で、「デスクトップとの対話をサービスに許可」を有効に していない場合、Firebird との通信の段階で失敗してしまう場合があります。
 Apache インストール時のデフォルトの状態では、これが有効になっていない 場合がありますので特に注意してください。

※※※ Linux での注意 ※※※
 Makefileを環境に合わせて修正し、手動でコンパイルして .so ファイルを作成 してください。リンクしている Firebird API 用のライブラリは、Firebird 1.5.2 用 のものとなっています。 使用している Firebird のバージョンが古い場合は、make ファイルを手動で変更 してください。configure などを用意していないので、ちょっと敷居が高い人もいる かもしれませんが.....。
 ちなみにコンパイルしている環境は、少し古臭いですが Redhat Linux Professional Workstation となっています。

3.2 モジュールのコピーと httpd.conf の編集

 Apache をインストールしたディレクトリ下にある modules ディレクトリに、 使用する Apache のバージョンに適合した mod_auth_fb.so をコピーします。 1.3 用のモジュールと 2.0 用のモジュールは異なっていますので、注意して下さい。
 Winodws 用の場合、リソースにバージョンなどの情報と共にコメントとして記録 してありますので、エクスプローラーからプロパティを参照することにより、 確認することが出来ます。
 コピーが出来たら、httpd.conf に以下のような設定を行います。

(1) モジュールのロードに関する設定
 ここでは、Apacheの動的にモジュールを呼び込む場合の標準的な設定においての 内容が記述してあります。モジュールを静的に組み込む場合は、若干異なってくる こともありますので注意して下さい。

(a) Apache 1.3.x でのモジュールロードの設定
AddModule mod_auth.c
 が有効になっている(コメントアウトが外されている)ことを確認します。 コメントアウト(先頭が#)になってない場合はコメントを外し、設定自体が ない場合は追加します。その後に、
LoadModule fb_auth_module modules/mod_auth_fb.so
 の追加と、
AddModule mod_auth_fb.c
 の2つを追加をします。標準の httpd.conf の場合、LoadModule や AddModule の 設定は概ね一箇所にまとめられていますので、その周辺の最後に追加して置けばよい でしょう。

(b) Apache 2.0.x
LoadModule auth_module modules/mod_auth.so
 が有効になっていることを確認します。コメントアウト(先頭が#)されている場合は コメントを外し、設定自体がない場合は追加します。その後に、
LoadModule fb_auth_module modules/mod_auth_fb.so
 を追加をします。標準の httpd.conf の場合、LoadModule の設定は概ね一箇所に まとめられていますので、その周辺の最後に追加して置けばよいでしょう。



(2) 認証に関する設定

 認証の方法は2つあります。1つはテーブル名と、名前およびパスワードのカラム (列)名を指定する方法で、もう1つはストアドプロシージャにより認証を行う方法 です。両者とも一長一短が有りますので、必要に応じて使い分けてください。

 テーブルによる認証は手軽に利用できますが、単純な完全一致による認証しか行え ません。そのため、名前(ID)での英大文字・小文字も別のものとして扱われます。 また、httpd.conf に記述したアカウント情報を取得できれば、テーブルの内容を容易 に参照出来ますので、セキュリティや個人情報保護に関する弱点になる場合もあります。

 ストアドプロシージャによる認証は、ストアドプロシージャを準備する手間が必要 です。しかし、より複雑な認証ロジックの実装が可能な上に、アクセス権限を適切に 設定すれば、より高度なセキュリティを期待できます。認証ロジックの変更も、 webサーバなどを停止せずに行えます。


(a) 設定ディレクティブの解説

ディレクティブ指定内容解説
AuthFirebirdDatabaseName データベース名の指定
(例"C:\TESTDB.FDB")
必須指定項目です。 接続するデータベース名を指定します。ネットワークアドレス を含んだパス名やエイリアス指定など、Firebird で一般的に使用できる指定方法が 使用できます。パスの指定方法は、データベースが設置されたサーバに依存します。
AuthFirebirdUser データベース接続用のユーザ名指定
(例"SYSDBA")
必須指定項目です。 データベースに接続するユーザを指定します。テーブルやストアドプロシージャの アクセス権限にも関係しますので、セキュリティも含めて適切な接続ユーザを 指定してください。
AuthFirebirdPassword データベース接続用のパスワード指定
(例"masterkey")
必須指定項目です。 データベースに接続するユーザのパスワードを設定します。
AuthFirebirdCharacterSet データベース接続キャラクタセットの指定
(例"SJIS_0208")
オプションです。 データベースに接続する時のキャラクタセットを指定します。指定を行わないと、 "ASCII"が使用されます。"NONE"を使用したい場合は、明示的な指定が必要です。
AuthFirebirdPconnect データベースの持続的接続指定
(例 Off)
オプションです。 データベースの接続に関して、持続的接続使用の有無を指定します。省略すると、On を指定した場合と同等です。
これを Onとすることにより、処理速度の向上が期待 できますが、Apache 起動中はデータベースから切断されないので、Apache子プロセス が大幅に増加した場合、データベースの接続セッション数が増大し、各種トラブルの 発生源となる場合もあります。
AuthFirebirdUserTable
AuthFirebirdNameField
AuthFirebirdPasswordField
テーブルによる認証の指定 テーブル認証を行うときは必須指定項目です。 認証情報が格納された、AuthFirebirdUserTable によりテーブル名、 AuthFirebirdNameField によりユーザ名のカラム、AuthFirebirdPasswordField によりパスワードのカラムを指定します。
各カラムには、平文で情報を格納する必要があります。
AuthFirebirdStoredProc ストアドプロシージャによる認証の指定 ストアドプロシージャ認証を行うときは必須指定項目です。この指定を 行うと、テーブル認証に関する指定は無視されます。
ストアドプロシージャ名を指定します、ストアドプロシージャには、ブラウザなどで 入力されたユーザ名とパスワードがVARCHARで渡されますので、認証 OK なら 1 を、 認証 NG なら 0 を INTEGER で返す必要があります。SELECT 文により実行されるので、 終了は SUSPEND となっている必要があります。
AuthFirebirdPlaintext 平文パスワード処理強制の指定 テーブル認証専用の指定項目です。ストアドプロシージャ認証を行うとき は、この指定は無視されます。
パスワードの照合を、Apache 内蔵の関数で行わず、強制的に平文であるものとして照合 を行います。この指定が Off の場合、Windowsでは MD5/SHA1 で格納されていない場合 は平文として処理されますが、UNIX 系の場合は crypt() の処理に依存します。 Linux等でセキュリティよりもシンプルさを優先したいときにこのオプションを On にして 下さい。
省略時のデフォルトは Off となっています。


(b) テーブル認証の場合の設定例

 httpd.confの設定によるテーブル認証の場合の例です。httpd.conf 内に記述します。


<Directory "E:/Apache Group/Apache/htdocs/test">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
    AuthType Basic
    AuthName "Auth Firebird test"
    require valid-user
    AuthFirebirdDatabaseName    "127.0.0.1:c:/Firebird/testauth.fdb"
    AuthFirebirdUser            "SYSDBA"
    AuthFirebirdPassword        "masterkey"
    AuthFirebirdCharacterSet    "EUCJ_0208"
    AuthFirebirdUserTable       "APAUTH"
    AuthFirebirdNameField       "USERID"
    AuthFirebirdPasswordField   "USERPW"
    #AuthFirebirdPconnect       Off
    AuthFirebirdPlaintext       Off
</Directory>


 設定内容は次のとおりです。

使用データベース ネットワークアドレスからのフルパス名指定で、キャラクタセットは "EUCJ_0208" (日本向けEUC)
接続アカウント インストールデフォルトのデータベース管理アカウント(SYSDBA)。
実運用時はパスワードの変更が強く推奨されています。
認証の指定 テーブルAPAUTHを使用します。ユーザ名はUSEDID、パスワードはUSERPWという名前 のカラムを使用します。
その他 持続的接続指定をコメントアウトしている(積極的にoffにしてない)ので、データベース との接続はパフォーマンス重視の持続的接続方式により行われます。 パスワードの照合処理は、Apache 標準のパスワード照合処理に準拠します。Linux環境 などでは平文のパスワードは使用できません。


(c) ストアドプロシージャ認証の場合の設定例

 httpd.confの設定によるストアドプロシージャ認証の場合の例です。httpd.conf 内に記述します。


<Directory "E:/Apache Group/Apache/htdocs/test">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
    AuthType Basic
    AuthName "Auth Firebird test"
    require valid-user
    AuthFirebirdDatabaseName    "AUTHDB"
    AuthFirebirdUser            "SYSDBA"
    AuthFirebirdPassword        "masterkey"
    AuthFirebirdCharacterSet    "ASCII"
    AuthFirebirdStoredProc      "AUTHCHECKPROC"
</Directory>


 設定内容は次のとおりです。

使用データベース エイリアス指定(AUTHDB)によりデータベースを指定しています。
エイリアス指定に関しては、前述の Firebird Wiki または Firebird の aliases.conf ファイルを参照して下さい。
接続アカウント インストールデフォルトのデータベース管理アカウント(SYSDBA)。
実運用時はパスワードの変更が強く推奨されています。
認証の指定 ストアドプロシージャ AUTHCHECKPROC を使用します。
その他 持続的接続指定を省略している(積極的にoffにしてない)ので、データベースとの 接続は、パフォーマンス重視の持続的接続方式により行われます。




3.3 データベース側の準備

 以下の作業を行う前に Firebird RDBMS を起動し、CREATE DATABASE 等により データベースの準備をしておいてください。

(1) テーブル認証の場合

 テーブル認証の場合、基本的には最低限ユーザ名とパスワードを格納する ための2つのカラム(列)を持ったテーブルを作成し、そこに認証するユーザ名と パスワードを含んだライン(行)を格納するということが基本作業となります。
 また、Apache(含む本モジュール) から接続するときのアカウントは、最低でも そのテーブルに対する参照権限を持っていなければなりません。 テーブルの作成者(所有者)はその権限を持っていますが、セキュリティなどの 理由により作成者とは別のアカウントで接続する場合は注意が必要です。

 例として、管理者権限(SYSDBA)で下記のような SQL を実行してテーブルを作成 します。最後の COMMIT は、SQL文の実行に使用したプログラムによっては不要です。
 ユーザ名(USERIDカラム)は、通常は一意である必要があるので、プライマリー キーとしておきます。これにより、インデックスが自動で作成されますので、 検索速度の向上も同時に期待できます。ちなみに下記の例では、カラムの格納サイズ は、かなり余裕を持ったものとしてあります。

CREATE TABLE APAUTH
(
    USERID  VARCHAR(80) NOT NULL PRIMARY KEY,
    USERPW  VARCHAR(40) NOT NULL
);
COMMIT;


 次に、作成したテーブルにユーザ認証データを追加します。例えば次のような SQL となります。最後の COMMIT を実行しないと、テーブルに対する変更が SQL 発行を行ったプログラム以外からは見ることが出来ません。また、Windows系 以外の環境では、AuthFirebirdPlaintextディレクティブで指定を行わないと平文の パスワードは使用できません。ディレクティブを使用して強制的に平文とするか、 この次に例を示す htpasswd で生成したハッシュ値を設定するようにして下さい。
 テーブル認証では、英大文字と小文字は別の文字と認識されますので、データを 設定する場合には注意して下さい。

INSERT INTO TABLE(USERID, USERPW) VALUES('TESTUSER', 'testpasswd');
COMMIT;


 Apacheのパスワード照合関数を使用しているため、MD5/SHA1で暗号化したパスワード も使用可能です。この場合、パスワードに設定するハッシュ値は、Apache 付属の htpasswd (または htpasswd.exe) により生成したものを使用してください。MD5 を使用 するか SHA1 を使用するかは、htpasswd に与えるオプションで選択します。 照合時には、テキストのヘッダを参照して自動的に適切な処理が行われます。
 SQL としては、例えば次のようなものになります。

INSERT INTO TABLE(USERID, USERPW) VALUES('TESTUSER', '$apr1$hK2.....$UqIBHN91GKUgxjhuLDEBF/');
COMMIT;



(2) ストアドプロシージャ認証の場合

 ストアドプロシージャ認証の場合、最低でも認証を行うストアドプロシージャを 用意する必要があります。また、認証のための情報を保持するテーブルを容易する場合 がほとんどだと思われますので、テーブル認証と同様な内容のテーブルが必要となる ことが多いでしょう。
 Apache(含む本モジュール) から接続するときのアカウントは、認証用ストアド プロシージャを実行する権限を持ってさえいれば(モジュールとしては)十分です。 GRANT により、そのストアドプロシージャ自体にそのテーブルをアクセスする権限を 与えておけば、認証情報テーブルをアクセスする権限は持たなくても問題ありません。
 そのため、暗号化などの対策を取らなくてもセキュリティを高めることが出来ます。

 テーブル認証向けに作成したテーブルと同構造のテーブルを認証情報として使用 し認証処理を行うストアドプロシージャは、次のようなものになります。
 このプロシージャでは、渡されたユーザ名を大文字に変換した後にテーブルから検索 しているため、テーブル内に格納するユーザ名をすべて大文字で格納としておけば、 英大文字と小文字を同一文字として認証処理を行うことが出来ます。 (パスワード比較においては明確に区別されます)

/*
    ユーザ・パスワード認証ストアドプロシージャ    
*/
SET TERM !! ;

CREATE PROCEDURE AUTHCHECKPROC (id VARCHAR(80), pw VARCHAR(80))
  RETURNS (result INTEGER)
  AS
  DECLARE VARIABLE upid VARCHAR(80);
  BEGIN
    upid = UPPER(:id);  /* 大文字小文字区別なしとする */
    result = 0;
    SELECT 1
      FROM APAUTH
      WHERE USERID=:upid AND USERPW=:pw
      INTO :result;
    SUSPEND; /* SELECT で呼び出すので必須 */
  END !!

SET TERM ; !!
COMMIT;



3.4. 再起動

 モジュールの組込み、httpd.conf 変更、データベースの準備が終了したら、Apache を起動または再起動して下さい。また、データベース内容変更後は、忘れずにコミット して終了させてください。


4. その他

 一応、専用の 掲示板らしきもの を作ってみました。
 メールは、caty@bd.wakwak.com の方にお願いします。 海外ドメインやフリーメール、英文のメールはスパムと認識されてしまう可能性が 十分にあります。いずれにせよ、返答などを保証するものではありません。

 注意点として、現在のバージョンでは Firebird API が完全にスレッドセーフか どうか不明だったのと、持続的接続処理の関係で、2.0用のモジュールではスレッド 間での排他処理が最適化されていません。
 そのため、スレッドによる接続処理が多いケースで、データベース側において 処理時間がかかる場合、パフォーマンスがあまり出ない可能性があります。
 ただし、これは複数プロセスにより接続を処理する場合には当てはまりません。 排他処理にはプロセス内のスレッド間でのみ有効なものを使用しているためです。

 Apache 1.3 + Version 1.0 において、Winodows では認証処理がぶつかると 固まることがあることが判明しました。Windows 環境の Apache 1.3.x は、マルチ スレッド処理で実装されていることが原因です。あまり綺麗なやり方ではないの ですが、Version 1.1 の Apache 1.3 用ではクリティカルセクションによる排他処理 を追加しました。(Apache 2.0 用はすでにApache汎用関数にて実装済み)
 また、Version 1.1 では、持続的接続処理使用時でも定期的に接続を切断 して再接続するようにしました。これにより、安定度は格段に向上しています。

 Linux 版に関しては、configure などのコンパイルを簡単に行うための環境は 今現在(Version 1.1)準備しておりません。付属の Makefile は、Apache 1.3 の Makefile から拝借してきて手を加えたものです。コンパイルする場合、ご自分 の環境に合わせて手動でファイルを変更する必要があります。
(Apache や Firebird のインストールディレクトリ設定を変更するのみで良い場合 も多いでしょうが)

5. 変更履歴

日付バージョンコメント
2005/07/191.1 ・ Firebird のコンパイル、動作確認バージョンを 1.5.2 に変更
・ Linux 版を追加
・ Windows + Apache 1.3 での安定度向上に対する対策を追加
・ 安定度向上のために持続的接続の処理を変更
2005/02/241.0公開開始バージョン (Windowsバイナリのみ)

Copyright. (C) 2005 Yoshiaki Tanaka


Download

 3/3現在、Linux でコンパイル・動作確認をしていないため、Windows 版バイナリ のみを公開しています。
 ドキュメントに書き忘れがあったので入れ替えました。モジュール本体は変更あり ません。

・ Windows 用バイナリファイル (Apache 1.3, 2.0 用+ランタイム) 2005/07/19 mod_auth_fb_win_110.lzh
・ Linuxs 用ソースファイル (Apache 1.3, 2.0 用同梱) 2005/07/19 mod_auth_fb_1.1.tar.gz



リンク
Firebird Wiki 有志の作成によるクイックスタートや日本語SQLリファレンス、管理コマンド のマニュアルなど実用に有用な情報多数。
Apache Software Foundation Apache Software Foundation のページ(基本的に英文)
Japan Apache Users Group 日本のアパッチユーザーグループ
Firebird Firebird 本家(基本的に英文)
IBPhoenix IBPhoenix社。 Firebird の開発参加と有料のサポート業務などを提供 (基本的に英文)
Firebird日本ユーザー会 日本の公式ユーザー会