こっち閉じますとか言いつつ、ナニゲにアクセスがあるようなので宣伝。
昨年の9月から書いていたApacheモジュールをCで書きましょう、な書籍が発売されました。
WebエンジニアのためのApacheモジュールプログラミングガイド
定価: 2,780円+税
ISBN: 4-7741-1799-4
詳細は出版社のサイトに譲るとして、サンプルコードの配付やサポート情報は私のサイトに纏めていきます。
全てのサンプルコードは単体のApacheモジュールとしてビルド可能で、BSDライク(MITライク)なライセンスのもと配付します。広告条件などの制約は一切ありませんので何でもアリです。
表紙は可愛らしいパンダです。何故パンダなのかは私に聞かないでください。。。
よーやっと一昨日ぐらいからマジ校正(推敲ともいう)に入ることができました。一昨日からといっても、実質作業できたのは一昨日の数時間と今日徹夜した分ぐらい。そしてその進捗は全8章のうち2章が終了。おせぇっ!
予定では今週末~週明けぐらいまでにレビューしてくれる(と予定している)人たちにメール投げてみてもらって、その間原稿を寝かせてもう一度練り直し~とか予想してたんですが既にピンチです。なんせ私25日金曜日から30日水曜日までがっつり帰省しちゃうんで。ってダイアルアップしながら作業するから変わんないとは思うけど。
ぱふー図なんかいつ書くんだよオレ。。。
本日Yahoo!メッセンジャーMacintosh版βがリリースされました。CarbonアプリになったのでMac OS Xでまともに使える日本版Yahoo!メッセンジャーがついにリリースされたので、先にアナウンスしていたとおり僕のFire日本化patchもお役御免って訳です。(Fire日本版のダウンロード数を今数えてみたら1000件ぐらいしか無いんだけど、今オレ以外で使ってる人いるのか?)
さー帰ったらインスコしよーと。
明け方の仕事は気が大きくなるので、原稿の直しには向かないことが良く解りました。スゲー削っちゃったような気がしる。。。
そーいや今日はNCSA Mosaicリリースから10年目だそうでつ。
Apache 1.3.xの秘められた機能Filter Callback
fixupsフェースなど適当な場所でバッファにコールバック関数を登録しておけば、バッファを介して出力するデータを参照することができる。つまりブラウザへの送受信バッファにセットすれば、Apacheがクライアントに送信する全データを取得することができるのだ!
static void dump_response(BUFF *bf, const void *src, int src_len)
{
char *b;
b = ap_palloc(bf->pool, src_len + 1);
memmove(b, src, src_len);
b[src_len] = '\0';
fprintf(stderr, "%s", b);
}
static int fixups_handler(request_rec *r)
{
r->connection->client->filter_callback = dump_response;
return DECLINED;
}
これさえあればもぅ!、、、、、、って何に使うんだよ。。。。
注: 少なくともApache 1.3.27でこの要素を使っているソースコードは皆無。
たぶん続きません。
最後の章「Apache 2.0.xにおけるモジュールの開発」が書き終わり、ようやく一通り書き終わったわけです。ただしこれから推敲や書き足し/削りがはじまるので、ここからがまた大変なんだろうけど。でもちょっと満足。←危険
Apache 2.0.xのモジュール開発に関してしらべてたら、結局ハンドラの登録方法が違うのと、APR(Apache Portable Runtime)に多くの関数とデータ型が移行したので名前とかが違うって点がキモ。ただし全体的な作法や方針、考え方みたいなものはさほど1.3.xのものとは差異がない。
とはいっても実質問題関数名とか違うので移植するのは大変だと思う。ただ1.3.xになれたひとなら2.0.xでもソコソコツマヅクことなくモジュールを書けるはず。できることが増えたし便利な要素も多いし。
ちょっとハマったのがDSOじゃなくて静的にモジュールを組み込む手順。Apache 1.3.xの頃はconfigureスクリプトに --add-module=/path/to/module でビルドすれば、Apacheのソースツリー配下にコピーしてビルドシステムに統合してくれていたので楽だったんだけど、Apache 2.0.xではそーいう仕組みがない。(少なくとも現在は正しく動いていない)
結局ドーするかっつーとソースツリー配下のmodulesディレクトリに適当な名前のディレクトリを作ってそこに
modules/site_module/mod_mymodule.c
modules/site_module/Makefile.in
modules/site_module/config.m4
をまず設置する。モジュールのコードはapxsで吐いた奴でイイとして、Makefile.inとconfig.m4はそれぞれ自分で書く必要がある。必要があると言っても
% cat modules/site_module/Makefile.in
include $(top_srcdir)/build/special.mk
% cat modules/site_module/config.m4
APACHE_MODPATH_INIT(site_module)
APACHE_MODULE(mymodule, Sample My Module)
APACHE_MODPATH_FINISH
って程度。
で、設置した後は
% ./buildconf
すればconfigureスクリプトが更新されて--enable-mymoduleオプションが使用できるようになる。で--enable-mymodule=staticなら静的、--enable-mymodule=dynamicなら動的に組み込むようになるって寸法。
apxsでDSOとして組み込むなら相変わらず楽なんだけど、静的に組み込むのがちょっと手間。ってまぁ手間といえるほど手間では無いと思うけど、1.3.xみたいにスカッと入れる方法が無いチックなのがちょっとキモイ。
そのかわりconfig.m4で独自のチェックを実行したり、依存するオブジェクトファイルやライブラリを指定することもできるので、込み入ったモジュールを作るときには便利。
これ以外でスマートにサクっと組み込む手順を知っている方がいたらマジへるぷみーでつ。
_____
Mac OS X 10.1.5に関して追記:
Mac OS X上でconfigureスクリプトはサーチパスからlibtoolではなくglibtoolを検索する。Appleのデベロッパーツールを組み込んだ場合
/usr/bin/libtool
/usr/bin/glibtool
がインストールされるがこれらのバージョンが古い場合、追加したモジュールのスタティックリンクに失敗する。あくまでも検索されるのはglibtoolなので、仮に最新版のlibtoolを
/usr/local/bin/libtool
に置いたとしてもNG。この場合は
# ln -s /usr/local/bin/libtool /usr/local/bin/glibtool
もしくは
# mv /usr/local/bin/libtool /usr/bin/glibtool
しておけば問題は回避できる。あ、PATHが/usr/local/bin:/usr/binな並びならばってことで。
Fink使ってる人は多分困らないと思うんだけど、ぼくはFinkとか使いたくない人なので(汗)
まったく必要性を感じないまま、やむを得ずApache 2.0.xについて突っ込んで調べはじめる。とりあえず関係してくるであろうドキュメントに目を通し、2.0.45をダウンロードしてビルド。付属のapxsでスケルトンを吐いて、モジュールのビルドテスト。うん、全然一緒で楽です。Apache 1.3.xでモジュール書いてた人なら困ることってほとんどないんじゃないかな~、と予想。
しかしドキュメントが一部古いのが困り者。たとえばモジュール書きがまっ先に読む出あろうConverting Modules from Apache 1.3 to Apache 2.0では、Apache 2.0.xのmodule構造体は
module MODULE_VAR_EXPORT module_name_module =
{
STANDARD20_MODULE_STUFF,
/* create per-directory config structures */
/* merge per-directory config structures */
/* create per-server config structures */
/* merge per-server config structures */
/* command handlers */
/* handlers */
/* register hooks */
};
と説明している。しかしこの構造は2001年1月の時点で次のように変更されている。
module MODULE_VAR_EXPORT module_name_module =
{
STANDARD20_MODULE_STUFF,
/* create per-directory config structures */
/* merge per-directory config structures */
/* create per-server config structures */
/* merge per-server config structures */
/* command handlers */
/* register hooks */
};
つまりコンテンツハンドラの登録をApache 1.3.xのようにhandler_rec構造体を使って行うのではなく、他のフェーズと同様にap_hook_handler()で行う。
って些細なもんだし、「古いかもよ」とか注意書きもあるし、apxsで出力されるコードがちゃんとそうなっているから良いんだけどね。ChangeLogもまだ目を通してないからアレだけど、若いソフトウェアだけに他にも色々あるんだろうなーとションボリしてみた。
んでもCVSのログ見る限りはドキュメントがメンテされていないわけじゃないっぽいし。でも2年前の変更がそのままってのもう~む。。。体制の問題?
そしてこんな日記書いてる間にpatch投げろよという心の声が聞こえてきたけどそれは気がむいたらということで。←おぃ
どりゃーぁぁぁぁぁあ残り一章ぉぉぉぉっ! ←だからぁ
よーやく「セキュリティ」に関する章が書き終わりました。
RCS file: /var/cvs/apache_mod_book/chapter8.txt,v
Working file: chapter8.txt
head: 1.6
branch:
locks: strict
access list:
symbolic names:
keyword substitution: kv
total revisions: 6; selected revisions: 6
description:
----------------------------
revision 1.6
date: 2003/04/07 17:58:37; author: enhydra; state: Exp; lines: +366 -5
"ハッシュ関数による一貫性の確認"でcryptoライブラリのHMAC()関数を解説。
----------------------------
revision 1.5
date: 2003/04/06 15:57:29; author: enhydra; state: Exp; lines: +2 -2
暗号関連を復活。サンプルコードをもとに内容を書きなおそう。
----------------------------
revision 1.4
date: 2003/04/06 07:22:39; author: enhydra; state: Exp; lines: +52 -6
OpenSSLのcryptoライブラリによる暗号処理を書き始め。
----------------------------
revision 1.3
date: 2003/03/30 13:09:59; author: enhydra; state: Exp; lines: +99 -6
Buffer Overflow関係の解説を追加。疲れた。
----------------------------
revision 1.2
date: 2003/03/23 14:58:45; author: enhydra; state: Exp; lines: +107 -9
XSSまで書いたので、次はバッファオーバーフロー話。
----------------------------
revision 1.1
date: 2003/03/22 12:23:55; author: enhydra; state: Exp;
Initial import. (やっとだよ)
=============================================================================
っと脳味噌の労力の割に意外に時間がかかっていないような。。。結局
Chapter 8. セキュリティ
- 入力の検査
- Apacheのリソース制限機能
- クロスサイトスクリプティング対策
- バッファオーばフローの回避
- バッファオーバーフローの概略
- 使用してはいけない関数
- 暗号化と署名によるデータの保護
- 暗号ライブラリとしてのOpenSSL
- 対象鍵暗号による暗号化
- ハッシュ関数による一貫性の確認
ってな感じの構成。なんか薄いなぁ。。。まぁ「セキュリティ - ApacheをSSL対応させる」で終わるよかよっぽどマシか。
っていうかこの企画というか本の悪い所は、コードの一部を見せて説明しようとしないで、毎回完全なサンプルコードで説明しようとしちゃう点と見た。筆者の負荷高すぎ。。。。
試しにwcしてみると。
% wc -l src/*/*.c
103 src/access_timeout/mod_access_timeout.c
125 src/access_timeout_hmac/mod_access_timeout_hmac.c
74 src/agentdir/mod_agentdir.c
48 src/auth_badpasswd/mod_auth_badpasswd.c
79 src/auth_regex/mod_auth_regex.c
93 src/charset_guess/mod_charset_guess.c
66 src/conditional_reqest/mod_conditional_reqest.c
294 src/encrypt_store/mod_encrypt_store.c
87 src/ext_redirect/mod_ext_redirect.c
108 src/get_cookie/mod_get_cookie.c
89 src/helloworld/mod_helloworld.c
81 src/int_redirect/mod_int_redirect.c
114 src/log_handler/mod_log_handler.c
123 src/log_header/mod_log_header.c
37 src/mime_skel/mod_mime_skel.c
111 src/mysql_connect/mod_mysql_connect.c
144 src/mysql_keep_connect/mod_mysql_keep_connect.c
105 src/pg_connect/mod_pg_connect.c
161 src/pg_keep_connect/mod_pg_keep_connect.c
23 src/pluginclude/dir.c
10 src/pluginclude/echo.c
69 src/pluginclude/httpget.c
164 src/pluginclude/mod_pluginclude.c
89 src/reqinfo/mod_reqinfo.c
101 src/send_cookie/mod_send_cookie.c
109 src/sendfile/mod_sendfile.c
135 src/showfile/mod_showfile.c
99 src/simple_conf/mod_simple_conf.c
89 src/strikeout/mod_strikeout.c
2930 total
うーん見開き1ページで精々130行入るかって感じのはずなんだが、これは。。。。
残りは「Apache1.xからApache2.xへの移植」な章。ってこの章は無くそうかな。まじで。
さーゴールデンウィーク前になんとかするぞーっ。
僕の今年のエイプリルフールねたmod_deny_deeplink.cの反響のまとめと、回避方法をしこしこ書いてたんだけど、viと間違えてESC押したら全部文章が消えちゃったので内緒にします(涙)
でも一言だけ。みんなアレが僕のエイプリルフールネタだと認識してないでしょ。。。なんだかとっても不本意(涙)
あ、最もサイトへの流入量が多かったのはセキュリティーホールmemoでダントツでした。2chは最下位レベル。
最初のバージョンは常に打ち捨てられる。