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 コマンドの呼び出し に関する情報を参照してください。

手順

  1. クレデンシャルストアのパスワードを選択します。

    後で、クレデンシャルストアに値を追加するとき、または値を復号化するとき、クレデンシャルストアコマンドはクレデンシャルストアのパスワードを使用して値を暗号化および復号化します。

  2. 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=
  3. 以下のように 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
  4. etc/system.properties ファイルのエントリーを更新するか、新しいエントリーを追加します。更新または追加するエントリーは、credential-store:store コマンドで指定したエイリアスを、コマンドが出力する参照値に設定します。以下に例を示します。

    db.password = CS:db.password

    Fuse が設定されたクレデンシャルストアで稼働している場合、db.password システムプロパティーなどの各インスタンスを、クレデンシャルストアにある実際のシークレット値に動的に置き換えます。

  5. credential-store:store コマンドでは、指定したエイリアスが既に使用されているシステムプロパティーである場合は、次のステップをスキップします。コードでシークレットに指定したエイリアスをまだ使用していない場合は、シークレットを必要とする各ファイルで、前の手順でシステムプロパティーとして追加したエイリアスを指定します。たとえば、コードは db.password を参照します。
  6. クレデンシャルストアに追加する値ごとに、前の 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 を使用してこれを確認すると、クレデンシャルストアの値は非表示になります。

JMX でチェック時の非表示値

2.5.3. クレデンシャルストアのシステムプロパティーと環境変数の説明

システムプロパティーまたは環境変数を使用して、クレデンシャルストアの設定パラメーターを保持できます。クレデンシャルストアを作成するときに指定するオプションによって、次のことが決まります。

  • プロパティーまたは変数を自分で設定する必要があるかどうか。
  • プロパティーまたは変数に設定されている、または設定する必要がある正確な値。

プロパティー/変数を理解すると、クレデンシャルストアがどのように機能するかを理解するのに役立ちます。

credential-store:create コマンドを実行し、--persist オプションのみを指定すると、コマンドはシステムプロパティーをクレデンシャルストア設定パラメーターに設定します。クレデンシャルストアのシステムプロパティーは明示的に設定する必要はありません。

代わりにクレデンシャルストアの環境変数を使用するか、credential-store:create コマンドのデフォルト動作を変更する場合、クレデンシャルストアの作成時に指定できるオプションに関する詳細は、credential-store:create コマンドリファレンス を参照してください。

クレデンシャルストアを作成するコマンドを呼び出すと、指定したオプションによってクレデンシャルストアのプロパティーまたは変数の設定が決まります。プロパティーまたは変数を独自に設定する必要がある場合、credential-store:create コマンドの出力には、その手順が含まれます。つまり、クレデンシャルストアのシステムプロパティーまたは環境変数の設定を決定するのはユーザーではありません。credential-store:create コマンドを実行すると常に設定が決定されます。

次の表は、クレデンシャルストアのプロパティーと変数について説明しています。特定のパラメーターについて、環境変数とシステムプロパティーの両方が設定されている場合、環境変数の設定が優先されます。

Name説明

環境変数: CREDENTIAL_STORE_PROTECION_ALGORITHM

システムプロパティー: credential.store.protection.algorithm

クレデンシャルストアコマンドが暗号化キーを取得するために使用する Password Based Encryption (PBE) アルゴリズム。

環境変数: CREDENTIAL_STORE_LOCATION

システムプロパティー: credential.store.location

クレデンシャルストアの場所。

環境変数: CREDENTIAL_STORE_PROTECTION_PARAMS

システムプロパティー: credential.store.protection.params

クレデンシャルストアが暗号化キーを取得するために使用するパラメーター。パラメーターには、反復回数、初期ベクトル、およびソルトが含まれます。

環境変数: CREDENTIAL_STORE_PROTECTION

システムプロパティー: credential.store.protection

クレデンシャルストアコマンドが、パスワードまたはその他のセキュアなデータをクレデンシャルストアから回復するために復号化する必要があるパスワード。credential-store:create コマンドを実行すると、このコマンドによりパスワードの指定が求められます。そのパスワードの暗号化は、この環境変数またはシステムプロパティーの設定です。

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 でクレデンシャルストアを見つけます。
  • クレデンシャルストア設定を保存しない。

次の表は、デフォルトの動作を変更するために指定できるオプションを示しています。

オプション説明

-w または --password-property

このオプションの後に、マスターパスワードの値に設定されている環境変数またはシステムプロパティーを指定します。クレデンシャルストアは、この値をアルゴリズムと組み合わせて使用して、暗号化キーまたは復号化キーを取得します。

-w または -W オプションを指定しない場合は、コマンドの呼び出し後に、マスターパスワードの入力と確認が求められます。

例: -w MASTER_PW

-W または --password

このオプションの後に、選択したマスターパスワードのプレインテキスト値を指定します。マスターパスワードのプレインテキスト値は履歴に表示されます。

クレデンシャルストアは、この値をアルゴリズムと組み合わせて使用して、暗号化キーまたは復号化キーを取得します。

-w または -W オプションを指定しない場合は、コマンドの呼び出し後に、マスターパスワードの入力と確認が求められます。

例: -W "M@s!erP#"

-f または --force

クレデンシャルストアの作成を強制します。新しいクレデンシャルストアを作成する場所に既存のクレデンシャルストアが存在する場合、このオプションを指定すると、コマンドは既存のクレデンシャルストアを上書きします。既存のクレデンシャルストアのコンテンツはすべて失われます。

デフォルトの動作では、目的の場所にクレデンシャルストアがすでに存在する場合、コマンドはクレデンシャルストアを作成しません。

-l または --location

新しいクレデンシャルストアの場所を指定します。デフォルトの場所である ${karaf.etc}/credential.store.p12 を使用することが推奨されます。

-ic または --iteration-count

このオプションの後に、使用されている暗号化アルゴリズムを繰り返し適用する回数が整数で示されます。反復するごとに、前の結果を取得して、再度アルゴリズムを適用します。その結果が最終的なマスクされたパスワードです。デフォルトは 200000 です。

-a または --algorithm

このオプションの後に、マスクされたパスワードを生成するために credential-store:create コマンドで使用されるアルゴリズムの識別子を指定します。デフォルトの masked-SHA1-DES-EDE を使用することが推奨されます。

-p または --persist

新しいクレデンシャルストアの設定を ${karaf.etc}/system.properties に保存します。このオプションを指定しないと、credential-store:create コマンドは次に行う手順が含まれる設定情報をコンソールに送信します。この表の後の例を参照してください。

クレデンシャルストア設定パラメーター値を確認する場合、このオプションを省略します。または、etc/system.properties ファイルを使用せずにクレデンシャルストア設定パラメーターをアプリケーションに渡す予定であるため、このオプションを省略することもできます。

--help

コマンド構文とオプションに関する情報を表示します。

--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 起動時の動作

  1. felix.configadmin バンドル:

    • felix.cm.pm プロパティーが設定されているため、ConfigurationAdmin サービスを登録する遅延。
    • name=cm OSGi サービス登録プロパティーで org.apache.felix.cm.PersistenceManagerOSGi サービスの可用性を待ちます。
  2. Fuse クレデンシャルストアバンドル:

    1. credential.store.* システムプロパティーまたは CREDENTIAL_STORE_* 環境変数に設定した値を使用して、クレデンシャルストアをロードします。
    2. org.apache.felix.cm.PersistenceManagerOSGi サービスを実装する OSGi サービスを登録します。

    何らかの障害が発生した場合、クレデンシャルストアバンドルは PersistenceManager サービスを登録しますが、特別なことはしません。何かが破損しているか、クレデンシャルストアが利用できない場合、Fuse は暗号化されていない設定値を読み取ることができるはずです。CS: 接頭辞で指定した暗号化された値は、元の値を覚えているか、クレデンシャルストアとその設定を復旧できる場合以外は失われます。

  3. 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