2.5. Elytron クレデンシャルストアの使用
Fuse には、JBoss EAP の一部である Elytron クレデンシャルストア機能が含まれています。クレデンシャルストアは、機密性の高いテキスト文字列をストレージファイルで暗号化することで、それらを安全に保護できます。各コンテナーには、必ず 1 つのクレデンシャルストアを含めることができます。
セキュアな設定では、パスワードの保存方法が一般的な問題です。たとえば、さまざまなアプリケーションからデータベースにアクセスするためのパスワードについて考えてみます。多くの認証方法では、パスワードをクリアテキストで使用できなければ、サーバーはデータベースサーバーにクレデンシャルを送信できません。通常、クリアテキストパスワードをテキスト設定ファイルに保存することは適切ではありません。
Elytron クレデンシャルストアはこの問題を解決します。パスワードやその他の機密性の高い値は、PKCS#12 仕様に準拠した暗号化ファイルであるクレデンシャルストアにセキュアに保存できます。クレデンシャルストアは、暗号化されていない値を保存しません。クレデンシャルストアは、PBE (Password Based Encryption) を使用して、パスワードなどの機密性の高い値とストア自体の両方を暗号化します。
詳細は以下のセクションを参照してください。
2.5.1. クレデンシャルストアの使用
Fuse を実行している Apache Karaf コンテナーで、クレデンシャルストアを使用するには、クレデンシャルストアを作成および設定してから、それに値を追加します。Fuse は引き続き実行され、クレデンシャルストアは使用可能になります。
前提条件
クレデンシャルストアを作成する際に、次のデフォルトを使用する。
- PKCS#12 クレデンシャルストアを作成する。
-
masked-SHA1-DES-EDE
アルゴリズムを適用してクレデンシャルストアを暗号化する。 - アルゴリズムを 200000 回繰り返す。
-
${karaf.etc}/credential.store.p12
でクレデンシャルストアを見つける。
-
クレデンシャルストア設定を
${karaf.etc}/system.properties
に保存する。
この動作を変更する必要がある場合は、 credential-store:create
コマンドの呼び出しに 関する情報を参照してください。
手順
クレデンシャルストアのパスワードを選択します。
後で、クレデンシャルストアに値を追加するとき、または値を復号化するとき、クレデンシャルストアコマンドはクレデンシャルストアのパスワードを使用して値を暗号化および復号化します。
credential-store:create
コマンドを実行します。これにより、選択したクレデンシャルストアのパスワードを入力するよう要求されます。karaf@root()> credential-store:create --persist Credential store password: ***** Credential store password (repeat): ***** Credential store configuration was persisted in ${karaf.etc}/system.properties and is effective. Credential store was written to /data/servers/fuse-karaf-7.4.0.fuse-740060/etc/credential.store.p12 By default, only system properties are encrypted. Encryption of configuration admin properties can be enabled by setting felix.cm.pm=elytron in etc/config.properties.
このコマンドは、
etc/system.properties
に以下のような設定を書き込みます。credential.store.location = /data/servers/fuse-karaf-7.4.0.fuse-740060/etc/credential.store.p12 credential.store.protection.algorithm = masked-SHA1-DES-EDE credential.store.protection.params = MDkEKFJId25PaXlVQldKUWw5R2tLclhZQndpTGhhVXJsWG5lNVJMbTFCZEMCAwMNQAQI0Whepb7H1BA= credential.store.protection = m+1BcfRyCnI=
以下のように
credential-store:store
コマンドを実行し、暗号化された値をクレデンシャルストアに追加します。credential-store:store alias
alias
を一意の鍵値に置き換えます。ツールは、後でクレデンシャルストアに追加する暗号化された値を取得するために、このエイリアスを使用します。たとえば、コードでdb.password
システムプロパティーを使用し、etc/system.properties
ファイルにdb.password
プロパティーをデータベースの実際のパスワードに設定するエントリーがあるとします。システムプロパティーdb.password
をエイリアスとして指定することが推奨されます。このコマンドを呼び出すと、クレデンシャルストアに追加する機密値を入力して確認するように求められます。プロンプトが表示されたら、
db.password
エイリアスの例を続行し、データベースの実際のパスワードを入力します。karaf@root()> credential-store:store db.password Secret value to store: ****** Secret value to store (repeat): ****** Value stored in the credential store. To reference it use: CS:db.password
etc/system.properties
ファイルのエントリーを更新するか、新しいエントリーを追加します。更新または追加するエントリーは、credential-store:store
コマンドで指定したエイリアスを、コマンドが出力する参照値に設定します。以下に例を示します。db.password = CS:db.password
Fuse が設定されたクレデンシャルストアで稼働している場合、
db.password
システムプロパティーなどの各インスタンスを、クレデンシャルストアにある実際のシークレット値に動的に置き換えます。-
credential-store:store
コマンドでは、指定したエイリアスが既に使用されているシステムプロパティーである場合は、次のステップをスキップします。コードでシークレットに指定したエイリアスをまだ使用していない場合は、シークレットを必要とする各ファイルで、前の手順でシステムプロパティーとして追加したエイリアスを指定します。たとえば、コードはdb.password
を参照します。 - クレデンシャルストアに追加する値ごとに、前の 3 つの手順を繰り返します。
結果
クレデンシャルストアを使用する準備が整いました。Fuse が起動するか、クレデンシャルストアバンドルが再起動すると、システムプロパティーを処理し、クレデンシャルストアエントリーへの参照を検索します。実行するシステムプロパティーごとに、Fuse はクレデンシャルストアから関連する値を取得し、システムプロパティーを実際のシークレット値に置き換えます。実際のシークレット値は、そのシステムプロパティーのインスタンスを含むすべてのコンポーネント、バンドル、およびコードで使用できます。
2.5.2. システムプロパティーがクレデンシャルストア設定を保持している場合の動作
クレデンシャルストアが使用されており、システムプロパティーを使用してその設定パラメーターを保持しているとします。Fuse が起動すると、すべてのシステムプロパティーが処理されます。Fuse は、CS:
接頭辞を持つ値に設定されたシステムプロパティーをクレデンシャルストアにある関連する値に置き換えます。Fuse は java.lang:type=Runtime
JMX MBean をプロキシーし、JMX getSystemProperties()
メソッドの呼び出しごとに復号化された値を非表示にします。
たとえば、クレデンシャルストアに 1 つのエントリーがあるとします。
karaf@root()> credential-store:list --show-secrets Alias │ Reference │ Secret value ────────────┼────────────────┼───────────── db.password │ CS:db.password │ sec4et
このエントリーをクレデンシャルストアに追加した後に、etc/system.properties
ファイルを編集し、次のエントリーを追加したとします。
db.password = CS:db.password
Fuse の起動時に、または org.jboss.fuse.modules.fuse-credential-store-core
バンドルを再起動すると、Fuse は db.password
システムプロパティーへの参照をチェックします。各参照で、Fuse は CS:db.password
エイリアスを使用してクレデンシャルストアから関連する値を取得します。これを確認するには、次のコマンドを呼び出します。
karaf@root()> system:property db.password sec4et
ただし、JMX を使用してこれを確認すると、クレデンシャルストアの値は非表示になります。
2.5.3. クレデンシャルストアのシステムプロパティーと環境変数の説明
システムプロパティーまたは環境変数を使用して、クレデンシャルストアの設定パラメーターを保持できます。クレデンシャルストアを作成するときに指定するオプションによって、次のことが決まります。
- プロパティーまたは変数を自分で設定する必要があるかどうか。
- プロパティーまたは変数に設定されている、または設定する必要がある正確な値。
プロパティー/変数を理解すると、クレデンシャルストアがどのように機能するかを理解するのに役立ちます。
credential-store:create
コマンドを実行し、--persist
オプションのみを指定すると、コマンドはシステムプロパティーをクレデンシャルストア設定パラメーターに設定します。クレデンシャルストアのシステムプロパティーは明示的に設定する必要はありません。
代わりにクレデンシャルストア環境変数を使用するか、credential-store:create
コマンドのデフォルト動作を変更するには、クレデンシャルストアの作成時に指定できるオプションに関する詳細は、credential-store:create
コマンドリファレンス を参照してください。
クレデンシャルストアを作成するコマンドを呼び出すと、指定したオプションによってクレデンシャルストアのプロパティーまたは変数の設定が決まります。プロパティーまたは変数を独自に設定する必要がある場合、credential-store:create
コマンドの出力には、その手順が含まれます。つまり、クレデンシャルストアのシステムプロパティーまたは環境変数の設定を決定するのはユーザーではありません。credential-store:create
コマンドを実行すると常に設定が決定されます。
次の表は、クレデンシャルストアのプロパティーと変数について説明しています。特定のパラメーターについて、環境変数とシステムプロパティーの両方が設定されている場合、環境変数の設定が優先されます。
名前。 | 説明 |
---|---|
環境変数:
システムプロパティー: | クレデンシャルストアコマンドが暗号化キーを取得するために使用する Password Based Encryption (PBE) アルゴリズム。 |
環境変数:
システムプロパティー: | クレデンシャルストアの場所。 |
環境変数:
システムプロパティー: | クレデンシャルストアが暗号化キーを取得するために使用するパラメーター。パラメーターには、反復回数、初期ベクトル、およびソルトが含まれます。 |
環境変数:
システムプロパティー: |
クレデンシャルストアコマンドが、パスワードまたはその他のセキュアなデータをクレデンシャルストアから回復するために復号化する必要があるパスワード。 |
2.5.4. credential-store:create
コマンドリファレンス
クレデンシャルストアを作成および設定するには、以下の形式の credential-store:create
コマンドを実行します。
credential-store:create [options]
オプションを指定しない場合、コマンドは以下を行います。
- 選択したクレデンシャルストアのパスワードの入力を求める。
- PKCS#12 クレデンシャルストアを作成する。
-
masked-SHA1-DES-EDE
アルゴリズムを使用してクレデンシャルストアを暗号化します。 - アルゴリズムを 200000 回繰り返す。
-
${karaf.etc}/credential.store.p12
でクレデンシャルストアを見つけます。 - クレデンシャルストア設定を保存しない。
次の表は、デフォルトの動作を変更するために指定できるオプションを示しています。
オプション | 説明 |
---|---|
| このオプションの後に、マスターパスワードの値に設定されている環境変数またはシステムプロパティーを指定します。クレデンシャルストアは、この値をアルゴリズムと組み合わせて使用して、暗号化キーまたは復号化キーを取得します。
例: |
| このオプションの後に、選択したマスターパスワードのプレインテキスト値を指定します。マスターパスワードのプレインテキスト値は履歴に表示されます。 クレデンシャルストアは、この値をアルゴリズムと組み合わせて使用して、暗号化キーまたは復号化キーを取得します。
例: |
| クレデンシャルストアの作成を強制します。新しいクレデンシャルストアを作成する場所に既存のクレデンシャルストアが存在する場合、このオプションを指定すると、コマンドは既存のクレデンシャルストアを上書きします。既存のクレデンシャルストアのコンテンツはすべて失われます。 デフォルトの動作では、目的の場所にクレデンシャルストアがすでに存在する場合、コマンドはクレデンシャルストアを作成しません。 |
|
新しいクレデンシャルストアの場所を指定します。デフォルトの場所である |
| このオプションの後に、使用されている暗号化アルゴリズムを繰り返し適用する回数が整数で示されます。反復するごとに、前の結果を取得して、再度アルゴリズムを適用します。その結果が最終的なマスクされたパスワードです。デフォルトは 200000 です。 |
|
このオプションの後に、マスクされたパスワードを生成するために |
|
新しいクレデンシャルストアの設定を
クレデンシャルストア設定パラメーター値を確認する場合、このオプションを省略します。または、 |
| コマンド構文とオプションに関する情報を表示します。 |
--persist
を指定しない場合のクレデンシャルストアの作成例
以下のコマンドはクレデンシャルストアを作成しますが、クレデンシャルストアの設定は ${karaf.etc}/system.properties
に保存されません。このコマンドは、デフォルトの masked-SHA1-DES-EDE
アルゴリズムを使用します。
karaf@root()> credential-store:create Credential store password: ***** Credential store password (repeat): ***** Credential store was written to /data/servers/fuse-karaf-7.4.0.fuse-740060/etc/credential.store.p12 By default, only system properties are encrypted. Encryption of configuration admin properties can be enabled by setting felix.cm.pm=elytron in etc/config.properties. Credential store configuration was not persisted and is not effective. Please use one of the following configuration options and restart Fuse. Option #1: Configure these system properties (e.g., in etc/system.properties): - credential.store.protection.algorithm=masked-SHA1-DES-EDE - credential.store.protection.params=MDkEKGdOSkpRWXpndjhkVVZYbHF4elVpbUszNW0wc3NXczhNS1A5cVlhZzcCAwMNQAQIDPzQ+BDGwX4= - credential.store.protection=0qudlx1XZFM= - credential.store.location=/data/servers/fuse-karaf-7.4.0.fuse-740060/etc/credential.store.p12 Option #2: Configure these environmental variables (e.g., in bin/setenv): - CREDENTIAL_STORE_PROTECTION_ALGORITHM=masked-SHA1-DES-EDE - CREDENTIAL_STORE_PROTECTION_PARAMS=MDkEKGdOSkpRWXpndjhkVVZYbHF4elVpbUszNW0wc3NXczhNS1A5cVlhZzcCAwMNQAQIDPzQ+BDGwX4= - CREDENTIAL_STORE_PROTECTION=0qudlx1XZFM= - CREDENTIAL_STORE_LOCATION=/data/servers/fuse-karaf-7.4.0.fuse-740060/etc/credential.store.p12
2.5.5. credential-store:store
コマンドリファレンス
暗号化された値をクレデンシャルストアに追加するには、以下の形式の credential-store:store
コマンドを実行します。
credential-store:store alias [secret]
alias
を一意の鍵値に置き換えます。ツールは、クレデンシャルストアに追加する暗号化された値を取得するために、このエイリアスを使用します。
必要に応じて、secret
を暗号化してクレデンシャルストアに追加する値に置き換えます。通常、これはパスワードですが、暗号化する任意の値を指定できます。
コマンドラインで secret
を指定すると、プレーンテキストの値が履歴に表示されます。コマンドラインで secret
を指定しないと、コマンドによりその入力を求められ、値は履歴に表示されません。
コマンドに関する情報を表示するには、次のように入力します。
credential-store:store --help
。
次のコマンドラインは、クレデンシャルストアにエントリーを追加する例です。
karaf@root()> credential-store:store db.password sec4et Value stored in the credential store. To reference it use: CS:db.password
クレデンシャルストアには、CS:db.password
を指定して参照できるエントリーが含まれるになります。
2.5.6. credential-store:list
コマンドリファレンス
クレデンシャルストアのエントリーのエイリアスを取得するには、credential-store:list
コマンドを実行します。これにより、クレデンシャルストアのすべてのエントリーのリストが表示されます。以下に例を示します。
karaf@root()> credential-store:list Alias │ Reference ─────────────┼─────────────── db.password │ CS:db.password db2.password | CS:db2.password
クレデンシャルストアで暗号化されているシークレット値の復号化リストも表示するには、次のようにコマンドを呼び出します。
karaf@root()> credential-store:list --show-secrets Alias │ Reference │ Secret value ─────────────┼─────────────────┼───────────── db.password │ CS:db.password │ sec4et db2.password | CS:db2.password | t0pSec4et
コマンドに関する情報を表示するには、次のように入力します。
karaf@root()> credential-store:list --help
2.5.7. credential-store:remove
コマンドリファレンス
クレデンシャルストアからエントリーを削除するには、以下の形式の credential-store:remove
コマンドを実行します。
credential-store:remove alias
alias
は、エントリーをクレデンシャルストアに追加したときに alias
引数に指定した一意の鍵値に置き換えます。CS:
接頭辞は指定しないでください。credential-store:list
コマンドを実行してエイリアスを取得できます。
credential-store:remove
コマンドは、指定したエイリアスを持つエントリーのクレデンシャルストアをチェックし、見つかった場合は削除します。以下に例を示します。
karaf@root()> credential-store:remove db.password Alias │ Reference │ Secret value ─────────────┼─────────────────┼───────────── db2.password | CS:db2.password | t0pSec4et
コマンドに関する情報を表示するには、次のように入力します。
karaf@root()> credential-store:remove --help
2.5.8. クレデンシャルストアの使用を有効化する設定管理プロパティーの例
開発環境では、設定管理サービスプロパティーを使用して、クレデンシャルストアの使用を有効にできます。Configuration Admin プロパティーは etc/*.cfg
ファイルで定義されます。
クレデンシャルストアの使用を有効化する設定管理プロパティーは、テクノロジープレビュー機能でのみ使用できます。テクノロジープレビュー機能は、Red Hat 製品のサービスレベルアグリーメント (SLA) の対象外であり、機能的に完全ではないことがあります。Red Hat は実稼働環境でこれらを使用することを推奨していません。これらの機能により、近日発表予定の製品機能をリリースに先駆けてご提供でき、お客様は開発プロセス時に機能をテストして、フィードバックをお寄せいただくことができます。Red Hat のテクノロジープレビュー機能のサポート範囲に関する詳細は、テクノロジープレビュー機能のサポート範囲 を参照してください。
準備
-
credential-store:create
コマンドを呼び出してクレデンシャルストアを作成します。credential-store:create コマンドリファレンス
を参照してください。 -
Configuration Admin プロパティーの使用を有効にするには、
etc/config.properties
ファイルを編集して、felix.cm.pm = elytron
が含まれる行のコメントを解除します。
# When uncommented, configuration properties handled by Configuration Admin service will be encrypted when storing # in etc/ and in bundle data. Values of the properties will actually be aliases to credential store entries. # Please consult the documentation for more details. felix.cm.pm = elytron
Fuse 起動時の動作
felix.configadmin
バンドル:-
felix.cm.pm
プロパティーが設定されているため、ConfigurationAdmin
サービスを登録する遅延。 -
name=cm
OSGi サービス登録プロパティーでorg.apache.felix.cm.PersistenceManagerOSGi
サービスの可用性を待ちます。
-
Fuse クレデンシャルストアバンドル:
-
credential.store.
* システムプロパティーまたはCREDENTIAL_STORE_
* 環境変数に設定した値を使用して、クレデンシャルストアをロードします。 -
org.apache.felix.cm.PersistenceManagerOSGi
サービスを実装する OSGi サービスを登録します。
何らかの障害が発生した場合、クレデンシャルストアバンドルは
PersistenceManager
サービスを登録しますが、特別なことはしません。何かが破損しているか、クレデンシャルストアが利用できない場合、Fuse は暗号化されていない設定値を読み取ることができるはずです。CS:
接頭辞で指定した暗号化された値は、元の値を覚えているか、クレデンシャルストアとその設定を復旧できる場合以外は失われます。-
-
felix.configadmin
プロセスは、新しい永続マネージャーサービスを使用してクレデンシャルストア設定をロードおよび保存します。
例
クレデンシャルストアに 2 つのエントリーがあるとします。
karaf@root()> credential-store:list --show-secrets Alias │ Reference │ Secret value ────────────┼────────────────┼───────────── db.password │ CS:db.password │ sec4et http.port │ CS:http.port │ 8182
設定管理サービス設定では、実際の値ではなく、機密性の高い値のエイリアスを使用することを選択します。たとえば、Web 設定プロパティーを次のように変更します。
karaf@root()> config:property-list --pid org.ops4j.pax.web javax.servlet.context.tempdir = /data/servers/fuse-karaf-7.4.0.fuse-740060/data/pax-web-jsp org.ops4j.pax.web.config.file = /data/servers/fuse-karaf-7.4.0.fuse-740060/etc/undertow.xml org.ops4j.pax.web.session.cookie.httpOnly = true org.osgi.service.http.port = 8181 karaf@root()> config:property-set --pid org.ops4j.pax.web org.osgi.service.http.port CS:http.port karaf@root()> config:property-list --pid org.ops4j.pax.web javax.servlet.context.tempdir = /data/servers/fuse-karaf-7.4.0.fuse-740060/data/pax-web-jsp org.ops4j.pax.web.config.file = /data/servers/fuse-karaf-7.4.0.fuse-740060/etc/undertow.xml org.ops4j.pax.web.session.cookie.httpOnly = true org.osgi.service.http.port = CS:http.port
ログでは、以下の行の最後にあるように、実際の値 8182
が表示されます。ログに実際のテキスト値が表示されるかどうかは、暗号化された値を使用するコンポーネントによって決まります。
2019-03-12 15:36:25,648 INFO {paxweb-config-2-thread-1} (ServerControllerImpl.java:458) : Starting undertow http listener on 0.0.0.0:8182
上記のコマンドでは、このプロパティーには数値がありますが、2 番目の config:property-list --pid org.ops4j.pax.web
コマンドは、8182
ではなく CS:http.port
を表示します。pax-web-undertow
プロセスはこのポートで開始します。これは、OSGi フックにより、config:property-list --pid org.ops4j.pax.web
コマンドの出力を表示する felix.fileinstall
プロセスが、復号化された (逆参照) 値を認識できないようにするためです。これは、etc/org.ops4j.pax.web.cfg
ファイルが復号化された (逆参照) 値を格納せず、代わりに格納する理由でもあります。次に例を示します。
org.osgi.service.http.port = CS:http.port org.ops4j.pax.web.config.file = ${karaf.etc}/undertow.xml org.ops4j.pax.web.session.cookie.httpOnly = true javax.servlet.context.tempdir = ${karaf.data}/pax-web-jsp