Microsoft Sentinel の Salesforce Service Cloud データコネクターの送信元 IP アドレスを固定する！

# はじめに
Microsoft Sentinel の Salesforce Service Cloud データコネクターにて Salesforce Service Cloud のイベントモニタリングログ収集する機能が提供されています。データコネクターは Azure Functions のアプリケーションとして提供されますが、アプリケーション実行される送信元 IP アドレスが毎回変わる動作になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/b2e6e3bd-e356-91fe-1296-9232176baee5.png)

Azure Functions は East US に展開しましたが、送信元 IP アドレスの場所として、United States だけでなく Germany や United Kingdom となっているものもあります。
そのため、今回は Azure Functions が REST API リクエストを送信する送信元 IP アドレスを固定化してみます！

## Azure Functions の従量課金プラン
Salesforce Service Cloud データコネクターの Azure Functions は使用量ベースの従量課金プランで展開されます。
従量課金プランは、アプリケーション実行時に利用可能な IP アドレスを使って通信を行う仕様になっています。利用可能な IP アドレスは複数あり、アプリケーション実行毎に異なる IP アドレスがアサインされます。

* 関数アプリの送信 IP アドレス (https://learn.microsoft.com/ja-jp/azure/azure-functions/ip-addresses?tabs=portal#find-outbound-ip-addresses)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/8c75dc11-1420-6e30-3cfe-1934b43b484e.png)

:::note info
情報
使用量プランでは AppService プランが `Y1` と表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/b029c0de-a58a-cd5f-3cb2-5580dcfd7390.png)
:::

従量課金プランでは VNET 統合を利用できないため、送信元 IP アドレスをコントロールすることができません。
Flex 従量課金プラン (プレビュー) では VNET 統合をサポートしていますが、2024年5月時点では東日本リージョンは対象外になっています。

* ネットワーク機能 (https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-scale#networking-features)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/e3a8abf3-cb6c-dff8-abb8-f7ca50e2d93e.png)

そのため、VNET 統合をサポートする Premium プランでデータコネクタを展開して送信元 IP アドレスを固定化してみます。

* チュートリアル: Azure 仮想ネットワーク NAT ゲートウェイを使用して Azure Functions の送信 IP を制御する (https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-how-to-use-nat-gateway)

## Azure Functions の料金プラン

Azure Functions の料金プランは、アプリケーションを実行した回数で課金する使用量課金と、アプリケーションを実行するコンピューティングリソースの vCPU やメモリの使用時間に対して課金する Premium プランの課金体系で提供されています。


* Azure Functions の価格 (https://azure.microsoft.com/ja-jp/pricing/details/functions/)

* 使用量プラン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/2d9812ae-2451-871b-0b21-0179b7a657f8.png)

* Premium プラン
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/50609df3-65ad-efbf-1036-126c64aed980.png)

## Salesforce Service Cloud データコネクタ
Microsoft Sentinel のデータコネクタで提供されている方法(Option1, 2 どちらも)で展開すると、Azure Functions は使用量プランで展開されます。
Azure Functions の送信元 IP アドレスの要件が無い場合は、こちらから簡単に展開できます。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/a3400153-a76f-aa25-da38-73347afd2ef5.png)

そのため、Premium プランの Azure Function を手動で作成し、Salesforce Service Cloud へ REST API でイベントモニタリングログを収集する関数アプリを展開していきます。

# 送信元 IP アドレスを固定する Azure Functions の作成
Sentinel で提供される Salesforce Service Cloud データコネクタと、先ほどのチュートリアルを参照しながら 送信元 IP アドレスを固定した Azure Functions を作成します。

構成イメージはこちらです。
* トポロジ (https://learn.microsoft.com/ja-jp/azure/azure-functions/functions-how-to-use-nat-gateway#topology)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/29a88b54-1316-d5bc-f8cb-635a5a7a8f44.png)

+ Sentinel の Salesforce Service Cloud データコネクタの手順
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/18dd87ad-657d-19d6-627e-3277611b39e6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/133122b9-877e-ecf0-a3c9-a5012b166cd7.png)

## 1. Azure Functions Premium プランの作成
まず、Azure ポータルから Premium プランで Azure Functions を作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/d1b0bdbe-7ec6-5c48-0c9f-ef7c146f1c4d.png)

関数アプリは Python 3.8 で作成されているため、ランタイムスタックとバージョンを指定します。Premium プランは EP1 と表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/7a1925ef-72c2-a583-8f73-a6719c49b6cd.png)

それ以外は既定値のまま作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/cb338dec-274c-6c07-670a-e529bd1ae10e.png)

## 2. SalesforceSentinelConnector アプリケーションの展開
Sentinel の Salesforce Service Cloud データコネクタから Azure Functions に展開するアプリケーションをダウンロードします。

Salesforce Service Cloud データコネクタページを開き、「Option 2 - Manual Deployment of Azure Functions」‐ 「Step 1 - Deploy a Function App」にリンクがありますが、こちらにも張っておきます。
* Salesforceデータコネクタアプリのダウンロード URL (https://aka.ms/sentinel-SalesforceServiceCloud-functionapp)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/aa8a69a0-1821-8ff6-8b95-f6d4b06a3145.png)

ダウンロードしたアプリケーションは Visual Studio Code から Azure Functions に展開するので、Visual Studio Code を起動し、Azure Tools 拡張機能をインストールします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/051947a3-bc4d-5ff8-3f3c-8dd71f1918fc.png)

Azure Tools にログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/dbb383c7-1cf3-593d-1aa6-3b0fac17b23c.png)

VS Code でダウンロードしたアプリケーションのフォルダを開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/20ba1a53-31ba-a0bf-278e-7a110105811d.png)

Azure Tools の Workspace から 「Initialize project for us...」をクリックし、「Skip virtual environment」を選択して、Initialize を完了させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/ec0f2252-90ba-95b3-47b9-da8035378d3e.png)

VS Code の Workspace から Azure Functions のアイコンを選択し、「Deploy to Azure...」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/7e97f772-b2d9-830a-c668-d31c7b3603e5.png)

アプリケーションを展開するサブスクリプション、Azure Funstion を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/71a39b2f-5611-b112-9931-57f36bbfc3da.png)

ポップアップにてアプリケーションを展開する画面が出るため、「Deploy」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/9c072caa-4354-79f4-34fe-506554fe4d74.png)

これで Salesforce Service Cloud に REST API でイベントモニタリングログを収集するアプリケーションの展開が完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/2791a90a-42f6-6711-a1db-252ce23bbdaa.png)

Azure ポータルからも確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/12268c68-8125-ac91-4074-e9b319753f8a.png)

## 3. アプリケーションのパラメータ設定
展開したアプリケーションに必要なパラメーターを確認します。
|パラメーター|値|
|--|--|
|WorkspaceID|Log Analytics ワークスペースID|
|WorkspaceKey|Log Analytics ワークスペース Primary Key|
|logAnalyticsUri|https://<"Log Analytics ワークスペースID">.ods.opinsights.azure.com|
|SalesforceTokenUri|https://login.salesforce.com/services/oauth2/token|
|SalesforceUser|Salesforce ユーザー名|
|SalesforcePass|Salesforce パスワード|
|SalesforceSecurityToken|Salesforce セキュリティトークン|
|SalesforceConsumerKey|Salesforce コンシューマキー|
|SalesforceConsumerSecret|Salesforce シークレット|
|timeInterval|hourly|
|Schedule|0 0 * * * *|

Log Analytics 関連の情報は、Log Analytics ワークスペースの「エージェント」から確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/236b2ead-79d2-ba47-8063-2cbc8d35081c.png)

Salesforce のコンシューマーキーとシークレットは、アプリケーションマネージャからアプリケーションの「参照」から確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/1d46c2bd-f88f-ac7e-319b-4f373e1f719f.png)

セキュリティトークンは、ユーザーアイコンの設定から 「私のセキュリティトークンのリセット」をすることで取得することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/ff2cd3f6-3769-2b83-5e38-d4eeb7ad3e97.png)

収集した情報を Azure Functions の環境変数に追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/2ebe9b1c-f625-6821-bc65-fcf516e2d1c9.png)

このように各パラメーターを追加していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/610bd088-1914-49c1-766c-3cb52894ed53.png)

すべてのパラメーターを入力するとこのようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/1b85e6cb-9b06-ab9d-9e04-5202d3460d9d.png)

## 4. VNET 統合を設定
Azure Functions を VNET 統合することで、アウトバンド通信を NAT Gateway 経由にすることができます。

Azure Functions のネットワークを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/c7c289f0-2153-b67f-7d3d-b6a8b4f67a61.png)

仮想ネットワーク統合の追加をし、VNET 統合する仮想ネットワーク、サブネットを追加します。
すでに VNET 統合を有効化したサブネットを選択することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/9a2746da-71d7-1bbe-7139-cdf5d6c23976.png)

VNET 統合が有効化されるとこのような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/f214b037-644d-18da-959f-ffec9c759d1a.png)

## 5. NAT Gateway の作成
最後に NAT Gateway を作成します。 

まず、パブリック IP アドレスを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/5458c976-9069-79c9-25b8-377e8376845f.png)

次に NAT Gateway を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/ed078592-8faf-03b1-6a6b-3413aee176c9.png)

事前に作成した Public IP アドレスを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/a37966da-058b-7665-9252-c0eeb3b18832.png)

NAT Gateway 経由で通信させる VNET 統合したサブネットを指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/d81a2c40-b99e-0bb4-6191-a57933e9e464.png)

これで NAT Gateway を作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/369dc105-b616-4b84-a565-02d9da5ab7ab.png)

## 6. 動作確認
Azure Functions に展開したアプリケーションを手動実行し、Salesforce Sercie Cloud にログインする IP アドレスを確認します。

Azure Functions 概要ページから、展開したアプリケーション 「SalesforceSentinelConnector」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/f2438034-e87f-4dd5-330c-8b3a7052790f.png)

「テスト/実行」から 「実行」をクリックします。するとアプリケーションが実行されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/a05a3ed9-4c0c-5294-0d82-8315161a4da7.png)

設定に問題がなければ、アプリケーションが実行され Salesforce Service Cloud からログを収集するスクリプトが実行されたログが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/40bc3798-1ca2-8d2e-d81d-d3bd09cd3bcc.png)

Salesforce 側のログイン履歴を確認し、NAT Gateway に設定した パブリック IP アドレスからアクセスが来ていることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2981190/bc05cabf-aa50-b858-8078-f728c03d0143.png)


# まとめ
Azure Functions を Premium プランで手動展開することで、送信元 IP アドレスを固定して Salesforce Service Cloud にログインしてログを収集することができるようになります。
Salesforce Service Cloud 側で IP アドレスによるログイン制限をしている場合、Nat Gateway にわりあてた 1つの IP アドレスからの通信を許可すればよいため、セキュリティリスクの軽減につなげることが可能です。
もし Salesforce Service Cloud のログを Sentinel に取り込む場合にご検討いただければと思います！

なお、Salesforce 側でイベントログ収集を有効化しないと、Sentinel にログは入ってきません。
こちらにイベントログの有効化手順がありますので、Salesforce に詳しくない方はぜひご参照ください！
* ログの記録開始 (https://successjp.salesforce.com/article/NAI-000437)