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 テーブルの RolesRoleGroup の Echo という名前のロールを持つ PrincipalID java
- Roles テーブルの CallerPrincipalRoleGroup に caller-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>