第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) | |
第4回 J2EEアプリケーションを構成するコンポーネント | |
第5回 データベースのブラウザを作る | |
第6回 EJBにおけるコンテナとコンポーネント | |
第7回 J2EEのセキュリティのキホンを知る | |
第8回 J2EEのトランザクション処理 |
連載記事一覧 |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (2017/5/9)
ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。今回は、実案件を事例とし、ログ管理基盤の有用性を、障害対応時間比較も交えて紹介 - Chatwork、LINE、Netflixが進めるリアクティブシステムとは何か (2017/4/27)
「リアクティブ」に関連する幾つかの用語について解説し、リアクティブシステムを実現するためのライブラリを紹介します - Fluentd+Elasticsearch+Kibanaで作るログ基盤の概要と構築方法 (2017/4/6)
ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。初回は、ログ基盤の構築、利用方法について - プログラミングとビルド、Androidアプリ開発、Javaの基礎知識 (2017/4/3)
初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。
|
|