第7回 J2EEのセキュリティのキホンを知る
――セキュリティの宣言的アプローチ――


 J2EEでの認証

 コンピュータにログインしてパスワードを入力するときには認証が行われますが、これはOSレベルの認証です。J2EEでは、こうしたOSレベルでの認証とはまったく別のレベルで認証が行われます。J2EEの認証では、「ユーザー」と「グループ」と「レルム(領域)」という、3つの概念を理解することが重要です。

 J2EEのユーザーは、OSの認証でのユーザーという考え方と同じように、ある人間を表しています。ただ、J2EEのユーザーはOSのユーザーとは独立であり、J2EEの認証サービスは、OSの認証サービスとは関係がありません。

 J2EEでも、OSと同じようにグループがあります。グループというのは、J2EEユーザーのある特徴や共通性に基づいたクラス分けです。例えば、eコマースのアプリケーションでは大部分の顧客は、「客」のグループに入るでしょうが、何人かの客は、「特別客」のグループに入れられるかもしれません。ユーザーをグループとして、いくつかのカテゴリに分類することは、たくさんのユーザーのアクセスをコントロールすることを容易にします。

 レルムはグループと似ていますが、認証の方針に注目したJ2EEユーザーの区分です。J2EEの認証サービスは、ユーザーを大きく「証明書付き」(Certificate)と「デフォルト」の2つのレルムに分けています。証明書付きレルムに属するユーザーを認証する場合は、J2EE認証サービスは、ユーザーが所持するX509形式の証明書をチェックします。この証明書付きレルムではHTTPSが使われます。デフォルト・レルムに属するJ2EEユーザーは、あるJ2EEグループに属しますが、証明書付きレルムのユーザーはJ2EEグループには属しません。

 

 deploytoolでのユーザーとグループの管理

 サンのJ2EEでユーザーとグループの管理をするのには、deploytoolを使うのが便利です。deploytoolの左側のツリーでサーバをクリックして、Toolsメニューから[Server Configuration]を選ぶと新しいウィンドウが開きます。この左側から[J2EE Server]を選び、[Users]をクリックします。そうすると、次のように、デフォルトあるいは証明書付きのレルムに登録されているユーザーの一覧が表示されるはずです。2つのレルムは、プルダウン・メニューで選ぶことができます(図1)。このリストでユーザーを選んで、[Delete User...]ボタンを押すとユーザーの削除が可能です。

図1 レルムに登録されているユーザーの一覧が参照できる

 J2EEにユーザーを登録するには[Add User...]ボタンを押します。そうすると、次のようなウィンドウが開きます(図2)。ユーザー名とパスワードを入力したら、そのユーザーが所属するグループを選んで[Add]ボタンを押します。1人のユーザーは、複数のグループに所属することができます。所属しているグループを削除するには[Remove]ボタンを使います。新しいグループを定義するには、このウィンドウで[Edit Groups....]ボタンを押して、新しい[Group]ウィンドウで[Add]ボタンを押せばいいのです。グループを削除するには、このウィンドウで[Delete]ボタンを使います。

図2 ユーザーの登録・削除を行うダイアログ

 

 realmtoolでのユーザーとグループの管理

 J2EEでは、realmtoolというコマンドで、コマンド・ラインからJ2EEユーザーとJ2EEグループの管理ができるようになっています。deploytoolから、GUIを通じて設定できるものを、わざわざコマンド・ラインで行う必要はないのではと考える人がいるかもしれませんが、それは少し違います。例えば、100人のユーザーを登録することを考えてみれば、GUIよりコマンドを呼び出すスクリプトを書いた方が、ずっと効率がいいことが分かります。実際的な用途での、J2EEのユーザーとグループの管理では、realmtoolなどのコマンドの利用が不可欠になると思います。

■ユーザーの表示

 デフォールト・レルムのすべてのユーザーを表示するには、次のコマンドを使います。

realmtool -list default

■ユーザーの登録

 デフォールト・レルムにユーザーを登録するには、-addフラグを利用します。次のコマンドは、robinというユーザーを、パスワードredでグループbirdとwingに登録します。

realmtool -add robin red bird,wing

 証明書付きレルムのユーザーを登録するには、そのユーザーのX509証明書のファイルを-importフラグで読み込みます。

realmtool -import certificate-file

■ユーザーの削除

 ユーザーを削除するには-removeフラグを使います。次のコマンドはユーザーsparrowをデフォールト・レルムから削除します。

realmtool -remove default sparrow

■グループの追加

 デフォールト・レルムにグループを追加するには、-addGroupフラグを利用します。次のコマンドは、デフォールト・レルムwingグループを追加しています。

realmtool -addGroup wing

なお、証明書付きレルムでグループを追加することはできません。

■グループの削除

 デフォールト・レルムからグループを削除するには、-removeGroupフラグを利用します。次のコマンドは、デフォールト・レルムからwingグループを削除します。

realmtool -removeGroup wing

 

 J2EEクライアントでの認証

 J2EEがマルチ・ティアであることが理由となって、J2EEサーバへのアクセスは、J2EEアプリケーション・クライアントからのもの、スタンド・アロンJavaアプリケーションからのもの、実践的には最も利用されるWeb層を通じたものなど、いくつかの種類があります。これらのJ2EEクライアントでの認証のスタイルを見てみましょう。

■クライアント・プログラムからのアクセス

 runclientを使ってJ2EEアプリケーション・クライアントが起動されると、そのコンテナは、まずJ2EEのユーザー名とパスワードを要求するウィンドウをポップアップします。J2EEの認証サービスは、デフォールト・レルムに、そのユーザー名とパスワードが登録されているかをチェックします。注意してほしいのは、このとき、クライアント側にはこうしたユーザー認証のためのコードはまったく必要ないということです。これは、J2EEを用いてサーバ・クライアントでプログラムを開発するうえで大きなメリットとなります。

 J2EEアプリケーション・クライアントを使わない、大部分のスタンド・アロンのJavaアプリケーションには、こうしたログイン・プロセスはありません。こうしたとき、J2EEは、内部的には、このユーザーに対しては、無認証で匿名であることを表すguestという名前のユーザー名を使っています。認証なしに見える場合でも、J2EEサーバがクライアントのanonymousなユーザーguestを認証していると考えるということです。何か、屁理屈のようですが、そうではありません。J2EEでは、サーバ上のリソースのアクセスに対して、認証のメカニズムが一貫した扱いで提供されているということが重要なのです。

■Webからのアクセスの認証

 WebブラウザからのJSP/Servletを通じたJ2EEサーバへのアクセスも、デフォルトでは見かけ上は認証なしで行われます。この場合も、こうしたクライアントには、guestユーザーが割り当てられています。Web層でのデフォルトのこうした扱いは、少しセキュリティが弱いと考えられるかもしれませんが、例えば、Webモールでの製品カタログへのアクセスは、Web上でのウィンドウ・ショッピングのようなものですから、それにいちいちログインを要求する必要はないのです。このように認証なしのアプリケーションが好ましい場合もたくさんあるのですから、こうしたデフォルトの設定は妥当なものでしょう。

 もっと大事なことは、J2EEではWebへのアクセス設定が、Webコンポーネントの配置時に簡単に可能となることです。deploytoolのツリーからWebコンポーネントを選んで[Security]タブを開けば[User Authentication Method]メニューから、Webコンポーネントに対する認証の方法を選択できます(図3)。選択肢としては、[None][Basic][Client Certificate][Form Based]の4つが与えられています。[None]は認証なし(guestでのログイン)で、[Basic]は、J2EEクライアント・アプリケーションの場合と同じくユーザー名とパスワードを要求するウィンドウがポップアップします。[Form Based]は、Webページ上のFormから、ユーザー名とパスワードを入力することになります。[Client Certificate]は証明書付きレルムのユーザーに対する認証要求です。

図3 Webコンポーネントに対する認証方法を選択する

 [Form Based]を選んだときには、Formを記述したLoginページだけでなく、認証失敗時に呼び出される、Errorページも準備します。これらのページは、先の選択メニューの隣の[Settings...]ボタンで、指定可能です。

■Web層の認証の信頼性を高める

 ユーザー認証の方法として[Basic]や[Form Based]を設定することによって、J2EEのWeb層へのアクセスには、ユーザー名とパスワードが必要となります。確かに、これで、セキュリティは高まったといえるのですが、実は、これらの方法にはセキュリティに関していえば、少し問題があります。これらの認証では、ユーザー名もパスワードも、そのままの形でネットワークに送り出されます。

 J2EEでは、次のような方法で、SSL上で認証を行うようにして、こうした問題を回避することができます。deploytoolのツリーから、Webコンポーネントを選んで、[Security]タブを開きます。[User Authentication Method]メニューから、[Basic]または[Form Based]を選びます。[Security constraint]で[Add]ボタンを押します。追加された[Security constraint]を選択します。[Network Security Requirement]のプルダウン・メニューで、「CONFIDENTIAL」を選びます(図4)

図4 SSL上で認証させる

2/3

J2EEの基礎(第7回)
  セキュリティの宣言的アプローチ
J2EEでの認証
  J2EEでの権限設定

連載内容
J2EEの基礎
  第1回 Java Pet Storeで、J2EEを体験する(1)
  第2回 Java Pet Storeで、J2EEを体験する(2)
 

第3回 J2EEアプリケーションと配置(deployment)

  第4回 J2EEアプリケーションを構成するコンポーネント
  第5回 データベースのブラウザを作る
  第6回 EJBにおけるコンテナとコンポーネント
第7回 J2EEのセキュリティのキホンを知る
  第8回 J2EEのトランザクション処理


連載記事一覧




Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間