第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
およびロール admin
で jdoe
ユーザーを作成するには、以下のようなエントリーを作成します。
jdoe=topsecret,admin
admin
ロールは、jdoe
ユーザーに完全な管理権限を付与します。
プロパティーログインモジュールでのユーザーグループの設定
ユーザーに直接ロールを割り当てる代わりに (またはそれに加えて)、プロパティーログインモジュールの user groups にユーザーを追加するオプションもあります。プロパティーログインモジュールでユーザーグループを作成するには、テキストエディターを使用して InstallDir/etc/users.properties
ファイルを開き、以下の構文で行を追加します。
_g_\:GroupName=Role1,Role2,...
たとえば、ロール group
および admin
で admingroup
ユーザーグループを作成するには、以下のようなエントリーを作成します。
_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
および admin
で admingroup
ユーザーグループを作成するには、以下のようなエントリーを作成します。
_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
レルムをすべてオーバーライドするように、rank
を100
以上に設定する必要があります。
-
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 クエリーを使用して関連データベースの更新を実行します) 。
複数のログインモジュールを各ログインモジュールと組み合わせて、認証コンポーネントと認可コンポーネントの両方を提供できます。たとえば、デフォルトの PropertiesLoginModule
と JDBCLoginModule
を組み合わせてシステムにアクセスできるようにすることができます。
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 グループ
admin
、devop
、および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=(&(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=(&(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.protocol
を TLSv1
(以降) に設定する必要があります。
さまざまなディレクトリーサーバーのフィルター設定
ディレクトリーサーバー間の最も重要な違いは、LDAP ログインモジュールでのフィルターオプションの設定に関連しています。正確な設定は、最終的には DIT の設定によって異なりますが、次の表は、さまざまなディレクトリーサーバーに必要な一般的なロールフィルター設定を示しています。
ディレクトリーサーバー | 一般的なフィルター設定 |
---|---|
389-DS Red Hat DS |
user.filter=(&(objectClass=InetOrgPerson)(uid=%u)) role.filter=(uniquemember=%fqdn) |
MS Active Directory |
user.filter=(&(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 演算子を表す) は &
としてエスケープ処理されます。
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.cfg
の Audit 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.audit
や com.example.audit
など、Apache Log4J ライブラリーと Log4J2 ライブラリーによって確立される標準のロガー (カテゴリー) 名のドット区切り形式を表します。<level>`
は、WARN
、INFO
、TRACE
、DEBUG
などのログレベル設定を表します。
たとえば、以下のサンプル監査設定ファイルにある以下の抜粋で、監査ログが有効になり、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 つあります。
-
encryption.name = basic
(「Basic 暗号化サービス」 で説明されている) -
encryption.name = jasypt
(「Jasypt 暗号化」 で説明されている)
独自の暗号化サービスを作成することもできます。これを実行するには、以下を行います。
-
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
設定ファイルを変更することで、暗号化を有効にできます。
機能
jasypt-encryption
をインストールします。これにより、jasypt
サービスがインストールされます。karaf@root> features:install jasypt-encryption
これで、
jaas
コマンドを使用してユーザーを作成できます。$FUSE_HOME/etc/org.apache.karaf.jaas.cfg
ファイルを開き、次のように変更します。encryption.enabled = true
、encryption.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
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
次のコマンドを入力して、ユーザーを作成します。
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
$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
-
既に
jaas:update
コマンドを実行しているので、新たに作成したログインを別のターミナルでテストできます。
2.1.11. JAAS と HTTP Basic 認証のインテグレーション
Servlet REST を使用すると、REST DSL を使用して Camel ルートに REST エンドポイントを定義できます。次の例は、HTTP 基本認証によって保護されている REST エンドポイントがユーザー認証を Karaf JAAS サービスに委任する方法を示しています。
手順
Apache Camel を
CamelInstallDir
にインストールした場合、以下のディレクトリーでサンプルを見つけることができます。CamelInstallDir/examples/camel-example-servlet-rest-karaf-jaas
Maven を使用して、サンプルを OSGi バンドルとしてビルドおよびインストールします。コマンドプロンプトを開き、現在のディレクトリーを
CamelInstallDir/examples/camel-example-servlet-rest-karaf-jaas
に切り替え、以下のコマンドを入力します。mvn install
セキュリティー設定ファイルを
KARAF_HOME/etc
フォルダーにコピーするには、以下のコマンドを入力します。cp src/main/resources/org.ops4j.pax.web.context-camelrestdsl.cfg $KARAF_HOME/etc
Karaf に Apache Camel をインストールするには、Karaf シェルコンソールで次のコマンドを入力します。
feature:repo-add camel ${project.version} feature:install camel
camel-servlet
、camel-jackson
、およびwar
Karaf 機能も必要で、以下のコマンドを入力してこれらの機能をインストールします。feature:install camel-servlet feature:install camel-jackson feature:install war
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