2.3. 暗号化されたプロパティープレースホルダーの使用方法

Karaf コンテナーを保護するときは、設定ファイルでプレインテキストのパスワードを使用しないでください。プレインテキストのパスワードの使用を回避する 1 つの方法は、可能な限り暗号化されたプロパティープレースホルダーを使用することです。詳細は以下のトピックを参照してください。

2.3.1. 値を暗号化するためのマスターパスワード

Jasypt を使用して値を暗号化するには、マスターパスワードが必要です。マスターパスワードは、ユーザー自身または管理者が選択できます。Jasypt では、いくつかの方法でマスターパスワードを設定できます。

まず、Blueprint 設定でプレインテキストを使用してマスターパスワードを指定する方法があります。以下はその例です。

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

  <enc:property-placeholder>
    <enc:encryptor class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
      <property name="config">
        <bean class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
          <property name="algorithm" value="PBEWithMD5AndDES" />
          <property name="password" value="myPassword" />
        </bean>
      </property>
    </enc:encryptor>
  </enc:property-placeholder>

</blueprint>

マスターパスワードをプレインテキストで指定する代わりに、次のいずれかを実行できます。

  • 環境変数をマスターパスワードに設定します。Blueprint 設定ファイルで、この環境変数を passwordEnvName プロパティーの値として指定します。たとえば、MASTER_PW 環境変数をマスターパスワードに設定すると、Blueprint 設定ファイルにこのエントリーが作成されます。

    <property name="passwordEnvName" value="MASTER_PW">

  • Karaf システムプロパティーをマスターパスワードに設定します。Blueprint 設定ファイルで、このシステムプロパティーを passwordSys プロパティーの値として指定します。たとえば、karaf.password システムプロパティーをマスターパスワードに設定すると、Blueprint 設定ファイルにこのエントリーが作成されます。

    <property name="passwordSys" value="karaf.password">

2.3.2. 暗号化されたプロパティープレースホルダーの使用

Karaf コンテナーを保護する場合は、Blueprint 設定ファイルで暗号化されたプロパティープレースホルダーを使用します。

前提条件

  • 値を暗号化するためのマスターパスワードを知っている。

手順

  1. デフォルトの暗号化アルゴリズム PBEWithMD5AndDES を使用するか、使用する暗号化アルゴリズムを次のように選択します。

    1. jasypt:list-algorithms コマンドを実行して、現在の Java 環境でサポートされるアルゴリズムを検出します。

      karaf@root()> jasypt:list-algorithms

      引数やオプションはありません。出力は、サポートされているダイジェストおよび Password Based Encryption (PBE) アルゴリズムの識別子リストです。このリストには、Fuse 7.11 の一部である Bouncy Castle ライブラリーによって提供されるアルゴリズムが含まれています。このリストは長くなる可能性があります。その短い部分は次のようになります。

      karaf@root()> jasypt:list-algorithms
      DIGEST ALGORITHMS:
       - 1.0.10118.3.0.55
       - 1.2.804.2.1.1.1.1.2.2.1
          ...
       - 2.16.840.1.101.3.4.2.9
       - BLAKE2B-160
       - BLAKE2B-256
         ...
       - MD4
       - MD5
       - OID.1.0.10118.3.0.55
         ...
       - SHA3-512
       - SKEIN-1024-1024
       - SKEIN-1024-384
         ...
       - TIGER
       - WHIRLPOOL
      
      PBE ALGORITHMS:
       - PBEWITHHMACSHA1ANDAES_128
       - PBEWITHHMACSHA1ANDAES_256
          ...
       - PBEWITHSHA1ANDRC2_128
       - PBEWITHSHA1ANDRC2_40
          ...
       - PBEWITHSHAANDIDEA-CBC
       - PBEWITHSHAANDTWOFISH-CBC
    2. リストを確認し、使用する暗号化アルゴリズムの識別子を見つけます。アルゴリズムの選択については、ご使用のサイトのセキュリティー専門家に相談することをお勧めします。
  2. 設定ファイルで使用するパスワードなど、機密性の高い設定値を暗号化するには、jasypt:encrypt コマンドを実行します。コマンドの形式は以下のとおりです。

    jasypt:encrypt [options] [input]

    オプションを指定せずにこのコマンドを呼び出し、暗号化する値を指定しない場合、コマンドによりマスターパスワードと暗号化する値の入力が求められ、他のオプションにはデフォルトが適用されます。以下に例を示します。

    karaf@root()> jasypt:encrypt
    Master password: ********
    Master password (repeat): ********
    Data to encrypt: *****
    Data to encrypt (repeat): *****
    Algorithm used: PBEWithMD5AndDES
    Encrypted data: oT8/LImAFQmOfXxuFGRDTAjD1l1+GxKL+TnHxFNwX4A=

    暗号化する値ごとに jasypt:encrypt コマンドを実行します。

    デフォルトの動作を変更するには、次のオプションを 1 つ以上指定します。

    オプション説明

    -w または --password-property

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

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

    -w MASTER_PW

    -W または --password

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

    Jasypt は、この値を暗号化アルゴリズムと組み合わせて使用して、暗号化キーを取得します。

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

    -W "M@s!erP#"

    -a または --algorithm

    このオプションの後に、jasypt:encrypt コマンドが最初の暗号鍵を取得するのに使用するアルゴリズムの識別子を指定します。デフォルトは PBEWithMD5AndDES です。

    jasypt-list-algorithms コマンドが出力するリストに含まれるすべてのアルゴリズムがサポートされます。コマンドラインでアルゴリズム名を指定すると、自動補完を利用できます。

    例: -a PBEWITHMD5ANDRC2

    -i または --iterations

    このオプションの後に、初期キーのハッシュを繰り返し作成する回数を整数で指定します。繰り返すたびに、前のハッシュ結果を取得し、それを再度ハッシュします。その結果が最終的な暗号化キーです。デフォルトは 1000 です。

    例 e: -i 5000

    -h または --hex

    16 進数の出力を取得するには、このオプションを指定します。デフォルトの出力は Base64 です。

    例: -h

    --help

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

    jasypt:encrypt --help

  3. jasypt:encrypt コマンドを実行して、取得した暗号化された値が含まれるプロパティーファイルを作成します。ENC() 関数で暗号化された各値をラップします。

    たとえば、一部の LDAP クレデンシャルを etc/ldap.properties ファイルに保存する場合は、ファイルの内容は次のようになります。

    #ldap.properties
    ldap.password=ENC(VMJ5S566MEDhQ5r6jiIqTB+fao3NN4pKnQ9xU0wiDCg=)
    ldap.url=ldap://192.168.1.74:10389
  4. 暗号化されたプロパティープレースホルダーに必要な namespace を blueprint.xml ファイルに追加します。これらの namespace は、Aries 拡張機能と ApacheKarafJasypt 用です。以下に例を示します。

    <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
     	xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
     	xmlns:enc="http://karaf.apache.org/xmlns/jasypt/v1.0.0">
    ...
    </blueprint>
  5. 使用した Jasypt 暗号化アルゴリズムの識別子とプロパティーファイルの場所を設定します。次の例は、以下を行う方法を示しています。

    • etc/ldap.properties ファイルからプロパティーを読み取るように ext:property-placeholder 要素を設定します。
    • enc:property-placeholder 要素を次のように設定します。

      • PBEWithMD5AndDES 暗号化アルゴリズムを特定します。
      • Karaf bin/setenv ファイルで定義した環境変数 JASYPT_ENCRYPTION_PASSWORD からマスターパスワードを読み取ります。

        <blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
         	xmlns:ext="http://aries.apache.org/blueprint/xmlns/blueprint-ext/v1.0.0"
         	xmlns:enc="http://karaf.apache.org/xmlns/jasypt/v1.0.0">
        
          <ext:property-placeholder>
            <ext:location>file:etc/ldap.properties</ext:location>
          </ext:property-placeholder>
        
          <enc:property-placeholder>
            <enc:encryptor class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
              <property name="config">
                <bean class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
                  <property name="algorithm" value="PBEWithMD5AndDES" />
                  <property name="passwordEnvName" value="JASYPT_ENCRYPTION_PASSWORD" />
                </bean>
              </property>
            </enc:encryptor>
          </enc:property-placeholder>
        …
        </blueprint>

初期化 Vector プロパティーの設定

以下のアルゴリズムでは、ivGenerator という名前の初期化ベクタープロパティーを Blueprint 設定に追加する必要があります。

PBEWITHHMACSHA1ANDAES_128
PBEWITHHMACSHA1ANDAES_256
PBEWITHHMACSHA224ANDAES_128
PBEWITHHMACSHA224ANDAES_256
PBEWITHHMACSHA256ANDAES_128
PBEWITHHMACSHA256ANDAES_256
PBEWITHHMACSHA384ANDAES_128
PBEWITHHMACSHA384ANDAES_256
PBEWITHHMACSHA512ANDAES_128
PBEWITHHMACSHA512ANDAES_256

以下の例は、必要に応じて、Blueprint 設定に ivGenerator プロパティーを追加する方法を示しています。

<enc:property-placeholder>
  <enc:encryptor class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
    <property name="config">
      <bean class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
        <property name="algorithm" value="PBEWITHHMACSHA1ANDAES_128"/>
        <property name="passwordEnvName" value="JASYPT_ENCRYPTION_PASSWORD"/>
        <property name="ivGenerator">
          <bean class="org.jasypt.iv.RandomIvGenerator" />
        </property>
      </bean>
    </property>
  </enc:encryptor>
</enc:property-placeholder>

暗号化されたプロパティープレースホルダーを使用する LDAP JAAS レルム設定

以下の例は、Jasypt 暗号化プロパティープレースホルダーを使用する LDAP JAAS レルム設定を表示し、前述の例の blueprint.xml ファイルに追加します。

注記

このトピックで説明されているプロセスを使用してプロパティーを暗号化する場合は、@PropertyInject アノテーションを使用してプロパティーを復号化できません。代わりに、この Blueprint の例のように、XML を使用してプロパティーを Java オブジェクトに挿入します。

この例では、コンテナーの初期化中に ${ldap.password} プレースホルダーは、etc/ldap.properties ファイルからの ldap.password プロパティーの復号化された値に置き換えられます。

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

  <ext:property-placeholder>
    <location>file:etc/ldap.properties</location>
  </ext:property-placeholder>

  <enc:property-placeholder>
    <enc:encryptor class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor">
      <property name="config">
        <bean class="org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig">
          <property name="algorithm" value="PBEWithMD5AndDES" />
          <property name="passwordEnvName" value="JASYPT_ENCRYPTION_PASSWORD" />
        </bean>
      </property>
    </enc:encryptor>
  </enc:property-placeholder>

  <jaas:config name="karaf" rank="200">
    <jaas:module className="org.apache.karaf.jaas.modules.ldap.LDAPLoginModule" flags="required">
      initialContextFactory=com.sun.jndi.ldap.LdapCtxFactory
      debug=true
        connectionURL=${ldap.url}
        connectionUsername=cn=mqbroker,ou=Services,ou=system,dc=jbossfuse,dc=com
        connectionPassword=${ldap.password}
        connectionProtocol=
        authentication=simple
        userRoleName=cn
        userBase = ou=User,ou=ActiveMQ,ou=system,dc=jbossfuse,dc=com
        userSearchMatching=(uid={0})
        userSearchSubtree=true
        roleBase = ou=Group,ou=ActiveMQ,ou=system,dc=jbossfuse,dc=com
        roleName=cn
        roleSearchMatching= (member:=uid={1})
        roleSearchSubtree=true
    </jaas:module>
  </jaas:config>

</blueprint>

環境変数またはシステムプロパティーの指定例

値を暗号化するときにプレインテキストのマスターパスワードを指定するのではなく、マスターパスワードに設定されている環境変数またはシステムプロパティーを指定できます。たとえば、bin/setenv ファイルに以下が含まれているとします。

export MASTER_PASSWORD=passw0rd

次のコマンドで値を暗号化できます。

karaf@root()> jasypt:encrypt -w MASTER_PASSWORD "$en$!t!ve"
Algorithm used: PBEWithMD5AndDES
Encrypted data: /4DZCwqXD7cQ++TKQjt9QzmmcWv7TwmylCPkHumv2LQ=

etc/system.properties ファイルに以下が含まれている場合:

master.password=passw0rd

次のコマンドで値を暗号化できます。

karaf@root()> jasypt:encrypt -w master.password "$en$!t!ve"
Algorithm used: PBEWithMD5AndDES
Encrypted data: 03+8UTJJtEXxHaJkVCmzhqLMUYtT8TBG2RMvOBQlfmQ=

2.3.3. jasypt:digest コマンドの呼び出し

Jasypt ダイジェストは、MD5 などの暗号化ハッシュ関数を値に適用した結果です。ダイジェストの生成は、一方向暗号化の一種です。ダイジェストを生成した後にダイジェストから元の値を再構築することはできません。特に機密性の高い値の場合、値を暗号化するのではなく、ダイジェストを生成することをお勧めします。その後、ダイジェストをプロパティープレースホルダーとして指定できます。

ダイジェストを生成するコマンドを呼び出すための形式は次のとおりです。

jasypt:digest [options] [input]

オプションを指定せず、ダイジェストを作成する入力を指定しない場合、コマンドにより暗号化する値の指定を要求され、オプションのデフォルト値が適用されます。以下に例を示します。

karaf@root()> jasypt:digest
Input data to digest: ********
Input data to digest (repeat): ********
Algorithm used: MD5
Digest value: 8D4C0B3D5EE133BCFD7585A90F15C586741F814BC527EAE2A386B9AA6609B926AD9B3C418937251373E08F18729AD2C93815A7F14D878AA0EF3268AA04729A614ECAE95029A112E9AD56FEDD3FD7E28B73291C932B6F4C894737FBDE21AB382

以下の例は、コマンドラインでの input 引数の指定を示しています。

karaf@root()> jasypt:digest ImportantPassword

このコマンドは、デフォルトのオプションを適用し、ImportantPassword の一方向暗号化を提供するダイジェストを生成します。コマンド出力は次のようになります。

karaf@root()> jasypt:digest ImportantPassword
Algorithm used: MD5
Digest value: 0bL90nno/nHiTEdzx3dKa61LBDcWQQZMpjaONtY3b1fJBuDWbWTTtZ6tE5eOOPKh7orLTXS7XRt2blA2DrfnjWIlIETjge9n

一方向暗号化が必要な各値に jasypt:digest コマンドを実行します。

デフォルトの動作を変更するには、次のオプションを 1 つ以上指定します。

オプション説明

-a または --algorithm

このオプションの後に、jasypt:digest コマンドでダイジェストを生成するために使用するダイジェストアルゴリズムの識別子を指定します。デフォルトは MD5 です。

jasypt-list-algorithms コマンドが出力するリストに含まれるすべてのダイジェストアルゴリズムがサポートされます。コマンドラインでアルゴリズム名を指定すると、自動補完を利用できます。

例: -a SHA-12

-i または --iterations

このオプションの後に、初期ダイジェストのハッシュを繰り返し作成する回数を整数で指定します。繰り返すたびに、前のハッシュ結果を取得し、それを再度ハッシュします。その結果が最終的なダイジェストです。デフォルトは 1000 です。

例 e: -i 5000

-s または --salt-size

このオプションの後に、jasypt:digest ダイジェストの作成に適用される salt のバイト数を示す整数を指定します。これは、機密性の高い値のダイジェストを生成する場合や、複数の場所にダイジェストを指定する必要がある場合に便利です。たとえば、同じ入力値で異なる salt サイズを使用して jasypt:digest を呼び出すことができます。入力が同じであっても、各コマンドは異なるダイジェストを生成します。デフォルトは 8 です。

例: -s 12

-h または --hex

16 進数の出力を取得するには、このオプションを指定します。デフォルトの出力は Base64 です。

例: -h

--help

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

jasypt:digest --help

ダイジェストの取得後、暗号化されたプロパティープレースホルダーの使用 に記載されているのと同じ方法で使用できます。

デフォルト以外の値を使用すると、計算に時間がかかります。以下に例を示します。

karaf@root()> jasypt:digest --iterations 1000000 --salt-size 32 -a SHA-512 --hex passw0rd
Algorithm used: SHA-512
Digest value: 4007A85C4932A399D8376B4F2B3221E34F0AF349BB152BEAC80F03BEB2B368DA7900F0990C186DB36D61741FA147B96DC9F73481991506FAA3662EA1693642CDAB89EB7E6B1DC21E1443D06D70A5842EB2851D37E262D5FC77A1D0909B3B2783

2.3.4. jasypt:decrypt コマンドの呼び出し

暗号化されたプレースホルダーの元の値を確認するには、プレースホルダーで jasypt:decrypt コマンドを使用します。

前提条件

  • jasypt:encrypt コマンドを呼び出してプレースホルダーを生成しておく必要があります。

以下を知っている必要があります。

  • マスターパスワード、またはマスターパスワードとして使用する環境変数またはシステムプロパティー。
  • jasypt:encrypt で使用される暗号化アルゴリズム。
  • jasypt:encrypt 反復の数。

jasypt:decrypt コマンドを呼び出すための形式は次のとおりです。

jasypt:decrypt [options] [input]

注記

optionsinput を指定せずにコマンドを実行できますが、jasypt:encrypt コマンドでデフォルトを使用している場合に 限り ます。

この場合、マスターパスワードと復号化する値を指定する必要があります。その他のオプションはすべてデフォルト値を持ちます。

この場合、マスターのパスワードおよびデータを入力して、プロンプトで復号化します。デフォルトのアルゴリズム PBEWithMD5AndDES は、値を復号化するための復号化キーを作成します。

karaf@root()> jasypt:decrypt
Master password: ********
Data to decrypt: ********************************************
Algorithm used: PBEWithMD5AndDES
Decrypted data: $en$!t!ve

2.3.4.1. jasypt:decrypt のオプションの指定

デフォルトの動作を変更するには、次のオプションを 1 つ以上指定します。

オプション説明注記

-w または --password-property

マスターパスワードの値に設定された環境変数またはシステムプロパティー。Jasypt は、この値を復号化アルゴリズムとともに使用して、最初の復号化キーを作成します。

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

-w MASTER_PW

-W または --password

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

Jasypt は、この値を復号化アルゴリズムと組み合わせて使用して、最初の復号化キーを取得します。

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

-W "M@s!erP#"

-a または --algorithm

このオプションの後に、jasypt:decrypt コマンドが最初の復号鍵を取得するのに使用するアルゴリズムの識別子を指定します。デフォルトは PBEWithMD5AndDES です。

jasypt-list-algorithms コマンドが出力するリストに含まれるすべてのアルゴリズムがサポートされます。コマンドラインでアルゴリズム名を指定すると、自動補完を利用できます。

jasypt:decrypt コマンドは、指定したプレースホルダー入力を生成するために jasypt:encrypt コマンドが使用したものと同じアルゴリズムを使用する必要があります。

-a PBEWITHMD5ANDRC2

-i または --iterations

このオプションの後に、初期キーのハッシュを繰り返し作成する回数を整数で指定します。繰り返すたびに、前のハッシュ結果を取得し、それを再度ハッシュします。その結果が最終的な復号化キーです。デフォルトは 1000 です。

jasypt:decrypt コマンドは、指定したプレースホルダー入力を生成するために jasypt:encrypt コマンドが使用したものと同じ反復回数を使用する必要があります。

-i 5000

-h または --hex

16 進数の出力を取得するには、このオプションを指定します。デフォルトの出力は Base64 です。

 

-h

-E または --use-empty-iv-generator

以前のバージョンの Jasypt で暗号化したパスワードを復号化するには、固定された IV ジェネレーターを使用します。

 

-E

--help

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

 

--help

2.3.4.2. 環境変数またはシステムプロパティーの指定

jasypt:decrypt コマンドに値をパラメーターとして追加する代わりに、環境変数またはシステムプロパティーを使用できます。

2.3.4.2.1. 環境変数の使用

環境変数を使用するには、パラメーターを bin/setenv ファイルに追加します。

export MASTER_PASSWORD=passw0rd

環境変数 MASTER_PASSWORD を使用して値を復号化できます。

karaf@root()> jasypt:decrypt -a -w MASTER_PASSWORD
Data to decrypt: ********************************************
Algorithm used: PBEWithMD5AndDES
Decrypted data: $en$!t!ve

2.3.4.2.2. システムプロパティーの使用

環境変数を使用するには、パラメーターを etc/system.properties ファイルに追加します。

master.password=passw0rd

このシステムプロパティー master.password を使用して値を復号化できます。

karaf@root()> jasypt:decrypt -w master.password
Data to decrypt: ********************************************
Algorithm used: PBEWithMD5AndDES
Decrypted data: $en$!t!ve