Tomcatのユーザー情報をデータベースで管理するJavaTips 〜アプリケーションサーバ/コンテナ活用編

» 2004年06月01日 10時00分 公開
[山田祥寛@IT]

 Tomcatの認証用のユーザー情報は、デフォルトでtomcat-users.xmlで管理されています。tomcat-users.xmlは非常にシンプルなXMLファイルで、小規模なサイトで少人数のユーザーを管理するには十分なものです。

 しかし、ユーザー数が多くなってくると、テキストファイルのtomcat-users.xmlでは難しい作業も増えてきます。例えば、500人いるユーザーの中から、同じグループに所属するユーザー(同じ権限を持つユーザー)を抽出したり、変更したりするのは容易な作業ではありません。

 また、十分なアクセス制限が施されていないサーバ上で運用している場合、tomcat-users.xmlによるユーザー管理にはセキュリティ上の危険が伴います。アクセス権の設定によっては、一般ユーザーにTomcatの認証パスワードを読み取られてしまう可能性があります。また、「Tomcatのパスワードをダイジェスト化する」で紹介した方法を利用すれば、パスワードの漏えいを防ぐことはできますが、ユーザー名や人数までは隠すことはできないため、脆弱(ぜいじゃく)性が伴うことには変わりありません。

 こういった問題に対処するため、Tomcatではデータベースに格納されたユーザー情報にJDBC経由でアクセスする「JDBCRealm」という認証方式をサポートしています。ユーザー情報をデータベースに格納して管理すれば、メンテナンス性が向上するだけでなく、データベースサーバのセキュリティ機構を利用できるので、よりセキュアなユーザー管理を行うことができます。

操作手順

(1)ユーザー情報格納用テーブルを作成する

 JDBCRealmを利用するには、まずデータベース上にユーザー情報格納用のテーブルを作成する必要があります。テーブル名、フィールド名などは任意に決めることが可能ですが、以下の情報は最低限必要になります。

テーブル名:tomcat_user
フィールド名 データ型 概要
userid VARCHAR(10) ユーザーID
passwd VARCHAR(30) パスワード

テーブル名:tomcat_role
フィールド名 データ型 概要
userid VARCHAR(10) ユーザーID
role VARCHAR(10) ロール名

 ただし、tomcat_roleテーブルの1レコードには、1つの権限しか設定できません。1人のユーザーに複数のロールを関連付けたいときは、以下の表のように複数行にわたってロールを設定する必要があります(tomcatユーザーにadmin、manager、user権限を与えています)。tomcat-users.xmlとは異なり、カンマ区切りなどで一度に指定することはできませんので、注意してください。

 テーブルの定義が終わったら、tomcat_roleテーブルに以下のデータを入力します。

userid role
tomcat admin
tomcat manager
tomcat user

 続いて、tomcat_userテーブルには以下のデータを入力します。

userid passwd
tomcat tomcat

(2)Server.xmlの編集

 Tomcatのサーバ設定ファイル(Server.xml)は、Tomcatをインストールしたフォルダ下のconfフォルダ内に含まれています。

 Server.xmlをテキストエディタなどで開き、以下のように編集します。なお、Realm要素の各属性値は、適宜環境に応じて変更する必要があります。

Server.xml
<!-- ← 削除
<Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
  driverName="org.gjt.mm.mysql.Driver"
connectionURL="jdbc:mysql://localhost/jsp?useUnicode
=true&amp;characterEncoding=Windows-31J"
  connectionName="root" connectionPassword="root"
  userTable="tomcat_user" userNameCol="userid" userCredCol="passwd"
  userRoleTable="tomcat_role" roleNameCol="role" />
-->  ← 削除
  ...中略...
<!-- ← 追加
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
  debug="0" resourceName="UserDatabase" /> 
-->  ← 追加


 UserDatabaseRealmが、デフォルトのtomcat-users.xmlによるレルム方式です。ここでは、UserDatabaseRealmを無効化したうえで、JDBCRealmを有効にします。JDBCRealmを有効にした場合に、Realm要素で指定可能な属性は以下のとおりです。

Realm要素で指定可能な主な属性
属性名 概要
className JDBCRealmが利用するクラス
driverName データベース接続時に使用するJDBCドライバ(完全修飾名)
connectionURL データベースへの接続文字列
connectionName データベース接続時に使用されるユーザー名
connectionPassword データベース接続時に使用されるパスワード
userTable ユーザー情報テーブルの名前
userNameCol ユーザー名を格納するフィールドの名前
userCredCol パスワードを格納するフィールドの名前
userRoleTable ユーザー権限情報テーブルの名前
roleNameCol 権限名を格納するフィールドの名前

 テーブル/フィールド名は、実際にデータベースサーバ上に作成したものと整合性がある必要がありますので、注意してください。

注意:Realm要素は、Engine要素、Host要素、Context要素のいずれかの配下に記述することができます。記述個所によって適用範囲が異なる点に注意してください(本稿では、Engine要素の配下を編集しています)。

Realm要素の記述個所による適用範囲の違い
要素名 対応範囲
Engine コンテナ全体に適用
Host 該当する仮想ホストにのみ適用
Context 該当するコンテキスト(アプリケーション)にのみ適用

(3)JDBCRealmによる認証を確認する

 JDBCRealmが有効になっているかどうかを確認するため、ユーザー認証が必要なアプリケーションからアクセスしてみましょう。自作アプリケーションでも構いませんが、標準で用意されているTomcat AdministratorやTomcat Managerなどを利用しても確認することができます。これらツールの概要、使い方については「Tomcat Administratorでコンテナ管理の負担を軽減する」や「GUIツールでTomcat管理の負担を減らす」「コマンドでTomcatのデプロイ操作を効率化するには」を参照してください。

 認証ダイアログ(または認証フォーム)が表示され、手順1で設定したユーザ名/パスワードで認証されれば成功です。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。