Mule 4 のゲートウェイ起動暗号化

Mule ゲートウェイ起動暗号化を使用すると、ポリシー、コントラクトや、Mule アプリケーションと Anypoint Platform 間の接続の設定に必要なログイン情報など、Mule Runtime Engine (Mule) により保存される機密情報を暗号化できます。

この機能は、Mule 4.2.0 以降でサポートされています。​暗号化をサポートするポリシー​ (基本認証 1.2.0 など) が 4.2.0 より前のバージョンの Mule で実行中の API に適用される場合、ポリシー設定は暗号化されません。

エージェントを使用した Anypoint Platform ログイン情報の暗号化

最も短い時間でクライアントのログイン情報を保護する方法は、Anypoint Runtime Manager エージェントを介して暗号化を設定する方法です。エージェントサーバーを作成するときに暗号化キーを追加します。これで、エージェントはプロパティを自動的に暗号化します。
エージェントを介して暗号化を設定する方法についての詳細は、​「Runtime Manager エージェントのインストールと設定」​を参照してください。

クライアント ID とクライアントシークレットの暗号化

エージェントを使用している場合でも、プロパティを手動で暗号化できます。最も一般的な方法は​セキュアプロパティツール​を使用することです。
暗号化されたプロパティを使用すると、Mule ゲートウェイは、CBC モードで AES アルゴリズムが使用されていると仮定します。

クライアント ID が ​bb458e566cba4e2ea5a826d27b46031a​ であり、暗号化キーを 128 ビット文字列 ​MyEncryptionKey1​ とするように選択したとします。これらのプロパティを暗号化するには、次のコマンドを実行する必要があります。

> java -jar secure-properties-tool.jar \
string \ (1)
encrypt \ (2)
AES \ (3)
CBC \
MyEncryptionKey1 \ (4)
bb458e566cba4e2ea5a826d27b46031a
1 string パラメーターを使用して単一値を暗号化します。
2 値を暗号化するようにツールを設定します。
3 CBC モードで AES を使用します。
Mule は後で値を復号化する際にこの設定を使用するため、これは重要です。
4 最後に、暗号化する暗号化キー-値ペアを指定します。

暗号化されたクライアント ID は、このコマンドにより次のように出力されます。

> smzbg+aV2HbiC9Fv8KBsZpD5PlXiplsfhZ42RWNEbHhUeZ9ZIDftljUx6sYpuQ+b

暗号化されたクライアント ID とクライアントシークレットを渡す

ログイン情報を暗号化したら、暗号化された値を、Mule 環境のルートフォルダーの ​conf​ ディレクトリ内にある ​wrapper.conf​ ファイルで設定する必要があります。

wrapper.java.additional.<n>=-Danypoint.platform.client_id=![_encrypted client ID_]
wrapper.java.additional.<n>=-Danypoint.platform.anypoint.platform.client_secret=![_encryptedclient secret_]
wrapper.java.additional.<n>=-Danypoint.platform.proxy_password=![_encrypted password_]

<n> には、​wrapper.java.additional​ ファイル内で一意の番号を指定してください。

設定ファイルに ​wrapper.java.additional.n​ エントリを追加する場合は、​<n>​ の各インスタンスを連続する番号に変更する必要があります。 そうしないと、Java はプロパティを正しく解析しません。

この例の設定では ​client_id​ は次のように表示されます。

wrapper.java.additional.100=-Danypoint.platform.client_id=![smzbg+aV2HbiC9Fv8KBsZpD5PlXiplsfhZ42RWNEbHhUeZ9ZIDftljUx6sYpuQ+b]
![​ プレフィックスと ​]​ サフィックスが必要です。これらは、囲まれた値が暗号化されていることを Mule Runtime Engine に示します。

保護された値を Mule Runtime Engine で復号化できるようにするには、Mule Runtime を開始するときに、​anypoint.platform.encryption_key​ プロパティを使用してシークレットキーを渡す必要があります。

$MULE_HOME/bin/mule start -M-Danypoint.platform.encryption_key=MyEncryptionKey1

Mule Runtime Engine は、​anypoint.platform.encryption_key​ プロパティに渡された暗号化キーを使用して、プロパティを復号化します。

しくみ

Anypoint Platform ログイン情報 (クライアント ID、クライアントシークレット、およびプロキシパスワード) を暗号化し、その暗号化された値を暗号化キーと共に Mule 環境の ​wrapper.conf​ ファイルに追加できます。

Mule ゲートウェイ機能は起動時に暗号化鍵があるかどうかを確認します。その後クライアント ID とクライアントシークレットがその ​wrapper.conf​ ファイルから取得されます。このファイルのいずれかの値が暗号化インジケーター (​![​ と ​]​) で囲まれている場合、Mule は以前に読み込んだ暗号化キーを使用して値を復号化し、その元のコンテンツを使用します。

起動暗号化のデバッグ

起動中に暗号化メカニズムに関する情報を表示するようにランタイム Log4J ロガーを設定できます。

$MULE_HOME/conf/log4j2.xml​ で、ゲートウェイデプロイの非同期ロガーをセットアップします。

...
  <AsyncLogger name="com.mulesoft.mule.runtime.gw.deployment" level="DEBUG" />
...

キーを指定すると、Mule 環境は次のメッセージを表示します。

An encryption key is present. Policies and API contracts will be encrypted.

指定しない場合、Mule Runtime Engine は次のメッセージと共に起動します。

No encryption key provided. Policies and API contracts will not be encrypted.

暗号化プロセスが失敗した場合、Mule 環境はエラーを表示します。

Client ID cannot be decrypted

ログイン情報を復号化できない場合は、Anypoint Platform には接続できず、以降はポリシーやコントラクトをダウンロードしたり、追跡されている API の分析情報を生成したりできなくなります。

ログイン情報に関するトラブルシューティング

暗号化されたログイン情報を Anypoint Platform に渡すときに問題が発生した場合、指定したログイン情報が有効であることを確認することをお勧めします。セキュアプロパティツールを使用して、値を元の値に復号化し、Anypoint Platform に表示された値と比較することができます。

  1. セキュアプロパティツールを実行してログイン情報を復号化します。

    > java -jar secure-properties-tool.jar string decrypt AES CBC <yourEncryptionKey>
  2. 復号化された値を Anypoint Platform 内の値と比較します。
    Anypoint Platform のログイン情報を検証する方法についての詳細は、​「ログイン情報の取得」​を参照してください。

サポートされるプロパティ

暗号化をサポートする ​wrapper.conf​ プロパティを次に示します。

プロパティ Property Key (プロパティキー) 説明

Client ID (クライアント ID)

anypoint.platform.client_id

Anypoint Platform のクライアント ID

Client secret (クライアントシークレット)

anypoint.platform.client_secret

Anypoint Platform のクライアントシークレット

Proxy password (プロキシパスワード)

anypoint.platform.proxy_password

Anypoint Platform に接続するためのプロキシ設定のパスワード

ポリシーの暗号化

API ポリシーの設定は ​policies​ ディレクトリに保存されています。認証されていないパーティには非表示にする必要がある機密情報 (​Basic Authentication​ ヘッダーのパスワード項目など) が一部のポリシーに含まれている場合があります。

提供された API ポリシー内の機密値は、ポリシー設定用の API Manager UI では機密としてマークされます。カスタムポリシーを作成するときに、どの値が機密かを定義することができます。

ポリシーの暗号化の設定

ポリシーの暗号化を有効にするには、​wrapper.conf​ ファイルで 2 つのシステムプロパティを提供する必要があります。

  • anypoint.platform.encryption_key
    ポリシーの暗号化キー。

    すべてのポリシーを暗号化した後、暗号化キーなしで Mule Runtime Engine を再起動した場合、すべてのポリシーが再度ダウンロードされます。ただし、機密情報はどれも暗号化されません。

  • anypoint.platform.policy_encryption_mode
    このプロパティキーは、2 つの値を取ります。

    FULL

    すべての値が暗号化されます。

    SENSITIVE_ONLY

    sensitive​ としてマークした値のみが暗号化されます。
    これはデフォルトの暗号化モードです。

    このプロパティを設定しないと、デフォルトの ​SENSITIVE_ONLY​ 暗号化モードが使用されます。
    暗号化モードは適用後に変更できます。​policies​ ディレクトリ内のファイルは、新しい暗号化モードに従って再生成されます。

    FULL​ から ​SENSITIVE_ONLY​ に変更している場合、​sensitive​ としてマークされていないすべてのパラメーターはファイルシステム内でプレーンテキストとして表示されます。

暗号化をサポートするポリシー

値の暗号化がサポートされるすべてのポリシーと、その機能をサポートするために必要な最小バージョンが以下のリストで説明されています。

これらのポリシーの以前のバージョンと以下のリストに示されていないポリシーでは、設定内の暗号化キーがゲートウェイ機能により検出されても、ポリシーの値は暗号化されません。

ポリシー バージョン

基本認証

1.2.0 以降。

クライアント ID 適用

1.2.0 以降。

ヘッダーの挿入

1.1.0 以降。

IP 許可リスト

1.0.0 以降。

IP ブロックリスト

1.0.0 以降。

JWT 検証

1.1.0 以降。

Open AM

1.2.0 以降。

Open ID

1.2.0 以降。

OAuth 2.0

1.2.0 以降。

Ping Federate

1.2.0 以降。

カスタムポリシーの暗号化

新しいカスタムポリシープロジェクトの推奨の作成方法は、Maven アーキタイプを使用することです。
アーキタイプを使用して新しいカスタムポリシープロジェクトを作成する場合、​-DencryptionSupported=true​ プロパティを渡して、カスタムポリシー内の暗号化を有効にできます。
この手順についての詳細は、​「アーキタイプを使用したプロジェクトのセットアップ」​を参照してください。 カスタムポリシーを手動で開発する場合、または既存のポリシーに暗号化を追加する場合、次の手順を実行します。

  1. 必要な連動関係をポリシーの ​pom.xml​ ファイルに追加します。
    Secure Configuration Property Module​ 連動関係を ​pom.xml​ ファイルに追加する必要があります。

    <dependency>
       <groupId>com.mulesoft.modules</groupId>
       <artifactId>mule-secure-configuration-property-module</artifactId>
       <version>${securePropertyModuleVersion}</version>
       <classifier>mule-plugin</classifier>
    </dependency>
  2. Secure Properties 要素​をポリシーのテンプレートファイルに追加します。
    次のスニペットをポリシーの XML テンプレートファイルの ​<mule …​>​ 要素の後に貼り付けます。

    {{#if encrypted}}
    <secure-properties:config key="${anypoint.platform.encryption_key}" file="${encryptedPropertiesFile}" name="encryptionConfiguration">
       <secure-properties:encrypt algorithm="AES" mode="CBC"/>
    </secure-properties:config>
    {{/if}}

    この機能は CBC モードの AES アルゴリズムのみをサポートします。
    ゲートウェイ機能は、ゲートウェイの起動時に設定されたシステムプロパティから ​anypoint.platform.encryption_key​ と ​encryptedPropertiesFile​ の値を取得します。

  3. ポリシーの YAML ファイルで機密値を定義します。
    デフォルトでは、カスタムポリシー内の値は機密ではありません。値が機密であることを指定するには、​sensitive​ 要素を使用します。

      configuration:
       - propertyName: username
         type: string
         sensitive: false
       - propertyName: password
         type: string
         sensitive: true (1)
    1 これで、ポリシー内の ​password​ 値は機密とみなされます。

オフラインポリシーの暗号化

オフラインポリシーの設定を暗号化するには、​セキュアプロパティツール​を使用して値を暗号化できます。

> java -jar secure-properties-tool.jar \
string \ (1)
encrypt \ (2)
AES \ (3)
CBC \
MyEncryptionKey1 \ (4)
bb458e566cba4e2ea5a826d27b46031a
  1. string パラメーターを使用して単一値を暗号化します。

  2. 値を暗号化するようにツールを設定します。

  3. CBC モードで AES を使用します。Mule は後で値を復号化する際にこの設定を使用するため、これは重要です。

  4. 最後に、暗号化する暗号化キー-値ペアを指定します。

詳細は、​オフラインポリシーの割り当て​を参照してください。

コントラクトの暗号化

Mule ゲートウェイが暗号化を使用して設定されている場合、コントラクト適用ポリシーに関連付けられているコントラクトも暗号化されます。

スコープと考慮事項

クラスターのシナリオでは、ノードごとに暗号化プロパティを設定する必要があります。それ以外の場合、一部のノードを無保護のままとすることができます。