Tomcatの認証用のユーザー情報は、デフォルトでtomcat-users.xmlで管理されています。tomcat-users.xmlは非常にシンプルなXMLファイルで、小規模なサイトで少人数のユーザーを管理するには十分なものです。
しかし、ユーザー数が多くなってくると、テキストファイルのtomcat-users.xmlでは難しい作業も増えてきます。例えば、500人いるユーザーの中から、同じグループに所属するユーザー(同じ権限を持つユーザー)を抽出したり、変更したりするのは容易な作業ではありません。
また、十分なアクセス制限が施されていないサーバ上で運用している場合、tomcat-users.xmlによるユーザー管理にはセキュリティ上の危険が伴います。アクセス権の設定によっては、一般ユーザーにTomcatの認証パスワードを読み取られてしまう可能性があります。また、「Tomcatのパスワードをダイジェスト化する」で紹介した方法を利用すれば、パスワードの漏えいを防ぐことはできますが、ユーザー名や人数までは隠すことはできないため、脆弱(ぜいじゃく)性が伴うことには変わりありません。
こういった問題に対処するため、Tomcatではデータベースに格納されたユーザー情報にJDBC経由でアクセスする「JDBCRealm」という認証方式をサポートしています。ユーザー情報をデータベースに格納して管理すれば、メンテナンス性が向上するだけでなく、データベースサーバのセキュリティ機構を利用できるので、よりセキュアなユーザー管理を行うことができます。
JDBCRealmを利用するには、まずデータベース上にユーザー情報格納用のテーブルを作成する必要があります。テーブル名、フィールド名などは任意に決めることが可能ですが、以下の情報は最低限必要になります。
フィールド名 | データ型 | 概要 | |
---|---|---|---|
userid | VARCHAR(10) | ユーザーID | |
passwd | VARCHAR(30) | パスワード | |
フィールド名 | データ型 | 概要 | |
---|---|---|---|
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 | |
Tomcatのサーバ設定ファイル(Server.xml)は、Tomcatをインストールしたフォルダ下のconfフォルダ内に含まれています。
Server.xmlをテキストエディタなどで開き、以下のように編集します。なお、Realm要素の各属性値は、適宜環境に応じて変更する必要があります。
<!-- ← 削除 |
UserDatabaseRealmが、デフォルトのtomcat-users.xmlによるレルム方式です。ここでは、UserDatabaseRealmを無効化したうえで、JDBCRealmを有効にします。JDBCRealmを有効にした場合に、Realm要素で指定可能な属性は以下のとおりです。
属性名 | 概要 | |
---|---|---|
className | JDBCRealmが利用するクラス | |
driverName | データベース接続時に使用するJDBCドライバ(完全修飾名) | |
connectionURL | データベースへの接続文字列 | |
connectionName | データベース接続時に使用されるユーザー名 | |
connectionPassword | データベース接続時に使用されるパスワード | |
userTable | ユーザー情報テーブルの名前 | |
userNameCol | ユーザー名を格納するフィールドの名前 | |
userCredCol | パスワードを格納するフィールドの名前 | |
userRoleTable | ユーザー権限情報テーブルの名前 | |
roleNameCol | 権限名を格納するフィールドの名前 | |
テーブル/フィールド名は、実際にデータベースサーバ上に作成したものと整合性がある必要がありますので、注意してください。
注意:Realm要素は、Engine要素、Host要素、Context要素のいずれかの配下に記述することができます。記述個所によって適用範囲が異なる点に注意してください(本稿では、Engine要素の配下を編集しています)。
要素名 | 対応範囲 | |
---|---|---|
Engine | コンテナ全体に適用 | |
Host | 該当する仮想ホストにのみ適用 | |
Context | 該当するコンテキスト(アプリケーション)にのみ適用 | |
JDBCRealmが有効になっているかどうかを確認するため、ユーザー認証が必要なアプリケーションからアクセスしてみましょう。自作アプリケーションでも構いませんが、標準で用意されているTomcat AdministratorやTomcat Managerなどを利用しても確認することができます。これらツールの概要、使い方については「Tomcat Administratorでコンテナ管理の負担を軽減する」や「GUIツールでTomcat管理の負担を減らす」「コマンドでTomcatのデプロイ操作を効率化するには」を参照してください。
認証ダイアログ(または認証フォーム)が表示され、手順1で設定したユーザ名/パスワードで認証されれば成功です。
Copyright © ITmedia, Inc. All Rights Reserved.