第2章 Apache Karaf コンテナーのセキュリティー保護

概要

Apache Karaf コンテナーは、JAAS を使用してセキュリティー保護されています。JAAS レルムを定義することで、ユーザー資格情報の取得に使用されるメカニズムを設定できます。デフォルトのロールを変更することで、コンテナーの管理インターフェイスへのアクセスを調整することもできます。

2.1. JAAS 認証

概要

Java Authentication and Authorization Service (JAAS) は、Java アプリケーションに認証を実装するための一般的なフレームワークを提供します。認証の実装はモジュール式であり、個々の JAAS モジュール (またはプラグイン) が認証の実装を提供します。

JAAS の背景情報については、JAAS リファレンスガイド を参照してください。

2.1.1. デフォルトの JAAS レルム

このセクションでは、Karaf コンテナー内のデフォルト JAAS レルムのユーザーデータを管理する方法について説明します。

デフォルトの JAAS レルム

Karaf コンテナーには事前定義された JAAS レルムである karaf レルムがあります。これはデフォルトで、コンテナーのすべての側面をセキュアにするために使用されます。

アプリケーションを JAAS と統合する方法

独自のアプリケーションで karaf レルムを使用できます。karaf を、使用する JAAS レルムの名前として設定するだけです。

デフォルトの JAAS ログインモジュール

Karaf コンテナーを初めて起動する場合、karaf デフォルトレルムを使用するように設定されています。このデフォルト設定では、karaf レルムは 5 つの JAAS ログインモジュールをデプロイし、同時に有効にします。デプロイされたログインモジュールを表示するには、以下のように jaas:realms コンソールコマンドを入力します。

Index │ Realm Name │ Login Module Class Name
──────┼────────────┼───────────────────────────────────────────────────────────────
1     │ karaf      │ org.apache.karaf.jaas.modules.properties.PropertiesLoginModule
2     │ karaf      │ org.apache.karaf.jaas.modules.publickey.PublickeyLoginModule
3     │ karaf      │ org.apache.karaf.jaas.modules.audit.FileAuditLoginModule
4     │ karaf      │ org.apache.karaf.jaas.modules.audit.LogAuditLoginModule
5     │ karaf      │ org.apache.karaf.jaas.modules.audit.EventAdminAuditLoginModule

ユーザーがログインしようとすると、リスト順に 5 つのモジュールで認証されます。各モジュールのフラグ値は、認証が成功するためにモジュールが正常に完了する必要があるかどうかを指定します。フラグ値は、モジュールの完了後に認証プロセスを停止するか、または次のモジュールに進むかも指定します。

Optional フラグは、5 つの認証モジュールすべてに設定されます。Optional フラグ設定により、現在のモジュールが正常に完了するかどうかにかかわらず、認証プロセスが常に 1 つのモジュールから次のモジュールに渡されます。Karaf JAAS レルムのフラグ値はハードコーディングされており、変更できません。フラグの詳細については、表2.1「JAAS モジュールを定義するためのフラグ」 を参照してください。

重要

Karaf コンテナーでは、プロパティーログインモジュールと公開鍵ログインモジュールの 両方 が有効になっています。JAAS はユーザーを認証するときに、まずプロパティーログインモジュールを使用してユーザーを認証しようとします。それが失敗すると、公開鍵ログインモジュールを使用してユーザーの認証を試みます。そのモジュールも失敗すると、エラーが発生します。

2.1.1.1. 認証監査ロギングモジュール

Karaf コンテナーのデフォルトモジュールのリスト内では、最初の 2 つのモジュールのみがユーザー ID の確認に使用されます。残りのモジュールは、成功したログイン試行と失敗したログイン試行の監査証跡をログに記録するために使用されます。デフォルトのレルムには、次の監査ロギングモジュールが含まれています。

org.apache.karaf.jaas.modules.audit.LogAuditLoginModule
このモジュールは、etc/org.ops4j.pax.logging.cfg ファイル内の Pax ロギングインフラストラクチャーに設定されたロガーを使用して、認証の試行に関する情報を記録します。詳細については、JAAS Log Audit Login Module を参照してください。
org.apache.karaf.jaas.modules.audit.FileAuditLoginModule
このモジュールは、認証の試行に関する情報を、指定したファイルに直接記録します。ロギングインフラストラクチャーは使用しません。詳細については、JAAS File Audit Login Module を参照してください。
org.apache.karaf.jaas.modules.audit.EventAdminAuditLoginModule
このモジュールは、OSGi Event Admin サービスを使用して認証の試行を追跡します。

プロパティーログインモジュールでのユーザーの設定

プロパティーログインモジュールは、ユーザー名/パスワードのクレデンシャルをフラットファイル形式で保存するために使用されます。プロパティーログインモジュールで新規ユーザーを作成するには、テキストエディターを使用して InstallDir/etc/users.properties ファイルを開き、以下の構文の行を追加します。

Username=Password[,UserGroup|Role][,UserGroup|Role]...

たとえば、パスワード topsecret およびロール adminjdoe ユーザーを作成するには、以下のようなエントリーを作成します。

jdoe=topsecret,admin

admin ロールは、jdoe ユーザーに完全な管理権限を付与します。

プロパティーログインモジュールでのユーザーグループの設定

ユーザーに直接ロールを割り当てる代わりに (またはそれに加えて)、プロパティーログインモジュールの user groups にユーザーを追加するオプションもあります。プロパティーログインモジュールでユーザーグループを作成するには、テキストエディターを使用して InstallDir/etc/users.properties ファイルを開き、以下の構文で行を追加します。

_g_\:GroupName=Role1,Role2,...

たとえば、ロール group および adminadmingroup ユーザーグループを作成するには、以下のようなエントリーを作成します。

_g_\:admingroup=group,admin

以下のユーザーエントリーを作成して、majorclanger ユーザーを admingroup に追加します。

majorclanger=secretpass,_g_:admingroup

公開鍵ログインモジュールの設定

公開鍵ログインモジュールは、SSH 公開鍵のクレデンシャルをフラットファイル形式で保存するために使用されます。公開鍵ログインモジュールで新規ユーザーを作成するには、テキストエディターを使用して InstallDir/etc/keys.properties ファイルを開き、以下の構文の行を追加します。

Username=PublicKey[,UserGroup|Role][,UserGroup|Role]...

たとえば、以下のエントリーを 1 行で InstallDir/etc/keys.properties ファイルに追加することで、admin ロールで jdoe ユーザーを作成できます。

jdoe=AAAAB3NzaC1kc3MAAACBAP1/U4EddRIpUt9KnC7s5Of2EbdSPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00b/JmYLdrmVClpJ+f6AR7ECLCT7up1/63xhv4O1fnfqimFQ8E+4P208UewwI1VBNaFpEy9nXzrith1yrv8iIDGZ3RSAHHAAAAFQCXYFCPFSMLzLKSuYKi64QL8Fgc9QAAAnEA9+GghdabPd7LvKtcNrhXuXmUr7v6OuqC+VdMCz0HgmdRWVeOutRZT+ZxBxCBgLRJFnEj6EwoFhO3zwkyjMim4TwWeotifI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhRkImog9/hWuWfBpKLZl6Ae1UlZAFMO/7PSSoAAACBAKKSU2PFl/qOLxIwmBZPPIcJshVe7bVUpFvyl3BbJDow8rXfskl8wO63OzP/qLmcJM0+JbcRU/53Jj7uyk31drV2qxhIOsLDC9dGCWj47Y7TyhPdXh/0dthTRBy6bqGtRPxGa7gJov1xm/UuYYXPIUR/3x9MAZvZ5xvE0kYXO+rx,admin
重要

ここで、id_rsa.pub ファイルの内容をすべて挿入しないでください。公開鍵自体を表す記号のブロックだけを挿入します。

公開鍵ログインモジュールでのユーザーグループの設定

ユーザーに直接ロールを割り当てる代わりに (またはそれに加えて)、公開鍵ログインモジュールの user groups にユーザーを追加するオプションもあります。公開鍵ログインモジュールでユーザーグループを作成するには、テキストエディターを使用して InstallDir/etc/keys.properties ファイルを開き、以下の構文の行を追加します。

_g_\:GroupName=Role1,Role2,...

たとえば、ロール group および adminadmingroup ユーザーグループを作成するには、以下のようなエントリーを作成します。

_g_\:admingroup=group,admin

以下のユーザーエントリーを作成して、jdoe ユーザーを admingroup に追加します。

jdoe=AAAAB3NzaC1kc3MAAACBAP1/U4EddRIpUt9KnC7s5Of2EbdSPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00b/JmYLdrmVClpJ+f6AR7ECLCT7up1/63xhv4O1fnfqimFQ8E+4P208UewwI1VBNaFpEy9nXzrith1yrv8iIDGZ3RSAHHAAAAFQCXYFCPFSMLzLKSuYKi64QL8Fgc9QAAAnEA9+GghdabPd7LvKtcNrhXuXmUr7v6OuqC+VdMCz0HgmdRWVeOutRZT+ZxBxCBgLRJFnEj6EwoFhO3zwkyjMim4TwWeotifI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhRkImog9/hWuWfBpKLZl6Ae1UlZAFMO/7PSSoAAACBAKKSU2PFl/qOLxIwmBZPPIcJshVe7bVUpFvyl3BbJDow8rXfskl8wO63OzP/qLmcJM0+JbcRU/53Jj7uyk31drV2qxhIOsLDC9dGCWj47Y7TyhPdXh/0dthTRBy6bqGtRPxGa7gJov1xm/UuYYXPIUR/3x9MAZvZ5xvE0kYXO+rx,_g_:admingroup

保存されたパスワードの暗号化

デフォルトでは、パスワードはプレインテキスト形式で InstallDir/etc/users.properties ファイルに保存されます。このファイルでパスワードを保護するには、管理者のみが読み取ることができるように users.properties ファイルのファイル権限を設定する必要があります。追加の保護を提供するために、オプションで、メッセージダイジェストアルゴリズムを使用して保存されたパスワードを暗号化できます。

パスワード暗号化機能を有効にするには、InstallDir/etc/org.apache.karaf.jaas.cfg ファイルを編集して、コメントで説明されているように暗号化プロパティーを設定します。たとえば、次の設定では、MD5 メッセージダイジェストアルゴリズムを使用した基本的な暗号化が有効になります。

encryption.enabled = true
encryption.name = basic
encryption.prefix = {CRYPT}
encryption.suffix = {CRYPT}
encryption.algorithm = MD5
encryption.encoding = hexadecimal
注記

org.apache.karaf.jaas.cfg ファイルの暗号化設定は、Karaf コンテナーのデフォルトの karaf レルムのみに適用されます。カスタムレルムには影響しません。

パスワード暗号化の詳細については、「保存されたパスワードの暗号化」 を参照してください。

デフォルトレルムのオーバーライド

JAAS レルムをカスタマイズする場合、最も便利なアプローチは、より高いランクの karaf レルムを定義してデフォルトの karaf レルムをオーバーライドすることです。これにより、すべての Red Hat Fuse セキュリティーコンポーネントがカスタムレルムを使用するように切り替わります。カスタム JAAS レルムを定義およびデプロイする方法の詳細については、「JAAS レルムの定義」 を参照してください。

2.1.2. JAAS レルムの定義

OSGi コンテナーで JAAS レルムを定義する場合、従来の JAAS ログイン設定 ファイルに定義を置くことは できません。代わりに、OSGi コンテナーは、Blueprint 設定ファイルで JAAS レルムを定義するために特別な jaas:config 要素を使用します。このように定義された JAAS レルムは、コンテナーにデプロイされた すべて のアプリケーションバンドルで利用できるようになり、コンテナー全体で JAAS セキュリティーインフラストラクチャーを共有できるようになります。

Namespace

jaas:config 要素は、http://karaf.apache.org/xmlns/jaas/v1.0.0 名前空間で定義されています。JAAS レルムを定義するときは、例2.1「JAAS ブループリント名前空間」 に示された行を含める必要があります。

例2.1 JAAS ブループリント名前空間

xmlns:jaas="http://karaf.apache.org/xmlns/jaas/v1.0.0"

JAAS レルムの設定

jaas:config 要素の構文は 例2.2「ブループリント XML での JAAS レルムの定義」 に示されています。

例2.2 ブループリント XML での JAAS レルムの定義

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
           xmlns:jaas="http://karaf.apache.org/xmlns/jaas/v1.0.0">

    <jaas:config name="JaasRealmName"
                 rank="IntegerRank">
        <jaas:module className="LoginModuleClassName"
                     flags="[required|requisite|sufficient|optional]">
            Property=Value
            ...
        </jaas:module>
        ...
        <!-- Can optionally define multiple modules -->
        ...
    </jaas:config>

</blueprint>

要素は次のように使用されます。

jaas:config

JAAS レルムを定義します。この要素は以下の属性を持ちます。

  • name — JAAS レルムの名前を指定します。
  • rank — JAAS レルム間で命名の競合を解決するためのオプションのランクを指定します。2 つ以上の JAAS レルムが同じ名前で登録されている場合、OSGi コンテナーは常に最高ランクのレルムインスタンスを選択します。デフォルトのレルム karaf を上書きする場合は、以前にインストールされた karaf レルムをすべてオーバーライドするように、rank100 以上に設定する必要があります。
jaas:module

現在のレルムで JAAS ログインモジュールを定義します。jaas:module には以下の属性があります。

  • className — JAAS ログインモジュールの完全修飾クラス名。指定されたクラスは、バンドルクラ出力ダーから利用可能である必要があります。
  • flags — ログイン操作の成功または失敗時に何が起こるかを決定します。表2.1「JAAS モジュールを定義するためのフラグ」 では、有効な値について説明しています。

    表2.1 JAAS モジュールを定義するためのフラグ

    説明

    required

    このログインモジュールの認証は成功する必要があります。成功または失敗に関係なく、常にこのエントリーの次のログインモジュールに進みます。

    requisite

    このログインモジュールの認証は成功する必要があります。成功した場合は、次のログインモジュールに進みます。失敗した場合は、残りのログインモジュールを処理せずにすぐに戻ります。

    sufficient

    このログインモジュールの認証は成功する必要はありません。成功した場合は、残りのログインモジュールを処理せずにすぐに戻ります。失敗した場合は、次のログインモジュールに進みます。

    任意

    このログインモジュールの認証は成功する必要はありません。成功または失敗に関係なく、常にこのエントリーの次のログインモジュールに進みます。

    jaas:module 要素の内容は、JAAS ログインモジュールインスタンスの初期化に使用されるプロパティー設定のスペース区切りリストです。特定のプロパティーは JAAS ログインモジュールによって決定され、適切な形式にする必要があります。

    注記

    レルムに複数のログインモジュールを定義できます。

標準 JAAS ログインプロパティーから XML への変換

Red Hat Fuse は、標準の Java ログイン設定ファイルと同じプロパティーを使用しますが、Red Hat Fuse では少し異なる方法で指定する必要があります。JAAS レルムの定義に対する Red Hat Fuse のアプローチと標準の Java ログイン設定ファイルアプローチを比較するには、例2.3「標準 JAAS プロパティー」 に示すログイン設定を変換する方法を考慮します。これは、Red Hat Fuse プロパティーログインモジュールクラス PropertiesLoginModule を使用して PropertiesLogin レルムを定義します。

例2.3 標準 JAAS プロパティー

PropertiesLogin {
    org.apache.activemq.jaas.PropertiesLoginModule required
        org.apache.activemq.jaas.properties.user="users.properties"
        org.apache.activemq.jaas.properties.group="groups.properties";
};

Blueprint ファイルの jaas:config 要素を使用した、同等の JAAS レルム定義を 例2.4「ブループリント JAAS プロパティー」 に示します。

例2.4 ブループリント JAAS プロパティー

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
  xmlns:jaas="http://karaf.apache.org/xmlns/jaas/v1.0.0"
  xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0">

  <jaas:config name="PropertiesLogin">
    <jaas:module flags="required"
      className="org.apache.activemq.jaas.PropertiesLoginModule">
        org.apache.activemq.jaas.properties.user=users.properties
        org.apache.activemq.jaas.properties.group=groups.properties
    </jaas:module>
  </jaas:config>

</blueprint>
重要

ブループリント設定の JAAS プロパティーに二重引用符を使用しないでください。

Red Hat Fuse は、JAAS 認証データを X.500 サーバーに保存するためのアダプターも提供します。例2.5「JAAS レルムの設定」 は、ldap://localhost:10389 にある LDAP サーバーに接続する Red Hat Fuse の LDAPLoginModule クラスを使用するよう、LDAPLogin レルムを定義します。

例2.5 JAAS レルムの設定

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
  xmlns:jaas="http://karaf.apache.org/xmlns/jaas/v1.0.0"
  xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0">

  <jaas:config name="LDAPLogin" rank="200">
    <jaas:module flags="required"
      className="org.apache.karaf.jaas.modules.ldap.LDAPLoginModule">
        initialContextFactory=com.sun.jndi.ldap.LdapCtxFactory
        connection.username=uid=admin,ou=system
        connection.password=secret
        connection.protocol=
        connection.url = ldap://localhost:10389
        user.base.dn = ou=users,ou=system
        user.filter = (uid=%u)
        user.search.subtree = true
        role.base.dn = ou=users,ou=system
        role.filter = (uid=%u)
        role.name.attribute = ou
        role.search.subtree = true
        authentication = simple
    </jaas:module>
  </jaas:config>
</blueprint>

LDAP ログインモジュールの詳細な説明と使用例については、「JAAS LDAP ログインモジュール」 を参照してください。

2.1.3. JAAS プロパティーログインモジュール

JAAS プロパティーログインモジュールは、ユーザーデータをフラットファイル形式で保存します (オプションで、保存されたパスワードはメッセージダイジェストアルゴリズムを使用して暗号化できます)。ユーザーデータは、単純なテキストエディターを使用して直接編集することも、jaas:* コンソールコマンドを使用して管理することもできます。

たとえば、Karaf コンテナーはデフォルトで JAAS プロパティーログインモジュールを使用し、関連するユーザーデータを InstallDir/etc/users.properties ファイルに保存します。

サポートされている認証情報

JAAS プロパティーログインモジュールはユーザー名/パスワードのクレデンシャルを認証し、認証されたユーザーに関連付けられたロールのリストを返します。

実装クラス

次のクラスは、JAAS プロパティーのログインモジュールを実装します。

org.apache.karaf.jaas.modules.properties.PropertiesLoginModule
JAAS ログインモジュールを実装します。
org.apache.karaf.jaas.modules.properties.PropertiesBackingEngineFactory
OSGi サービスとして公開する必要があります。このサービスは、Apache Karaf シェルから jaas:* コンソールコマンドを使用してユーザーデータを管理できるようにします (Apache Karaf Console Reference を参照)。

オプション

JAAS プロパティーログインモジュールは、次のオプションをサポートしています。

users
ユーザープロパティーファイルの場所。

ユーザープロパティーファイルの形式

ユーザープロパティーファイルは、プロパティーログインモジュールのユーザー名、パスワード、およびロールデータを保存するために使用されます。各ユーザーは、ユーザープロパティーファイルの 1 行で表されます。この行の形式は、次のとおりです。

Username=Password[,UserGroup|Role][,UserGroup|Role]...

このファイルでは、ユーザーグループを定義することもできます。各ユーザーグループは、次の形式の 1 行で表されます。

_g_\:GroupName=Role1[,Role2]...

たとえば、次のように、ユーザー bigcheese および guest、ならびにユーザーグループ admingroup および guestgroup を定義できます。

# Users
bigcheese=cheesepass,_g_:admingroup
guest=guestpass,_g_:guestgroup

# Groups
_g_\:admingroup=group,admin
_g_\:guestgroup=viewer

ブループリント設定のサンプル

以下の Blueprint 設定は、プロパティーログインモジュールを使用して新しい karaf レルムを定義する方法を示しています。ここで、rank 属性を 200 に設定すると、デフォルトの karaf レルムが上書きされます。

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
  xmlns:jaas="http://karaf.apache.org/xmlns/jaas/v1.0.0"
  xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
  xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0">

  <type-converters>
    <bean class="org.apache.karaf.jaas.modules.properties.PropertiesConverter"/>
  </type-converters>

<!--Allow usage of System properties, especially the karaf.base property-->
  <ext:property-placeholder
       placeholder-prefix="$[" placeholder-suffix="]"/>

  <jaas:config name="karaf" rank="200">
    <jaas:module flags="required"
className="org.apache.karaf.jaas.modules.properties.PropertiesLoginModule">
        users= $[karaf.base]/etc/users.properties
    </jaas:module>
  </jaas:config>

  <!-- The Backing Engine Factory Service for the PropertiesLoginModule -->
  <service interface="org.apache.karaf.jaas.modules.BackingEngineFactory">
    <bean class="org.apache.karaf.jaas.modules.properties.PropertiesBackingEngineFactory"/>
  </service>

</blueprint>

必ず、BackingEngineFactory Bean を OSGi サービスとしてエクスポートし、jaas:* コンソールコマンドがユーザーデータを管理できるようにします。

2.1.4. JAAS OSGi 設定ログインモジュール

概要

JAAS OSGi 設定ログインモジュールは、OSGi Config Admin Service を利用してユーザーデータを保管します。このログインモジュールは、JAAS プロパティーのログインモジュールとかなり似ていますが (たとえばユーザーエントリーの構文は同じ)、ユーザーデータを取得するメカニズムは OSGi Config Admin Service に基づいています。

ユーザーデータは、対応する OSGi 設定ファイル etc/PersistentID.cfg を作成するか、OSGi Config Admin Service によってサポートされる任意の設定方法を使用して直接編集できます。ただし、jaas:* コンソールのコマンドはサポートされません。

サポートされている認証情報

JAAS OAGi 設定ログインモジュールはユーザー名/パスワードのクレデンシャルを認証し、認証されたユーザーに関連付けられたロールのリストを返します。

実装クラス

次のクラスは、JAASOSGi 設定ログインモジュールを実装します。

org.apache.karaf.jaas.modules.osgi.OsgiConfigLoginModule
JAAS ログインモジュールを実装します。
注記

OSGi 設定ログインモジュールのバッキングエンジンファクトリーはありません。つまり、jaas:* コンソールコマンドを使用してこのモジュールを管理することはできません。

オプション

JAAS OSGi 設定ログインモジュールは、以下のオプションをサポートします。

pid
ユーザーデータを含む OSGi 設定の 永続 ID。OSGi Config Admin 規格で、永続 ID は関連する設定プロパティーのセットを参照します。

設定ファイルの場所

設定ファイルの場所は、永続 ID PersistentID の設定が以下のファイルに保存される通常の慣例に従います。

InstallDir/etc/PersistentID.cfg

設定ファイルの形式

PersistentID.cfg 設定ファイルは、OSGi config ログインモジュールにユーザー名、パスワード、およびロールデータを保存するために使用されます。各ユーザーは、設定ファイル内の 1 行で表されます。この行の形式は、次のとおりです。

Username=Password[,Role][,Role]...
注記

JAAS OSGi 設定ログインモジュールでは、ユーザーグループはサポートされて いません

ブループリント設定のサンプル

以下の Blueprint 設定は、OSGi 設定ログインモジュールを使用して新しい karaf レルムを定義する方法を示しています。ここで、rank 属性を 200 に設定すると、デフォルトの karaf レルムが上書きされます。

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
  xmlns:jaas="http://karaf.apache.org/xmlns/jaas/v1.0.0"
  xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
  xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0">

  <jaas:config name="karaf" rank="200">
    <jaas:module flags="required"
className="org.apache.karaf.jaas.modules.osgi.OsgiConfigLoginModule">
        pid = org.jboss.example.osgiconfigloginmodule
    </jaas:module>
  </jaas:config>

</blueprint>

この例では、ユーザーデータはファイル InstallDir/etc/org.jboss.example.osgiconfigloginmodule.cfg に保存され、jaas:* コンソールを使用して設定を編集することはできません。

2.1.5. JAAS 公開鍵ログインモジュール

JAAS 公開鍵ログインモジュールは、ユーザーデータをフラットファイル形式で保存します。このファイル形式は、単純なテキストエディターを使用して直接編集できます。ただし、jaas:* コンソールのコマンドはサポートされません。

たとえば、Karaf コンテナーはデフォルトで JAAS パブリックキーログインモジュールを使用し、関連するユーザーデータを InstallDir/etc/keys.properties ファイルに保存します。

サポートされている認証情報

JAAS 公開鍵ログインモジュールは、SSH 鍵の認証情報を認証します。ユーザーがログインしようとすると、SSH プロトコルは保存されている公開鍵を使用してユーザーにチャレンジします。ユーザーは、チャレンジに答えるために、対応する秘密鍵を所有している必要があります。ログインが成功すると、ログインモジュールはユーザーに関連付けられているロールのリストを返します。

実装クラス

次のクラスは、JAAS 公開鍵ログインモジュールを実装します。

org.apache.karaf.jaas.modules.publickey.PublickeyLoginModule
JAAS ログインモジュールを実装します。
注記

公開鍵ログインモジュールのバッキングエンジンファクトリーはありません。つまり、jaas:* コンソールコマンドを使用してこのモジュールを管理することはできません。

オプション

JAAS 公開鍵ログインモジュールは、次のオプションをサポートしています。

users
公開鍵ログインモジュールのユーザープロパティーファイルの場所。

鍵プロパティーファイルの形式

keys.properties ファイルは、公開鍵ログインモジュールのユーザー名、公開鍵、およびロールデータを保存するために使用されます。各ユーザーは、鍵プロパティーファイルの 1 行で表されます。この行の形式は、次のとおりです。

Username=PublicKey[,UserGroup|Role][,UserGroup|Role]...

ここで PublicKey は、SSH キーペアの公開鍵の部分です (通常は UNIX システムの ~/.ssh/id_rsa.pub にあるユーザーのホームディレクトリーにあります) 。

たとえば、admin ロールでユーザー jdoe を作成するには、以下のようなエントリーを作成します。

jdoe=AAAAB3NzaC1kc3MAAACBAP1/U4EddRIpUt9KnC7s5Of2EbdSPO9EAMMeP4C2USZpRV1AIlH7WT2NWPq/xfW6MPbLm1Vs14E7gB00b/JmYLdrmVClpJ+f6AR7ECLCT7up1/63xhv4O1fnfqimFQ8E+4P208UewwI1VBNaFpEy9nXzrith1yrv8iIDGZ3RSAHHAAAAFQCXYFCPFSMLzLKSuYKi64QL8Fgc9QAAAnEA9+GghdabPd7LvKtcNrhXuXmUr7v6OuqC+VdMCz0HgmdRWVeOutRZT+ZxBxCBgLRJFnEj6EwoFhO3zwkyjMim4TwWeotifI0o4KOuHiuzpnWRbqN/C/ohNWLx+2J6ASQ7zKTxvqhRkImog9/hWuWfBpKLZl6Ae1UlZAFMO/7PSSoAAACBAKKSU2PFl/qOLxIwmBZPPIcJshVe7bVUpFvyl3BbJDow8rXfskl8wO63OzP/qLmcJM0+JbcRU/53Jj7uyk31drV2qxhIOsLDC9dGCWj47Y7TyhPdXh/0dthTRBy6bqGtRPxGa7gJov1xm/UuYYXPIUR/3x9MAZvZ5xvE0kYXO+rx,admin
重要

ここで、id_rsa.pub ファイルの内容をすべて挿入しないでください。公開鍵自体を表す記号のブロックだけを挿入します。

このファイルでは、ユーザーグループを定義することもできます。各ユーザーグループは、次の形式の 1 行で表されます。

_g_\:GroupName=Role1[,Role2]...

ブループリント設定のサンプル

以下の Blueprint 設定は、パブリックキーログインモジュールを使用して新しい karaf レルムを定義する方法を示しています。ここで、rank 属性を 200 に設定すると、デフォルトの karaf レルムが上書きされます。

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
  xmlns:jaas="http://karaf.apache.org/xmlns/jaas/v1.0.0"
  xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
  xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0">

<!--Allow usage of System properties, especially the karaf.base property-->
  <ext:property-placeholder
       placeholder-prefix="$[" placeholder-suffix="]"/>

  <jaas:config name="karaf" rank="200">
    <jaas:module flags="required"
className="org.apache.karaf.jaas.modules.publickey.PublickeyLoginModule">
        users = $[karaf.base]/etc/keys.properties
    </jaas:module>
  </jaas:config>

</blueprint>

この例では、ユーザーデータはファイル InstallDir/etc/keys.properties に保存され、jaas:* コンソールを使用して設定を編集することはできません。

2.1.6. JAAS JDBC ログインモジュール

概要

JAAS JDBC ログインモジュールを使用すると、Java Database Connectivity (JDBC) を使用してデータベースに接続し、ユーザーデータをデータベースバックエンドに格納できます。したがって、JDBC をサポートする任意のデータベースを使用してユーザーデータを格納できます。ユーザーデータを管理するには、ネイティブデータベースクライアントツールまたは jaas:* コンソールコマンドのいずれかを使用できます (バッキングエンジンは設定済みの SQL クエリーを使用して関連データベースの更新を実行します) 。

複数のログインモジュールを各ログインモジュールと組み合わせて、認証コンポーネントと認可コンポーネントの両方を提供できます。たとえば、デフォルトの PropertiesLoginModuleJDBCLoginModule を組み合わせてシステムにアクセスできるようにすることができます。

注記

JAAS JDBC ログインモジュールでは、ユーザーグループはサポートされて いません

サポートされている認証情報

JAAS JDBC ログインモジュールは、ユーザー名/パスワードのクレデンシャルを認証し、認証されたユーザーに関連付けられたロールのリストを返します。

実装クラス

次のクラスは、JAASJDBC ログインモジュールを実装します。

org.apache.karaf.jaas.modules.jdbc.JDBCLoginModule
JAAS ログインモジュールを実装します。
org.apache.karaf.jaas.modules.jdbc.JDBCBackingEngineFactory
OSGi サービスとして公開する必要があります。このサービスは、Apache Karaf シェルから jaas:* コンソールコマンドを使用してユーザーデータを管理できるようにします (olink:FMQCommandRef/Consolejaas を参照)。

オプション

JAAS JDBC ログインモジュールは、次のオプションをサポートしています。

datasource

OSGi サービスまたは JNDI 名として指定された JDBC データソース。次の構文を使用して、データソースの OSGi サービスを指定できます。

osgi:ServiceInterfaceName[/ServicePropertiesFilter]

ServiceInterfaceName は、データソースの OSGi サービス (通常は javax.sql.DataSource) によってエクスポートされるインターフェイスまたはクラスです。

複数のデータソースを Karaf コンテナー内の OSGi サービスとしてエクスポートできるため、通常、必要な特定のデータソースを選択するためにフィルター ServicePropertiesFilter を指定する必要があります。OSGi サービスのフィルターは、サービスプロパティー設定に適用され、LDAP フィルター構文から借用した構文に従います。

query.password
ユーザーのパスワードを取得する SQL クエリー。クエリーには 1 つの疑問符 ? を含めることができます。これは、実行時にユーザー名に置き換えられます。
query.role
ユーザーのロールを取得する SQL クエリー。クエリーには 1 つの疑問符 ? を含めることができます。これは、実行時にユーザー名に置き換えられます。
insert.user
新しいユーザーエントリーを作成する SQL クエリー。クエリーには 2 つの疑問符 ? を含めることができます。最初の疑問符はユーザー名に置き換えられ、2 つ目の疑問符は実行時にパスワードに置き換えられます。
insert.role
ユーザーエントリーにロールを追加する SQL クエリー。クエリーには 2 つの疑問符 ? を含めることができます。最初の疑問符はユーザー名に置き換えられ、2 つ目の疑問符は実行時にロールに置き換えられます。
delete.user
ユーザーエントリーを削除する SQL クエリー。クエリーには 1 つの疑問符 ? を含めることができます。これは、実行時にユーザー名に置き換えられます。
delete.role
ユーザーエントリーからロールを削除する SQL クエリー。クエリーには 2 つの疑問符 ? を含めることができます。最初の疑問符はユーザー名に置き換えられ、2 つ目の疑問符は実行時にロールに置き換えられます。
delete.roles
ユーザーエントリーから複数のロールを削除する SQL クエリー。クエリーには 1 つの疑問符 ? を含めることができます。これは、実行時にユーザー名に置き換えられます。

JDBC ログインモジュールの設定例

JDBC ログインモジュールを設定するには、次の主な手順を実行します。

データベーステーブルの作成

JDBC ログインモジュールを設定する前に、ユーザーデータを格納するためにバッキングデータベースにユーザー users テーブルと roles テーブルを設定する必要があります。たとえば、以下の SQL コマンドは、適切な users テーブルと roles テーブルの作成方法を示しています。

CREATE TABLE users (
  username VARCHAR(255) NOT NULL,
  password VARCHAR(255) NOT NULL,
  PRIMARY KEY (username)
);
CREATE TABLE roles (
  username VARCHAR(255) NOT NULL,
  role VARCHAR(255) NOT NULL,
  PRIMARY KEY (username,role)
);

users テーブルにはユーザー名/パスワードデータが格納され、roles テーブルはユーザー名を 1 つ以上のロールに関連付けます。

データソースの作成

JDBC ログインモジュールで JDBC データソースを使用するには、データソースインスタンスを作成し、データソースを OSGi サービスとしてエクスポートするのが正しい方法です。そうすることで、JDBC ログインモジュールは、エクスポートされた OSGi サービスを参照することにより、データソースにアクセスできるようになります。たとえば、Blueprint ファイルに以下のようなコードを使用して、MySQL データソースインスタンスを作成し、OSGi サービス (javax.sql.DataSource 型) として公開できます。

<blueprint xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
  <bean id="mysqlDatasource"
        class="com.mysql.jdbc.jdbc2.optional.MysqlDataSource">
    <property name="serverName" value="localhost"></property>
    <property name="databaseName" value="DBName"></property>
    <property name="port" value="3306"></property>
    <property name="user" value="DBUser"></property>
    <property name="password" value="DBPassword"></property>
  </bean>

  <service id="mysqlDS" interface="javax.sql.DataSource"
        ref="mysqlDatasource">
    <service-properties>
        <entry key="osgi.jndi.service.name" value="jdbc/karafdb"/>
    </service-properties>
  </service>
</blueprint>

上記のブループリント設定は、OSGi バンドルとして Karaf コンテナーにパッケージ化およびインストールする必要があります。

データソースを OSGi サービスとして指定

データソースがインスタンス化され、OSGi サービスとしてエクスポートされると、JDBC ログインモジュールを設定する準備が整います。特に、JDBC ログインモジュールの datasource オプションは、以下の構文を使用してデータソースの OSGi サービスを参照できます。

osgi:javax.sql.DataSource/(osgi.jndi.service.name=jdbc/karafdb)

ここで、javax.sql.DataSource はエクスポートされた OSGi サービスのインターフェイスタイプで、フィルター (osgi.jndi.service.name=jdbc/karafdb) は、osgi.jndi.service.name サービスプロパティーに値 jdbc/karafdb を持つ特定の javax.sql.DataSource インスタンスを選択します。

たとえば、以下の Blueprint 設定を使用して、サンプル MySQL データソースを参照する JDBC ログインモジュールで karaf レルムをオーバーライドできます。

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
  xmlns:jaas="http://karaf.apache.org/xmlns/jaas/v1.0.0"
  xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
  xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0">

<!--Allow usage of System properties, especially the karaf.base property-->
  <ext:property-placeholder
       placeholder-prefix="$[" placeholder-suffix="]"/>

  <jaas:config name="karaf" rank="200">
    <jaas:module flags="required"
      className="org.apache.karaf.jaas.modules.jdbc.JDBCLoginModule">
        datasource = osgi:javax.sql.DataSource/(osgi.jndi.service.name=jdbc/karafdb)
        query.password = SELECT password FROM users WHERE username=?
        query.role = SELECT role FROM roles WHERE username=?
        insert.user = INSERT INTO users VALUES(?,?)
        insert.role = INSERT INTO roles VALUES(?,?)
        delete.user = DELETE FROM users WHERE username=?
        delete.role = DELETE FROM roles WHERE username=? AND role=?
        delete.roles = DELETE FROM roles WHERE username=?
    </jaas:module>
  </jaas:config>

  <!-- The Backing Engine Factory Service for the JDBCLoginModule -->
  <service interface="org.apache.karaf.jaas.modules.BackingEngineFactory">
    <bean class="org.apache.karaf.jaas.modules.jdbc.JDBCBackingEngineFactory"/>
  </service>

</blueprint>
注記

上記の設定に示されている SQL ステートメントは、実際にはこれらのオプションのデフォルト値です。したがって、これらの SQL ステートメントと一致するユーザーテーブルとロールテーブルを作成する場合は、オプション設定を省略して、デフォルトに依存することができます。

JDBCLoginModule を作成する他に、前述の Blueprint 設定も JDBCBackingEngineFactory インスタンスをインスタンス化し、エクスポートします。これにより、jaas:* コンソールコマンドを使用してユーザーデータを管理できます。

2.1.7. JAAS LDAP ログインモジュール

概要

JAAS LDAP ログインモジュールを使用すると、ユーザーデータを LDAP データベースに保存できます。保存されたユーザーデータを管理するには、標準の LDAP クライアントツールを使用します。ただし、jaas:* コンソールのコマンドはサポートされません

Red Hat Fuse での LDAP の使用に関する詳細は、LDAP 認証チュートリアル を参照してください。

注記

ユーザーグループは、JAAS LDAP ログインモジュールではサポートされて いません

サポートされている認証情報

JAAS LDAP 設定ログインモジュールはユーザー名/パスワードのクレデンシャルを認証し、認証されたユーザーに関連付けられたロールのリストを返します。

実装クラス

次のクラスは、JAAS LDAP ログインモジュールを実装します。

org.apache.karaf.jaas.modules.ldap.LDAPLoginModule
JAAS ログインモジュールを実装します。Karaf コンテナーにプリロードされているため、バンドルをインストールする必要はありません。
注記

LDAP ログインモジュールのバッキングエンジンファクトリーはありません。つまり、jaas:* コンソールコマンドを使用してこのモジュールを管理することはできません。

オプション

JAAS LDAP ログインモジュールは、次のオプションをサポートしています。

認証

LDAP サーバーにバインドする際に使用する認証方法を指定します。有効な値は以下のとおりです。

  • simple — ユーザー名とパスワード認証でバインドします。connection.username および connection.password プロパティーを設定する必要があります。
  • none — 匿名でバインドします。この場合、connection.username プロパティーおよび connection.password プロパティーは割り当て解除できます。

    注記

    ディレクトリーサーバーへの接続は、検索を実行するためにのみ使用されます。この場合、認証されたバインドよりも高速であるため、匿名バインドがよく使用されます (ただし、ファイアウォールの背後に配置するなどして、ディレクトリーサーバーが十分に保護されていることも確認する必要があります)。

connection.url

LDAP URL (ldap://Host:Port) を使用してディレクトリーサーバーの場所を指定します。オプションでこの URL を修飾するには、スラッシュ / とその後にディレクトリーツリーの特定ノードの DN を追加します。この接続で SSL セキュリティーを有効にするには、URL で ldaps: スキームを指定する必要があります (例: ldaps://Host:Port)。スペース区切りリストで複数の URL を指定することもできます。次に例を示します。

connection.url=ldap://10.0.0.153:2389 ldap://10.10.178.20:389
connection.username
ディレクトリーサーバーへの接続を開くユーザーの DN を指定します。たとえば、uid=admin,ou=system です。DN に空白が含まれる場合、LDAPLoginModule は解析できません。唯一の解決策は、空白を含む DN 名の前後に二重引用符を追加してから、バックスラッシュを追加して引用符をエスケープすることです。たとえば、uid=admin,ou=\"system index\" になります。
connection.password
connection.username からの DN と一致するパスワードを指定します。ディレクトリーサーバーでは通常、パスワードは対応するディレクトリーエントリーの userPassword 属性として保存されます。
context.com.sun.jndi.ldap.connect.pool
true の場合、LDAP 接続の接続プールを有効にします。デフォルトは false です。
context.com.sun.jndi.ldap.connect.timeout
LDAP サーバーへの TCP 接続を作成するためのタイムアウトをミリ秒単位で指定します。デフォルト値は無限になっているため、接続試行がハングアップする可能性があるため、このプロパティーを明示的に設定することをお勧めします。
context.com.sun.jndi.ldap.read.timeout
LDAP 操作の読み取りタイムアウトをミリ秒単位で指定します。デフォルト値は無限になっているため、このプロパティーを明示的に設定することをお勧めします。
context.java.naming.referral

LDAP 参照 は、一部の LDAP サーバーでサポートされている間接参照の形式です。LDAP 参照は、1 つ以上の URL を含む LDAP サーバーのエントリーです (通常、別の LDAP サーバーの 1 つ以上のノードを参照します)。context.java.naming.referral プロパティーを使用すると、フォローする参照を有効または無効にすることができます。次のいずれかの値に設定できます。

  • follow は、参照をフォローします (LDAP サーバーによってサポートされることを前提とします)。
  • ignore は、すべての参照を通知せずに無視します。
  • throw は、リファールに遭遇するたびに PartialResultException を出力します。
disableCache
このプロパティーを true に設定すると、ユーザーおよびロールキャッシュを無効にできます。デフォルトは false です。
initial.context.factory
LDAP サーバーへの接続に使用されるコンテキストファクトリーのクラスを指定します。これは常に com.sun.jndi.ldap.LdapCtxFactory に設定する必要があります。
role.base.dn
ロールエントリーを検索する DIT のサブツリーの DN を指定します。たとえば、ou=groups,ou=system となります。
role.filter

ロールの検索に使用される LDAP 検索フィルターを指定します。これは、role.base.dn によって選択されるサブツリーに適用されます。たとえば、(member=uid=%u) となります。LDAP 検索操作に渡される前に、値は次のように文字列置換を受けます。

  • %u は、受信クレデンシャルから抽出されたユーザー名に置き換えられます。
  • %dn は、LDAP サーバーの対応するユーザーの RDN に置き換えられます (user.filter フィルターとの照合によって検出されます)。
  • %fqdn は、LDAP サーバーの対応するユーザーの DN に置き換えられます (user.filter フィルターとの照合によって検出されます)。
role.mapping

LDAP グループと JAAS ロールの間のマッピングを指定します。マッピングが指定されていない場合、デフォルトで各 LDAP グループは同じ名前の対応する JAAS ロールにマッピングされます。ロールマッピングは、次の構文で指定されます。

ldap-group=jaas-role(,jaas-role)*(;ldap-group=jaas-role(,jaas-role)*)*

各 LDAP グループ ldap-group は Common Name (CN) によって指定されます。

たとえば、LDAP グループ admindevop、および tester の場合は、以下のように JAAS ロールにマップできます。

role.mapping=admin=admin;devop=admin,manager;tester=viewer
role.name.attribute
ロール/グループの名前を含むロールエントリーの属性タイプを指定します。このオプションを省略すると、ロール検索機能は事実上無効になります。(例: cn)。
role.search.subtree
ロールエントリー検索範囲に、role.base.dn によって選択されたツリーのサブツリーが含まれるかどうかを指定します。true の場合、ロールルックアップは再帰的 (SUBTREE) になります。false の場合、ロールルックアップは最初のレベルでのみ実行されます (ONELEVEL)。
ssl
LDAP サーバーへの接続が SSL を使用して保護されているかどうかを指定します。connection.url が SSL ldaps:// で始まる場合は、このプロパティーに関係なく使用されます。
ssl.provider
LDAP 接続に使用する SSL プロバイダーを指定します。指定しない場合、デフォルトの SSL プロバイダーが使用されます。
ssl.protocol
SSL 接続に使用するプロトコルを指定します。SSLv3 プロトコルが使用されないようにするには (POODLE 脆弱性)、このプロパティーを TLSv1 に設定する 必要があります
ssl.algorithm
トラストストアマネージャーが使用するアルゴリズムを指定します。たとえば、PKIX です。
ssl.keystore
LDAP クライアント自身の X.509 証明書を格納するキーストアの ID (LDAP サーバーで SSL クライアント認証が有効になっている場合にのみ必要)。キーストアは、jaas:keystore 要素を使用してデプロイする必要があります (「Apache DS のサンプル設定」を参照)。
ssl.keyalias
LDAP クライアント独自の X.509 証明書のキーストアエイリアス (ssl.keystore によって指定されたキーストアに複数の証明書が保存される場合にのみ必要)。
ssl.truststore
LDAP サーバーの証明書を検証するために使用される信頼できる CA 証明書を格納するキーストアの ID (LDAP サーバーの証明書チェーンは、トラストストア内の証明書の 1 つによって署名されている必要があります)。キーストアは、jaas:keystore 要素を使用してデプロイする必要があります。
user.base.dn
ユーザーエントリーを検索するための DIT のサブツリーの DN を指定します。たとえば、ou=users,ou=system です。
user.filter

ユーザーの認証情報の検索に使用される LDAP 検索フィルターを指定します。これは、user.base.dn によって選択されるサブツリーに適用されます。たとえば、(uid=%u) です。LDAP 検索操作に渡される前に、値は次のように文字列置換を受けます。

  • %u は、受信クレデンシャルから抽出されたユーザー名に置き換えられます。
user.search.subtree
ユーザーエントリー検索範囲に、user.base.dn によって選択されたツリーのサブツリーが含まれるかどうかを指定します。true の場合、ユーザールックアップは再帰的 (SUBTREE) になります。false の場合、ユーザールックアップは最初のレベル (ONELEVEL) でのみ実行されます。

Apache DS のサンプル設定

以下の Blueprint 設定は、LDAP ログインモジュールを使用して新しい karaf レルムを定義する方法を示しています。ここで、rank 属性を 200 に設定すると、デフォルトの karaf レルムが上書きされ、LDAP ログインモジュールは Apache ディレクトリーサーバーに接続されます。

<?xml version="1.0" encoding="UTF-8"?>
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
  xmlns:jaas="http://karaf.apache.org/xmlns/jaas/v1.0.0"
  xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
  xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0">

  <jaas:config name="karaf" rank="100">

    <jaas:module className="org.apache.karaf.jaas.modules.ldap.LDAPLoginModule" flags="sufficient">
      debug=true

      <!-- LDAP Configuration -->
      initialContextFactory=com.sun.jndi.ldap.LdapCtxFactory
<!--  multiple LDAP servers can be specified as a space separated list of URLs -->
      connection.url=ldap://10.0.0.153:2389 ldap://10.10.178.20:389

<!--  authentication=none -->
      authentication=simple
      connection.username=cn=Directory Manager
      connection.password=directory

      <!-- User Info -->
      user.base.dn=dc=redhat,dc=com
      user.filter=(&amp;(objectClass=InetOrgPerson)(uid=%u))
      user.search.subtree=true

      <!-- Role/Group Info-->
      role.base.dn=dc=redhat,dc=com
      role.name.attribute=cn
<!--
      The 'dc=redhat,dc=com' used in the role.filter
      below is the user.base.dn.
-->
<!--      role.filter=(uniquemember=%dn,dc=redhat,dc=com) -->
      role.filter=(&amp;(objectClass=GroupOfUniqueNames)(UniqueMember=%fqdn))
      role.search.subtree=true

<!-- role mappings - a ';' separated list -->
      role.mapping=JBossAdmin=admin;JBossMonitor=viewer

<!-- LDAP context properties -->
      context.com.sun.jndi.ldap.connect.timeout=5000
      context.com.sun.jndi.ldap.read.timeout=5000

<!-- LDAP connection pooling -->
<!-- http://docs.oracle.com/javase/jndi/tutorial/ldap/connect/pool.html -->
<!-- http://docs.oracle.com/javase/jndi/tutorial/ldap/connect/config.html -->
     context.com.sun.jndi.ldap.connect.pool=true

<!-- How are LDAP referrals handled?

     Can be `follow`, `ignore` or `throw`.  Configuring `follow` may not work on all LDAP servers, `ignore` will
     silently ignore all referrals, while `throw` will throw a partial results exception if there is a referral.
-->
     context.java.naming.referral=ignore

<!-- SSL configuration -->
     ssl=false
     ssl.protocol=SSL
<!-- matches the keystore/truststore configured below -->
     ssl.truststore=ks
     ssl.algorithm=PKIX
<!-- The User and Role caches can be disabled - 6.3.0 179 and later -->
     disableCache=true
    </jaas:module>
  </jaas:config>

  <!-- Location of the SSL truststore/keystore
  <jaas:keystore name="ks" path="file:///${karaf.home}/etc/ldap.truststore" keystorePassword="XXXXXX" />
-->
</blueprint>
注記

SSL を有効にするには、connection.url 設定で ldaps スキームを使用する必要があります。

重要

Poodle 脆弱性 (CVE-2014-3566) から保護するには、ssl.protocolTLSv1(以降) に設定する必要があります。

さまざまなディレクトリーサーバーのフィルター設定

ディレクトリーサーバー間の最も重要な違いは、LDAP ログインモジュールでのフィルターオプションの設定に関連しています。正確な設定は、最終的には DIT の設定によって異なりますが、次の表は、さまざまなディレクトリーサーバーに必要な一般的なロールフィルター設定を示しています。

ディレクトリーサーバー一般的なフィルター設定

389-DS

Red Hat DS

user.filter=(&amp;(objectClass=InetOrgPerson)(uid=%u))
role.filter=(uniquemember=%fqdn)

MS Active Directory

user.filter=(&amp;(objectCategory=person)(samAccountName=%u))
role.filter=(uniquemember=%fqdn)

Apache DS

user.filter=(uid=%u)
role.filter=(member=uid=%u)

OpenLDAP

user.filter=(uid=%u)
role.filter=(member:=uid=%u)
注記

上記の表では、オプション設定が Blueprint XML ファイルに組み込まれるため、& 記号 (論理 And 演算子を表す) は &amp; としてエスケープ処理されます。

2.1.8. JAAS ログ監査ログインモジュール

ログインモジュール org.apache.karaf.jaas.modules.audit.LogAuditLoginModule は、認証試行の堅牢なロギングを提供します。最大ファイルサイズの設定、ログローテーション、ファイル圧縮、フィルターリングなどの標準的なログ管理機能をサポートしています。これらのオプションの設定は、ロギング設定ファイルで確立します。

デフォルトでは、認証監査ロギングは無効になっています。ロギングを有効にするには、ロギング設定と監査設定を定義してから、2 つをリンクする必要があります。ロギング設定では、ファイルアペンダー プロセスと ロガー プロセスのプロパティーを指定します。ファイルアペンダーは、認証イベントに関する情報を指定されたファイルに公開します。ロガーは、認証イベントに関する情報を取得し、指定したアペンダーがそれを利用できるようにするメカニズムです。標準の Karaf Log4j ロギング設定ファイル etc/org.ops4j.pax.logging.cfg でロギング設定を定義します。

監査設定により、監査ロギングとロギングフラストラクチャーへのリンクが使用可能になります。監査設定は、etc/org.apache.karaf.jaas.cfg ファイルに定義します。

アペンダー設定

デフォルトでは、標準の Karaf Log4j 設定ファイル (etc/org.ops4j.pax.logging.cfg) は、AuditRollingFile という名前の監査ロギングアペンダーを定義します。

次のサンプル設定ファイルの抜粋は、${karaf.data}/security/audit.log で監査ログファイルに書き込むアペンダーのプロパティーを示しています。

# Audit file appender
log4j2.appender.audit.type = RollingRandomAccessFile
log4j2.appender.audit.name = AuditRollingFile
log4j2.appender.audit.fileName = ${karaf.data}/security/audit.log
log4j2.appender.audit.filePattern = ${karaf.data}/security/audit.log.%i
log4j2.appender.audit.append = true
log4j2.appender.audit.layout.type = PatternLayout
log4j2.appender.audit.layout.pattern = ${log4j2.pattern}
log4j2.appender.audit.policies.type = Policies
log4j2.appender.audit.policies.size.type = SizeBasedTriggeringPolicy
log4j2.appender.audit.policies.size.size = 8MB

アペンダーを使用するには、アペンダーがログファイルに公開するための情報を提供するロガーを設定する必要があります。

ロガー設定

デフォルトでは、Karaf Log4j 設定ファイル (etc/org.ops4j.pax.logging.cfg) は、org.apache.karaf.jaas.modules.audit という名前の監査ロガーを定義します。次のサンプル設定ファイルの抜粋では、認証イベントに関する情報を、AuditRollingFile という名前のアペンダーに提供するようにデフォルトロガーが設定されています。

log4j2.logger.audit.name = org.apache.karaf.jaas.modules.audit
log4j2.logger.audit.level = INFO
log4j2.logger.audit.additivity = false
log4j2.logger.audit.appenderRef.AuditRollingFile.ref = AuditRollingFile

log4j2.logger.audit.appenderRef.AuditRollingFile.ref の値は、etc/org.ops4j.pax.logging.cfgAudit file appender セクションの log4j2.appender.audit.name の値と一致する必要があります。

2.1.8.1. 認証監査ロギングの有効化

ロギング設定を確立した後、監査ロギングをオンにして、ロギング設定を監査設定に接続できます。

監査ロギングを有効にするには、以下の行を etc/org.apache.karaf.jaas.cfg に挿入します。

audit.log.enabled = true
audit.log.logger = <logger.name>
audit.log.level = <level>

<logger.name> は、org.jboss.fuse.auditcom.example.audit など、Apache Log4J ライブラリーと Log4J2 ライブラリーによって確立される標準のロガー (カテゴリー) 名のドット区切り形式を表します。<level>` は、WARNINFOTRACEDEBUG などのログレベル設定を表します。

たとえば、以下のサンプル監査設定ファイルにある以下の抜粋で、監査ログが有効になり、org.apache.karaf.jaas.modules.audit という名前の監査ロガーを使用するように設定されます。

audit.log.enabled = true
audit.log.logger = org.apache.karaf.jaas.modules.audit
audit.log.level = INFO

audit.log.logger の値は、Karaf Log4j 設定ファイル (etc/org.ops4j.pax.logging.cfg) の log4j2.logger.audit.name の値と一致する必要があります。

ファイルを更新すると、Apache Felix ファイルインストールバンドルが変更を検出し、Apache Felix 設定管理サービス ( Config Admin) の設定を更新します。次に、Config Admin からの設定がロギングインフラストラクチャーに渡されます。

設定ファイルを更新するための Apache Karaf シェルコマンド

<FUSE_HOME>/etc の設定ファイルは直接編集するか、Apache Karaf config:* コマンドを実行して、Config Admin を更新できます。

config* コマンドを使用して設定を更新すると、Apache Felix File Install バンドルは変更について通知され、関連する etc/*.cfg ファイルが自動的に更新されます。

例: config コマンドを使用した JAAS レルムのプロパティーの一覧表示

JAAS レルムのプロパティーを一覧表示するには、シェルプロンプトから次のコマンドを入力します。

config:property-list --pid org.apache.karaf.jaas

このコマンドは、次の例のとおり、レルムの現在のプロパティーを返します。

   audit.log.enabled = true
   audit.log.level = INFO
   audit.log.logger = org.apache.karaf.jaas.modules.audit
   encryption.algorithm = MD5
   encryption.enabled = false
   encryption.encoding = hexadecimal
   encryption.name =
   encryption.prefix = {CRYPT}
   encryption.suffix = {CRYPT}

例: config コマンドを使用した監査ログレベルの変更

レルムの監査ログレベルを DEBUG に変更するには、シェルプロンプトで、config:property-set --pid org.apache.karaf.jaas audit.log.level DEBUGを入力します。

変更が有効であることを確認するには、再度プロパティーをリストして、audit.log.level の値を確認します。

2.1.9. JAAS ファイル監査ログインモジュール

認証モジュール org.apache.karaf.jaas.modules.audit.FileAuditLoginModule は、認証試行の堅牢なロギングを提供します。ファイル監査ログインモジュールは、指定されたファイルに直接書き込みます。Pax ロギングインフラストラクチャーに依存しないため、設定は簡単です。ただし、ログ監査ログインモジュール とは異なり、パターンフィルターリングやログファイルローテーションなどのログ管理機能はサポートされていません。

FileAuditLoginModule で監査ロギングを有効にするには、以下の行を etc/org.apache.karaf.jaas.cfg に挿入します。

audit.file.enabled = true
audit.file.file = ${karaf.data}/security/audit.log
注記

通常、ファイル監査ログインモジュールログ監査ログインモジュール の両方を使用して監査ログを設定することはありません。両方のモジュールでログを有効にする場合、一意のターゲットログファイルを使用するように各モジュールを設定することで、データの損失を回避できます。

2.1.10. 保存されたパスワードの暗号化

デフォルトでは、JAAS ログインモジュールはパスワードをプレインテキスト形式で保存します。ファイルのアクセス許可を適切に設定することでこのようなデータを保護でき、そのように保護する必要もありますが、パスワードを (メッセージダイジェスト アルゴリズムを使用して) 非表示形式で保存することで、パスワードをさらに保護できます。

Red Hat Fuse は、パスワード暗号化を有効にするための一連のオプションを提供します。これは、任意 の JAAS ログインモジュール (不要な公開鍵ログインモジュールを除く) と組み合わせることができます。

重要

メッセージダイジェストアルゴリズムを解読するのは困難ですが、攻撃に対して無防備ではありません (たとえば、暗号化ハッシュ関数に関する Wikipedia の記事 を参照してください)。パスワードを含むファイルを保護するために、パスワードの暗号化の使用に加え、常にファイル権限を使用してください。

オプション

オプションで、次のログインモジュールのプロパティーを設定することにより、JAAS ログインモジュールのパスワード暗号化を有効にできます。これには、「Jasypt 暗号化を使用したログインモジュールの例」 の説明に従って InstallDir/etc/org.apache.karaf.jaas.cfg ファイルを編集するか、または独自の Blueprint ファイルをデプロイします。

encryption.enabled
パスワード暗号化を有効にするには、true に設定します。
encryption.name
OSGi サービスとして登録されている暗号化サービスの名前。
encryption.prefix
暗号化されたパスワードの接頭辞。
encryption.suffix
暗号化されたパスワードの接尾辞。
encryption.algorithm

暗号化アルゴリズムの名前を指定します (例: MD5 または SHA-1)。次の暗号化アルゴリズムのいずれかを指定できます。

  • MD2
  • MD5
  • SHA-1
  • SHA-256
  • SHA-384
  • SHA-512
encryption.encoding
暗号化されたパスワードのエンコード: hexadecimal または base64
encryption.providerName (Jasypt のみ)
ダイジェストアルゴリズムを提供する java.security.Provider インスタンスの名前。
encryption.providerClassName (Jasypt のみ)
ダイジェストアルゴリズムを提供するセキュリティープロバイダーのクラス名
encryption.iterations (Jasypt のみ)
ハッシュ関数を再帰的に適用する回数。
encryption.saltSizeBytes (Jasypt のみ)
ダイジェストの計算に使用されるソルトのサイズ。
encryption.saltGeneratorClassName (Jasypt のみ)
ソルトジェネレーターのクラス名。
role.policy
ロールプリンシパルを識別するためのポリシーを指定します。値 prefix または group を指定できます。
role.discriminator
ロールポリシーで使用される識別子の値を指定します。

暗号化サービス

Fuse が提供する暗号化サービスは 2 つあります。

独自の暗号化サービスを作成することもできます。これを実行するには、以下を行います。

  • org.apache.karaf.jaas.modules.EncryptionService インターフェイスを実装
  • 実装を OSGI サービスとして公開します。

次のリストは、カスタム暗号化サービスを OSGI コンテナーに公開する方法を示しています。

<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">

    <service interface="org.apache.karaf.jaas.modules.EncryptionService">
        <service-properties>
            <entry key="name" value="jasypt" />
        </service-properties>
        <bean class="org.apache.karaf.jaas.jasypt.impl.JasyptEncryptionService"/>
    </service>
    ...
</blueprint>

Basic 暗号化サービス

Basic 暗号化サービスは、デフォルトで Karaf コンテナーにインストールされ、encryption.name プロパティーを basic という値に設定することで参照が可能です。Basic 暗号化サービスでは、メッセージダイジェストアルゴリズムは SUN セキュリティープロバイダー (Oracle JDK のデフォルトのセキュリティープロバイダー) によって提供されます。

Jasypt 暗号化

Jasypt 暗号化サービスは通常、デフォルトで Karaf にインストールされます。必要に応じて、以下のように jasypt-encryption 機能をインストールして明示的にインストールできます。

JBossA-MQ:karaf@root> features:install jasypt-encryption

このコマンドは、必要な Jasypt バンドルをインストールし、Jasypt 暗号化を OSGi サービスとしてエクスポートして、JAAS ログインモジュールで使用できるようにします。

Jasypt 暗号化の詳細については、Jasypt のドキュメント を参照してください。

Jasypt 暗号化を使用したログインモジュールの例

デフォルトでは、パスワードは etc/users.properties ファイルにクリアテキストで保存されます。jasypt-encryption 機能をインストールし、etc/org.apache.karaf.jaas.cfg 設定ファイルを変更することで、暗号化を有効にできます。

  1. 機能 jasypt-encryption をインストールします。これにより、jasypt サービスがインストールされます。

    karaf@root> features:install jasypt-encryption

    これで、jaas コマンドを使用してユーザーを作成できます。

  2. $FUSE_HOME/etc/org.apache.karaf.jaas.cfg ファイルを開き、次のように変更します。encryption.enabled = trueencryption.name = jasypt、およびこの場合は encryption.algorithm = SHA-256 を設定します。その他の encryption.algorithm オプションは、要件に応じて設定できます。

    #
    # Boolean enabling / disabling encrypted passwords
    #
    encryption.enabled = true
    
    #
    # Encryption Service name
    #   the default one is 'basic'
    #   a more powerful one named 'jasypt' is available
    #       when installing the encryption feature
    #
    encryption.name = jasypt
    
    #
    # Encryption prefix
    #
    encryption.prefix = {CRYPT}
    
    #
    # Encryption suffix
    #
    encryption.suffix = {CRYPT}
    
    #
    # Set the encryption algorithm to use in Karaf JAAS login module
    # Supported encryption algorithms follow:
    #   MD2
    #   MD5
    #   SHA-1
    #   SHA-256
    #   SHA-384
    #   SHA-512
    #
    encryption.algorithm = SHA-256
  3. Karaf コンソールで jaas:realms コマンドを入力し、デプロイされたログインモジュールを表示します。

    karaf@root()> jaas:realms
    
    Index │ Realm Name │ Login Module Class Name
    
    ──────┼────────────┼───────────────────────────────────────────────────────────────
    
    1     │ karaf      │ org.apache.karaf.jaas.modules.properties.PropertiesLoginModule
    
    2     │ karaf      │ org.apache.karaf.jaas.modules.publickey.PublickeyLoginModule
    
    3     │ karaf      │ org.apache.karaf.jaas.modules.audit.FileAuditLoginModule
    
    4     │ karaf      │ org.apache.karaf.jaas.modules.audit.LogAuditLoginModule
    
    5     │ karaf      │ org.apache.karaf.jaas.modules.audit.EventAdminAuditLoginModule
  4. 次のコマンドを入力して、ユーザーを作成します。

    karaf@root()> jaas:realm-manage --index 1
    
    karaf@root()> jaas:user-list
    
    User Name │ Group      │ Role
    
    ──────────┼────────────┼──────────────
    
    admin     │ admingroup │ admin
    
    admin     │ admingroup │ manager
    
    admin     │ admingroup │ viewer
    
    admin     │ admingroup │ systembundles
    
    admin     │ admingroup │ ssh
    
    karaf@root()> jaas:useradd usertest test123
    
    karaf@root()> jaas:group-add usertest admingroup
    
    karaf@root()> jaas:update
    
    karaf@root()> jaas:realm-manage --index 1
    
    karaf@root()> jaas:user-list
    
    User Name │ Group      │ Role
    
    ──────────┼────────────┼──────────────
    
    admin     │ admingroup │ admin
    
    admin     │ admingroup │ manager
    
    admin     │ admingroup │ viewer
    
    admin     │ admingroup │ systembundles
    
    admin     │ admingroup │ ssh
    
    usertest  │ admingroup │ admin
    
    usertest  │ admingroup │ manager
    
    usertest  │ admingroup │ viewer
    
    usertest  │ admingroup │ systembundles
    
    usertest  │ admingroup │ ssh
  5. $FUSE_HOME/etc/users.properties ファイルを見ると、ユーザー usertest がファイルに追加されていることがわかります。

    admin = {CRYPT}WXX+4PM2G7nT045ly4iS0EANsv9H/VwmStGIb9bcbGhFH5RgMuL0D3H/GVTigpga{CRYPT},_g_:admingroup
    
    _g_\:admingroup = group,admin,manager,viewer,systembundles,ssh
    
    usertest = {CRYPT}33F5E76E5FF97F3D27D790AAA1BEE36057410CCDBDBE2C792239BB2853D17654315354BB8B608AD5{CRYPT},_g_:admingroup
  6. 既に jaas:update コマンドを実行しているので、新たに作成したログインを別のターミナルでテストできます。

2.1.11. JAAS と HTTP Basic 認証のインテグレーション

Servlet REST を使用すると、REST DSL を使用して Camel ルートに REST エンドポイントを定義できます。次の例は、HTTP 基本認証によって保護されている REST エンドポイントがユーザー認証を Karaf JAAS サービスに委任する方法を示しています。

手順

  1. Apache Camel を CamelInstallDir にインストールした場合、以下のディレクトリーでサンプルを見つけることができます。

    CamelInstallDir/examples/camel-example-servlet-rest-karaf-jaas
  2. Maven を使用して、サンプルを OSGi バンドルとしてビルドおよびインストールします。コマンドプロンプトを開き、現在のディレクトリーを CamelInstallDir/examples/camel-example-servlet-rest-karaf-jaas に切り替え、以下のコマンドを入力します。

    mvn install
  3. セキュリティー設定ファイルを KARAF_HOME/etc フォルダーにコピーするには、以下のコマンドを入力します。

    cp src/main/resources/org.ops4j.pax.web.context-camelrestdsl.cfg $KARAF_HOME/etc
  4. Karaf に Apache Camel をインストールするには、Karaf シェルコンソールで次のコマンドを入力します。

    feature:repo-add camel ${project.version}
    feature:install camel
  5. camel-servletcamel-jackson、および war Karaf 機能も必要で、以下のコマンドを入力してこれらの機能をインストールします。

    feature:install camel-servlet
    feature:install camel-jackson
    feature:install war
  6. camel-example-servlet-rest-karaf-jaas サンプルをインストールするには、以下のコマンドを入力します。

    install -s mvn:org.apache.camel.example/camel-example-servlet-rest-karaf-jaas/${project.version}

結果

アプリケーションが実行中であることを確認するには、以下のコマンドを入力してアプリケーションログファイルを表示できます (ログの表示を停止する場合は ctrl+c を使用)。

log:tail

REST user エンドポイントは以下の操作をサポートします。

  • GET /user/{id} - 指定 ID を持つユーザーを表示する
  • GET /user/final - すべてのユーザーを表示する
  • PUT /user - ユーザーを更新/作成する
注記

view 操作は HTTP GET を使用し、update 操作は HTTP PUT を使用します。

2.1.11.1. Web ブラウザーから REST サービスにアクセス

以下の例を使用して、Web ブラウザーからサービスにアクセスできます (admin をユーザー、admin をパスワードとしてポップアップダイアログボックスに入力する必要があります)。

例: ユーザー ID 123 を表示

http://localhost:8181/camel-example-servlet-rest-blueprint/rest/user/123

例: すべてのユーザーを一覧表示

http://localhost:8181/camel-example-servlet-rest-blueprint/rest/user/findAll

2.1.11.2. コマンドラインから REST サービスへのアクセス

以下の例のように、コマンドラインから curl を使用して REST user エンドポイントにアクセスできます。

例: ユーザー ID 123 を表示

curl -X GET -H "Accept: application/json" --basic -u admin:admin http://localhost:8181/camel-example-servlet-rest-blueprint/rest/user/123

例: すべてのユーザーを表示します

curl -X GET -H "Accept: application/json" --basic -u admin:admin http://localhost:8181/camel-example-servlet-rest-blueprint/rest/user/findAll

例: ユーザー ID 234 を作成または更新します

curl -X PUT -d "{ \"id\": 234, \"name\": \"John Smith\"}" -H "Accept: application/json" --basic -u admin:admin http://localhost:8181/camel-example-servlet-rest-blueprint/rest/user