【Azure】【マネコン操作】まだWindows BATにパスワードを埋め込んでるの? Azure Logic Apps+Key Vaultで固定変数を外部化する方法

Azure

今回はAzureに関する記事です。
Azure のKey Vaultへ格納した変数を、インターネット経由でLogic Appsへアクセスし、
自宅や会社等、特定の場所から安全に参照する構成を解説していきます。

最初に、本記事で扱う用語は公式やAzureポータル上などで表記揺れがあるため
以下の太字部分で統一します。

  • Azure Key Vault:初出は正式名称、以降は「Key Vault」
  • Azure Logic Apps:初出は正式名称、以降は「Logic Apps」
  • キー コンテナー:Azure Portalの操作手順で、画面上の項目を指す場合だけ使用
  • ロジック アプリ:同じく画面上の項目を指す場合だけ使用
  1. 【Azure】【マネコン操作】まだWindows BATにパスワードを埋め込んでるの? Azure Logic Apps+Key Vaultで固定変数を外部化する方法
    1. 本記事のターゲット
    2. 全体概要図
    3. Key Vaultの作成
      1. 前提
      2. Key Vault作成
        1. (1)キー コンテナー へアクセス
        2. (2)作成画面
        3. (3)確認および作成
      3. 自分への Key Vault Administrator 権限付与
        1. (1)キーコンテナーのアクセス制御(IAM)を開く
        2. (2)キー コンテナー管理者を選択して次へ
        3. (3)操作中のユーザーをメンバーへ追加
        4. (4)ロールと割り当ての追加
        5. (5)キー コンテナー管理者が追加されたことを確認
      4. テスト用シークレットの登録
        1. (1)Key-Vaultのシークレットを開く
        2. (2)シークレットの作成画面
        3. (3)シークレットの作成確認
        4. (4)シークレット登録を繰り返す
        5. (5)登録したシークレットの一覧を確認
    4. Logic Appsの作成
      1. ロジックアプリ本体の作成
        1. (1)Logic Appsへのアクセス
        2. (2)ホスティングオプション
        3. (3)ロジックアプリの作成
        4. (4)確認および作成
        5. (5)作成完了
      2. HTTPトリガーとアクションの作成
        1. (1)ロジックアプリデザイナーから編集
        2. (2)URLを控える
      3. Key Vaultへのアクセス許可設定
        1. (1)Logic AppsのマネージドID有効化
        2. (2)Key Vault Secrets User 権限付与
        3. (3)キー コンテナー シークレットユーザーを選択して次へ
        4. (4)作成したLogicAppsをメンバーへ追加
        5. (5)キー コンテナー シークレット ユーザーが追加されたことを確認
      4. ワークフロー設定によるセキュリティ対策
        1. (1)送信元IPアドレス制限
        2. (2)実行履歴の保存期間
    5. Windows BATを使った接続テスト
      1. (1)下準備
      2. ① RDP接続
      3. ② 処理のON/OFF制御
      4. ③ ファイルコピー
    6. 最後に
      1. 余談

【Azure】【マネコン操作】まだWindows BATにパスワードを埋め込んでるの? Azure Logic Apps+Key Vaultで固定変数を外部化する方法

本記事のターゲット

以下に該当する方へおすすめするべく、本記事を執筆しています⇩

  • 使用しているツールにパスワード直書きなどしているものを見直したい
  • 複数のツールで毎回同じ固定変数を利用しており一元管理したい
  • 複数PCなどに同じツールを展開して、変数管理も一元化したい
  • 格納した変数を取り出す際に、Azure CLIなど専用のツールを利用したくない
  • 指定したネットワークからのみ取得できる固定変数置き場を作成したい
  • 専用ソフトやDBを導入せず、上記をフラットな感覚で実現したい

本構成は、送信元のグローバルIPアドレスを特定できることが前提です。
IPアドレスが変更された場合は、Logic Apps側の許可設定も更新する必要があります。

なお筆者の利用しているSoftBank光では、
グローバルIPが数年単位で変わらないこともあるため、今回は手動管理としています。

また本記事では、パスワードやAPIキー、各種設定値など、
プログラムから参照する比較的変更頻度の低い値を便宜上「固定変数」と表現しています。

全体概要図

自宅PCからLogicAppsを参照すると、引数で与えた文字列をキーにして、
LogicAppsがKeyVaultへ問い合わせをします。
戻り値としてKeyVaultへ格納されているSecretsが応答されます。

Key Vaultの作成

前提

以下ネーミングのリソースグループをサンプルとして利用します。

  • リソースグループ:Addache-Test

解説としては名前を固定しますが、上記の名前でなくても問題ありません。
本記事では作成手順を割愛します。

Key Vault作成

(1)キー コンテナー へアクセス

[すべてのサービス]-[セキュリティ]-[キー コンテナー] を開き、新規作成を押下します。

※日本語UIでは「キー コンテナー」と表現されています

(2)作成画面
  1. サブスクリプションとリソースグループを選択します
    ※ここでは「サブスクリプション TEST」を指定しています
  2. Key Vault名:Key-TestSecrets
    ※名前を変える時は後述(LogicApps)のJSONコードも忘れず修正してください
  3. 地域:Japan East
  4. 価格レベル:標準
  5. 赤枠以外の部分は飛ばして問題なし

また、[次へ]を押下するとパブリックアクセスへの制御など設定できますが、
後で変更できるためスキップしてよいです。

本記事ではVnet統合したり、閉域網に閉じ込めたりする手順は取り扱いません。
また、パブリックアクセスを許可していても、誰でも閲覧できるわけじゃありません。
シンプル・イズ・ベストな解説を行っていきます。

(3)確認および作成

さっと確認して、[作成]を押下します。

自分への Key Vault Administrator 権限付与

テナント所有者権限を付与していても、Key VaultのSecret値はメンテナンスできませんので、
別途権限付与を行う必要があります。

(1)キーコンテナーのアクセス制御(IAM)を開く

ここで[ロールの割り当てを追加]を押下します。

(2)キー コンテナー管理者を選択して次へ

適当に探すとなかなか出てこないので、検索窓に[キー コンテナー]と入力するのが早いです。

(3)操作中のユーザーをメンバーへ追加

現在操作しているユーザーをメンバーへ追加し、[レビューと割り当て]を選択します。

(4)ロールと割り当ての追加

さっと確認し問題なさそうなら[レビューと割り当て]を押下します。

(5)キー コンテナー管理者が追加されたことを確認

アクセス制御の画面に戻って、以下のように表示されていれば権限付与完了です。

テスト用シークレットの登録

後述するサンプルコード(テストケース)にあわせて、事前にSecretsを登録します。
登録するSecretsは6つです。

ケースKey Vaultの登録値実現すること
① RDP接続RDP-USER
RDP-PASS
RDP-HOST
認証情報と接続先を一元管理
② 処理のON/OFF制御APP-ENABLED配布済みBATの動作をAzure側で切り替える
③ ファイル保存先の一元管理COPY-FROM
COPY-TO
複数PCのファイル出力先を一括変更
(1)Key-Vaultのシークレットを開く

まずはSecretsの一覧画面を開きます。
最初は何も登録されていません。
[生成/インポート]をクリックします。

(2)シークレットの作成画面

名前と値を入力します。サンプルとして以下のシークレットを設定している様子です。

  • 【シークレット名】:【シークレット値】
  • RDP-USER:(ご自身のPCのログインユーザーを入力ください)
(3)シークレットの作成確認

登録成功すると以下のように一覧へ表示されます。

(4)シークレット登録を繰り返す

他のシークレットも登録します。
※繰り返しになるため説明画像は割愛

それぞれのシークレットへ設定する値は以下です。

  • 【シークレット名】:【シークレット値】
  • RDP-PASS:(ご自身のPCのログインユーザーのパスワードを入力ください)
  • RDP-HOST:localhost
  • APP-ENABLED:ON
  • COPY-FROM:FromFolder
  • COPY-TO:ToFolder
(5)登録したシークレットの一覧を確認

登録作業が終わったら、以下のように6種類登録されていることを確認します。
※それぞれ後述するサンプルコードで参照します

シークレット値は、登録後に変更することも可能です。

Azure Key Vaultは本来、シークレット/暗号化キー/証明書を管理するサービスです。
一般的な設定値をすべて格納する用途には、
Azure App Configurationなど別の選択肢もあります。

Logic Appsの作成

KeyVaultを作成したら、LogicAppsを作成していきます。

ロジックアプリ本体の作成

(1)Logic Appsへのアクセス

[すべてのサービス]-[モノのインターネット]-[Logic Apps]をクリックして新規作成を押下します。

(2)ホスティングオプション

デフォルトではスタンダードのところが選択されています。
そのまま進めるとSKUごとの月額課金が始まってしまい、高くついてしまうため
「従量課金」を選択し直します。

使用量に応じた課金ですが、
1時間に5000回実行するようなワークフローでも構築しない限り
大抵はタダ同然です。

→月1,000回程度なら、Logic Appsの実行料金は無料枠内に収まる見込み
→無料枠なしで計算した場合でも 3,000×$0.000025=$0.075=約12円
→Logic Appsが参照するKey Vaultのシークレット取得料金は、月1,000回で約0.5円程度

(3)ロジックアプリの作成

以下のネーミングでロジックアプリを作成します。

  • ロジック アプリ名:Lap-TestSecrets
(4)確認および作成

サッと確認して問題なさそうであれば[作成]を押下します。

(5)作成完了

以下のように作成完了したことを確認してください。

HTTPトリガーとアクションの作成

ロジックアプリの処理本体を作成していきます。
ノーコードで開発できるスグレモノですが、手動操作の解説をするのはそれなりに大変なので
今回は完成品をコードで流し込みます。

(1)ロジックアプリデザイナーから編集

[ロジックアプリデザイナー]-[Code]を開き、中央のコード部分へ
以下のJSON(Githubページ)を貼り付けます。

Logic AppsのワークフローJSONを開く

JSON全体をコピーし、<KEY_VAULT_NAME> をご自身のKey Vault名に置き換えてから、
Logic Appsへ貼り付けて保存してください。山括弧も含めて置換します。

※記事のとおりに作成しているなら、[key-testsecrets]です。

⇨差替えが終わったら、[Publish]を押下します。

(2)URLを控える

作成されたロジックアプリを表示し
[When an HTTP request is received]をクリックします。

HTTP URLが表示されているので、コピーして控えておきましょう。
※後でテスト用BATへ埋め込みます

Key Vaultへのアクセス許可設定

LogicAppsで処理の作成をしただけでは、
KeyVaultへアクセスしてSecretsを参照することはできません。

この手順でLogicApps→KeyVaultへのアクセス権を設定します。

(1)Logic AppsのマネージドID有効化

まずはLogicAppsのマネージドIDを有効化します。
オンにすればOKです。

(2)Key Vault Secrets User 権限付与

先程作成した[KeyVault]の画面へ戻り、アクセス制御(IAM)から設定していきます。
※LogicAppsにもアクセス制御(IAM)はありますが、同じ操作ができない

(3)キー コンテナー シークレットユーザーを選択して次へ

適当に探すとなかなか出てこないので、検索窓に[キー コンテナー]と入力するのが早いです。

(4)作成したLogicAppsをメンバーへ追加

LogicAppsをメンバーへ追加し、[レビューと割り当て]を選択します。

(5)キー コンテナー シークレット ユーザーが追加されたことを確認

アクセス制御の画面に戻って、以下のように表示されていれば権限付与完了です。

ワークフロー設定によるセキュリティ対策

LogicAppsへ戻って、以下2本立てのセキュリティ設定を行います。

  • ロジックアプリへのアクセスを固定IPへ制限する
  • 実行履歴の保持期間を最低(7日間)へ再設定する

従量課金プランのロジックアプリは、インターネットから誰でもアクセスできてしまいます。

Secretsのキー名がバレなければ簡単に悪用されないですが、
参照失敗しても実行回数はカウントされてしまう(課金額が増えてしまう)ので、
制限をかけておくに越したことはありません。

→この制限が本記事の目玉でもあります。

(1)送信元IPアドレス制限

[ワークフロー設定]を開き、IPアドレスの制限設定を行います。
自宅グローバルIPアドレスを設定してください。
※末尾に/32 を付与しないと登録できませんのでご注意

自宅のグローバルIPアドレスが分からない場合は以下のサイトで確認してください⇩

☆確認くん☆

(2)実行履歴の保存期間

同じ画面の下の方へスクロールし、[Run history retention in days]を[Custom]へ変更します。
日数は7日(最低)を選択します。設定したら[Save]を押下します。

実行履歴の保存期間とあわせて、先程のフロー本体JSON内で
実行履歴の入出力データを非表示化する設定が行われています。

  • HTTP(Key Vault取得) → Secure outputs:ON
  • Response-MyHome → Secure inputs:ON

すべてのフローに設定する必要はなく、
重要なデータを扱っている部分のみ設定しておけば問題ありません。

Windows BATを使った接続テスト

Key Vaultに登録した値を、WindowsのBATから取得して使ってみましょう。
用途別に3本のサンプルを用意しました。それぞれ単独で実行可能です。

(1)下準備

デスクトップへ以下のフォルダを作成してください。
[FromFolder]

ココに、サンプルBATを配置します。

このPATHじゃないと動かない、というものではありませんが、
以下の意図により指定いたします。

  • サンプル③(ファイルコピー)で実行結果の確認が出来るようにする
  • BATの置き場を記事内で統一する

フォルダを作成したら、以下をDLして格納してください。

サンプル①:RDP接続(01-rdp.bat)

サンプル②:ON/OFF制御(02-app-enabled.bat)

サンプル③:ファイルコピー(03-file-copy.bat)

各コードページの Download raw file から、.bat 形式で保存してください。
(そのままDLすれば即利用可能です)

DL後はBAT冒頭の

set "URI=REPLACE_WITH_LOGIC_APPS_SIGNED_URL"

を、先に控えたHTTP URLへ置き換えれば実行できます。

URL中の % は、BAT内では %% と記述してください。
共通的に以下部分へ含まれています。

(例)
変更前: sp=%2Ftriggers%2FWhen_an_HTTP_request_is_received%2F
変更後: sp=%%2Ftriggers%%2FWhen_an_HTTP_request_is_received%%2F

実際の署名付きURLを設定したBATは、GitHubなどへ公開しないでください。
必要なシークレットや設定上の注意点は、サンプルのREADMEにまとめています。

なお、筆者の作成したBATに警戒心があるときは
ChatGPTなどにコードを渡して、リスク監査を実施してもらってください。

・バックドアやウィルスなどの仕込みがないか
・不明な場所へのデータ送信が設定されていないか

それぞれのコードについて、簡単に解説します。

① RDP接続

シークレット:RDP-USER、RDP-PASS、RDP-HOST
に記述されている接続先/ユーザー名/パスワードをそれぞれ取得し、
リモートデスクトップを起動します。

画面には接続先とユーザー名を表示し、パスワードはマスクします。
※登録した資格情報は10秒後に削除されます

ただしWindows HomeはRDPの接続先になれず、自分自身への接続にも制約があります。
接続できない場合は、利用可能な別PCを指定してください。

※テスト可能なマシンをお持ちでない場合は、本検証はスキップしてください

② 処理のON/OFF制御

シークレット:APP-ENABLED を取得し、ON のときだけPC名を表示する hostname を実行します。
OFF の場合は実行をスキップします。

Key Vaultの値を変更して再実行すると、BATを書き換えずに動作を切り替えられます。
この設定は、ほかのBATには影響しません。

③ ファイルコピー

シークレット:COPY-FROM と COPY-TO を取得し、
デスクトップ上のフォルダ間でファイルをコピーします。

実行前にデスクトップへ FromFolder を手動で作成し、テスト用ファイルを置いてください。

記事の手順通りに進んでいれば、作成済のはずです。

コピー先の ToFolder は、存在しなければBATが作成し、存在していればそのまま使います。
同名ファイルは上書きされるため、テスト用のファイルで試しましょう。

本手順ではBATをFromFolderへまとめて配置してます。
ToFolderへBATがコピーされていれば成功です。

最後に

今回は変数をKeyVaultへ保存し、インターネット経由で取得し利用する手順を執筆しました。
10年前であれば

「PC内の特定の場所にスクリプトを固めて配置し、iniファイルなどへ変数をまとめる」
「Windows標準の環境変数設定をメンテナンスして、環境にあった動作をさせる」

あたりが定石だったと思いますが、モダンなパブリッククラウドを利用すれば

  • 「自宅で利用する変数までクラウドで管理できる」
  • 「BATだけ配布すれば自宅内にある、どのPCからでも即利用できる」
  • 「BATのファイルコピーとあわせてiniファイルなどのコピーや配置も不要、PC内でもBATの格納場所を選ばない」
  • 「Windowsの環境設定変数を、環境にあわせてメンテナンスする必要がない」
  • 「インターネット参照にも関わらず、グローバルIPによる最低限のセキュリティが担保できる(他の場所から利用できない)」

というメリットがあります。

Windowsの環境変数設定などの機能は、
よりセキュアな設定を行いたい場合は選択肢に入ってきます。

セキュリティと運用(操作性)はトレードオフなので、
「その環境でどこまでの安全確保をするか?」を検討し、
双方バランスの取れた機能を採用してください。

余談

AWSで実現する場合は
「Lambda + SSMパラメータストア or Secret Manager」のような構成になると思います。
コチラも機会があれば記事化したいと思います。

AzureのLogicAppsと直接対応するサービスは現時点(2026年11月現在)では存在しません。

M365 Power Automate が類似するサービスとなっており、完全にMicrosoftな世界観です。

また、LogicAppsへアクセスするためのHTTP URLに限って、
本記事内では各コードに埋め込むしかありませんが、こちらも

LogicAppsに依存せず、変数のようにインターネットから取得する

方法がありますので、そちらも機会を見て記事化します。

なお、本記事ではWindows BATをテストコードとして利用しています。
本当はPowerShellで提供したかったのですが、以下の理由でBATを採用しています。

Windows標準ではPowerShellをそのまま実行できないので、少々環境依存になる

本記事が皆さまのご参考になれば幸いです。

コメント

タイトルとURLをコピーしました