secure-mule-app について
secure-mule-appは、Muleアプリ内の機密値を検出し、MuleSoftのセキュアプロパティに変換する手順を案内するスキルです。XML、properties、YAMLを調べ、ユーザーの確認後に暗号化と設定変更を行います。
主な機能
- 01MuleのXML、properties、YAMLをスキャン
- 02値を表示せずに機密情報を検出
- 03secure-properties-toolで値を暗号化
- 04XML参照をセキュアなプレースホルダーに変更
- 05プロジェクト設定と除外ルールを更新
活用シーン
- 01Mule XMLのハードコードされた認証情報を移行
- 02機密プロパティを暗号化された値に変換
- 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 つずつ質問します。
まず、暗号化キーを尋ねます:
- 「値の暗号化に使用する暗号化キーを指定してください。(このキーは、セキュアプロパティの暗号化と復号に使用します)」
次に、暗号化アルゴリズムを尋ねます:
- 「使用する暗号化アルゴリズムを選択してください。(番号を入力してください)」
AES- Advanced Encryption Standard(128、192、または 256 ビット)Blowfish- 高速なブロック暗号DES- Data Encryption StandardDESede- Triple DESRC2- Rivest Cipher 2
次に、暗号モードを尋ねます:
- 「使用する暗号モードを選択してください。(番号を入力してください)」
CBC- Cipher Block ChainingCFB- Cipher FeedbackECB- Electronic CodebookOFB- Output FeedbackGCM- 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 - 見つかった場合は、ローカルで見つかったため再利用するとユーザーに伝えてから、次に進みます
- 見つからない場合は、見つからなかったこととダウンロードすることをユーザーに伝え、自動的にダウンロードします:
- 必要に応じて assets ディレクトリを作成します:
mkdir -p {skill_base_directory}/assets 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"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"- ダウンロード後、ファイルが存在し、空でないことを確認してから次に進みます
- 必要に応じて assets ディレクトリを作成します:
- ダウンロードに失敗した場合は、ユーザーに伝え、手動ダウンロード用 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、pwdsecret、apikey、api-key、api_keytoken、auth、credentialusername、user、loginurl、uri、host、endpointclientId、client-id、client_idclientSecret、client-secret、client_secretkey、private、certificate
重要:次の条件を満たす属性を検出します。
- 上記のいずれかのパターンに一致する
- 空でない値を持つ
- すでにセキュアプロパティプレースホルダーを使用している(
${secure::で始まる)属性ではない - プロパティプレースホルダーを使用している属性も含めます(
${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 内のハードコード値の場合:
次の情報に基づいて、コンテキストに応じたプロパティキー名を生成します。
-
設定/コネクターの種類:XML 要素または親要素から特定します。
<db:mysql-config>→mysql<http:request-config>→http<sfdc:sfdc-config>→salesforce<mongo:config>→mongodb<ftp:config>→ftp
-
属性名:実際の属性名を使用します。
password→passwordusername→usernameurl→urlclientId→clientId
-
設定名属性(使用できる場合):
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