水無月ばけらのえび日記

bakera.jp > 水無月ばけらのえび日記 > 岡崎市立中央図書館のサービスが停止した理由

岡崎市立中央図書館のサービスが停止した理由

2010年8月21日(土曜日)

岡崎市立中央図書館のサービスが停止した理由

更新: 2010年8月26日0時30分頃

朝日の報道と前後して、高木さんからも情報が出ていますね……「Anonymous FTPで公開されていたGlobal.asaが示すもの 岡崎図書館事件(6) (takagi-hiromitsu.jp)」。

福岡県の篠栗町立図書館のサイトにFTPサーバが立っていて、Anonymous FTPでソースコードらしきものが取得できたというお話のようで。今どきFTPのポートが開いているというだけでも驚きますが、Anonymous FTPは物凄いですね。

※私の記憶では、Windows 2000 ServerのFTPサービスはデフォルトで匿名アクセスが有効になっていたような気がします。Windows Server 2003ではFTPを使おうと思ったこと自体がないので、最近どうなっているのかは良く分かりませんが。

※2010-08-26追記: デフォルト設定どころか、管理会社 (MDISとは別らしい) が故意に認証を外したらしく、しかも書き込み可能だったという説があるようで……http://twitter.com/HiromitsuTakagi/status/22096009910 (twitter.com)。それは想像もできませんでした。にわかには信じがたい話ですが、事実だとすれば驚愕の一言です。

以前から、MELIL/CSはSession_OnStartでDBコネクションを確立しているのではないかと推察されていました。高木さんが取得したGlobal.asaの内容は、まさにその予想を裏付けるものでした。

この実装では、セッション開始の際にDBへの接続が確立され、セッション終了時に破棄されます。しかし、この図書館の蔵書検索は、そもそもログインして使うサービスではありません。ログアウトの機能もありませんから、ユーザーのログアウトでセッションが終了することはありません。ユーザーがサイトから離脱してもサーバ側にはセッションが残り、タイムアウトになるまで維持されます。タイムアウトまでの時間は設定によりますが、IISのデフォルトでは20分です。

さらに注目するべきは、セッションがCookieで管理されているということです。誰かがブラウザでこのアプリケーションにアクセスすると、アプリケーションではセッションが開始され、そのセッションIDを含むCookieが発行されます。次回アクセス時には、ブラウザからアプリケーションにCookieが送られ、アプリケーションはそのCookieを見て、同一セッションであるかどうかを判断します。

では、ブラウザのCookieが無効だったらどうなるでしょうか。この場合、初回アクセス時にセッションが開始されてCookieが発行されますが、ブラウザはそのCookieを無視します。次回アクセス時にはCookieが送られてこないため、アプリケーションは初回アクセスだと判断します。アプリケーションは別のセッションを開始し、別のCookieを発行します。

つまり、Cookie無効状態でアクセスされると、アプリケーションはどんどん新しいセッションを作ります。普通はそれでも大した問題は起きないのですが、セッション開始時にDB接続を確立する場合、DBへの接続数がどんどん増えていくことになります。DB接続できる本数には限りがありますから、その上限に達するとDB接続できなくなり、エラーで終了してしまいます。たとえば以下のようなエラーメッセージが出ることになります。

Oracle Automation エラー '800a01b8' 接続できません。,ORA-00020: maximum number of processes (150) exceeded

/LM/W3SVC/1/Root/tosho/global.asa, 行 31

これは、私が尼崎市立図書館のサイトで目撃したメッセージです。岡崎市立中央図書館においては、このエラーが On Error Resume Next で飛ばされ、別の場所でエラーになっていたと考えられています。いずれにしても、DB接続数が上限に達してしまい、サービスを継続できなくなるという現象が発生します。CPUパワーやメモリ、ディスクの容量などとは全く関係なく発生します。

ふつう、クローラはCookieを送出しませんから、クローラがアクセスしてくると一気に大量のDB接続が発生することになります。だからrobots.txtでクローラのアクセスを拒否していたのでしょう。

ではCookie有効のブラウザであれば問題が起きないかというと、そうでもありません。多くの人がアクセスしてきた場合、アクセスしてきた人数分だけDB接続が発生し、タイムアウトまで維持されます。短時間の間に多くの人が来れば、負荷がそれほど高くなくてもサービスが停止してしまうおそれがあります。

そもそも、セッション開始時にDB接続を確立するような設計がナンセンスなのであって、その設計を見直すべきです。高木さんの報告によれば、ASP.NET版では実際に見直しがされているようですね。

※どうでも良い話ですが、「'エラー対策?」というコメントが秀逸で笑ってしまいました。「エラー対策」と書くなら分かるのですが、どうして疑問形で書かれているのでしょうか。

関連する話題: Web / セキュリティ / 岡崎市立中央図書館事件 / librahack

最近の日記

関わった本など