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 設定ファイルで暗号化されたプロパティープレースホルダーを使用します。
前提条件
- 値を暗号化するためのマスターパスワードを知っている。
手順
デフォルトの暗号化アルゴリズム
PBEWithMD5AndDES
を使用するか、使用する暗号化アルゴリズムを次のように選択します。jasypt:list-algorithms
コマンドを実行して、現在の Java 環境でサポートされるアルゴリズムを検出します。karaf@root()> jasypt:list-algorithms
引数やオプションはありません。出力は、サポートされているダイジェストおよび Password Based Encryption (PBE) アルゴリズムの識別子リストです。このリストには、Fuse 7.8 の一部である 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
- リストを確認し、使用する暗号化アルゴリズムの識別子を見つけます。アルゴリズムの選択については、ご使用のサイトのセキュリティー専門家に相談することをお勧めします。
設定ファイルで使用するパスワードなど、機密性の高い設定値を暗号化するには、
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
jasypt:encrypt
コマンドを実行して、取得した暗号化された値が含まれるプロパティーファイルを作成します。ENC()
関数で暗号化された各値をラップします。たとえば、一部の LDAP クレデンシャルを
etc/ldap.properties
ファイルに保存する場合は、ファイルの内容は次のようになります。#ldap.properties ldap.password=ENC(VMJ5S566MEDhQ5r6jiIqTB+fao3NN4pKnQ9xU0wiDCg=) ldap.url=ldap://192.168.1.74:10389
暗号化されたプロパティープレースホルダーに必要な 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>
使用した 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 つ以上指定します。
オプション | 説明 | 例 |
---|---|---|
|
このオプションの後に、
|
例: |
| このオプションの後に、初期ダイジェストのハッシュを繰り返し作成する回数を整数で指定します。繰り返すたびに、前のハッシュ結果を取得し、それを再度ハッシュします。その結果が最終的なダイジェストです。デフォルトは 1000 です。 |
例 e: |
|
このオプションの後に、 |
例: |
| 16 進数の出力を取得するには、このオプションを指定します。デフォルトの出力は Base64 です。 |
例: |
| コマンド構文とオプションに関する情報を表示します。 |
|
ダイジェストの取得後、暗号化されたプロパティープレースホルダーの使用 で説明されているのと同じ方法で使用 できます。
デフォルト以外の値を使用すると、計算に時間がかかります。以下に例を示します。
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]
オプションを指定せず、復号化する暗号化された入力を指定しない場合、コマンドによりマスターパスワードと復号化する値の入力を指定するよう要求され、他のオプションにはデフォルト値が適用されます。この復号化の例を正常に実行するには、jasypt:encrypt
コマンドがデフォルトを使用して値を暗号化する必要があります。以下に例を示します。
karaf@root()> jasypt:decrypt Master password: ******** Data to decrypt: ******************************************** Algorithm used: PBEWithMD5AndDES Decrypted data: $en$!t!ve
このコマンドは、指定するマスターパスワードとデフォルトのアルゴリズム (PBEWithMD5AndDES
) を使用して復号化キーを作成します。次に、コマンドはこの復号化キーを使用して、プロンプトに入力した値を復号化します。
デフォルトの動作を変更するには、次のオプションを 1 つ以上指定します。
オプション | 説明 | 例 |
---|---|---|
| このオプションの後に、マスターパスワードの値に設定されている環境変数またはシステムプロパティーを指定します。Jasypt は、この値を復号化アルゴリズムと組み合わせて使用して、最初の復号化キーを取得します。
|
|
| このオプションの後に、選択したマスターパスワードのプレインテキスト値を指定します。マスターパスワードのプレインテキスト値は履歴に表示されます。 Jasypt は、この値を復号化アルゴリズムと組み合わせて使用して、最初の復号化キーを取得します。
|
|
|
このオプションの後に、
|
例: |
| このオプションの後に、初期キーのハッシュを繰り返し作成する回数を整数で指定します。繰り返すたびに、前のハッシュ結果を取得し、それを再度ハッシュします。その結果が最終的な復号化キーです。デフォルトは 1000 です。
|
例: |
| 16 進数の出力を取得するには、このオプションを指定します。デフォルトの出力は Base64 です。 |
例: |
| 以前のバージョンの Jasypt で暗号化したパスワードを復号化するには、固定された IV ジェネレーターを使用します。 |
例: |
| コマンド構文とオプションに関する情報を表示します。 |
|
環境変数またはシステムプロパティーの指定例
値を復号化するときにプレインテキストのマスターパスワードを指定するのではなく、マスターパスワードに設定されている環境変数またはシステムプロパティーを指定できます。たとえば、bin/setenv
ファイルに以下が含まれているとします。
export MASTER_PASSWORD=passw0rd
次のコマンドで値を復号化できます。
karaf@root()> jasypt:decrypt -a -w MASTER_PASSWORD Data to decrypt: ******************************************** Algorithm used: PBEWithMD5AndDES Decrypted data: $en$!t!ve
etc/system.properties
ファイルに以下が含まれている場合:
master.password=passw0rd
次のコマンドで値を復号化できます。
karaf@root()> jasypt:decrypt -w master.password Data to decrypt: ******************************************** Algorithm used: PBEWithMD5AndDES Decrypted data: $en$!t!ve