Power Automate(クラウド)とPower Automate for Desktop(PAD)を連携させ、Power Automateから入力したデータをPAD経由で SOAR の APIに渡してみた

以前、Power Automate(クラウド)から Power Automate for Desktop にてあらかじめ作成しておいた XSOAR のインシデント作成タスクを呼び出したことがありました。

しかしその時は、Power Automate(クラウド)から何もデータを渡していなかったので今回は、Power Automate(クラウド)から入力されたデータを基にXSOAR のインシデントを作成する形でタスクを呼び出してみました。

1.Power Automate for Desktopで変数などの準備

Power Automate(クラウド)からデータを受け取る場合、Power Automate for Desktop側であらかじめ入出力変数を設定しておかなければなりません。

そこで今回は以下の2つを入力用変数として作成しました。
・Detail
・Date

作成の方法ですが、Power Automate for Desktopのフロー作成画面に入ると右ペインに「入出力変数」の設定があるので、そこから「入力」を選択します。

Power Automate for Desktop – 入出力変数設定1

すると以下のようなポップアップが表示されるので、画面に表示されている項目を入力していきます。(変数名は「Detail」を設定)

Power Automate for Desktop – 入出力変数設定2

なお、これらの項目のうち、「外部名」に設定した値が、後からPower Automate(クラウド)で設定する際に設定画面に表示されます。

同様に「Date」という変数も設定したのが以下の状態です。

Power Automate for Desktop – 入出力変数設定3

この後、実際にXSOARのAPIを実行している設定(上記画面の「Webサービスを呼び出します」)を開いて、先ほど作成した変数を下図の赤線の通り設定します。

Power Automate for Desktop -「Webサービスを呼び出します」

なお、XSOAR上では、”test %Date%”がインシデント名、”Detail”がそのインシデントを開いた時の Detail の設定項目になります。

2.Power Automate(クラウド)でフロー作成

1.のPADの設定を行いセーブしたら(!)、Power Automate(クラウド)でのフローの作成に入ります。

フロー作成画面で”Desktop”で検索をかけると「Run a flow build with Power Automate for desktop」というアクションがあるので、それを選択します。

Power Automate(クラウド)1

そしてその設定画面を開くと、下図のとおり一番上に「Desktop Flow」という項目があるので、その下のプルダウンから、先ほどPAD上で作成したフロー名(ここでは「XSOAR連携 – データ受信」)を選択します。

すると、その下にある「Advanced parameters」のプルダウンを開いた際に、先ほどPADで設定した変数(外部名)が表示されるので、それぞれチェックボックスで選択します。

Power Automate(クラウド)2

そして、それそれの変数に対して渡したいデータをテキストフィールドに書き込んでいきます。

Power Automate(クラウド)3

ここでは「XSOAR Detail」には固定文字の”TEST”そ、「XSOAR Date」にはその時の日付を設定しています。

3.Power Automate(クラウド)のフローを実行

これで準備が整ったので、先ほど作成したPower Automate(クラウド)のフローを実行します。

Power Automate(クラウド)フロー実行1

どうやらうまくいったようなので、念のため、Power Automate(クラウド)のフロー実行結果を確認してみると、ちゃんと変数が設定されて正常終了しているようでした。

Power Automate(クラウド)フロー実行2

4.XSOAR側の処理状況を確認

その後、XSOAR側で正常にインシデントが登録されているか確認してみました。

するとインシデント名のところには赤線の通り、%Date%で渡した今日の日付の入ったものが登録されていました。

XSOARコンソール1

また、そのインシデントの中を見てみると、Detail の部分には%Detail%で渡した”TEST”という文字が登録されていることも確認できました。

XSOARコンソール2

Power Automate を無料で試す方法があると聞いたので申請してみた

会社で Teams と Power Automate を利用しているのですが、自宅でもこれらを使っていろいろ自動化のテストしてみたいと思っていました。

そこでインターネットで情報を漁っていたところ、Microsoft 365 開発者プログラムに参加すれば無料で使えると聞いたので、以下のサイトから申請してみました。

1.Microsoft 365 開発者プログラムに参加し、onmicrosoft.comのアカウントを取得

Microsoft 365 開発者プログラム
https://developer.microsoft.com/en-us/microsoft-365/dev-program
Microsoft 365 Developer program top

上記画面の「Join now」から登録処理を進めます。

すると、以下の画面が表示され、左上の方に「xxx@xxx.onmicrosoft.com」というアカウントが発行されていることが確認できました。

Microsoft 365 Developer program

このonmicrosoft.comのアカウントを使うと、以下の Power Apps を無料で利用申請することができるようなります。

2.Power Appsを無料で開始する

Power Apps 無料で開始する
https://powerapps.microsoft.com/ja-jp/landing/developer-plan/

上記サイトにアクセスすると「無料で開始する」というボタンがあるので、それをクリックすると以下の画面が表示されます。

Power Apps 開発者向けプラン(Microsoft)

その後、処理をすすめると、以下の画面が表示されます。

Power Apps画面(Microsoft)

この画面の左ペインに表示されている「Power Platform」を選択することにより、 Power Automateや Teams など利用可能になります。

Power Automate を利用して Teamsのチャネルに登録されたメッセージをSlackに送信してみた

Power Automate を利用して、Teams の特定のチャンネルに投稿されたメッセージを Slack に送信する処理を作成してみました。

なお、Power Automate については、Microsoft 365 Developer Program を使ってテストを行なっています。このあたりの話は別のブログで記載したいと思います。

動作前提

Teams にて「インシデント対応」というチームの作り、その中の「一般」チャネルに何かメッセージが入力されたらそれを検知し、Slackのその内容を送信する想定です。

Microsoft Teams

フロー作成

Power Automateにてフローを作成します。全体のフローは以下の通り6ステップとなっています。

Power Automate フロー全体

単純に Teamsのメッセージを受け取って Slack に投げるだけなのでもっと少ないステップになりそうですが、HTMLをプレーンテキストに変換し、配列を文字列にし、さらに不要なカッコや改行を取り除いて Slackに送信しているのでこうなりました。

このあたりの処理は以外と難しかったので、あとでこのブログに記録の為に追記しておこうと思います。

以下、細かな処理を記載しておきます。(2023.12.3)

「変数を初期化する Teamsメッセージ」では、手前のタスクでプレーンテキスト化した Teamsのメッセージを変数 teams_array に設定しています。
なおこのときプレーンテキストが(なぜか)配列の形”[“と”]”に囲まれているので、Typeとしては Arrayとしています。

Power Automate タスク詳細1

「変数を配列から文字列にする」では replace()関数をつかって、先ほどの teams_array の中身のTypeをArray から Stringの形にし、変数 teams_string に設定しています。

Power Automate タスク詳細2

「変数を初期化する 改行コード」では、次のタスクで利用する為に改行コード”\n”を LFcode という変数に設定しています。

Power Automate タスク詳細3

最後に「メッセージの投稿」では、変数 teams_string の中の改行コード”\n”を replace()関数を使用し(空白に)置き換えています。

Power Automate タスク詳細4

動作結果

以下が Slack の general チャンネルに Power Automateからメッセージを送信した結果です。

画面上の最初の方は Teams のメッセージを受け取ってそのまま Slackに投げたので HTMLとなっていますが、最後の方ではプレーンテキスト化し、”[“や改行”¥n”を取り除いてシンプルに URLだけが表示されるようになっています。

Slack – general

Power Automate から SOAR のWeb APIをたたいてみた

XSOARには Web APIが用意されていて、コマンドプロンプトから以下のようなコマンドを実施すると、”palybookId”で指定したプレイブックを起動したり、”details”で指定した情報をインシデント情報として記録できます。(プレイブックのインプットデータとしても活用可能)

% curl -kv 'https://XX.XXX.XX.X:XXXX/incident' -X POST -H 'Authorization: XXXXXXXXXX' -H 'Accept: application/json' -H 'Content-Type: application/json,application/xml' -d '{"name": "test 20231201","type": "Access","owner": "admin","details": "http://k2-ornata.com/%22,%22playbookId": "59daa471-0cc5-495a-8567-1a252fd020c6"}'

この情報を元に Power Automate for Desktopの「Webサービスを呼び出します」を使って、同じ様に XSOAR にアクセスしてみました。

1.まずはChatGPTに相談

curlのコマンド情報からから Webリスクエストを作成してくれるサイトはいくつかあるようですが、どれも今一つだったので、そういえばと思い ChatGPT に相談してみました。(別のコマンドを相談した時のものですが。)

ChatGPT

上記は少し違うコマンドについて相談したときのものですが、かなりいい感じで答えてくれていることがわかります。

2.Power Automateを設定

そこで 上記の ChatGPT の回答も踏まえながら、以下の通り各パラメータを設定してみました。

Power Automate – Webサービスを呼び出します

3.レスポンスエラーへの対処(400, 403)

しかしながらすんなりとはいかず、SOARからの以下のようなレスポンスエラーが頻発しました。

{"id":"bad_request","status":400,"title":"Bad request","detail":"Request body is not well-formed. It must be JSON.","error":"unexpected EOF","encrypted":false,"multires":null}

こういったエラーが XSOAR から返ってくるようであれば、以下の3点を見直してみる必要があります。

<正しくWeb APIにアクセスするポイント>
1.Authorization: に認証情報が正しく設定されているか?
2.「要求本文」に記載したデータが正しく JSON フォーマットで描かれているか?
3.「詳細」設定にて以下の図の通り「要求本文をエンコードします」がOFFになっているか?

Power Automate – Webサービスを呼び出します(詳細)

特に2.のJSONフォーマットはかなりシビアな感じなので、念入りに確認する必要があります。たとえば以下のように同じ”でくくっているように見えて実は”になっていたりするので要注意です。

"59daa471-0cc5-495a-8567-1a252fd020c6”

これらを修正することで、ようやく正常に XSOAR にアクセスすることができました。

Power Automate で Splunkの操作を自動化してみた

Power Automate のブラウザ操作機能で実際に Splunk のWeb画面をどこまで操作できるか試してみました。

試してみる前は Power Automateのレコーダー機能で何も考えずにできてしまうのではないかと楽観視していましたが、そうすんなりいかないことがわかりました。

ただし、コツさえつかめば比較的簡単に解決できるようなので、Power Automateはやはり自動化しやすいなという思いを新たに持ちました。

1.ブラウザ操作をレコーダーで記録

まずざっとPower AutomateのレコーダーでSplunkの操作を記録した結果は以下の通りです。

Power Automate – レコーダー記録直後

この中からまずは不要そうなアクションを削除します。具体的には赤枠でかこった部分が不要と思われる部分です。

2.とりあえず動かしてみる

不要そうなアクションを削除した後とりあえず動かしてみると、まず以下の赤枠で囲われた部分で処理がエラーになりました。

Power Automete – Error 1

3.エラー部分のUI要素を編集する

具体的には、ログの検索時間を「最新24時間」から「全時間」変えるところで失敗しています。

Splunk 自動化失敗箇所1

そこで、Power Automateの右端のアイコンメニューの内、上から2つ目の「UI要素」を選択し、「Anchor ‘全時間’」となっている部分を確認することにします。

Power Automate – UI要素

「Anchor ‘全時間’」部分から右クリックでメニューを表示させ、そこから「編集」を選びます。

Power Automate – UI要素 – 編集

すると以下の通り複数の要素が選択されている状態になっていますので、とりあえず一番したの「Anchor ‘全時間’」だけ選択された状態にします。

Power Automate – UI要素2

結果として下部の「セレクターをプレビューする」が「a[Text=”全時間”]」とシンプルな形になります。

Power Automate – UI要素3

これで保存すると、処理を流したときにうまく「全時間」を選択してくれるようになりました。

4.再度動かしてみる

そこで再度動かしてみましたが、今度はテキストフィールドを選択するところでエラーになりました。

Power Automate – Error 2

おそらくDiv の後ろの “id-“が動的なUI要素として生成されているからではないかと思われます。

5.エラー部分の動的なUI要素に対処する

具外的にはSplunk画面の以下の赤枠部分のテキストフィールド選択が失敗しています。

Splunk 自動化失敗箇所2

そこで、エラーが出ていたアクションの編集画面を右クリックで表示し、以下の画面のようにUI要素として「Text area ‘サーチ’」を選択します。

Power Automate – UI要素の変更

こうすることで以下のとおりアクションの表示が変わりますが、よく見てみると「Test area ‘サーチ’に”を入力する」となっており、テキストフィールドに入力したはずのSPL文が入っていません。

Power Automate – 入出力変数1

そこで右上の赤枠の通り、「入出力変数」から「入力」を選択し新しい入出力変数としてSPL文を設定しておきます。

Power Automate- 入出力変数2

この入出力変数(NewInput)を設定してくことで、下図の通り先ほどのアクションの編集画面から入力値として NewInput を選択できるようになります。

Power Automate- 入出力変数3

これで、NewInput の値を変えるだけで、いろいろなSPLを検索することができるようになりますね。

Power Automate – 完成

6.自動化成功

最終的に最後まで自動化した結果が以下の通りです。

Splunk自動化結果

SPL で表示した結果をCSV でローカルに保存するところまで自動化できました。

Power AutomateからVirus Total にアクセスするPythonを呼び出して入力したサイトの安全性を確認してみた

最近、Power Automateをいろいろといじり始めていますが、今回は、Power Automateから Virus TotalにアクセスするPythonプログラムを呼び出してみましたので、そのときの設定を記録しておきます。

なお、処理の流れは以下の通りです。

1.入出力変数(NewInput)にVirus Totalで評価するURLを設定
2.NewInputの内容をinput.txtに書き込み
3.Virus TotalにアクセスするPythonプログラムを呼び出し
  (input: input.txt, output:output.txt, scan_result.json)
4.Virus Totalでの評価結果をoutput.txtファイル等から読み込み
5.Gmailをつかって評価結果をメール送信

Power Automate全体フロー

以下、フローを作成していて苦労した点を少し説明していきます。

2.NewInputの内容をinput.txtに書き込み

Power Automateの機能メニューから「テキストをファイルに書き込む」を選択した際に、エンコードがデフォルトでUTF-8になっていましたが、それだとなぜが Pythonで読み込んだときに半角が全角になってしましいました。

そこでエンコードの設定を「UTF-8」から「システムの規定値」に変えたところ、半角のままpythonで処理することができました。

Power automate – テキストをファイルに書き込む

3.Virus TotalにアクセスするPythonプログラムを呼び出し

正直このPythonプログラムは ChatGPTにお願いして大部分を作成してもらいました。

手直ししたのは、「json_response[‘positives’]」を「json_response[“positives”]」を書き換えたくらいです。

あとはそのまま動いてくれました。

import requests
import json

# VirusTotalのAPIキーを設定します。
api_key = 'virus totalのapiキーをここに設定'

# VirusTotalのURLスキャンAPIエンドポイントを設定します。
url_scan_endpoint = 'https://www.virustotal.com/vtapi/v2/url/scan'

# ファイルを読み込みモードで開きます。
with open('c:\\tmp\\input.txt', 'r') as file:

# ファイルから文字列を読み込み、調査したいURLを設定します。
url_to_check = file.read()
print(url_to_check)

# APIリクエストのパラメータを設定します。
params = {'apikey': api_key, 'url': url_to_check}

# URLスキャンAPIにリクエストを送信します。
response = requests.post(url_scan_endpoint, data=params)

# レスポンスをJSON形式で取得します。
json_response = response.json()

# スキャンIDを取得します。
scan_id = json_response["scan_id"]

# VirusTotalのURLレポートAPIエンドポイントを設定します。
url_report_endpoint = 'https://www.virustotal.com/vtapi/v2/url/report'

# APIリクエストのパラメータを設定します。
params = {'apikey': api_key, 'resource': scan_id}

# URLレポートAPIにリクエストを送信します。
response = requests.get(url_report_endpoint, params=params)

# レスポンスをJSON形式で取得します。
json_response = response.json()

# URLが安全かどうかを判断します。
if json_response["positives"] > 0:
    text_to_write = 'The URL is not safe.'
else:
    text_to_write = 'The URL is safe.'

# ファイルを書き込みモードで開きます。
with open('output.txt', 'w') as file:
    # 文字列をファイルに書き出します。
    file.write(text_to_write)

# レスポンスをファイルに保存します。
with open('scan_result.json', 'w') as outfile:
    json.dump(json_response, outfile)

5.Gmailをつかって評価結果をメール送信

ここでは、Gmailサーバにアクセスする為のポート番号の設定や、2段階認証していたのでアプリパスワードの設定に少してこずりました。