WebAPIのTomcatレルム認証入門:Docker環境での実装を徹底解説!

【リード文】
Webアプリケーション開発において、ユーザー認証はセキュリティの要です。しかし、「認証の仕組みが複雑でよく分からない」「Docker環境での設定方法が難しい」と感じていませんか?この記事では、現役システムエンジニアが、Tomcatのレルム認証をDocker環境で実装する手順を、具体的なコード例とともに分かりやすく解説します。この記事を読めば、TomcatとMySQLを使った堅牢なユーザー認証基盤を構築できるようになります。



前提知識:Tomcatレルム認証とは?

Tomcatレルム認証とは、Tomcatが提供する組み込みの認証機能です。外部のデータベースやファイル、LDAPサーバーなどと連携し、ユーザーの資格情報(ユーザー名、パスワード)を検証します。アプリケーションのコードとは独立して認証ロジックを管理できるため、セキュリティの実装がシンプルになります。

特にデータベースと連携するDataSourceRealmは、ユーザー情報をMySQLなどのデータベースに保存する際に利用されます。Tomcatは設定ファイル(context.xml)に記述された情報をもとに、データベースにアクセスし、ユーザーの認証を行います。


なぜDocker環境で認証を構築するのか?

Dockerを使う最大のメリットは、環境の再現性分離性です。Tomcat、MySQL、そしてアプリケーションをそれぞれ独立したコンテナとして動かすことで、開発環境と本番環境での差異をなくし、デプロイやテストを容易にします。各コンテナは個別の役割に特化するため、管理がシンプルになります。


実践手順:Tomcatレルム認証を実装する5つのステップ

ここでは、Docker Composeを使ってTomcatとMySQLを連携させ、レルム認証を実装する具体的な手順を解説します。


ステップ1:データベーステーブルの作成

認証情報を格納するためのテーブルをMySQLに作成します。パスワードは必ずハッシュ化して保存しましょう。ここではBCryptの使用を推奨します。

CREATE TABLE users (
  user_name VARCHAR(255) NOT NULL PRIMARY KEY,
  user_pass VARCHAR(255) NOT NULL
);

CREATE TABLE user_roles (
  user_name VARCHAR(255) NOT NULL,
  role_name VARCHAR(255) NOT NULL,
  FOREIGN KEY (user_name) REFERENCES users(user_name)
);

ステップ2:Tomcatの設定ファイル(context.xml)の編集

Tomcatコンテナにマウントするcontext.xmlファイルを作成し、データベース接続情報を記述します。

<Context>
  <Realm className="org.apache.catalina.realm.DataSourceRealm"
         dataSourceName="jdbc/UserDB"
         userTable="users"
         userNameCol="user_name"
         userCredCol="user_pass"
         userRoleTable="user_roles"
         roleNameCol="role_name" />

  <Resource name="jdbc/UserDB"
            auth="Container"
            type="javax.sql.DataSource"
            username="<span class="text-red-500">your_mysql_user</span>"
            password="<span class="text-red-500">your_mysql_password</span>"
            driverClassName="com.mysql.cj.jdbc.Driver"
            url="jdbc:mysql://<span class="text-red-500">mysql_container_name</span>:3306/<span class="text-red-500">your_database</span>?useSSL=false" />
</Context>

ポイント:urlのホスト名は、Docker Composeで定義したMySQLコンテナのサービス名(mysql_container_name)を指定します。


ステップ3:web.xmlの設定

認証が必要なAPIパスと、許可するロールを定義します。これにより、特定のURLにのみ認証を適用できます。

<login-config>
  <auth-method>BASIC</auth-method>
  <realm-name>My Realm</realm-name>
</login-config>

<security-constraint>
  <web-resource-collection>
    <web-resource-name>Protected API</web-resource-name>
    <url-pattern>/api/users/*</url-pattern>
  </web-resource-collection>
  <auth-constraint>
    <role-name>manager</role-name>
  </auth-constraint>
</security-constraint>

上記の例では、/api/users/配下のAPIにアクセスする場合、managerロールを持つユーザーであることが求められます。


ステップ4:Dockerfileの作成

TomcatコンテナにMySQL JDBCドライバと、設定ファイルを配置するためのDockerfileを作成します。

FROM tomcat:9-jdk11
COPY mysql-connector-java-8.0.28.jar $CATALINA_HOME/lib/
COPY context.xml $CATALINA_HOME/conf/
COPY web.xml $CATALINA_HOME/webapps/your_app/WEB-INF/

ステップ5:Docker Composeファイルの作成

TomcatコンテナとMySQLコンテナを定義し、ネットワークを共有するdocker-compose.ymlファイルを作成します。

services:
  web:
    build: .
    ports:
      - "8080:8080"
    depends_on:
      - db
  db:
    image: mysql:8
    environment:
      - MYSQL_ROOT_PASSWORD=...

ポイント:depends_onを使うことで、webコンテナがdbコンテナより後に起動するように設定できます。


よくある疑問と注意点

  • Q:ログイン画面はどこに?
    A:TomcatのBASIC認証は、ブラウザに直接ダイアログを表示して資格情報を求めます。カスタムのログイン画面を実装する場合は、Spring Securityなどのフレームワークを利用するのが一般的です。
  • 注意点:パスワードの安全性
    パスワードは必ずソルトを含めてハッシュ化してください。ソルトとは、ランダムな文字列をパスワードに付加してハッシュ化をより困難にする仕組みです。これにより、辞書攻撃やレインボーテーブル攻撃への耐性が高まります。

まとめ:セキュリティの基礎を固めよう

この記事では、Docker環境でTomcatレルム認証を実装する手順を解説しました。データベースにユーザー情報を一元管理し、Tomcatの設定だけで認証を制御できるこの仕組みは、シンプルながらも堅牢なセキュリティ基盤を構築する第一歩となります。この実践例を参考に、ぜひご自身のプロジェクトに認証機能を組み込んでみてください。


【CTA】
この記事が役立ったと感じたら、SNSでシェアしていただけると励みになります。また、WebAPI開発やセキュリティに関するご質問があれば、お気軽にコメントください。

コメントを残す

メールアドレスが公開されることはありません。必須項目には印がついています *