Red Hat Training

A Red Hat training course is available for Red Hat JBoss Enterprise Application Platform

第5章 データベースを使用するためのセキュリティードメインの設定

LDAP と同様に、セキュリティードメインはログインモジュールを使用して認証および承認にデータベースを使用するように設定できます。

5.1. Database ログインモジュール

Database ログインモジュールは、認証とロールマッピングをサポートする JDBC (Java Database Connectivity) ベースのログインモジュールです。このログインモジュールは、ユーザー名、パスワード、およびロール情報がリレーショナルデータベースに格納される場合に使用されます。

このログインモジュールは、想定される形式のプリンシパルおよびロールが含まれる論理テーブルへの参照を提供して動作します。以下に例を示します。

Table Principals(PrincipalID text, Password text)
Table Roles(PrincipalID text, Role text, RoleGroup text)

Principals テーブルはユーザー PrincipalID を有効なパスワードに関連付けます。また、Roles テーブルはユーザー PrincipalID をそのロールセットに関連付けます。ユーザーパーミッションに使用されるロールは、Roles の RoleGroup コラムの値を持つ行に含まれる必要があります。

テーブルは論理であるため、ログインモジュールが使用する SQL クエリーをユーザーが指定できます。唯一の要件として、java.sql.ResultSet は前述の Principals および Roles と同じ論理構造を持ちます。テーブル名およびコラムの実際の名前は、コラムのインデックスに基づいてアクセスされるため、関係ありません。

この概念を明確化するために、すでに宣言されているようにPrincipals および Roles という 2 つのテーブルがあるデータベースを検討してください。以下のステートメントは、以下のデータをテーブルに追加します。

  • Principals テーブルの echoman というパワスワードを持つ PrincipalID java
  • Roles テーブルの RolesRoleGroupEcho という名前のロールを持つ PrincipalID java
  • Roles テーブルの CallerPrincipalRoleGroupcaller-java という名前のロールを持つ PrincipalID java

表5.1 完全なデータベースログインモジュールオプション

オプションTypeデフォルト説明

digestCallback

完全修飾クラス名

none

入力パスワードをハッシュするために salts などの事前/ ポストダイジェストコンテンツが含まれる DigestCallback 実装のクラス名。hashAlgorithm が指定されている場合にのみ使用されます。

dsJndiName

JNDI リソース

java:/DefaultDS

認証情報を格納している JNDI リソースの名前。このオプションは必須です。

hashAlgorithm

文字列

プレーンパスワードを使用

パスワードのハッシュに使用されるメッセージダイジェストアルゴリズム。サポートされているアルゴリズムは Java セキュリティープロバイダーによって異なりますが、サポートされているのは MD5、SHA-1、および SHA-256 です。

hashCharset

文字列

プラットフォームのデフォルトのエンコーディング

パスワード文字列をバイト配列に変換する際に使用する charset/エンコーディングの名前。これには、サポートされているすべての Java charset 名が含まれます。

hashEncoding

文字列

Base64

使用する文字列エンコーディング形式。

ignorePasswordCase

boolean

false

パスワードの比較で大文字と小文字を無視するかどうかを示すフラグ。

inputValidator

完全修飾クラス名

none

クライアントによって提供されるユーザー名およびパスワードを検証するために使用される InputValidator 実装のインスタンス。

principalsQuery

準備済み SQL ステートメント

select Password from Principals where PrincipalID=?

プリンシパルに関する情報を取得するための準備済み SQL クエリー。

rolesQuery

準備済み SQL ステートメント

none

ロールに関する情報を取得するための準備済み SQL クエリー。これは、「select Role, RoleGroup from Roles where PrincipalID=?」のクエリーと同等です。ここでは、Role は ロール名で、RoleGroup 列値は常に大文字の R または CallerPrincipal を持つ Roles のいずれかにしてください。

storeDigestCallback

完全修飾クラス名

none

入力パスワードをハッシュするために salts などのストア/予測ダイジェストコンテンツが含まれる DigestCallback 実装のクラス名。hashStorePassword または hashUserPassword が true で、hashAlgorithm が指定されている場合にのみ使用されます。

suspendResume

boolean

true

データベースの操作中に既存の JTA トランザクションを一時停止するかどうか。

throwValidatorError

boolean

false

検証エラーがクライアントへ公開されるべきかどうかを示すフラグ。

transactionManagerJndiName

JNDI リソース

java:/TransactionManager

ログインモジュールによって使用されるトランザクションマネージャーの JNDI 名。

5.1.1. データベースログインモジュールを使用するようセキュリティードメインを設定

Database ログインモジュールを使用するようにセキュリティードメインを設定する前に、データソースを適切に設定する必要があります。JBoss EAP 6 でのデータソースの作成と設定の詳細は、Red Hat JBoss Enterprise Application Platform 6 Administration and Configuration Guide のデータソース管理セクションを参照してください。

データソースを適切に設定したら、セキュリティードメインがデータベースログインモジュールを使用するように設定できます。以下の例では、MyDatabaseDS という名前のデータソースが作成され、以下で構築されるデータベースで正しく設定されていることを前提としています。

CREATE TABLE Users(username VARCHAR(64) PRIMARY KEY, passwd VARCHAR(64))
CREATE TABLE UserRoles(username VARCHAR(64), role VARCHAR(32))

データベースログインモジュールを追加する CLI コマンド

/subsystem=security/security-domain=testDB:add

/subsystem=security/security-domain=testDB/authentication=classic:add
/subsystem=security/security-domain=testDB/authentication=classic/login-module=Database:add( \
  code=Database, \
  flag=required, \
  module-options=[ \
    ("dsJndiName"=>"java:/MyDatabaseDS"), \
    ("principalsQuery"=>"select passwd from Users where username=?"), \
    ("rolesQuery"=>"select role, 'Roles' from UserRoles where username=?") \
  ])
reload

結果の XML

<security-domain name="testDB">
  <authentication>
    <login-module code="Database" flag="required">
      <module-option name="dsJndiName" value="java:/MyDatabaseDS"/>
      <module-option name="principalsQuery" value="select passwd from Users where username=?"/>
      <module-option name="rolesQuery" value="select role, 'Roles' from UserRoles where username=?"/>
    </login-module>
  </authentication>
</security-domain>