毎日新聞のスクープ記事によると、6年前から店晒しになっていた不正指令電磁的記録罪を新設する刑法改正案を、共謀罪から切り離して提出することを法務省が検討しているそうだ。
コンピューターウイルスを使って個人情報を流出させるなどのサイバー犯罪を阻止するため、法務省はいわゆる「ウイルス作成罪」を新たに創設する刑法改正の検討に入った。(略)法務省は早期の法案提出を目指す。(略)
同種の刑法改正案は共謀罪を創設する組織犯罪処罰法改正案とともに03年以降3度、政府が国会に提出し、いずれも廃案となった。今回はサイバー犯罪防止の重要性がより高まっているとして、共謀罪を除き提出する方向で検討している。
そのまま切り離して再提出するのか、少しは直す余地があるのか。また、不正指令電磁的記録罪の他のバンドルして出されていた部分も出てくるのかといった点はまだ明らかにされていない。前回の提出法案では以下のものが含まれていた。
- 第一 刑法の一部改正
- 一 国外犯処罰
- 二 封印等破棄
- 三 強制執行妨害目的財産損壊等
- 四 強制執行行為妨害等
- 五 強制執行関係売却妨害
- 六 加重封印等破棄等
- 七 公契約関係競売等妨害
- 八 不正指令電磁的記録作成等
- 九 不正指令電磁的記録取得等
- 十 わいせつな電磁的記録に係る記録媒体等の頒布等
- 十一 電子計算機損壊等業務妨害の罪の未遂
- 第二 刑事訴訟法の一部改正
- 一 差し押さえるべき電子計算機に電気通信回線で接続している記録媒体からの複写
- 二 記録命令付き差押え
- 三 電磁的記録に係る記録媒体の差押えの執行方法
- 四 電磁的記録に係る記録媒体の差押状の執行を受ける者等への協力要請
- 五 保全要請等
- 六 電磁的記録の没収のための所要の規定整備
- 第三 組織的な犯罪の処罰及び犯罪収益の規制等に関する法律の一部改正
- 第四 刑事事件における第三者所有物の没収手続に関する応急措置法の一部改正
- 第五 国際捜査共助法の一部改正
- 第六 条約による国外犯処罰
- 第七 地方税法及び国税徴収法の一部改正
Twitterでの世間の反応を見ると、案の定、「ウイルス」「作成」という言葉のイメージに引きずられた感想が流れている。毎日新聞は8月8日の「MAINICHI RT」紙にこのニュースを掲載、Twitterでの反応を載せている。
私がこの法案の条文を初めて耳にしたのは、2004年だったか、経産省から電話があって、こういう法案があるけどどう思うかと訊かれたときだった。元々「ウイルスの定義をどうするんだ?」と思っていた私としては、「そういう作り方があるのか。なるほど。」と思った記憶がある。
そのときを思い返すと、要するに、他人を騙してプログラムを実行させる行為を処罰できるようにする話なんだと理解して、「なかなかいいんじゃないの」との感想を持ったのだと思う。
しかし、その後、情報ネットワーク法学会のセミナーで改正案の解説を聴講しに行ったところ、強い違和感を覚え、2004年5月15日の日記に疑問点を書いた。この時点では、不勉強なため法律についての考え方がまるでできておらず、独り言をつぶやいたにすぎなかった。
2年後、未だ成立していないこの改正案について、とうとう「「不正指令電磁的記録に関する罪」に「作成罪」はいらないのではないか」という日記を書いた。これに対し、石井徹哉先生からトラックバックを頂き、何往復かに渡って議論……というか、刑法の考え方を諭してくださった。要するに、文書偽造の罪を考えるときに、偽造私文書行使罪(刑法161条)があれば私文書偽造罪(同159条)(行使の目的での私文書の偽造)は要らないのか、いや、現にあるじゃないのという指摘であった。
このやり取りを通して、疑問を呈すなら相手の土俵の上で、つまり法律の領域の言葉と概念で説明しなければ、けっして聞き入れられるものではないことを痛感した。
そして、ググっても見つからなかった、法制審議会刑事法(ハイテク犯罪関係)部会の議事録を見つけ、それを読んだところ、何を言えば問題点を指摘できるのかがわかり、やっと言いたいことを書けるようになった。
その後も、繰り返し同じことを説明方法を変えて主張してきた。
要するにどういうことか、今日tweetしたことを貼っておく。
法務省刑事局長の答弁というのは、2008年1月26日の日記で書いたように、以下の発言であり、2回、同趣旨のことが言われていることからして、これが言い間違いということはないのではないかと思う。
(大林政府参考人 = 法務省刑事局長 大林宏)
○大林政府参考人 今回新設いたします不正指令電磁的記録作成等の罪は、人の電子計算機における実行の用に供する目的で行われることが必要とされております。
そこで、この「人」という解釈でございますが、刑法の他の規定と同じく、犯人以外の者ということでございます。また、「電子計算機における実行の用に供する目的」とは、人が電子計算機を使用するに際してその意図に沿うべき動作をさせず、またはその意図に反する動作をさせるべき不正な指令を与える状態にする目的を意味しております。
したがって、不正指令電磁的記録作成等の罪が成立するためには、不正指令電磁的記録、すなわち、コンピューターウイルスが、犯人以外の者が電子計算機を使用するに際してその意図に沿うべき動作をさせないか、またはその意図に反する動作をさせるべき不正な指令を与える状態にする目的を犯人が有していることが必要でございます。(略)
衆議院議事録, 第162回国会 法務委員会 第26号, 2005年7月12日
しかし、実際に提出されている法案の条文は、「人の電子計算機における実行の用に供する目的で」としか書かれていないわけで、「実行」には何も限定がかかっていない。文章通りに解釈すれば、どういう実行であれ他人に使わせる目的であればこの目的要件を満たしてしまうわけで、他人に使わせているソフトウェアの全ての作者はこの目的要件を満たしてしまう。*3
そうすると、あとは、そのプログラムが客観的どのように評価されるかしだいということになってしまい、結局ふりだしに戻って、「意図に沿うべき動作をさせず、又はその意図に反する動作をさせるべき不正な指令」とは何なのか、どう線引きするのかという話になってしまう。
このような私の主張に対し、法律に詳しいと思しきブロガーの方などから、「その懸念は故意で落ちるから心配ない」という趣旨の指摘を何度も頂いた。つまり、プログラム作成者がそのプログラムが「人が電子計算機を使用するに際してその意図に沿うべき動作をさせず、又はその意図に反する動作をさせる」ものであると認識していないならば故意がないことになると。
しかし、その場合、一旦そう認識させられたならば、プログラム提供を中止しなければならないのかという問題が残る。
たしかに、客観的な評価として危険なプログラムとされるものを作ってしまった場合には、その危険をなくすよう直した方がよいことには違いないが、直さないで提供し続けていると犯罪になるというのは、間違っていると思う。
このことについては2008年6月21日の日記で書いた。それに対してさらに「やはり「故意」で解決できるのではないか。」というトラックバックを頂いており、反論を書きたかったのだが、今見てみるとリンク先が消えていて読めない。この記事のはてブエントリに冒頭部分が残っているので引用すると、
結論を先に述べると,以下のようになります。やはり「故意」の問題として処理すれば足りるのではないか。高木氏の『構成要件(の一部)に該当するだけで不安』という考えは杞憂ではないが,積極的に放置したような場合でないと処罰されないと考えられるため,許容でき...
という書き出しだったようだ。やはり、「積極的に放置したような場合でないと処罰されない」とあるように、放置してはいけないという前提での主張のように見える。
私が言いたいのは、たとえ、プログラムの動作内容が誤解されやすいもの(その結果、利用者の意図に反する実行がなされる)であっても、プログラムの作成者に、誤解させて実行させる目的がない限り、それは犯罪ではないということだ。
というわけで、このような問題認識に基づいて、私も2006年10月22日の日記で修正案を書いている。
(不正指令電磁的記録作成等)
第百六十八条の二 人の電子計算機における実行の用に供し、人が電子計算機を使用するに際してその意図に沿うべき動作をさせず、又はその意図に反する動作をさせる目的で、次に掲げる電磁的記録その他の記録を作成し、又は提供した者は、三年以下の懲役又は五十万円以下の罰金に処する。一 人が電子計算機を使用するに際してその意図に沿うべき動作をさせず、又はその意図に反する動作をさせるべき不正な指令を与える電磁的記録
二 前号に掲げるもののほか、同号の不正な指令を記述した電磁的記録その他の記録
2 前項第一号に掲げる電磁的記録を人の電子計算機における実行の用に供し、人が電子計算機を使用するに際してその意図に沿うべき動作をさせず、又はその意図に反する動作をさせた者も、同項と同様とする。
3 前項の罪の未遂は、罰する。
(不正指令電磁的記録取得等)
第百六十八条の三 前条第一項の目的で、同項各号に掲げる電磁的記録その他の記録を取得し、又は保管した者は、二年以下の懲役又は三十万円以下の罰金に処する。
直すべき点がわかるようにあえて冗長に直接的に書き直したものなので、刑法の法文としては不格好な構成になっているに違いないが、そこはプロが直してほしいと思う。
ところで、日弁連は、2003年7月に「ハイテク犯罪に対処するための刑事法の整備に関する意見」を発表しており、その中で、「不正指令電磁的記録等作成等の罪の新設等」として、次のように主張していた。
とりわけ,不正指令電磁的記録等の作成については,それらの予備的行為の中でも最も早い段階を犯罪行為として捉えようとするものであるし,不正指令電磁的記録取得罪及び同保管罪は,コンピュータ・ウイルスが送りつけられるという,いわば被害者的な立場の者について犯罪が成立する可能性があることを考えると,我が国においては,これらの犯罪の新設については時期尚早と言うべきであり,立法事実が存しないと言わなければならない。
たしかに、2003年7月当時は、まだ、いわゆる「仁義なきキンタマ」ウイルスが登場しておらず、日本発の悪質なウイルスはあまり出てきていない時期だった。それが、その年の暮れには「仁義なきキンタマ」が登場して、翌年から大規模な被害が連続して大量に発生する事態となった。
Winnyネットワーク等でのウイルス流通が止まらないのは、わざとウイルスばかり集めて溜め込んで共有状態を維持し続けている輩がたくさんいることであり、彼らがそれをやめない限りウイルス被害はなくならないわけで、供用目的取得罪や供用目的保管罪がそこに有効に働いてくるはずである。このことについては2008年2月3日の日記に書いた。
それに対して、2003年7月の日弁連の意見書は、次のように主張していた。
財団法人社会安全研究財団が2002年3月にまとめた「不正プログラム対策に関する調査研究報告書」は,故意に不正プログラムを使用するなど悪質な行為は何らかの法的規制が必要であるが,その保有・入手・流通・製造段階での規制については,ヒアリング調査の結果賛否両論であり,まず,使用のみを規制の対象とし,その効果を見て保有・入手・流通・製造について段階的に規制すべきであるとの意見が出されており(同報告書38,39頁),これが現時点での我が国での代表的な見解と考えられる。
それからもう7年、状況はすっかり変わってしまっているのだから、日弁連は改めて、不正指令電磁的記録罪について意見書を作り直すべきではないだろうか。
*1 法制審議会刑事法(ハイテク犯罪関係)部会第3回会議にて
*3 実際、法制審議会刑事法(ハイテク犯罪関係)部会の議事録に目を通すと、この目的要件の解説が何回も何回も出てきているけども、「他人に実行させるつもりがないなら罪にならない」という説明しか出てこない。たとえば、「自分のコンピュータでウイルスをテストする分には,この要綱の案で申し上げますと,「人の電子計算機における実行の用に供する目的」がありませんので,当然当たらないというように考えております」という発言が繰り返し出てくるが、それ以上につっこんだ説明は出てこない。
「岡崎図書館事件について その1」に続く今後の日記予定。
平成22年4月1日施行の改正国立国会図書館法に基づき、国立国会図書館が、国・地方公共団体等の公共機関を対象に、インターネット上で公開されている資料のWebクローラによる収集を開始したという。その説明資料によると、クローラのアクセス間隔の基準は「1秒以上」だという。中野区立図書館の場合、/robots.txt が置かれておらず、セッションタイムアウトは実測で600秒*1であることから、1秒間隔でクローラが来ると*2、散発的につながらない状態がしばしば発生すると思われる。
中野区立図書館や岡崎市立中央図書館は、三菱電機インフォメーションシステムズ(以下、三菱電機IS)の図書館システム「MELIL/CS」を採用しており、同じシステムを採用している全国の図書館の一覧が以下にある。
「MELIL/CS」には旧型(ASPによる実装)と新型(ASP.NETによる実装)の2種類があり、URL中のファイル名の拡張子が「.asp」のものが旧型、「.aspx」が新型として見分けられる。
旧型「MELIL/CS」を採用している全国の図書館を見てまわると、半数以上のところで /.robots.txt を配備していることがわかる。中には、ルートディレクトリに置かなければ意味をなさないのに、サブディレクトリに置いているところもある。
どうしてこうバラバラなのか解せないが、それ以前に /robots.txt の設定内容も、ほとんどが以下の図1のような調子で、不必要な行が大量にあって異常なものになっている。/robots.txt の仕様をわからないままに書いているように見受けられる。
このように必死な感じで /robots.txt を配備するのは、そうしないと閲覧しづらくなる不具合が起きてしまうためなのだろうが、こんな設定(すべてのクローラに対して全ディレクトリ拒否)にしてしまうと、Web検索にも出て来なくなる危険がある。
たとえば、「岡崎市立中央図書館」でGoogle検索すると、以下の図2の結果になる。図書館の正式名称は「岡崎市立中央図書館」なのに、検索結果には「岡崎市立図書館」と表示されている。トップページのタイトルは「Libra―岡崎市立中央図書館―」なのに、それが表示されていない。そして、通常ならば表示されるはずのページ概要も現れていない。
同様にYahoo!で検索してみると、次の図3のように、「図書館ホームページへ」、「図書館」などとタイトルが悲惨なことになっている。これは、「18歳未満」や「いいえ」で検索したときにYahoo!のトップページが出てくるように、リンク元の情報を基に検索結果が作られているためで、リンク元のタイトルが表示されているのであろう。図書館のWebサーバが全くクロールされていないために、こんな結果になっている。
同様にbingで検索すると、以下の図4のように、タイトルすら現れない。SEO的に最悪な状況であるわけで、たまたま1番目に出ている状況だと思われる。
そして、同様にBaiduで検索すると、サイトが出てこない。Baiduではリンク元の情報を参考にしていないか、/robots.txt で拒否されているサイトは検索結果に出さない方針なのかもしれない。
これは、「MELIL/CS」の /robots.txt を置いている他の図書館も同様で、たとえば、相模原市立図書館を検索すると、次のようになる。
相模原市立図書館は、URLに「.aspx」とあるように、新型の方の「MELIL/CS」を採用しているので、もはや /robots.txt は不要なはず*3だが、旧型同様の /robots.txt が置かれている。
旧型から新型に切り替えられた際に放置されたためかもしれないが、そもそも、このような /robots.txt は消す必要があることに、図書館員も三菱電機ISも気づいていないのではないか。*4
昨年改正されて今年4月1日に施行された国立国会図書館法は、第25条の3において、次のように規定している。
第十一章の二 国、地方公共団体、独立行政法人等のインターネット資料の記録
第二十五条の三 館長は、公用に供するため、第二十四条及び第二十四条の二に規定する者が公衆に利用可能とし、又は当該者がインターネットを通じて提供する役務により公衆に利用可能とされたインターネット資料(電子的方法、磁気的方法その他の人の知覚によつては認識することができない方法により記録された文字、映像、音又はプログラムであつて、インターネットを通じて公衆に利用可能とされたものをいう。以下同じ。)を国立国会図書館の使用に係る記録媒体に記録することにより収集することができる。
2 第二十四条及び第二十四条の二に規定する者は、自らが公衆に利用可能とし、又は自らがインターネットを通じて提供する役務により公衆に利用可能とされているインターネット資料(その性質及び公衆に利用可能とされた目的にかんがみ、前項の目的の達成に支障がないと認められるものとして館長の定めるものを除く。次項において同じ。)について、館長の定めるところにより、館長が前項の記録を適切に行うために必要な手段を講じなければならない。
3 (略)
「館長が前項の記録を適切に行うために必要な手段」とは何かというと、「国立国会図書館法によるインターネット資料の記録に関する規程」第2条で次のように規定されている。
(インターネット資料の記録を適切に行うために講ずべき手段)
第二条 法第二十五条の三第二項の規定により法第二十四条及び第二十四条の二に規定する者が講じなければならない手段は、同項のインターネット資料を公衆に利用可能としている電子計算機において、館長の定める基準により、法第二十五条の三第一項の記録を行うために必要な情報を加え、又は同項の記録を妨げる情報を削ることとする。ただし、当該者が当該電子計算機について当該手段を講ずる権限を有しない場合は、この限りでない。
「館長の定める基準」とは、平成22年国立国会図書館告示第一号「国立国会図書館法第二十五条の三第三項のインターネット資料等に関する件」に書かれていて、
(国立国会図書館法によるインターネット資料の記録に関する規程第二条の基準)
2 国立国会図書館法によるインターネット資料の記録に関する規程(平成二十一年国立国会図書館規程第五号)第二条の基準は、国立国会図書館の館長が自動収集プログラムにより法第二十五条の三第一項の記録を行うことができることとする。
とある。要するにこれらは、/robots.txt を次のように設定せよという話である。
国立国会図書館は、改正国立国会図書館法に基づいたインターネット資料の収集を開始しており、以下のサイトで、「公的機関の皆様へ」として、この法で定められた義務について周知している。
4) 収集にあたってのお願い
国立国会図書館法第25条の3第2項及び第3項に定めるとおり、下記のご対応をお願いいたします。
- 当館のインターネット自動収集に関して排除指定を行っている場合、その設定の変更・解除
変更方法については、説明用パンフレット(PDF:394KB)をご覧ください。
- (略)
つまり、三菱電機ISの図書館システム「MELIL/CS」(旧型)を導入した多くの公共図書館は、Web検索から姿を隠したというだけでなく、国立国会図書館法第25条の3第2項に違反し、違法状態になっている。*5
図書館員や図書館システム業者がこのことに未だ気づいていないというのは、驚きを禁じ得ない。
表1で「設定あり」とした各図書館に加え、新型の「MELIL/CS」を導入している以下の公共図書館も、/robots.txt によってすべてのクローラに対して図書館の全ディレクトリを拒否している。(2010年8月11日現在)
一方、生駒市図書館など、図9のように「Allow」の設定がなされていて、どうにかしようとしている様子のあるところもあるし、奈良市立図書館の /robots.txt のように、公開すべきディレクトリが除外されている*6ところも少なからずある。
というわけで、国会図書館の周知が足りていないのではないか。もっと強行に、文部科学省から全国の図書館に通達を出すとか、総務省自治行政局から全国の自治体に通達を出すとか、そういったことは行われていないのだろうか。
ところで、そういった周知徹底をするならば、図8で引用した、国会図書館の説明用パンフレット「改正国立国会図書館法によるインターネット資料の収集について」の「ロボット排除について」の説明は、このままではマズいと思われる。
「下記のとおり変更してください」とあるので、意味もわからず切羽詰まって対応する係員が、このとおりに設定してしまう虞れがあるように思う。
つまり、元々どのクローラも拒否していなかったサイトが、新たに /robots.txt を作って、図の通りに「ndl-japan」のクローラだけ許可して、それ以外を全部拒否する設定(図中の「User-agent:* Disallow:/」の部分)を書いてしまう事態が起きる可能性が十分にあるように思える。
ざっくり探してみたところ、大阪医科大学の /robots.txt がちょっと怪しい。「User-agent: * Disallow: /」で全拒否した後、特定の検索エンジンのクローラだけ許可している。これでは一部の検索サイトでヒットしなくなるだろう。
このまま国会図書館の説明用パンフレットで周知徹底がされていくと、全国の公共機関が次々とWeb検索から姿を消していくかもしれない。
8月24日13時00分の時点で、表1で旧型MELIL/CS導入の「設定あり」とした図書館のうち、観音寺市立図書館が /robots.txt を削除した以外、他はすべて /robots.txt で全クローラを拒否した状態を継続中であることを確認。同様に、新型MELIL/CSについて挙げた6つの図書館のうち、河内長野市立図書館が /robots.txt を削除した以外、他はすべて /robots.txt で全クローラを拒否した状態を継続中。
8月31日9時55分の時点で、上記の /robots.txt の状況に変化なし。
9月7日23時00分の時点で、加賀市立図書館の /robots.txt が消えたことを確認。他は(9月11日訂正削除)全クローラ拒否を継続中。
加賀市立図書館の表1のURLが誤っていた。「/robots.txt」としなければならないところを誤って「/toshow/robots.txt」としていた。このリンク先を閲覧して修正状況を確認していたため、上記「追記(9月7日)」で「加賀市立図書館の /robots.txt が消えた」としたのは誤りで、消えたのは「/toshow/robots.txt」であった。現時点では「/robots.txt」が存在しており、全クローラを拒否した状態になっている。(これが、以前からそうだたかは今となっては不明。)
9月10日16時ごろ、岡崎市立中央図書館の /robots.txt が以下の内容に修正された。
User-agent: * Disallow: Crawl-delay: 1
「Crawl-delay: 1」の指定は意味がないと思う。
その他の図書館は、9月11日12時00分時点で変化なし。
9月14日12時00分の時点で、加賀市立図書館と可児市立図書館の /robots.txt が修正された(上記の岡崎市立中央図書館と同じ内容に修正された)のを確認。加賀市立図書館には、9月10日の夕方に電話でこの件について問い合わせをしていた。可児市立図書館に対しては何もしていない。加賀市立図書館の /robots.txt の更新日時は2010年9月11日16時14分15秒、可児市立図書館のものは2010年9月11日14時19分38秒となっている。
それ以外の図書館は、9月14日12時00分の時点で変化なし。
*1 ASPセッションのタイムアウト。検索結果の画面で次ページに進めたときにタイムアウトが発生するか否かによって測定したもの。
*2 10分間に600人が訪れたのと同じ状態(DB接続数が)となる。アクセス数として比較すると、平常時の平均に対して約8倍(中野区立図書館の年間アクセス数は400万とのことなので)にあたる。加えて、通常のブラウザによるアクセスにおいて、1人がASPセッション中にアクセスする回数が平均5回と仮定すると、クローラによるアクセスではDB接続数が5倍という計算になるため、DB接続数で比較すると、通常の40倍の数が発生することになると推測される。
*3 新型の「MELIL/CS」は、「コネクションプーリング接続方式」と「都度接続方式」をサポートしており、旧型にあった「一般的なクローラが来ただけで閲覧しづらくなってしまう欠陥」は存在しないのだから、/robots.txt で拒否する必要性がない。
*4 もしくは、三菱電機ISは、旧型のときに図書館に対して「閲覧しづらくなる事象への対策のために /robots.txt が必要」と説明して設置していた手前、新型だからそれが不要というのでは旧型の欠陥を認めることになるため、「/robots.txt を削除します」と言い出せない状態ということなのかもしれない。
*5 日本のソフト別OPACリストから、他のベンダーの図書館がどうなっているか、地方公共団体を対象にざっくり調べてみたところ、/robots.txt をこんなふうに設定しているのは三菱電機ISだけだった。
*6 たまたまそうなったようにも見えるが。
もしや三菱電機ISのシステムはフリーソフトを使っていたりはしないかと、「WwKensaku.aspx」でググってみたところ(図1)、そこに現れたのは、 Anonymous FTPサイト専門の検索サイトだった*1。そこでさらに「WwKensaku.aspx」で検索してみると、なんとそこに現れたリンク先は ftp://210.230.245.201/ (図2)、このリンクをクリックすると図3の画面が現れた。
210.230.245.201 をDNSで逆引きすると sasaguri1.uxt.cknet.co.jp となる。http://sasaguri1.uxt.cknet.co.jp/ にアクセスしてみると、以下の図4のようになった。
ドメイン名が変だが、これは篠栗町立図書館(福岡県)の正規サイトのようだ。
Anonymous FTPサイトを見て廻ったところ、MELIL/CSのプログラム(VBスクリプト)の一部等が公開された状態になっていた。念のため、ftpコマンドでアクセスしてみたところ、「Anonymous access allowed」と表示され、パスワードなしに接続することができた(図5)。
公開された状態のMELIL/CSのプログラムのうち、特に重要なものは図6のディレクトリにあった。
ディレクトリを隈無く見て廻ると、「Global.asax」が置かれているように、これは新型の方(ASP.NET版)であるが、旧型(ASP版)の残骸のようなもの*2が随所にあり、旧型のものと思われる「Global.asa」が置かれていた。
その中身は図7のものであった。
肝心の部分のコードは以下のとおりである。
Sub Session_OnStart (中略) 'エラー対策? On Error Resume Next '図書館用データベース Set Session("OraDatabase") = OraSession.DbOpenDatabase(HostName ,LoginPasswd ,Clng(3)) End Sub Sub Session_OnEnd Set Session("OraDyna_Book") = Nothing Set Session("OraDatabase") = Nothing Set Session("OraSQLStmt") = Nothing End Sub
まさに、Twitter界隈で皆が予想していたとおりだった。
つまり、7月14日の「サーバ管理者日誌」で「念力デバッグ」として、現象から推測されていたことがほぼ図星で、7月22日の「その後の念力デバッグ」で補正されたものがズバリであった。そして、この推測を基に再現実験が行われた「ぐて〜blog」の7月24日のエントリ「岡崎市立図書館の件のサーバ側挙動の擬似環境下再現実験(その2)」で作成された「Global.asa」は、
Sub Session_OnStart Set Session("OraDatabase") = Application("OraSession").DbOpenDatabase("libradb","scott/tiger",clng(3)) End Sub Sub Session_OnEnd Set Session("OraDatabase") = Nothing End Sub
というもので、さらに、中川氏が警察の取り調べで見せてもらったというサーバ側アクセスログにあったエラーメッセージの記憶を基に、そのようなエラーメッセージが出るよう、「On Error Resume Next」のエラー処理を追加したのが、7月29日の「ASP実験、Session_OnStartのオブジェクト生成失敗を無視する処理」のときの「Global.asa」であり、まさにその推測は完全に当たっていたということになる。*3
このコードの場合、DB接続はアクセス元のブラウザ専用として確保(ASPセッションに紐付け)され、ASPセッションがタイムアウトするまでの間(7月の時点で岡崎市立中央図書館では実測で620秒くらいだった)、閉じられることなく(使いもしないのに)占有されてしまう。その間に新しい閲覧者(ブラウザが)接続してくると、次々新しいDB接続が確保され、その最大数に達すると、それ以上のアクセスを受付けなくなってしまう。
旧型MELIL/CSの設定ファイルもあった(図8)。
2003年8月に作成され、少なくとも2005年7月まで正式に活用されていたことが窺える。
iモード版ではcookieが使えないため、Global.asaによるASPセッション中のDB接続の維持ができないことから、アクセスの都度接続する方式をとっているらしく、DB接続のID・パスワードがこの設定ファイルに書かれている(Gloabl.asaではなく)。
他にも管理者用のものと思われる「AdminTools.asp」が公開された状態になっていた。これは旧型であり、2003年5月に開発されたことが窺える。
ここで謎なのが、著作者として個人の氏名が書かれていて、およそ会社の職務で書いたものには見えない文言が書かれている。旧型の.aspに著者名があるものは、どれもこの方によるものになっていた。*4
一方、新型(ASP.NET)の方はどうなっていたかというと、まず、「Global.asax.vb」にはDB接続するコードは書かれていなかった。そして、新型用の設定ファイルに以下の記述があった(図10)。
「データベースのアクセス方式を指定する」とあり、「0:都度コネクト」と「1:プーリング機能」が選択できるようになっている。
このDB接続の実装は、「Database.vb」にあった(図11)。
これを読むと、新型のMELIL/CSでは、今回の岡崎市立中央図書館のような事態や、他の各地の図書館で報告されていた不具合(/robots.txtを置かないと一般のクローラが来ただけで支障が出てしまう)が生じないよう、ちゃんとDB接続の管理が作り込まれていることがわかる。「都度接続方式」では、SQL文の実行が終了してASPページの実行が終了する(HTTPレスポンスがブラウザに返される)までに、毎回DB接続を閉じるように書かれている。
このコードが書かれたのは、2006年3月〜2007年2月であり、少なくともこの時点で三菱電機ISは、旧型の欠陥を原因まで含めて承知していたはずと言える。
そして、このAnonymous FTPサイトの存在を朝日新聞の記者*5に通報したところ、数日後にはこのAnonymous FTPは閉鎖されていた。
iPhoneといっしょにMacに乗り換える子が多いみたい。Mac買ったらまず開くのは「アプリケーション」フォルダなんだけど、左隅にいるちょっと気になるロボット君、「Automator」君っていうんだけど、知ってた?
開くとこんな感じ。いろいろ並んでてよくわかんないけど、「インターネット」を選んで、「Safariの現在のWebページを取得」を選択。
これを右のところにドラッグして、追加。こんな感じ。
次は「WebページからリンクURLを取得」*1をドラッグして、その次に「URLをダウンロード」もドラッグね。
こんな感じになるんだけど、もう完成。あとは、Safariで図書館サイトに行って、新着図書のページへGo!
そしたら、Automator君の「実行」ボタンを押すだけ!
リンク先のアドレスが抽出されて、
もりもり取りにいって、はい終了。
22ページ取りにいって19.277秒。けっこうアグレッシブ。ウェイトは1秒より短いみたい。
ばっちり取れてる。
これが世界標準のMacの機能。5年前からあったみたい。クローラーキモいなんて言ってるコーダー女子もいるみたいだけど、パソコンくんばっか相手にしてると時代に取り残されちゃう。
既にプログラミングという技術は決して特別なものではなく、誰でも開発に参加できる時代です。
至言だわ。
ちなみに、Automator君は /robots.txt は見ないみたい。見た目はロボットだけど。
*1 2006年の「Mac OS X 10.4.7 Update (delta) について」によると「Automator の「Web ページからイメージの URL を取得」アクションや「Web ページからリンク URL を取得」アクションで、Cookie やセッションを要求する Web サイト(特に、URL と共に認証情報が渡される場合)に対するサポートが、今まで以上に充実しました。」とのこと。
21日の日記で示したMELIL/CS(旧型)の構造上の欠陥について、その仕組みをアニメーションで表現してみる。
まず、Webアクセスの仕組み。ブラウザとWebサーバはHTTPで通信するが、アクセスごとにHTTP接続は切断される*1。以下のアニメ1はその様子を表している。
このように、アクセスが終わると接続が切断されて、次のアクセスで再び接続するのであるが、ブラウザごとに毎回同じ「セッションオブジェクト」に繋がるよう、「セッションID」と呼ばれる受付番号を用いて制御されている。
なお、赤い線は、その接続が使用中であることを表している。
次に、「3層アーキテクチャ」と呼ばれる、データベースと連携したWebアプリケーションの実現方式について。3層アーキテクチャでは、Webアプリケーションが、Webサーバからデータベースサーバ(DB)へと接続して、SQL文実行をDBに要求する。
以下のアニメ2は、3層アーキテクチャにおける、ブラウザからWebサーバへのHTTP接続と、WebサーバからDBサーバへのDB接続のタイミングを表している。
このように、HTTP接続を維持したまま、DB接続でSQL実行を要求し、SQL実行が終わって、結果をブラウザに返すとき、DB接続とHTTP接続を切断する。このような実現方式は「都度接続方式」と呼ばれる*2。
複数のブラウザからアクセスがあるとき、SQL実行が十分に短時間であれば、DBサーバ上でのSQL実行は同時に1つとなる(アニメ2の前半)が、あるSQL実行が長時間にわたった場合には、複数のSQL実行が同時に走ることになる(アニメ2の後半で青い丸が2個ある状態)。この数が過多となると、サイトが「重い」状態となる。
そして、メリル方式(旧型MELIL/CS)の場合を以下のアニメ3に示す。メリル方式では、セッションオブジェクトが作られると同時にDB接続が作成され、その後HTTP接続が切断されても、DB接続は維持されたまま、そのセッションオブジェクト専用として使われる。アニメ3では、DB接続が3本までに制限されている場合を想定している。(実環境ではその100倍前後の本数で運用されている。)
このように、3台の端末のブラウザがアクセスしてきた時点で、DB接続の上限の3本を使い尽くし、4台目のブラウザがアクセスしてくると、DB接続に失敗して、そのブラウザは何度アクセスしてもエラー画面*3になってしまうという「閲覧障害」が起きる。(DBでの処理が「重い」かどうかに関係なく。)
そしてアニメ3の後半では、一部の端末がいなくなって10分が経過すると、セッションのタイムアウトが起きて、当該セッションオブジェクトが消滅し、消滅と同時にそのセッションが握っていたDB接続が切断されて、DB接続に空きができ、5台目の端末が接続できるようになる(閲覧障害が解消する)という様子を表している。
これがメリル方式の特徴であり、もし、永遠にDB接続が切断されないバグであったなら、毎日すぐに閲覧障害になって使い物にならないから、さすがに放置されることはなかったであろうが、このように、セッションタイムアウトまでの期間中に一定数のブラウザがアクセスに来たときだけ閲覧障害が起きるという、微妙なものであった。
次に、ブラウザがcookieオフ設定である場合をアニメ化してみる。
以下のアニメ4は、cookieオフのブラウザ、あるいは元々cookie機能を持たない自動アクセスプログラム(Googlebot等のWebクローラ等)が連続アクセスするときの様子を表している。
このように、cookie非対応であることから、同じブラウザからのアクセスであることを識別できないため、次々と新しいセッションオブジェクトが作られて処理される。しかし、一般的には、Webサーバ上のセッションオブジェクトはほぼ無尽蔵に作成できるので*4、とくに問題はない。
次に、cookie非対応で都度接続方式のサイトに連続アクセスした場合の様子を、アニメ5に示す。
このように、アクセスごとにセッションオブジェクトは次々新しいものとなるが、「シリアルアクセス」でアクセスしている限り、DB接続とSQL実行は同時に1つであり、とくに問題は起きない。
ところが、メリル方式の場合はそうはいかない。cookieオフで連続アクセスするとアニメ6のようになる。
このように、3回アクセスした時点でDB接続が上限に達し、4回目以降はエラーとなる。そして、10分後には、セッションタイムアウトとなって、DB接続は解放され、元の状態に戻る。
岡崎図書館事件では、朝日新聞の記事によると「10分間にアクセスが約1千件を超えると、ホームページの閲覧ができなくなり」とあり、DB接続の上限が1000本だった。仮に1秒に1.5回のアクセスペースだとすると、10分で900本のDB接続を占有することになり、他に一般の利用者が100人以上いたならば、閲覧障害が生じることになる。もっとも、最初のアクセスから10分が経過すると、最初のアクセスで作られたセッションがタイムアウトし、DB接続が次々解放され始めるので、閲覧障害は解消されたはずである。
このことについて、「サーバ管理者日誌」の7月27日のエントリ「シリーズ・クロールとDoSの違いと業務妨害罪と(7) - 念力デバッグ再び」が、この閲覧障害発生のタイミングを図1のように推定していた。
青い線は、連続アクセスが順調に進んだ期間を表しており、線が途切れている部分が、閲覧障害発生中の期間を表している。
このように、閲覧障害は、一旦起きるとずっと続くというものではなく、グラフのように断続的に、あるいは一時的に発生するものであった。その発生割合は、連続アクセスの速度と、DB接続の上限本数と、セッションタイムアウトの時間によって決まる(多くなったり少なくなったりする)。
ただ、アニメ3に示したように、一旦接続エラーになったブラウザ(アニメ3における4番目の端末のブラウザ)は、10分が経過した後も、DB接続のないセッションオブジェクトに繋がり続けるため、何度リロードしても閲覧障害が解消していないように見えただろう。この状態は、ブラウザを再起動する(あるいは、10分間以上リロードをしないで我慢して、タイムアウトさせてからリロードする)まで続く。(追記:※1この様子を表すアニメ8を以下の最後に追加した。)
そのため、閲覧障害の発生期間がグラフのように部分的であっても、たまたまその期間中にサイトに訪れた利用者は、その後ずっとリロードしても閲覧できなくなることから、苦情の電話に至ったものと考えられる。
ちなみに、メリル方式のことを、DB接続を維持するものであることから、「コネクションプーリング」と呼んでいる人をTwitter界隈で稀に見かけたが、それは間違いで、こういうのをコネクションプーリングとは言わない。
コネクションプーリングとは、以下のアニメ7に示すような方式のことを指す。
つまり、事前にDB接続を一定数確保して接続プールとし、Webアプリのセッションは、空いている任意のDB接続をプールから獲得して使用し、使い終えたら切断しないでプールに戻すというもの。都度接続方式に比べて、DB接続の確立に要す時間を省くことができ、レスポンスが早いと言われる。1990年代後半にその必要性が認識され、1999年ごろまでに確立し、2000年ごろには広く知られていた。
このようなコネクションプーリング方式や、都度接続方式を用いて3層アーキテクチャを構成していたならば、岡崎図書館事件の閲覧障害は起きなかった。これらの方式で閲覧障害が起きるとしたら、ひとつひとつのSQL実行の処理時間が相当長い場合*5、つまり、1つのSQL実行が終わらないうちに次のSQL実行が始まり、それが繰り返されて積み重なっていくような場合に限られる。「シリアルアクセス」ではそのようなことは起きないので、起きるとすれば、本当にたくさんの人が同時に訪れたときや、「パラレルアクセス」での真のDoS攻撃が行われた場合であろう。
21日の日記で示したように、2006年に開発された新型MELIL/CSでは、「都度接続方式」と「コネクションプーリング方式」が実装されている。
上記※1で述べていた、閲覧障害発生中のタイミングで訪れたブラウザでは閲覧障害解消後も閲覧障害が続いているように見えるという、その様子を、以下のアニメ8に示す。
上の各アニメをFlashからYouTube動画に変更した。
2010年10月4日に置いていたニコニコ動画版も以下に埋め込んでおく。
*1 Keep-Aliveについては、ここでは省略している。
*2 三菱電機ISの新型MELIL/CSの設定ファイルおよびコード上のコメントによると。
*3 旧型MELIL/CSでは、Global.asaにおいて、セッション開始時にのみDB接続を試みるように書かれていた。そのときエラーが発生しても、「On Error Resume Next」によって無視するように書かれていたため、初期化されない変数を抱えたまま、セッションオブジェクトは生成される。それ以降、そのセッションに接続するブラウザは、何度リロードしてもエラー「オブジェクトがありません」となる状態になったのではないかと考えられる。(エラー発生時にセッションを破棄するコードが書かれていなかったのならば。)
*4 無尽蔵にセッションを生成できるのは、Webが、HTTP接続をアクセスの都度切断するものとして設計されているため。もし、HTTPが接続を維持するタイプのプロトコルであったなら、セッション期間中のアクセス者数は、数百人ほどが限界になっていただろう。昔、Webが登場する前、Anonymous FTPをよく利用していたものだが、接続しようとすると「既に100人がログインしている」として接続を拒否されることがよくあったものだ。DB接続でも同様であり、使わない接続を維持し続けるのは無駄であり、3階層アーキテクチャでWebと結合すると、一般的なWebクローラが来ただけで破綻してしまう。
*5 旧型MELIL/CSでは、蔵書検索でのキーワード検索が異常なほど遅いという指摘も出ている。しかし、岡崎図書館事件で行われたアクセスは、蔵書検索ではなく、「TosCode」で指定された書誌ページへのアクセスであり、そのSQL実行は十分に短く、他の利用者への迷惑となるとは通常考えられない。