mcpField
S
secure-mule-app

secure-mule-app

github.com/mulesoftセキュリティ14266 回インストール今日更新
リポジトリ

secure-mule-app について

secure-mule-appは、Muleアプリ内の機密値を検出し、MuleSoftのセキュアプロパティに変換する手順を案内するスキルです。XML、properties、YAMLを調べ、ユーザーの確認後に暗号化と設定変更を行います。

主な機能

  1. 01MuleのXML、properties、YAMLをスキャン
  2. 02値を表示せずに機密情報を検出
  3. 03secure-properties-toolで値を暗号化
  4. 04XML参照をセキュアなプレースホルダーに変更
  5. 05プロジェクト設定と除外ルールを更新

活用シーン

  1. 01Mule XMLのハードコードされた認証情報を移行
  2. 02機密プロパティを暗号化された値に変換
  3. 03適用前にセキュリティ変更案を確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/mulesoft/mulesoft-dx --skill secure-mule-app

インストール後、Claude Code で/secure-mule-appを入力して読み込まれたか確認します。

詳細

MuleSoft のセキュリティスペシャリストとして、機密データを暗号化し、Mule アプリケーションのセキュリティ保護を支援します。

タスク

Mule アプリケーションの XML ファイル(src/main/mule)とプロパティファイル(src/main/resources)の両方をスキャンして、機密データ(ユーザー名、パスワード、URL、API キー、シークレット、トークン)を特定し、MuleSoft のセキュアプロパティ設定を使用して暗号化します。

手順

ステップ 1:プロジェクト構成を確認する

  • 現在の作業ディレクトリに src/main/mule ディレクトリがあることを確認します
  • 見つからない場合は、Mule アプリケーションプロジェクトではないようだとユーザーに伝えます

ステップ 2:ユーザー設定を取得する

以下の情報を、一度に 1 つずつ質問します。

まず、暗号化キーを尋ねます:

  • 「値の暗号化に使用する暗号化キーを指定してください。(このキーは、セキュアプロパティの暗号化と復号に使用します)」

次に、暗号化アルゴリズムを尋ねます:

  • 「使用する暗号化アルゴリズムを選択してください。(番号を入力してください)」
    1. AES - Advanced Encryption Standard(128、192、または 256 ビット)
    2. Blowfish - 高速なブロック暗号
    3. DES - Data Encryption Standard
    4. DESede - Triple DES
    5. RC2 - Rivest Cipher 2

次に、暗号モードを尋ねます:

  • 「使用する暗号モードを選択してください。(番号を入力してください)」
    1. CBC - Cipher Block Chaining
    2. CFB - Cipher Feedback
    3. ECB - Electronic Codebook
    4. OFB - Output Feedback
    5. GCM - Galois/Counter Mode(AES のみ)

最後に、バックアップについて尋ねます:

  • 「暗号化されていない値を参照用に local.properties に保存しますか?(はい/いいえ)」

ステップ 3:セキュアプロパティツール JAR を探すかダウンロードする

確認する前に、何をするのか、またその理由をユーザーに明確に伝えてください。「JAR があるか確認します」のような曖昧な表現は避けてください。どの JAR を指しているのかユーザーにはわからないためです。代わりに、次のように伝えます。

「MuleSoft の secure-properties-tool JAR(機密データの暗号化に使用する CLI ツール)を確認しています。ローカルにダウンロードされていない場合は、MuleSoft のドキュメントサイトから取得します。」

  • JAR が次の場所にあるか確認します:{skill_base_directory}/assets/secure-properties-tool.jar
  • 見つかった場合は、ローカルで見つかったため再利用するとユーザーに伝えてから、次に進みます
  • 見つからない場合は、見つからなかったこととダウンロードすることをユーザーに伝え、自動的にダウンロードします:
    1. 必要に応じて assets ディレクトリを作成します:mkdir -p {skill_base_directory}/assets
    2. curl を使用してダウンロードします(macOS ではデフォルトで利用できるため、こちらを推奨します):
      curl -L -o "{skill_base_directory}/assets/secure-properties-tool.jar" \
        "https://docs.mulesoft.com/mule-runtime/4.4/_attachments/secure-properties-tool.jar"
      
    3. curl が利用できない場合は、wget を試します:
      wget -O "{skill_base_directory}/assets/secure-properties-tool.jar" \
        "https://docs.mulesoft.com/mule-runtime/4.4/_attachments/secure-properties-tool.jar"
      
    4. ダウンロード後、ファイルが存在し、空でないことを確認してから次に進みます
  • ダウンロードに失敗した場合は、ユーザーに伝え、手動ダウンロード用 URL を案内します: https://docs.mulesoft.com/mule-runtime/4.4/_attachments/secure-properties-tool.jar
  • 注意:Maven(mvn)は使用できません。この JAR は Maven リポジトリではなく、ドキュメントサイトでホストされています

ステップ 4:XML ファイルとプロパティファイルをスキャンする

次の 2 か所で機密データをスキャンします。

A. XML ファイルをスキャンする

src/main/mule 内のすべての XML ファイル(サブディレクトリを含む)をスキャンし、機密性の高い属性を検出します。

検出するパターン(大文字と小文字を区別しない):

  • password、passwd、pwd
  • secret、apikey、api-key、api_key
  • token、auth、credential
  • username、user、login
  • url、uri、host、endpoint
  • clientId、client-id、client_id
  • clientSecret、client-secret、client_secret
  • key、private、certificate

重要:次の条件を満たす属性を検出します。

  1. 上記のいずれかのパターンに一致する
  2. 空でない値を持つ
  3. すでにセキュアプロパティプレースホルダーを使用している(${secure:: で始まる)属性ではない
  4. プロパティプレースホルダーを使用している属性も含めます(${email.password} や ${db.username} など)。これらは ${secure::} 形式に変換する必要があります。
B. Properties/YAML ファイルをスキャンする
  • src/main/resources ディレクトリ(サブディレクトリを含む)をスキャンし、既存の .properties および .yaml/.yml ファイルを探します。
  • 見つかった各ファイルについて、上記と同じパターンを使用して機密データが含まれているか確認します。
  • 機密性の高い値を含むプロパティ名を記録します(例:email.password=secret → email.password を記録)。
  • これらの値は暗号化し、.secure.properties ファイルに移動する必要があります。

Step 5: 検出結果を表示する

見つかった機密データの概要を表示します。

  • XML ファイル:機密性の高い属性(ハードコード値またはプロパティプレースホルダー)を含む各ファイルを一覧表示します。
  • Properties ファイル:機密性の高いプロパティを含むファイルと、そのプロパティ名を一覧表示します。
  • 属性名/プロパティ名を表示します(セキュリティ上、値は表示しません)。
  • 項目の合計数を表示します。

機密データが見つからなかった場合は、ユーザーにその旨を知らせて終了します。

Step 6: ユーザーの確認を得る

変更を加える前に、ユーザーに次の内容を提示します。

  • 変更されるファイル
  • 実行する操作(pom.xml の更新、セキュアプロパティの作成、値の暗号化、XML ファイルの更新、global-configs.xml の作成/更新)
  • secure-properties-tool.jar を使用して暗号化する値の数

ユーザーが「いいえ」と答えた場合は、直ちに停止します。

Step 7: プロパティキーを決定する

見つかった各機密値について、プロパティキー名を決定します。

A. すでに properties ファイルにある値の場合:
  • properties ファイルにある既存のプロパティ名を使用します
  • 例:local.properties に email.password=secret がある場合は、email.password を使用します。
  • これにより、変換後も XML の参照 ${email.password} が ${secure::email.password} と一致します。
B. XML 内のハードコード値の場合:

次の情報に基づいて、コンテキストに応じたプロパティキー名を生成します。

  1. 設定/コネクターの種類:XML 要素または親要素から特定します。

    • <db:mysql-config> → mysql
    • <http:request-config> → http
    • <sfdc:sfdc-config> → salesforce
    • <mongo:config> → mongodb
    • <ftp:config> → ftp
  2. 属性名:実際の属性名を使用します。

    • password → password
    • username → username
    • url → url
    • clientId → clientId
  3. 設定名属性(使用できる場合):name または doc:name 属性の値を使用します。

    • <db:mysql-config name="MySQL_Config"> → MySQL_Config を使用

プロパティキーの形式:{connector}.{config-name}.{attribute} または {connector}.{attribute}

例:

  • MongoDB のパスワード:mongodb.password または mongodb.MongoDB_Config.password
  • MySQL のユーザー名:mysql.username または mysql.Database_Config.username
  • HTTP API キー:http.apikey または http.API_Config.apikey
  • Salesforce のクライアントシークレット:salesforce.clientSecret

同じプロパティキーが複数回生成される場合は、番号を追加します:mongodb.password.1、mongodb.password.2

Step 8: 値を暗号化する

ユーザーの確認後、暗号化が必要な一意の機密値をまとめて暗号化します。

  • 暗号化が必要な機密値のうち、一意のものをすべて収集します。
  • 各値について、確認を求めずに次の暗号化コマンドを実行します。
    java -cp {skill_base_directory}/assets/secure-properties-tool.jar com.mulesoft.tools.SecurePropertiesTool string encrypt <algorithm> <mode> <key> <value>
    
  • 生成したプロパティキーを各暗号化値に対応付けて保存します。
  • 追加の許可を求めずに、すべての暗号化コマンドを順番に実行します。

ステップ 9:プロパティファイルの作成/更新

セキュアプロパティファイル(src/main/resources/local.secure.properties):

  • ファイルが存在するか確認します
  • 存在する場合:新しい暗号化済みプロパティを追加します
  • 存在しない場合:ファイルとディレクトリ構成を作成します
  • 形式:property.key=![encrypted_value]

バックアッププロパティファイル(src/main/resources/local.properties)- 任意:

  • ユーザーが元の値をバックアップすることを選択した場合にのみ作成します
  • 参照用に暗号化されていないプロパティ値を書き込みます
  • 形式:property.key=original_value
  • ファイルの先頭に警告コメントを追加します:
    # WARNING: This file contains unencrypted sensitive values for reference only
    # DO NOT commit this file to version control
    # Add this file to .gitignore
    

ステップ 10:XMLファイルの更新

機密データを含む各XMLファイルに対して、次の2種類の更新を実行します。

A. ハードコードされた値をセキュアプロパティのプレースホルダーに置き換えます:
  • ハードコードされた機密値をそれぞれ ${secure::property.key.name} に置き換えます

例:


<mongo:config name="MongoDB_Config">
    <mongo:connection username="admin" password="secret123" database="mydb" />
</mongo:config>


<mongo:config name="MongoDB_Config">
    <mongo:connection username="${secure::mongodb.MongoDB_Config.username}"
                      password="${secure::mongodb.MongoDB_Config.password}"
                      database="mydb" />
</mongo:config>
B. 既存のプロパティプレースホルダーを更新して secure:: 接頭辞を付けます:
  • XMLですでに ${email.password} のようなプロパティプレースホルダーを使用している場合は、${secure::email.password} に更新します
  • 重要:暗号化されたプロパティ(.secure.properties に移動したもの)のプレースホルダーのみを更新します

例:


<logger message="${email.username}"/>
<logger message="${email.password}"/>


<logger message="${secure::email.username}"/>
<logger message="${secure::email.password}"/>

すべての変更を行った後、更新したXMLをディスクに書き戻します。

ステップ 11:global-configs.xml の作成/更新

src/main/mule/global-configs.xml が存在するか確認します:

存在する場合:

  • ファイルを読み込み、セキュアプロパティ設定がすでに存在するか確認します
  • 存在しない場合は、この設定を手動で追加する必要があることをユーザーに伝えます:
<secure-properties:config name="Secure_Properties_Config"
    file="local.secure.properties"
    key="${encryption.key}"
    doc:name="Secure Properties Config">
    <secure-properties:encrypt algorithm="ALGORITHM" mode="MODE" />
</secure-properties:config>

存在しない場合:

  • 適切なMule XML構造で新しい global-configs.xml ファイルを作成します
  • セキュアプロパティの名前空間と設定を含めます
  • セキュアプロパティ設定要素を追加します

テンプレート:

<?xml version="1.0" encoding="UTF-8"?>
<mule xmlns="http://www.mulesoft.org/schema/mule/core"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
      xmlns:secure-properties="http://www.mulesoft.org/schema/mule/secure-properties"
      xsi:schemaLocation="
        http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
        http://www.mulesoft.org/schema/mule/secure-properties http://www.mulesoft.org/schema/mule/secure-properties/current/mule-secure-properties.xsd">

    <secure-properties:config name="Secure_Properties_Config"
        file="local.secure.properties"
        key="${encryption.key}"
        doc:name="Secure Properties Config">
        <secure-properties:encrypt algorithm="ALGORITHM" mode="MODE" />
    </secure-properties:config>

</mule>

ステップ 12:セキュアプロパティの依存関係で pom.xml を更新

  • プロジェクトのルートにある pom.xml ファイルを読み込みます
  • mule-secure-configuration-property-module 依存関係がすでに存在するか確認します
  • 存在しない場合は、<dependencies> セクションに追加します:
    <dependency>
        <groupId>com.mulesoft.modules</groupId>
        <artifactId>mule-secure-configuration-property-module</artifactId>
        <version>1.3.0</version>
        <classifier>mule-plugin</classifier>
    </dependency>
    
  • 依存関係がすでに存在する場合は、ユーザーに伝えてこのステップをスキップします

ステップ 13:暗号化キーで launch.json を更新

  • プロジェクトのルートに .vscode/launch.json が存在するか確認します
  • 存在する場合:
    • ファイルを読み込みます
    • Muleアプリケーションを実行するための設定を探します
    • 各設定で mule.runtime.args フィールドを確認します
    • mule.runtime.args が存在する場合は、既存の値に -M-Dencryption.key=<their-encryption-key> を追加します
    • mule.runtime.args が存在しない場合は、値を -M-Dencryption.key=<their-encryption-key> として追加します
    • 更新した launch.json をディスクに書き戻します
    • .gitignore を確認:.vscode/ または .vscode/launch.json が .gitignore に含まれていることを確認します
      • .gitignore が存在する場合は、.vscode/ または .vscode/launch.json が含まれているか確認します
      • どちらのパターンも見つからない場合は、.vscode/ を .gitignore に追加します
      • .gitignore が存在しない場合は作成し、.vscode/ を追加します
  • 存在しない場合は、実行設定に暗号化キーを手動で追加する必要があることをユーザーに伝えます:
    Add to VM arguments:
    -M-Dencryption.key=<their-encryption-key>
    
    Or set as environment variable:
    export ENCRYPTION_KEY=<their-encryption-key>
    

ステップ 14:既存のプロパティ/YAMLファイルを .gitignore で保護

  • 機密データを含んでいた各プロパティ/YAMLファイル(ステップ 4 で特定)について:
    • 機密データのコミットを防ぐため、そのファイルを .gitignore に追加します
    • これには local.properties、dev.properties などのファイルが含まれます

ステップ 15:最終サマリー

完了サマリーを提示します:

  • ✅ スキャンした XML ファイルの数
  • ✅ スキャンしたプロパティファイルの数
  • ✅ 暗号化した機密値の数
  • ✅ セキュアプロパティファイルの作成/更新(例:local.secure.properties)
  • ✅ 更新した XML ファイル:
    • ハードコードされた値を ${secure::} プレースホルダーに置き換え
    • 既存のプロパティ参照を ${property} から ${secure::property} に更新
  • ✅ global-configs.xml をセキュアプロパティで設定
  • ✅ pom.xml を更新し、セキュアプロパティの依存関係を追加
  • ✅ launch.json を更新し、暗号化キーを追加
  • ✅ 機密データを含む既存の properties/YAML ファイルを .gitignore で保護

重要な注意事項:

  • local.secure.properties をバージョン管理にコミットしないでください
  • (作成した場合)local.properties をバージョン管理にコミットしないでください
  • 機密データを含む properties/YAML ファイル(現在 .gitignore に記載されています)をコミットしないでください
  • .secure.properties のプロパティ名が XML ファイル内の参照と一致していることを確認してください
  • 変更をコミットする前に、暗号化キーを使用してアプリケーションをテストしてください
  • すべての XML ファイルの変更を確認し、${secure::} プレフィックスが正しく追加されていることを確かめてください

エラー処理

  • Java がインストールされていない場合は、ユーザーに伝えて終了します
  • JAR のダウンロードに失敗した場合は、手動でダウンロードする手順を提示します
  • 暗号化に失敗した場合は、エラーを表示し、その値をスキップします
  • XML の解析に失敗した場合は、警告を表示し、ほかのファイルの処理を続行します
  • ファイルの書き込みに失敗した場合は、エラーを表示し、完了した内容を一覧表示します

セキュリティのベストプラクティス

  • 機密値を平文で記録または表示しないでください
  • 変更を行う前に、必ず確認を求めてください
  • セキュアプロパティファイルをコミットしないよう、ユーザーに注意を促してください
  • .gitignore エントリーの追加を提案してください

リファレンスドキュメント

詳細については、以下を参照してください: https://docs.mulesoft.com/anypoint-code-builder/int-create-secure-configs

コメント