Windows上のApache2.2で ODBCデータソースを使った Basic認証を行う
最初に断っておくけど、よっぽどの物好きにしかお勧めできないよ、こんなの。
Apache 2.2には RDBへのアクセスを提供するインターフェイス mod_dbdと、それを Basic認証のバックエンドとして使う mod_authn_dbdがあって、ドライバさえあれば好きなリレーショナルデータベースをパスワードデータベースとして使える。
ここで PostgreSQLや MySQLのやりかたを紹介するのは、ありふれた普通の技術ブログ。
Oracleのやりかたを紹介するのはちょっと変わった技術ブログ。
うちは、Microsoft Accessの MDBファイル(いわゆるJetな)や Microsoft SQL Serverを使うやりかたを紹介する変態技術ブログ。ということにしてみた。
さて、Apacheには残念ながら個別のRDBMS用ドライバが含まれていないのだが、Google codeから ODBC用のmod_dbdドライバが入手出来るのでそれを使ってみる。これなら AccessやSQL Serverといわず Paradoxだろうが dBASEだろうが FoxProだろうが Basic認証のパスワードデータベースとして使えるわけだ。Cool! そんな奴いないとおもうけど。
なお、これからしばらくVisualStudioが入ってる Windows環境を前提に話を進める。
既に Apache 2.2.6がmsi形式のインストーラでインストール済みなのも前提。
インストーラ形式で配布されている Windows版 Apacheに付属している libaprutilは DSOサポートがオフになっているのでこのままだとデータベースドライバがロードできない。なのでApacheのbinフォルダにある libaprutil-1.dllを DSO有効バージョンに置き換えてやる必要がある。以下、駆け足で手順を示す。
httpd-2.2.6 の Windows用ソースをダウンロードして展開
srclib\apr-util\include\apu.hw の最後にある #endifの前あたりに
#define APR_DSO_BUILD 1
を追加
srclib\apr-utilに移動し、
nmake -f libaprutil.mak CFG="libaprutil - Win32 Release"
で、リリースビルドの libaprutil-1.dllを作成 (Releaseフォルダに出来る)
問題の libaprutil-1.dllをリプレースすれば DSO対応化は完了。
次に mod_dbdを ODBC対応にさせるためのドライバ apr_dbd_odbc.dllをビルドする。
http://code.google.com/p/odbc-dbd/からソースをダウンロードして展開後、下記のコマンドでビルドする(APR= には Apacheのインストールフォルダを指定すること)。
nmake -f Makefile.win APR="c:\Program Files\Apache Software Foundation\Apache2.2"
これで Release\apr_dbd_odbc.dllが出来るので、Apacheの binフォルダへコピーする。
httpd.confに下記のモジュール読み込み設定を追加(デフォルトではコメントですら入っていないので書き足す)
LoadModule dbd_module modules/mod_dbd.so
LoadModule authn_dbd_module modules/mod_authn_dbd.so
さらに、mod_dbdのディレクティブ DBDriverと DBDParamsを設定する。下記は localhostで動作している Microsoft SQL Server上のデータベース mydb にユーザー名 sa, パスワード secretで接続する設定の例。
DBDriver odbc
DBDParams "CONNECT='Driver={SQL Server};Server=localhost;Uid=sa;Pwd=secret;Database=mydb''"
Accessの .mdbファイルを使うなら CONNECT='DRIVER={Microsoft Access Driver (*.mdb)};DBQ=C:/path/to/users.mdb;' のようになる。
CONNECT=の代わりにDATASOURCE=,USER=,PASSWORD=で設定済みのODBCデータソースを使う事も出来る。
あとは普通の Basic認証と同様の設定を行うが、AuthBasicProviderディレクティブで dbdを指定し、AuthDBDUserPWQueryでパスワード列を引いてくる SQLをセットすることでパスワードデータベースとして mod_dbdが用いられるようになる。
こんな面倒くさいことしないで IISを使えばいいんじゃ・・・って言うの禁止。
■おまけ■
最近知った機能なんだけど、Satisfy っていうディレクティブを使うと 「特定ホストからのアクセスはパスワード不要・それ以外は要パスワード」というアクセス制御が出来るらしい。今までずっとApacheの機能では出来ないと思ってた・・・。
先の例にくっつけるなら Require valid-userの後に
Satisfy any
order deny,allow
allow from 127.0.0.1 169.254. 192.168.
deny from all
みたいなふうにすると localhostやプライベートネットワークからのアクセスは認証をパス出来る。
社内LANからはパスワード無しでアクセスできるが外出先からのアクセスは要パスワード、のような運用に使えるだろう。
Apache 2.2には RDBへのアクセスを提供するインターフェイス mod_dbdと、それを Basic認証のバックエンドとして使う mod_authn_dbdがあって、ドライバさえあれば好きなリレーショナルデータベースをパスワードデータベースとして使える。
ここで PostgreSQLや MySQLのやりかたを紹介するのは、ありふれた普通の技術ブログ。
Oracleのやりかたを紹介するのはちょっと変わった技術ブログ。
うちは、Microsoft Accessの MDBファイル(いわゆるJetな)や Microsoft SQL Serverを使うやりかたを紹介する変態技術ブログ。ということにしてみた。
さて、Apacheには残念ながら個別のRDBMS用ドライバが含まれていないのだが、Google codeから ODBC用のmod_dbdドライバが入手出来るのでそれを使ってみる。これなら AccessやSQL Serverといわず Paradoxだろうが dBASEだろうが FoxProだろうが Basic認証のパスワードデータベースとして使えるわけだ。Cool! そんな奴いないとおもうけど。
なお、これからしばらくVisualStudioが入ってる Windows環境を前提に話を進める。
既に Apache 2.2.6がmsi形式のインストーラでインストール済みなのも前提。
インストーラ形式で配布されている Windows版 Apacheに付属している libaprutilは DSOサポートがオフになっているのでこのままだとデータベースドライバがロードできない。なのでApacheのbinフォルダにある libaprutil-1.dllを DSO有効バージョンに置き換えてやる必要がある。以下、駆け足で手順を示す。
httpd-2.2.6 の Windows用ソースをダウンロードして展開
srclib\apr-util\include\apu.hw の最後にある #endifの前あたりに
#define APR_DSO_BUILD 1
を追加
srclib\apr-utilに移動し、
nmake -f libaprutil.mak CFG="libaprutil - Win32 Release"
で、リリースビルドの libaprutil-1.dllを作成 (Releaseフォルダに出来る)
問題の libaprutil-1.dllをリプレースすれば DSO対応化は完了。
次に mod_dbdを ODBC対応にさせるためのドライバ apr_dbd_odbc.dllをビルドする。
http://code.google.com/p/odbc-dbd/からソースをダウンロードして展開後、下記のコマンドでビルドする(APR= には Apacheのインストールフォルダを指定すること)。
nmake -f Makefile.win APR="c:\Program Files\Apache Software Foundation\Apache2.2"
これで Release\apr_dbd_odbc.dllが出来るので、Apacheの binフォルダへコピーする。
httpd.confに下記のモジュール読み込み設定を追加(デフォルトではコメントですら入っていないので書き足す)
LoadModule dbd_module modules/mod_dbd.so
LoadModule authn_dbd_module modules/mod_authn_dbd.so
さらに、mod_dbdのディレクティブ DBDriverと DBDParamsを設定する。下記は localhostで動作している Microsoft SQL Server上のデータベース mydb にユーザー名 sa, パスワード secretで接続する設定の例。
DBDriver odbc
DBDParams "CONNECT='Driver={SQL Server};Server=localhost;Uid=sa;Pwd=secret;Database=mydb''"
Accessの .mdbファイルを使うなら CONNECT='DRIVER={Microsoft Access Driver (*.mdb)};DBQ=C:/path/to/users.mdb;' のようになる。
CONNECT=の代わりにDATASOURCE=,USER=,PASSWORD=で設定済みのODBCデータソースを使う事も出来る。
あとは普通の Basic認証と同様の設定を行うが、AuthBasicProviderディレクティブで dbdを指定し、AuthDBDUserPWQueryでパスワード列を引いてくる SQLをセットすることでパスワードデータベースとして mod_dbdが用いられるようになる。
<Location /myprivatearea>これで Windows上の Apache2.2で ODBCデータベースを使ったユーザー認証が出来るようになった。
AuthType basic
AuthName "private area"
AuthBasicProvider dbd
AuthDBDUserPWQuery "SELECT Password from Users WHERE User_ID = ?"
Require valid-user
</Location>
こんな面倒くさいことしないで IISを使えばいいんじゃ・・・って言うの禁止。
■おまけ■
最近知った機能なんだけど、Satisfy っていうディレクティブを使うと 「特定ホストからのアクセスはパスワード不要・それ以外は要パスワード」というアクセス制御が出来るらしい。今までずっとApacheの機能では出来ないと思ってた・・・。
先の例にくっつけるなら Require valid-userの後に
Satisfy any
order deny,allow
allow from 127.0.0.1 169.254. 192.168.
deny from all
みたいなふうにすると localhostやプライベートネットワークからのアクセスは認証をパス出来る。
社内LANからはパスワード無しでアクセスできるが外出先からのアクセスは要パスワード、のような運用に使えるだろう。

0 件のコメント:
コメントを投稿
<< ホーム