こんにちは。平田です。
JBoss EAP 7.1から、従来のsecurityサブシステムを置き換えるElytronが使えるようになりました。Elytronを導入すると、EAP自体とアプリケーションの認証・認可を一元管理できるようになります。
今回は、Elytronを導入し、管理コンソールの認証バックエンドの切り替えを試してみます。
初期設定では、EAPの管理コンソールへのアクセスに対してプロパティファイルに基づいて認証されます。これを、データベースに登録したアカウント情報による認証に切り替えます。
準備
設定をいじる前にいくつか準備します。
- EAP 7.1は、初期状態では従来のsecurityサブシステムを使うようになっています。これをElytronに切り替えます。
- マニュアル How to Configure Server Security の 2.1.2.1. Enable Elytron Security Across the Server を参考に切り替えます。
$ bin/jboss-cli.sh --file=docs/examples/enable-elytron.cli
- マニュアル How to Configure Server Security の 2.1.2.1. Enable Elytron Security Across the Server を参考に切り替えます。
- 認証に使うデータを登録します。今回は、初期状態で用意されているExampleDSデータソースで初期化されるH2 DatabaseのインメモリDBに認証データを登録します。
- サーバを起動します。
$ bin/standalone.sh
- SQLを流すためにquickstartsに同梱されたh2-console.warをデプロイします。
$ bin/jboss-cli.sh -c [standalone@localhost:9990 /] deploy /path/to/jboss-eap-7.1.0.GA-quickstarts/h2-console/h2-console.war
- http://localhost:8080/h2-console を開き、ExampleDSの接続URlを指定して接続します。
JDBC URL:jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE User Name / Password: sa / sa
- 認証データを流し込みます。
create table eap_users ( username varchar(64) primary key , password varchar(64) , roles varchar(64) ); insert into eap_users values ('nick-fury', 'p@ssw0rd', 'Admin'); insert into eap_users values ('ironman', 'p@ssw0rd', 'Guest'); insert into eap_users values ('captain-america', 'p@ssw0rd', 'Guest');
- サーバを起動します。
Elytronの設定
Elytron導入前の状態では、管理コンソールの認証は /core-service=management/security-realm=ManagementRealm にてプロパティファイルを参照するように設定されています。
Elytron導入後は、management-interfaces/http-interface → Elytronサブシステム内のhttp-authentication-factory → ManagementDomain → ManagementRealm という構造になっており、Elytronサブシステム内のManagementRealmでプロパティファイルを参照するようになっています。
従来のsecurityサブシステムでは、認証バックエンドの定義はsecurity-domainのlogin-moduleで指定しましたが、Elytronでは security-realm で指定するようです。
試行錯誤した結果、以下のように設定することで管理コンソールの認証をDBベースにできました。
- jdbc-realmを定義します。
/subsystem=elytron/jdbc-realm=dbrealm:add(\ principal-query=[{\ sql="SELECT password,roles FROM eap_users WHERE username=?", \ data-source=ExampleDS, \ clear-password-mapper={password-index=1}, \ attribute-mapping=[{index=2,to=groups}] \ }]\ )
- ManagementDomainにjdbc-realmを追加します。
/subsystem=elytron/security-domain=ManagementDomain:list-add(name=realms, value={realm=dbrealm, role-decoder=groups-to-roles})
- ManagementDomainのdefault-realmを、jdbc-realmに変更してリロードします。
/subsystem=elytron/security-domain=ManagementDomain:write-attribute(name=default-realm, value=dbrealm) :reload
動作確認
管理コンソールを開き、ironman / p@ssw0rd
でログインしてみます。
今回の検証ではインメモリDBを使っているため、サーバを停止すると認証データが消えてログインできなくなります。このため、確認が済んだら設定を戻しておきます。
/subsystem=elytron/security-domain=ManagementDomain:write-attribute(name=default-realm, value=ManagementRealm)