JBoss EAP管理コンソールの認証を
Elytron jdbc-realmに切り替える

こんにちは。平田です。

JBoss EAP 7.1から、従来のsecurityサブシステムを置き換えるElytronが使えるようになりました。Elytronを導入すると、EAP自体とアプリケーションの認証・認可を一元管理できるようになります。

今回は、Elytronを導入し、管理コンソールの認証バックエンドの切り替えを試してみます。

初期設定では、EAPの管理コンソールへのアクセスに対してプロパティファイルに基づいて認証されます。これを、データベースに登録したアカウント情報による認証に切り替えます。

準備

設定をいじる前にいくつか準備します。

  1. EAP 7.1は、初期状態では従来のsecurityサブシステムを使うようになっています。これをElytronに切り替えます。
    1. マニュアル 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
  2. 認証に使うデータを登録します。今回は、初期状態で用意されているExampleDSデータソースで初期化されるH2 DatabaseのインメモリDBに認証データを登録します。
    1. サーバを起動します。
      $ bin/standalone.sh
    2. 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
    3. 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

    4. 認証データを流し込みます。
      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ベースにできました。

  1. 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}] \
      }]\
    )
  2. ManagementDomainにjdbc-realmを追加します。
    /subsystem=elytron/security-domain=ManagementDomain:list-add(name=realms, value={realm=dbrealm, role-decoder=groups-to-roles})
  3. 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)

コメントを残す

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