公開日:2007年6月28日
独立行政法人情報処理推進機構
セキュリティセンター
本ページの情報は2007年6月時点のものです。
記載の資料は資料公開当時のもので、現在は公開されていないものも含みます。
アクセス制御は、ユーザ認証とアクセス認可の2段階からなる。アクセス制御されるWebページは、オブジェクトIDによって「一本釣り」できてしまわないようにPEP(Policy Enforcement Point)を設置する必要がある。
アクセス認可は、ユーザ認証を通過したユーザに対してデータやプログラム等のコンピュータのリソースの利用を許す/許さないを制御する機能である。アクセス認可の機能を実装する際には、ふたつの留意点がある。
アクセス認可は、あらかじめユーザ認証(本人認証)を行っておき、その結果に基づいて行う必要がある。
クライアントの接続IPアドレスや、パスワードの提示を受けずに受け入れたユーザ識別番号等を用いてアクセス認可を行う方法は、他人によるなりすましを見過ごすおそれがある。ユーザを特定することが重要でないシステムを除き、これらの方法は避けた方がよい。
ユーザから対象のリソースへのアクセスが起こる際、アクセス認可のためのロジックを迂回できては具合が悪い。例えば、選択できる項目の表示をメニュー画面上で隠したのみでは、URLを用いて直接リソースが呼び出せるといった問題があり得る。
ユーザがリソースにアクセスする経路に立ちふさがる形で仕組みを設け、ユーザがアクセスを試みたときには必ずアクセス認可の判定ロジックが働くようにする。
Webアプリケーションにおいて、アクセス認可の判定内容は概ね次の 3段階の構成になる(図2-6)。これらの最終的な判定結果が「Yes」の場合のみ、Webページ等のリソースへのアクセスを執行するようなPEP(Policy Enforcement Point)を設置する。
アクセス認可の対象となるWebページは原則としてhttps:を使用する。さもないと、正規のユーザがコンテンツを取得する際の通信を許可されていない第三者が傍受し、不正にコンテンツを閲覧するおそれがある。
ただし、Webサイトのセキュリティの方針として、盗聴されるリスクを容認する旨の意思決定をした場合はその限りではない。
会員制のサイトや有償コンテンツを提供するサイトにおいては、特定のページはログイン済みのユーザでなければ閲覧を制限するような仕組みが必要である。
そのためには、制限の対象となるWebページを表示する各プログラムにおいて、現在アクセスしているユーザがログイン済みであるか否かをプログラム冒頭で判定するようにする。ユーザがログイン済みでなければコンテンツを開示しない。
この仕組みはおおむね次のように実現する。
HTTP認証を使う場合は、毎回のHTTPリクエストにユーザ認証データが含まれているので、それが適切なユーザ認証データであるか否かを判断することによって、ユーザがログイン済みであることの判定を行う。
ログイン済みのユーザに無条件ですべてのWebページの閲覧を許すのではなく、各ユーザごとにWebページの閲覧の許可・禁止を制御したい場合がある。例えば、オプションの申し込みに応じて利用できる内容が変化するサイト、一般会員と特別会員のように会員に複数の種別があるサイト等である。
そうした制御の対象となるWebページを表示する各プログラムにおいては、現在ログインしているユーザの識別子と表示しようとしているページの組み合わせが「許可されている」ものであるか否かを判定するロジックをもつ。組み合わせが「許可されない」ものであればコンテンツを開示しない。
この仕組みについては、概ね次のような要素から成る。
Webページによっては、そのWebページそのものの閲覧はどのログイン済みユーザにも許すが、そのユーザに関わりのあるデータのみ開示するように制限を加えたいというケースがある。
例えば、会員のショッピング履歴項目のひとつひとつを一意に識別できるキーの値が存在し、それをWebプログラムのパラメータに与えるようになっている場合である。このパラメータにうまく値を与えると他人のショッピング履歴が不正に参照できるとしたら具合が悪い。
Webプログラムがデータを表示あるいは保存する際のキーは、それが現在のユーザに「許可された」ものであることを確かめた上で用いる必要がある。
データベーステーブルにユーザID(あるいはユーザを一意に識別できる別値)のカラムを設けておき、そのテーブルにアクセスする際のSQL文のWHERE句には必ずユーザIDによる制約条件をつけるようにする。
ユーザIDとキー値の妥当な組み合わせを表やリスト等何らかのデータ構造で保持しておき、キー値を用いたデータへのアクセスに先だってキー値を検査する。
アクセス認可のうまくいかない実装方式を下例に示す。
攻撃者は、そのパラメータを偽造しうる。
攻撃者は、URLを直接指定してページを呼び出しうる。
攻撃者は、ツールを使って Referer: ヘッダを偽造しうる。
攻撃者は、ツールを使って POSTリクエストを投入しうる。