AES 暗号化
この方法では、暗号化されたパスワードを設定ファイル内に保存する必要がないので、不正な第三者による検索や復号化が困難となってセキュリティが強化されます。
パスワードを暗号化する
この方法では、AlgorithmCipher
を使用します。これにより、dbconfig.xml
ファイル内のデータベース パスワードを暗号化するアルゴリズムを選択できます。
始める前に: JSON オブジェクトの準備
JSON オブジェクトで、パスワードの暗号化に必要なすべての引数を指定します。以下の情報と例を使用して事前に用意しておきます。
フィールド | 説明 |
---|---|
plainTextPassword | プレーンテキストのパスワード |
algorithm | 以下のアルゴリズムから1つ選択します。
|
algorithmKey | アルゴリズム キーは上記で選択したアルゴリズムと一致している必要があります。
|
この情報を使用して、パスワードを暗号化するための適切な JSON を準備できます。次に例を示します。
{"plainTextPassword":"secret","algorithm":"AES/CBC/PKCS5PADDING","algorithmKey":"AES"}
以下の手順を実行するときは、この JSON を使用できるようにしておいてください。
ステップ 1: パスワードの暗号化
データベースのパスワードを暗号化するときは、以下のテーブルに示すように、いくつかのオプションの引数を指定できます。
引数 | 説明 |
---|---|
| 暗号の正規クラス名。初期設定を使用するには空のままにします: |
| これらのオプションの引数を表示するヘルプ メッセージを出力します。 |
| パスワードに対して |
| 暗号化したいプレーンテキストのパスワード。このパラメーターを省略すると、コンソールからパスワードの入力を求められます。 |
| 最低限の情報をログに出力します。 |
データベース パスワードを暗号化するには、次の手順に従います。
<Jira-installation-directory>/bin
に移動します。次のコマンドを実行して、データベース パスワードを暗号化します。上記のオプション パラメーターも使用できます。
java -cp "./*" com.atlassian.secrets.cli.db.DbCipherTool -c com.atlassian.secrets.store.algorithm.AlgorithmSecretStore
パスワードの入力を求められたら、「始める前に」に記載されている情報に基づいて、事前に準備しておいた JSON オブジェクトを入力します。
注:JSON オブジェクトは 1 行で入力する必要があります。このコマンドを実行すると、次のような出力が表示されます。
2023-10-13 00:30:49,016 main INFO [com.atlassian.secrets.DefaultSecretStoreProvider] Initiating secret store class: com.atlassian.secrets.store.algorithm.AlgorithmSecretStore 2023-10-13 00:30:50,811 main DEBUG [secrets.store.algorithm.AlgorithmSecretStore] Initiate AlgorithmCipher 2023-10-13 00:30:50,891 main DEBUG [secrets.store.algorithm.AlgorithmSecretStore] Encrypting data... 2023-10-13 00:30:50,950 main DEBUG [store.algorithm.serialization.EnvironmentVarBasedConfiguration] Will try to read file path from environment variable under: com_atlassian_db_config_password_ciphers_algorithm_java_security_AlgorithmParameters 2023-10-13 00:30:50,951 main DEBUG [store.algorithm.serialization.EnvironmentVarBasedConfiguration] Nothing found under environment variable. 2023-10-13 00:30:51,093 main DEBUG [store.algorithm.serialization.UniqueFilePathGenerator] Will use generated name: java.security.AlgorithmParameters_1234567890 2023-10-13 00:30:51,108 main DEBUG [secrets.store.algorithm.AlgorithmSecretStore] Name of generated file with algorithm params used for encryption: java.security.AlgorithmParameters_1234567890 2023-10-13 00:30:51,111 main DEBUG [store.algorithm.serialization.EnvironmentVarBasedConfiguration] Will try to read file path from environment variable under: com_atlassian_db_config_password_ciphers_algorithm_javax_crypto_spec_SecretKeySpec 2023-10-13 00:30:51,111 main DEBUG [store.algorithm.serialization.EnvironmentVarBasedConfiguration] Nothing found under environment variable. 2023-10-13 00:30:51,220 main DEBUG [store.algorithm.serialization.UniqueFilePathGenerator] Will use generated name: javax.crypto.spec.SecretKeySpec_1234567890 2023-10-13 00:30:51,245 main DEBUG [store.algorithm.serialization.SerializationFile] Saved file: javax.crypto.spec.SecretKeySpec_1234567890 2023-10-13 00:30:51,353 main DEBUG [store.algorithm.serialization.UniqueFilePathGenerator] Will use generated name: javax.crypto.SealedObject_1234567890 2023-10-13 00:30:51,357 main DEBUG [store.algorithm.serialization.SerializationFile] Saved file: javax.crypto.SealedObject_1234567890 2023-10-13 00:30:51,369 main DEBUG [secrets.store.algorithm.AlgorithmSecretStore] Encryption done. Success! For Jira, set the following properties in dbconfig.xml: <atlassian-password-cipher-provider>com.atlassian.secrets.store.algorithm.AlgorithmSecretStore</atlassian-password-cipher-provider> <password>{"sealedObjectFilePath":"javax.crypto.SealedObject_1234567890","keyFilePath":"javax.crypto.spec.SecretKeySpec_1234567890"}</password> For Bitbucket, set the following properties in bitbucket.properties: jdbc.password.decrypter.classname=com.atlassian.secrets.store.algorithm.AlgorithmSecretStore jdbc.password={"sealedObjectFilePath":"javax.crypto.SealedObject_1234567890","keyFilePath":"javax.crypto.spec.SecretKeySpec_1234567890"} For Bamboo, set the following properties in bamboo.cfg.xml: <property name="jdbc.password.decrypter.classname">com.atlassian.secrets.store.algorithm.AlgorithmSecretStore</property> <property name="hibernate.connection.password">{"sealedObjectFilePath":"javax.crypto.SealedObject_1234567890","keyFilePath":"javax.crypto.spec.SecretKeySpec_1234567890"}</property> For Confluence, set the following properties in confluence.cfg.xml: <property name="jdbc.password.decrypter.classname">com.atlassian.secrets.store.algorithm.AlgorithmSecretStore</property> <property name="hibernate.connection.password">{"sealedObjectFilePath":"javax.crypto.SealedObject_1234567890","keyFilePath":"javax.crypto.spec.SecretKeySpec_1234567890"}</property>
パスワードを暗号化すると暗号化ツールによって 3 つのファイルが生成され、後で dbconfig.xml
ファイルに追加する出力 JSON オブジェクトが出力されます。次のステップでは、これらのファイルの保護方法について説明します。
ステップ 2: 生成されたファイルの保護
次のファイルが生成されています。
javax.crypto.SealedObject_[timestamp]
暗号化されたパスワードを持つファイル。
javax.crypto.spec.SecretKeySpec_[timestamp]
パスワードの暗号化に使用されるキー。このファイルは、パスワードを復号化するために必要です。
java.security.AlgorithmParameters_[timestamp]
パスワードの暗号化に使用されたアルゴリズム パラメーター。このファイルは、暗号化されたパスワードを再生成する場合にのみ必要です。
Jira をクラスターで実行している場合、ファイルはすべてのノードから同じパスで利用できる必要があります。パスワードを復号化してデータベースに接続するためには、Jira がこれらのファイルへのアクセスと読み取りを実行できる必要があります。ツールによって生成されたファイルの権限を変更して、Jira を実行しているユーザーに対して、ファイルが「読み取り専用」になるようにします。
ステップ 3: 暗号化されたパスワードを dbconfig.xml に追加
暗号化されたパスワードを追加するには、次の手順に従います。
<home-directory>/dbconfig.xml
ファイルをバックアップします。バックアップをインスタンスの外部の安全な場所に移動します。dbconfig.xml
ファイルで、次の内容を含むように<atlassian-password-cipher-provider>
プロパティを追加または変更します。com.atlassian.secrets.store.algorithm.AlgorithmSecretStore
dbconfig.xml
ファイルの<password>
プロパティを追加または変更して、2 つのファイルへの完全修飾パスを含めます。{"sealedObjectFilePath":"/home/jira/javax.crypto.SealedObject_1234567890","keyFilePath":"/home/jira/javax.crypto.spec.SecretKeySpec_1234567890"}
更新が完了したら、
dbconfig.xml
に次の内容が含まれていることを確認してください。<atlassian-password-cipher-provider>com.atlassian.secrets.store.algorithm.AlgorithmSecretStore</atlassian-password-cipher-provider> <password>{"sealedObjectFilePath":"/home/jira/javax.crypto.SealedObject_1234567890","keyFilePath":"/home/jira/javax.crypto.spec.SecretKeySpec_1234567890"}</password>
WINDOWS Windows で Jira を実行している場合は、JSON のパース エラーを回避するために、ファイル パスをエスケープして、パスを囲む二重引用符(”)を一重引用符(’)に変更する必要があります。パスは次の例のようになります。
<atlassian-password-cipher-provider>com.atlassian.secrets.store.algorithm.AlgorithmSecretStore</atlassian-password-cipher-provider> <password>{"sealedObjectFilePath":'C:\\jira\\javax.crypto.SealedObject_1234567890',"keyFilePath":"'C:\\jira\\javax.crypto.spec.SecretKeySpec_1234567890'"}</password>
- Jira を再起動します。
ステップ 4: (オプション) ファイル パスを環境変数として格納
この手順は任意ですが、セキュリティを強化するために実行することをおすすめします。
生成されたファイルへのパスを環境変数として保存できます。パスが dbconig.xml
ファイルに存在しない場合、Jira は自動的に特定の環境変数でパスを検索します。この方法では、ファイル パスが dbconfig.xml
ファイルに格納されず、暗号化に使用されるファイルを見つけることが困難になります。
生成されたファイルへのパスを環境変数として保存するには、次の手順に従います。
生成された 2 つのファイルを環境変数として保存します。
AlgorithmCipher
ではパスワードの復号化にアルゴリズム パラメーターが使用されないため、アルゴリズム パラメーターを含むファイルを追加する必要はありません。Jira インスタンスの起動に使用するスクリプトで、次の環境変数を正しい値に設定する必要があります。com_atlassian_db_config_password_ciphers_algorithm_javax_crypto_spec_SecretKeySpec com_atlassian_db_config_password_ciphers_algorithm_javax_crypto_SealedObject
例:
export com_atlassian_db_config_password_ciphers_algorithm_javax_crypto_spec_SecretKeySpec=/home/jira/javax.crypto.spec.SecretKeySpec_1234567890 export com_atlassian_db_config_password_ciphers_algorithm_javax_crypto_SealedObject=/home/jira/javax.crypto.SealedObject_1234567890
ステップ 1 の「パスワードを暗号化する」での出力を編集して、ファイルへのパスを削除します。
confluence.cfg.xml
ファイルは次のようになるはずです。<atlassian-password-cipher-provider>com.atlassian.secrets.store.algorithm.AlgorithmSecretStore</atlassian-password-cipher-provider> <password>{}</password>
- Jira を再起動します。
パスワードの復号化
機密データを復号化する方法。
-m decrypt
パラメーターでコマンドを拡張します。java -cp "./*" com.atlassian.secrets.cli.db.DbCipherTool -c com.atlassian.secrets.store.algorithm.AlgorithmSecretStore -m decrypt
JSON オブジェクトを求められたら、
dbconfig.xml
ファイルのいずれかのオブジェクトを指定します。{"sealedObjectFilePath":"/home/jira/javax.crypto.SealedObject_1234567890","keyFilePath":"/home/jira/javax.crypto.spec.SecretKeySpec_1234567890"}
コマンドを実行すると、シークレットが復号化されて次のように出力されます。
2023-10-13 05:01:14,203 main INFO [com.atlassian.secrets.DefaultSecretStoreProvider] Initiating secret store class: com.atlassian.secrets.store.algorithm.AlgorithmSecretStore
2023-10-13 05:01:15,991 main DEBUG [secrets.store.algorithm.AlgorithmSecretStore] Initiate AlgorithmCipher
2023-10-13 05:01:16,068 main DEBUG [secrets.store.algorithm.AlgorithmSecretStore] Decrypting data...
2023-10-13 05:01:16,250 main DEBUG [secrets.store.algorithm.AlgorithmSecretStore] Decryption done.
Success! Decrypted password using cipher provider: com.atlassian.secrets.store.algorithm.AlgorithmSecretStore decrypted password: secret
暗号化されたパスワードの再作成
暗号化されたパスワードを紛失して、プレーン テキスト パスワードを再暗号化しようとしている場合、新しく暗号化されたパスワードは異なって見えます。これは同じプレーン テキスト パスワードを引き続き表しているため、問題はありません。ただし、Jira インスタンスが別のサーバーに移行される際に同じ暗号化されたパスワードを使用するなど、一部のケースでは一貫性を保つことをおすすめします。
以前とまったく同じ方法でパスワードを暗号化するには、元のパスワードの暗号化に使用したキーとアルゴリズム パラメータが必要です。いずれもも暗号化ツールによって生成され、以下のファイルに保存されています。
- キー:
javax.crypto.spec.SecretKeySpec_[timestamp]
- アルゴリズム パラメータ:
java.security.AlgorithmParameters_[timestamp]
これらのファイルを見つけたら、JSON オブジェクトで 2 つの追加フィールドを使用して暗号化ツールでその場所を指すことができます。これらのフィールドの説明とサンプル JSON オブジェクトは次のとおりです。
フィールド | 説明 |
---|---|
| 元のパスワードの暗号化に使用されたキーを含むファイルへのパス。例: ファイル パスを環境変数として保存した場合、このパラメータを省略できます。 |
| 元のパスワードの暗号化に使用されたアルゴリズム パラメータを含むファイルへのパス。例: |
パスワードを求められたら、JSON オブジェクトを入力します。
{"plainTextPassword":"secret","algorithm":"AES/CBC/PKCS5PADDING","algorithmKey":"AES","algorithmParametersFilePath":"/home/jira/java.security.AlgorithmParameters_1234567890","keyFilePath":"/home/jira/javax.crypto.spec.SecretKeySpec_1234567890"}
パスワードを暗号化するには、「ステップ 1:パスワードを暗号化する」に従って、JSON オブジェクトをキーとアルゴリズム パラメーターで使用します。