(57)【要約】【課題】  クライアントプログラムとホストプログラムの関係を利用して、悪意あるクライアントプログラムが開発され問題となる場合があった。【解決手段】  本発明によれば、公開関数を呼び出すことの出来るクライアントプログラムとそのアクセスレベルを予め設定しておくことにより、アクセスできるクライアントプログラムを限定し、かつ、そのアクセスレベルまで細かく限定し設定することが可能となる。更にはクライアントプログラムの認証結果をログとして逐一記録していくため、エンドユーザもしくはその管理者が認証結果のログを確認することで、不正アクセスを検知し対策する事が可能となる。更には、ホストプログラムが、公開関数が呼び出されるたびに、認証結果のログを自ら参照することで度重なる不正アクセスもしくは不正にアクセスしようとする兆候を自動的に見つけ出し防御することが可能となる。【選択図】  図４
2007034932.tif 000002
【特許請求の範囲】
【請求項１】
関数を公開して外部プログラムからアクセスされるプログラムにおいて、
前記外部プログラムの認証のために、前記外部プログラムからアクセスされる認証関数を提供する外部プログラム認証手段と、
外部プログラムの実行ファイルのファイルパスを取得する実行ファイル取得手段と、
前記外部プログラム毎に実行可能なアクセスレベルを予め設定しておくアクセスレベル設定手段と、
前記外部プログラムから、前記外部プログラム認証手段の認証関数が呼び出された場合に、前記アクセスレベル設定手段にてアクセスレベルが設定されているかを判断し、設定されていると判断した場合に一意の認証コードを割り当てる認証コード割り当て手段を有することを特徴とするプログラムのアクセスログ記録方法。
【請求項２】
関数を公開して外部プログラムからアクセスされるプログラムにおいて、
前記請求項１の認証コード割り当て手段の結果をログとして記録する認証ログ記録手段と、
前記外部プログラムからのアクセス時に前記認証ログ記録手段を参照し、アクセスを許可して良いか否かを判断するアクセス判断手段と、
アクセス可能と判断した場合にのみ、前記請求項１のアクセスレベル設定手段で設定されたアクセスレベルに応じて関数を実行する関数実行手段と、
その履歴をアクセスログとして必要に応じて記録するアクセスログ記録手段を有することを特徴とする前記請求項１のプログラムのアクセスログ記録方法。
【請求項３】
前記アクセスログ記録手段は、前記認証ログ記録手段と同一のものとして記録されることを特徴とする前記請求項２のプログラムのアクセスログ記録方法。
【請求項４】
前記アクセスログ記録手段は、前記関数実行手段による関数実行の記録を常にアクセスログとして記録することを特徴とする前記請求項２のプログラムのアクセスログ記録方法。
【請求項５】
前記アクセスログ記録手段は、前記関数実行手段による関数実行の記録を必要に応じてアクセスログとして記録することを特徴とする前記請求項２のプログラムのアクセスログ記録方法。
【請求項６】
前記認証ログ記録手段は、前記アクセス判断手段による判断結果を常に認証ログとして追記していくことを特徴とする前記請求項２のプログラムのアクセスログ記録方法。
【請求項７】
前記認証ログ記録手段は、前記アクセス判断手段による判断結果を必要に応じて認証ログとして追記していくことを特徴とする前記請求項２のプログラムのアクセスログ記録方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、関数を公開して外部プログラムからアクセスされるプログラムに関し、特に関数群を公開するソフトウェアデベロップメントキット(Software Development Kit：以下SDK)を利用した外部プログラムからのアクセスに対して、制限を加えるプログラムアクセス制限方法に関する。
【背景技術】
【０００２】
従来、プログラムの中のデータの参照や書き換え、あるいはそのプログラムの持つ機能を外部の別プログラムからアクセスし実行可能とするために関数やイベント（以下、関数で統一して称する）を公開することが行われていた。以下、前記関数を公開しているプログラムをホストプログラム、同じく前記公開関数を呼び出す外部プログラムをクライアントプログラムと称する。
【０００３】
公開関数を提供する場合、ホストプログラムが提供する公開関数の仕様をドキュメント化したり、あるいはその利用方法の理解のためにサンプルプログラムなどを作成し、それらをまとめてSDKとしてソフトウェアデベロッパ(Independent Software Developer：以下ISV)へ提供する形態が一般的であり、ISVはSDKを利用して元のホストプログラムとは異なるクライアントプログラムを開発することが可能であった。オリジナルのホストプログラムとは異なる操作性を実現したり、特定の機能に限定してシンプルな機能のみを実装することによって、幅広いエンドユーザの要求に個別に応えることか可能となっていた。
【０００４】
ホストプログラムとクライアントプログラムの関係は大きく分けて2つに分類できる。１つは、画像処理ライブラリなど、それ単体では能動的に動作しないホストプログラムの場合である。この場合ホストプログラムはそれ単体でエンドユーザに提供されることは稀であり、クライアントプログラムはSDKの一部として提供されたホストプログラムを利用して、例えば画像回転関数や画像フォーマット変換関数などを呼び出していた。それにより、ISVが能動的に動作するクライアントプログラムを開発しエンドユーザに提供していた。もう一方は例えば電子文書ファイリングプログラムなど、それ単体で動作するホストプログラムの場合である。電子文書ファイリングプログラムはグラフィカルユーザインタフェース(以下GUI）やデータベース、スキャナドライバを備え、それ単体でエンドユーザへ提供され利用可能ではあるが、特定の機能に限定した定型業務プログラムを欲するエンドユーザにとっては豊富な機能が逆に災いし使い勝手を悪くすることがある。この問題を解決するために、ISVはSDKを利用してエンドユーザの望むカスタマイズを行い、独自のクライアントプログラムを開発していた。
【０００５】
これら2つのどちらの場合でも、公開関数を呼び出すクライアントプログラムと共に、関数を公開しているホストプログラムの全てあるいはその一部が共にエンドユーザへ納入され稼動されていた。具体的には以下のようなプログラム形態となっていた。
【０００６】
公開関数はプログラミング言語や動作するコンピュータのOSの種類によって様々な形態となる。例えば公開関数のプロトタイプ宣言や必要なデータ型を定義したヘッダファイルをSDKの中で提供し、それをクライアントプログラムでインクルードした上で関数を利用する形態は最も広く知られる方法である。あるいは、クライアントプログラムが、OSが提供するコンポーネントオブジェクトモデル(Component Object Model：以下COM)の仕組みを利用し、ホストプログラムの公開関数をまとめてCOMサーバーモジュールを作成し、それをSDKの一部として提供する方法が知られている。ISVは提供されたCOMサーバーモジュールを自ら開発するクライアントプログラムから呼び出すことによって、ホストプログラムへのアクセスが可能であったり、あるいはCOMサーバーモジュール自身がホストプログラムであり完結している場合もあった。ホストプログラムへのアクセスするためには、クアイアントプログラムから例えば最初に公開関数の１つであるConnect関数をユーザ名とパスワードを引数として呼び出す。するとこれにより公開関数が呼び出されたホストプログラムは、自ら持つユーザ管理情報と照らし合わせてパスワードが正しいか否かを判定する。ユーザ認証が正しく行われたならばクライアントプログラムへ正常終了を返し、以後、クライアントプログラムは公開関数を呼び出すことによって、ホストプログラムが保持するデータにアクセスしたり、ホストプログラムに実装されているまとまった機能、例えば電子文書ファイリングされた文書の検索を実行し、特定の文書を取得することなどが可能であった。
【０００７】
又、従来例としては、例えば特許文献１と特許文献２をあげることが出来る。
【特許文献１】特開2000-56967号公報
【特許文献２】特開2002-49492号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
ところがそのクライアントプログラムとホストプログラムの関係を利用して、悪意あるクライアントプログラムが開発され問題となる場合があった。例えば前記電子文書ファイリングプログラムの例の場合では、ファイリングされた膨大な電子文書がデータベースに蓄積され、それらを複数のユーザで共有利用するのが一般的である。文書によっては機密情報も含まれているため、細かいパーミッションや権限設定が行われるのが普通である。もちろんSDKを利用して開発されたクライアントプログラムも、通常は正しいエンドユーザによって適切にデータベースにアクセスし必要な業務を実現していた。しかし、悪意あるクライアントプログラムが密かに開発され、例えばエンドユーザの操作なしにバックグラウンドで起動し公開関数を利用してホストプログラムにアクセスし、文書に関する各種情報を盗み見たり改竄したり、あるいは文書を引き出してしまうなどの問題を引き起こす場合があった。この場合、通常は前述したようなユーザ認証にてセキュリティを確保しているのだが、もしも一旦ユーザ名とパスワードが破られたり漏洩してしまうとなす術がないことが特に問題となっていた。そもそも正当なクライアントプログラムからのアクセスなのか、それとも悪意あるクライアントプログラムからのアクセスなのかを判断することができなかったため、必要に応じてそのアクセスを制限できるようにしたいという要望があり、更にはそのアクセス履歴を記録することで、情報の漏洩や改竄を抑止し防御したいという要望が寄せられていた。
【課題を解決するための手段】
【０００９】
上記課題を解決するために、
関数を公開して外部プログラムからアクセスされるプログラムにおいて、
前記外部プログラムの認証のために、前記外部プログラムからアクセスされる認証関数を提供する外部プログラム認証手段と、
外部プログラムの実行ファイルのファイルパスを取得する実行ファイル取得手段と、
前記外部プログラム毎に実行可能なアクセスレベルを予め設定しておくアクセスレベル設定手段と、
前記外部プログラムから、前記外部プログラム認証手段の認証関数が呼び出された場合に、前記アクセスレベル設定手段にてアクセスレベルが設定されているかを判断し、設定されていると判断した場合に一意の認証コードを割り当てる認証コード割り当て手段と、
前記認証コード割り当て手段の結果をログとして記録する認証ログ記録手段と、
前記外部プログラムからのアクセス時に前記認証ログ記録手段を参照し、アクセスを許可して良いか否かを判断するアクセス判断手段と、
アクセス可能と判断した場合にのみ、前記アクセスレベル設定手段で設定されたアクセスレベルに応じて関数を実行する関数実行手段と、
その履歴をアクセスログとして必要に応じて記録する
ことを可能とする。
【発明の効果】
【００１０】
以上説明したように、本発明によれば、公開関数を呼び出すことの出来るクライアントプログラムとそのアクセスレベルを予め設定しておくことにより、アクセスできるクライアントプログラムを限定し、かつ、そのアクセスレベルまで細かく限定し設定することが可能となる。更にはクライアントプログラムの認証結果をログとして逐一記録していくため、エンドユーザもしくはその管理者が認証結果のログを確認することで、不正アクセスを検知し対策する事が可能となる。更には、ホストプログラムが、公開関数が呼び出されるたびに、認証結果のログを自ら参照することで度重なる不正アクセスもしくは不正にアクセスしようとする兆候を自動的に見つけ出し防御することが可能となる。
【発明を実施するための最良の形態】
【００１１】
以下に、本発明の実施例を図面に基づき説明する。
【００１２】
図1は、それ単体では能動的に動作しないホストプログラムの場合であり、COMサーバーモジュールがホストプログラムとしてISVに提供される場合のプログラム構成図である。クライアントプログラム101はCOMサーバーモジュール102が公開する公開関数103を呼び出すことで、ホストプログラムつまりCOMサーバーモジュール102の情報へアクセスすることが可能となる。この場合、OS上の実行単位であるプロセスはクライアントプログラムのプロセス104のみで動作する。画像処理ライブラリなど、それ単体ではエンドユーザへ提供されない場合にこの構成となる場合が多い。
【００１３】
図2は、ホストプログラムとクライアントプログラムの関係の中で前記COMサーバーモジュールを利用する場合のうち、COMサーバーモジュールとは別にホストプログラムが存在する場合のプログラム構成図である。クライアントプログラム201が、SDKとして提供されたCOMサーバーモジュール202の公開関数204を呼び出すと、COMサーバーモジュールは必要に応じて内部的な非公開関数205を呼び出してホストプログラム203へとアクセスする。実行時のプロセスは、クライアントプログラムプロセス206の中にCOMサーバーモジュールがロードされ動作する。ホストプログラム203はそのままホストプログラムプロセス207であり、この2つのプロセスが共に動作することになる。ホストプログラムが単体でエンドユーザへ提供されている場合で、SDKとしてホストプログラムとは独立してCOMサーバーモジュールを提供する場合にこの構成となる場合が多い。
【００１４】
図3は、前記図2の構成と似ているが、COMサーバーモジュールがホストプログラムと一体化されている場合のプログラム構成図である。クライアントプログラム301は公開関数302を呼び出してCOMサーバーモジュール303へとアクセスする。COMサーバーモジュール303はホストプログラム303とも表現することができる。それぞれクライアントプログラムプロセス304、ホストプログラムプロセス305の2つのプロセスが共に動作することになる。この構成の場合には、ホストプログラムが単体でエンドユーザへ提供される場合もあれば、ホストプログラムはそれ単体では機能せず常にクライアントプログラムと共にエンドユーザへ提供される場合もある。
【００１５】
（第1の実施例）
これ以降、図3のプログラム構成の場合を例として説明を続ける。
【００１６】
クライアントプログラムの認証を行う方法について図4を用いて説明する。
【００１７】
クライアントプログラム401は公開関数402を呼び出してCOMサーバーモジュール403つまりホストプログラム403へとアクセスする。それぞれクライアントプログラムプロセス404、ホストプログラムプロセス405の2つのプロセスが共に動作することになる。ただ図3と比較して、SDKヘルパーモジュール407が追加されている点が異なる。SDKヘルパーモジュール407はSDKとしてISVに提供されるものの中の1つであり、ホストプログラム403と同時に開発される。ホストプログラム403にアクセスする前にクライアントプログラム401の認証を行うためのプログラムである。クライアントプログラム401はホストプログラム403にアクセスするために、まず最初にSDKヘルパーモジュール407が公開しているクライアントプログラム認証関数406を呼び出す必要がある。SDKヘルパーモジュール407の処理内容については図5を用いて後述する。その後SDKヘルパーモジュール407はホストプログラム403が内部的に公開しているクライアントプログラム内部認証関数408を呼び出す。ホストプログラム403は、正しく認証できた場合にはクライアントプログラムプロセス404と関連付けられる一意の認証コードを生成する。ホストプログラム403の処理については図6を用いて後述する。ホストプログラム403は最終的に前述の関数の戻り値として前述の認証コードをSDKヘルパーモジュール407へ返す。この認証コードはそのままクライアントプログラム401へ戻される。クライアントプログラム401は認証されたことを確認後、図3での説明と同様に公開関数402を呼び出し、ホストプログラム403へとアクセスし動作するのだが、その際、呼び出す公開関数402の種類によっては前記戻された認証コードを引数として指定する必要がある。公開関数402はホストプログラム403が公開するものであり、その処理自体もホストプログラム403の中で実行される。その引数に認証コード803の指定が必要か否かは公開関数402の構文として予め定められているものであり、例えばユーザのログインを行う公開関数402を呼び出す場合には認証コードを引数に指定しなくてはいけなかったり、単にホストプログラム403のバージョン情報を取得するだけの公開関数402ならば認証コードの指定は不要など、必要に応じて予め決められている。クライアントプログラム401は、以後、必要に応じてこの認証コードを引数の1つとして公開関数402を呼び出す。
【００１８】
続いて、図4で示されるSDKヘルパーモジュール407の処理内容について図5を用いて説明する。
【００１９】
SDKヘルパーモジュール407はクライアントプログラム認証関数406が呼び出されると、S501にてOSの提供するシステム関数を用いてクライアントプログラムプロセス404のプロセスIDを取得する。続いてそれを手掛かりに同じくOSの提供するシステム関数を用いてS502にてクライアントプログラム401の実行ファイルへのパスを取得する。その後S503にて、前記取得したクライアントプログラム401の実行ファイルへのパスを引数に、ホストプログラム403が内部的に公開しているクライアントプログラム内部認証関数408を呼び出す。
【００２０】
続いてクライアントプログラム認証内部関数408が呼び出されたホストプログラム403の処理について図6を用いて説明する。
【００２１】
ホストプログラム403には、予めアクセスを許可するクライアントプログラムのファイルパスとそのアクセスレベルが設定されている。ファイルパスとアクセスレベルの設定内容については図7のアクセス管理表を用いて後述する。
【００２２】
S601にて、ホストプログラム403はクライアントプログラム認証内部関数408の引数として渡されたファイルパスを読み出す。続いてS602にて、そのファイルパスがアクセス管理表で設定されているか否かを判断する。もしも設定されていない場合には、S603にてアクセス管理表に設定されていない事を意味する0を認証結果とする。認証結果とはクライアントプログラム401の認証を行った結果を記録するログ情報に記録される値であり、図8を用いて後述される。次に、S602にて引数として渡されたファイルパスがアクセス管理表で設定されている場合にはS608へ進み、認証ログを参照する。認証ログとはクライアントプログラム401の認証を行った結果を随時記録するログ情報であり、詳細については図8を用いて後述する。S608では、認証ログで認証結果が-1となっていないかを判断する。もしも認証コードが-1であったならばS609へと進み、改めて認証結果を-1とする。これは、図9を用いて後述する公開関数402が呼び出された場合のホストプログラム403の処理に関係し、公開関数402が正しい認証コードで呼び出されなかった場合に不正なクライアントプログラムであると判断し、以後のアクセスを禁止する目的としてホストプログラム403が認証ログに-1と記録するものである。S608にて認証結果が-1でない場合にはS604へと進む。S604にて0と-1以外のランダムな英数文字の5桁の認証コードを生成する。認証コードを毎回ランダムに生成することで、もしも不正なクライアントプログラムによって認証コードが一度解読されたとしても、度重なるアクセスを防止することが出来る。続いてS604にて生成した認証コードをアクセス管理表の該当する実行ファイルパスに相当する箇所に書き換える。続いてS610にて生成した認証コードを認証結果とする。その後S605にて、クライアントプログラム認証内部関数408の引数として渡された実行ファイルのパスと、前記認証結果を別途認証ログに記録しておく。続いてS606にて、認証コードをクライアントプログラム認証内部関数408の返値として戻す。
【００２３】
続いて前述のアクセス管理表について図7を用いて説明する。
【００２４】
アクセス管理表には、実行ファイルパス701、アクセスレベル702、認証コード703が管理されている。図7では5つの設定がされている場合の例であるが、これより少なくとも多くとも良い。実行ファイルパス701とアクセスレベル702はエンドユーザあるいは管理者によって予め設定されるものである。実行ファイル701は文字列としてクライアントプログラム401の実行ファイルへのファイルパスが文字列として記録される。アクセスレベル702は、実行ファイルパス701に記された実行ファイルのアクセスレベルが記録される。アクセスレベルは4種類が設定可能である。図7の中では、例として参照可能なアクセスレベルを704〜707で記す。参照レベル704はファイル情報の参照のみが可能であり、ファイル自体の読み出しは不可能である。例えば文書ファイリングシステムの場合には、文書を格納するフォルダ名や文書名、更新日時などの文書情報は参照可能であるが、その文書そのものを読み出しファイルを取得することはできない。読み込みレベル705はファイルの読み出しは可能であるが、その文書情報の編集はもちろん文書自体の書き換えも行えない。変更レベル706は、文書情報の編集や文書そのものの書き換えは可能だが、文書を削除することはできない。削除レベル707は文書の削除が可能であり、全ての操作が可能であることを意味する。ただし、この実施例は上記4種類のアクセスレベルの設定が可能な場合を例に記述しているが、実際にはそれ以上でもそれ以下でも良い。例えば、実行ファイル701に相当するクライアントプログラム401のアクセスを許可するか否かだけのフラグ値でも良い。認証コード703は、S603またはS604にて生成されたものである。認証コードのデフォルト値は認証不可を意味する0である。認証コードはホストプログラムプロセス405が存在する間その値は保持されるが、ホストプログラムプロセス405が終了し再度起動された場合にはデフォルト値に初期化される。
【００２５】
続いてS605にて記録される認証ログついて図8を用いて説明する。
【００２６】
認証ログには、認証を行った時刻S801、クライアントプログラム認証内部関数408の引数で渡された実行ファイルパス802、認証結果803、そして認証箇所804の4つが記録される。認証箇所804は整数であり、その認証がクライアントプログラム認証内部関数408で行われた場合には1、公開関数402の呼び出し時に行われた認証ならば2となる。認証ログはS605の手順が実行される度に追加して記録されていくものであり、かつ、ホストプログラム403から任意のタイミングで参照・追記されていくものである。S605の手順以外の場合にホストプログラム403から参照・追記される処理については図9を用いて後述する。認証ログはクライアントプログラム401やSDKヘルパーモジュール407から参照することはできない。認証ログはホストプログラムプロセス405の終了後も保持される。メモリやハードディスクドライブなどの記録メディア上に記録されたり、あるいは他のPCや記録装置に転送され、そこで記録される場合もある。
【００２７】
続いてクライアントプログラム401から公開関数402が呼び出された場合のホストプログラム403の処理について図9を用いて説明する。
【００２８】
まず、図4で説明した通り、クライアントプログラム401は、必要に応じてクライアントプログラム認証内部関数408の戻り値である認証コード803を利用して公開関数402を呼び出す。S901にて、ホストプログラム403は引数に認証コード803が含まれるか否かを確認し、含まれている場合にはS902へと進む。含まれていない場合にはS903へと進む。ただし、S901は、実際には公開関数402の構文として予め定められているものであり、プログラム実行中に実際に判断しない場合がある。その場合は、呼び出された個々の公開関数402の中の処理内容として予めプログラミングされている。S902にて、引数として指定された認証コードと、図7に示されるアクセス管理表の認証コード703の中に記録されているものとで一致するものがあるか否かを判断する。一致するものがある場合にはS903へ進み、一致するものがない場合はS908へと進む。続いてS903にて図8に示される認証ログを時刻が新しい順に検索し、引数として渡された認証コードが認証結果803に存在するか否かを判断する。存在する場合にはS904へ進む。存在しない場合は、過去に認証されたことがないことを意味し、つまり引数として渡された認証コードも不正であると判断できるためS908へと進む。続いてS903にて行った認証ログの検索で該当した認証結果803に該当する実行ファイルパス802を取得する。続いてS905にて認証ログにてその時間以後に同名の実行ファイルパスが存在しないか否かを検索する。存在しない場合にはS906へと進み、もしも存在するならば、それは正しく認証された後に何らかの理由によって認証が不正だったことを意味するため、S908へと進む。S906では、認証が正しく行われた事となり、図8にて説明した通り認証ログへ追記する。ただし、もちろん毎回認証ログへ記録する必要はない。関数が正常に認証された事を全て記録する必要がない場合には記録せず、認証失敗の場合のみ記録することが可能である。もしくは、特定の関数の場合にのみ常にログを記録し、それ以外の場合には記録をしないということも設定可能であし、またはアクセスレベルによって記録する外部プログラム、記録しない外部プログラムを設定することが可能である。これらの設定は必要に応じて自由に設定することが可能であり、例えば予めプログラミングされている場合もあれば、図7に示すアクセス管理表を拡張した形態でエンドユーザもしくは管理者に設定可能とすることもできる。次に、S907では図7に記された亜アクセス管理表に設定された認証コード703の中から、引数として指定された認証コードに一致するものを探し、該当したもののアクセスレベル702を読み出す。続いてS909にて、前記読み出したアクセスレベルに従って、可能な範囲にて公開関数402の処理を実行する。例えば今呼び出された公開関数402が文書名の変更関数であった場合で、かつ、アクセスレベルが参照であった場合には、実際には文書名の変更は行われず、例えばアクセスレベルエラーをクライアントプログラム401へ返すこととなる。
【００２９】
公開関数402の処理を実行する。S908では、認証が正しく行われなかったこととなり、公開関数の処理を実行せずに中断し、更に認証結果として-1を図8で説明した通り認証ログに追記する。
【００３０】
（第２の実施例）
以上、図3のプログラム構成の場合を例に、図4以降の説明を行ってきたが、図１のプログラム構成の場合にはホストプログラム102が、SDKヘルパーモジュール407とホストプログラム403の処理を併せ持ち、同様の機能を実現できる。
【００３１】
（第３の実施例）
同じく、図２のプログラム構成の場合には、COMサーバーモジュール202がSDKヘルパーモジュール407の処理を行うことで、同様の機能を実現できる。
【図面の簡単な説明】
【００３２】
【図１】一般的なプログラム構成例その１
【図２】一般的なプログラム構成例その２
【図３】一般的なプログラム構成例その３
【図４】本実施例における特徴的なプログラム構成例
【図５】SDKヘルパーモジュールのフローチャート
【図６】ホストプログラムのフローチャートその１
【図７】アクセス管理表
【図８】認証ログ
【図９】ホストプログラムのフローチャートその２
【図１】
2007034932.tif 000003
【図２】
2007034932.tif 000004
【図３】
2007034932.tif 000005
【図４】
2007034932.tif 000006
【図５】
2007034932.tif 000007
【図６】
2007034932.tif 000008
【図７】
2007034932.tif 000009
【図８】
2007034932.tif 000010
【図９】
2007034932.tif 000011