設定のシークレット
暗号化された設定値を使用して、機密性の高いパスワード、シークレット、トークン、キーを保護してください。
シークレット設定は、 ${handler::value}
のように表現できます。 handler
は、 value
をデコードまたは復号化するための io.smallrye.config.SecretKeysHandler
の名前です。
設定値の暗号化
設定値を暗号化し、後で復号化するには、以下のマネージド依存関係を追加します:
<dependency>
<groupId>io.smallrye.config</groupId>
<artifactId>smallrye-config-crypto</artifactId>
</dependency>
QuarkusのCLIコマンドを使用して、 新しい暗号化された値を追加するか、 application.properties
の既存の値を暗号化します:
設定プロパティ my.secret
は、値 1234
が暗号化され、 Base64 でエンコードされ、値を復号化するために必要なシークレットハンドラを持つ式 ${aes-gcm-nopadding::}
とともに application.properties
に追加されます。
存在しない場合は、暗号化キーも生成され、 smallrye.config.secret-handler.aes-gcm-nopadding.encryption-key
に設定されます。
my.secret=${aes-gcm-nopadding::DLTb_9zxThxeT5iAQqswEl5Dn1ju4FdM9hIyVip35t5V}
smallrye.config.secret-handler.aes-gcm-nopadding.encryption-key=DDne5obnfH1RSeTg71xSZg
デフォルトのシークレットハンドラーは AES/GCM/NoPadding アルゴリズムを使用し、 value を復号するために ${aes-gcm-nopadding::value} 式を必要とします。
|
暗号化された設定の読み取り
Quarkusの設定システムでは、 my.secret
を検索する際に、設定値が自動的に復号化されます。
値の暗号化に使用された暗号化キーは、値の復号化に使用され、 smallrye.config.secret-handler.aes-gcm-nopadding.encryption-key
に設定されたものと同じでなければなりません。
class BusinessBean {
@Inject
SmallRyeConfig config;
public void businessMethod() {
ConfigValue mySecret = config.getConfigValue("my.secret");
mySecret.getValue(); (1)
}
}
1 | 値 1234 を返します。 |
キーストアへのシークレットの保存
暗号化された値を持つことは、平文の値よりも良いことですが、 application.properties
で設定することは避けたいと思います。
Java KeyStoreは、ファイルベースの Vault
として使用できます。
機密データをこの Vault
にインポートし、Java SecretKey
値として安全に保存することができます。
KeyStore
ConfigSource
を使用するには、以下のマネージド依存関係を追加します:
<dependency>
<groupId>io.smallrye.config</groupId>
<artifactId>smallrye-config-source-keystore</artifactId>
</dependency>
KeyStoreの作成
次のコマンドは、単純なKeyStoreを作成します:
echo DLTb_9zxThxeT5iAQqswEl5Dn1ju4FdM9hIyVip35t5V | keytool -importpass -alias my.secret -keystore properties -storepass arealpassword -storetype PKCS12 -v
-alias my.secret
オプションは、設定プロパティ名 my.secret
を値 DLTb_9zxThxeT5iAQqswEl5Dn1ju4FdM9hIyVip35t5V
と共にキーストアに格納します。
-storepass arealpassword
は、キーストアにアクセスするために必要なパスワードです。
暗号鍵を安全に保管する必要もあります。鍵は他のシークレットと一緒に保存すべきではありません。
そのため、鍵用に別の KeyStore
を作成することが出来ます:
echo DDne5obnfH1RSeTg71xSZg | keytool -importpass -alias smallrye.config.secret-handler.aes-gcm-nopadding.encryption-key -keystore key -storepass anotherpassword -storetype PKCS12 -v
KeyStoreの使用
新しく作成した KeyStore
を使用するには、以下の設定を application.properties
に追加します:
smallrye.config.source.keystore."properties".path=properties (1)
smallrye.config.source.keystore."properties".password=arealpassword (2)
smallrye.config.source.keystore."properties".handler=aes-gcm-nopadding (3)
smallrye.config.source.keystore."key".path=key (4)
smallrye.config.source.keystore."key".password=anotherpassword (5)
1 | secretsプロパティを持つ´KeyStore`へのパス |
2 | KeyStore のシークレットを抽出するための KeyStore パスワード |
3 | KeyStore シークレットを復号化する SecretKeyHandler |
4 | 暗号化キーが格納されている´KeyStore`へのパス。 |
5 | 暗号鍵を取り出すことが出来る KeyStore パスワード |
KeyStoreパスワードの保護
Quarkusがキーストアからシークレットを抽出できるようにするには、 application.properties
で KeyStore
パスワードを指定する必要があります。
このキーストアのパスワードは機密性の高い値であるため、漏洩のリスクを最小限に抑え、保護する方法を検討する必要があります。
注意すべき重要な点として、権限のないユーザーも実際のキーストアにアクセスする必要があるため、このパスワードが漏れたとしても、キーストアに保存されている実際のシークレットが漏れるとは限らないということがあります。 キーストアファイルへのアクセスを限られたロールに制限し、そのロールの1つでQuarkusプロセスを実行させることで、グループ外の人がキーストアにアクセスしにくくなります。 キーストアパスワードは環境変数として設定できます。攻撃者がキーストアにアクセスできる時間を制限するために、このパスワードを定期的に変更する必要があります。