> For the complete documentation index, see [llms.txt](https://docs.expel.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.expel.io/connect-your-technology/l-p-integrations/microsoft/microsoft-azure-setup-for-workbench.md).

# Microsoft Azure Setup for Workbench

This setup guide takes you through steps to set up Azure with Workbench.

### Wizard vs. Manual Setup

You can use our Azure Wizard, which leverages Azure templates, to programmatically connect your Azure instance.&#x20;

Or, you can easily deploy RBAC subscription roles in Azure, allowing you to decide whether Expel should monitor one or more subscriptions. Expel can also connect to existing log storage accounts, or create new ones on your behalf.

{% hint style="info" %}
Creating and maintaining additional storage logs can result in additional fees from Microsoft Azure. If you enable storage logging, it's applied to all storage accounts deployed in your subscription.&#x20;
{% endhint %}

## Prerequisites

1. You must be able to log in to the Microsoft Entra Admin Center as a user assigned the Global Administrator or User Administrator role.
2. You must install Microsoft 365 to monitor Azure Monitor Activity Log.
   * Microsoft allows using the Microsoft 365 Management Activity API to retrieve information about various user, admin, system, and policy actions and events from Microsoft 365 AND Microsoft Entra ID activity logs.&#x20;
   * For example, this is how Expel pulls Azure sign-in logs. If you want us to monitor this type of data for your environment, enable audit logging and [set up the Microsoft 365 security device in Workbench](/connect-your-technology/l-p-integrations/microsoft/microsoft-365-setup-for-workbench.md).
3. Ensure you have provided Expel access to the required RBAC permissions and roles listed in the [Reference](#azure-rbac-permissions-and-roles) section.
4. Enabling Azure Defender is strongly recommended by Expel to monitor Azure infrastructure. Azure Defender can be enabled on a per-resource basis or for resource groups. The following Azure Defender services are currently monitored by Expel:
   * Azure Storage
   * Azure KeyVault
   * Azure Resource Manager
   * Azure App Service
   * Azure SQL Service
   * Azure Cosmos DB Service

### About Connecting Your Device

Expel uses API integrations to connect directly to the Microsoft Azure platform. We support authentication through an Microsoft Entra ID app. To collect data, Workbench communicates directly with APIs, including the Microsoft Security Graph API to poll alerts from Microsoft Sentinel. Workbench also queries Azure Log Analytics to enrich Sentinel alerts with the Azure Log Analytics context that originally generated that alert.

### About Console Permissions in Your Devices

As you connect your devices to Workbench, you provide Workbench access to those devices through permissions in the devices. These permissions vary from one device technology to another, but we typically need at least Read access to your devices to pull in any logs from those devices into Workbench. For more information, see [Why Expel Asks for Console Access](/connect-your-technology/about-integrations/why-expel-asks-for-console-access.md).

## Step 1: Enable Console and Cross-Tenant Access for Expel

{% hint style="warning" %}
**If your organization has already created a new Expel account for console access and enabled cross-tenant access for another Microsoft integration, you may skip to** [**Step 2: Enable Azure Application Access**](#step-2-enable-azure-application-access)**.** The same "\<Your Organization GUID>@soc.expel.io" account provides access across all Microsoft services.
{% endhint %}

### Step 1: Enable Console Access for a New Account

Expel requires console access to allow analysts to perform investigation and triage. Without this additional level of information, details cannot be verified by our analysts and an investigation cannot be initiated. For more information, see [Why Expel Asks for Console Access](/connect-your-technology/about-integrations/why-expel-asks-for-console-access.md).

1. [Log in to the Microsoft Entra Admin Center](https://entra.microsoft.com/) as a user assigned the Global Administrator or User Administrator role.
2. Navigate to **Entra ID > Users > All Users**.
3. Select **User > Invite external user**.
4. On the **Basics** tab, include the following:
   * **Email** - use your [Organization GUID](#user-content-fn-1)[^1] to create the email address in the format "\<Your Organization GUID>@soc.expel.io". For example, `a123bc45-aa12-123b@soc.expel.io` .
   * **Display Name** - enter "Expel SOC".
5. On the Assignments tab, configure the following:
   * Select **Add role**.
   * Search for and select **Global Reader**.

{% hint style="info" %}
This role provides read-only access across most Microsoft 365 and Azure management consoles.
{% endhint %}

6. Select **Review + invite** and then **Invite**.

The user account will be added to your directory as a guest, and an invitation will be sent to the email provided.

### Step 2: Enable Cross-Tenant Access

In this step you will add Expel as an external organization and configure inbound trust.

1. Still in the Microsoft Entra Admin Center, navigate to **Entra ID > External Identities > Cross-tenant access settings**.
2. Select the **Organizational settings** tab.
3. Select **Add organization**.
4. On the Add organization pane, enter Expel’s tenant ID: `1cde81fd-b430-4035-b24d-709921922876`
5. Select **Expel** from the search results, and then select **Add**.
6. In the Organizational settings list, locate the **Expel** row and select **Inbound access**.
7. On the "Inbound access settings - Expel" page, select the **Trust settings** tab, and configure the following:
   * Select **Customize settings**.
   * Enable **Trust multifactor authentication from Microsoft Entra tenants**.
   * Enable **Trust compliant devices**.
   * Enable **Trust Microsoft Entra hybrid joined devices**.
   * Under Automatic redemption, enable **Automatically redeem invitations with the tenant Expel**.
8. Select **Save**.

## Step 2: Enable Azure Application Access

Choose one of the following methods to enable secure API access. You will need to save the following value(s) as they are generated, for use later in this guide:

* Directory (tenant) ID
* Application (client) ID\*[^2]
* Application (client) secret value\*[^2]

{% hint style="info" %}
Enabling the Enterprise Application is the recommended approach. However, because the Enterprise Application supports access for multiple Microsoft integrations (Microsoft Sentinel, Azure Log Analytics, and so on), it may be that the permissions granted to the Enterprise Application are more than the minimum required for the Azure integration specifically.
{% endhint %}

<details>

<summary>Option 1: Enable the Expel Azure Integration (RECOMMENDED)</summary>

1. As an Administrator, go to the [Expel Admin Consent Page](https://login.microsoftonline.com/common/oauth2/authorize?prompt=consent\&client_id=5b465fa7-ab2e-4840-9e40-d471cdfcc903\&response_type=code\&sso_reload=true).
2. Review and accept requested permissions.
3. The Expel Azure Integration app appears under Enterprise Applications.&#x20;
   * Review the properties and make sure that all permissions were properly granted (see the chart below).
   * Copy and save the **Directory (Tenant) ID**, as you will need it in the next step.

<table><thead><tr><th width="224.2109375">Permission</th><th>Function</th></tr></thead><tbody><tr><td><code>User.Read</code></td><td>Allows users to sign in to the app and allows the app to read the profile of signed-in users. It also allows the app to read basic company information of signed-in users.</td></tr><tr><td><code>SecurityEvents.Read.All</code></td><td>Allows the app to read your organization’s security events without a signed-in user.</td></tr><tr><td><code>User.ReadWrite.All</code></td><td><p>Allows the app to read and update user profiles without a signed-in user.</p><p></p><p><em>Note: Write permissions are optional, and only required if you plan to enable</em> <a href="/pages/EyWah2jprFVmJXj442PU"><em>Expel's auto remediation capabilities</em></a> <em>for disabling and resetting user credentials.</em></p></td></tr><tr><td><code>User.Read.All</code></td><td>Allows the app to read user profiles without a signed-in user.</td></tr><tr><td><code>Data.Read</code></td><td>Allows this application to access Log Analytics data.</td></tr></tbody></table>

</details>

<details>

<summary>Option 2: Create a Custom Entra ID App</summary>

1. [Log in to Azure.](https://portal.azure.com/)
2. Navigate to the **Microsoft Entra ID** service.
3. Go to **Manage > App registrations**.
4. Select **New registration**.
5. Fill in the application details as follows:
   * **Name** - enter "Expel Cloud Service", or another name of your choosing.
   * **Supported account types** - leave the "accounts in this organizational directory only" option selected (the first option).
6. Select **Register**.
7. You will navigate automatically to the Settings page for the app you just created.
8. Copy and save the **Application (client) ID** and **Directory (tenant) ID** to a safe place, as you will need it in the next step.
9. In the left menu, go to **Manage > API permissions**.
10. Select **Add a permission**.
11. Add the following permissions as **application permissions** (not as delegated permissions):

<table><thead><tr><th width="227.9375">Permission</th><th>Function</th></tr></thead><tbody><tr><td><code>User.Read</code></td><td>Allows users to sign in to the app and allows the app to read the profile of signed-in users. It also allows the app to read basic company information of signed-in users.</td></tr><tr><td><code>SecurityEvents.Read.All</code></td><td>Allows the app to read your organization’s security events without a signed-in user.</td></tr><tr><td><code>User.ReadWrite.All</code></td><td><p>Allows the app to read and update user profiles without a signed-in user.<br></p><p><em>Note: Write permissions are optional and only required if you plan to enable</em> <a href="/pages/EyWah2jprFVmJXj442PU"><em>Expel's auto remediation capabilities</em></a> <em>for disabling and resetting user credentials.</em></p></td></tr><tr><td><code>User.Read.All</code></td><td>Allows the app to read user profiles without a signed-in user.</td></tr><tr><td><code>Directory.Read.All</code></td><td>Allows the app to read data in your organization's directory, such as users, groups and apps, without a signed-in user.</td></tr></tbody></table>

12. After all permissions are assigned, select **Grant admin consent** and **Yes** at the prompt.
13. Still in the new app, use the left menu to go to **Manage > Certificates & secrets**.
14. Select **New client secret**.
15. For the new secret:
    * **Description** - enter a description, such as "Expel API".
    * **Expires** - select **730 days (24 months)**.&#x20;
16. Select **Add**.
17. Copy and save the **client secret's** [**value**](#user-content-fn-3)[^3] to a safe place, as you will need it in the next step.

</details>

## Step 3: Enable Roles Within Azure Subscriptions

Some event sources within Azure require Role-Based Access (RBAC) roles to be granted to the Microsoft Entra ID Application within each Azure subscription. One of these RBAC roles granted to our Microsoft Entra ID Application should also be granted to the Expel user created in Step 1 to allow Expel to investigate further into any alerts.

This section walks through granting the Azure Log Analytics Reader role to both the Microsoft Entra ID Application from Step 2 and the Expel user from Step 1.

{% hint style="warning" %}
This step is a requirement or Workbench cannot poll any logs.&#x20;
{% endhint %}

1. Navigate to **Subscriptions** in the main Azure service menu by searching "Subscriptions".
2. Select the subscription(s) Workbench will monitor.
3. Repeat the steps below for each subscription.
4. Add the below roles by selecting **Access Control (IAM) > +Add > Add role assignment**, assigning access to the **Microsoft Entra ID user, group or application**, and selecting the **Expel Azure Integration enterprise app** or **custom Microsoft Entra ID app** that you created earlier. &#x20;
   * Log Analytics Reader: Required role to ingest logs.
5. Repeat the above step and assign the **Log Analytic Reader** role to Microsoft Entra ID, \<Your Organization GUID>@soc.expel.io.

## Step 4: Route and Enable Azure Resource Logs

To monitor activity within your Azure environment, Expel needs access to diagnostic logs (the "who, what, when" of resource activity). We do not monitor the actual data or files within your production storage accounts; that data remains completely invisible to us.

To set up this access securely, you will configure your existing Azure resources to send their diagnostic logs to a storage account that we can access. You have two options:

* [Option 1 (Recommended)](#option-1-recommended-create-a-new-dedicated-storage-account-for-logs): Create a new, dedicated storage account to be used only for collecting logs for Expel.
* [Option 2](#option-2-use-an-existing-centralized-log-storage-account): Use an existing centralized storage account (this account must be one where you aggregate diagnostic logs from multiple resources).

{% hint style="info" %}
We only ask for read-only permissions to one specific log account, whether you choose Option 1 or Option 2.
{% endhint %}

<details>

<summary>Option 1 (Recommended): Create a New, Dedicated Storage Account for Logs</summary>

This is the most common and recommended approach. You will create a new storage account, grant us read-only access, and then configure your other accounts to send logs to it.

{% hint style="info" %}
Azure requires the diagnostic setting destination to be in the same region as the resource sending logs. If your production storage accounts span multiple regions, create a dedicated storage account in each region and then grant Expel the same access to each.
{% endhint %}

### Step 1: Create the Storage Account&#x20;

Create a new storage account, choosing Standard performance on the Basics tab. This creates a general purpose v2 (StorageV2) account, which is the required type.

* We recommend using a descriptive name, such as `expelazurelogcompanyname`. Note that storage account names allow only lowercase letters and numbers, of between 3 and 24 characters.
* Make sure to leave **Enable hierarchical namespace (Data Lake Storage Gen2)** as unchecked on the Advanced tab, as it is not needed for log collection.

### Step 2: Grant Expel Access

{% hint style="warning" %}
We will not ask for, and you should not grant, permissions to any of your other storage accounts that contain your business data.
{% endhint %}

1. Navigate to the new storage account.
2. Select **Access Control (IAM)**.&#x20;
3. Select **Add > Add role assignment**.
4. Locate the Expel Azure Integration app or the custom app you created earlier, and assign the `Storage Blob Data Reader` role.
5. Select **Save**.

### Step 3: Configure Log Routing

For each existing production storage account that contains data you want us to monitor, you must route its diagnostic logs to the new storage account.&#x20;

{% hint style="warning" %}
You must repeat these steps for each existing storage account you want monitored.
{% endhint %}

1. Navigate to your existing storage account (e.g. `productiondatastorage`).
2. From the left-hand menu, navigate to **Monitoring > Diagnostic settings**.
3. Perform the following steps for each resource (**blob**, **queue**, **table**, and **file**):
   * Select the first resource (i.e. blob).
   * Select **Add diagnostic setting**.
   * Give the setting a descriptive name (e.g. `route-logs-to-expel`; you may use the same name for all resources if you wish).
   * Under **Logs**, select all of the following categories: **Storage Read**, **Storage Write**, **Storage Delete**.
   * Under **Destination details**, select **Archive to a storage account**, and then use the dropdowns to choose the new storage account you created.
   * Select **Save**.
   * Repeat these steps for the remaining resources within that storage account.

If you have other storage accounts that you want monitored, navigate to the next account and repeat all of these steps. If not, continue to firewall settings.

### Step 4: Adjust Firewall Settings

If your newly created log storage account has network restrictions, you must adjust the firewall settings to allow Expel to access the logs.

{% hint style="info" %}
Access to these logs is still strictly controlled by the Storage Blob Data Reader role you assigned earlier. This setting simply ensures that Azure's network firewall does not block Expel's secure, authenticated access. All requests to this storage account from Expel will originate from our documented [static IP addresses](/workbench-setup/configure-an-ip-allow-list.md).
{% endhint %}

1. Navigate to the storage account.
2. From the menu, select **Security + networking > Networking**.
3. Scroll down to **Resource settings** and then select **View**.
4. Under **Exceptions**, make sure the **Allow read access to storage logging from any network** option is checked.

</details>

<details>

<summary>Option 2: Use an Existing Centralized Log Storage Account</summary>

If you already have a storage account that you use as a central destination for diagnostic logs, you can grant Expel access to it instead of creating a new one.

### Step 1: Verify Critical Storage Account Settings and Routing

* First, make sure the diagnostic logs from your connected critical storage accounts have the **Storage Read**, **Storage Write**, and **Storage Delete** log categories enabled.
* Next, make sure the diagnostic logs from your critical storage accounts are already being successfully routed to the existing centralized storage account.

### Step 2: Grant Expel Access

{% hint style="warning" %}
We will not ask for, and you should not grant, permissions to any of your other storage accounts that contain your business data.
{% endhint %}

1. Navigate to your existing centralized storage account.
2. Select **Access Control (IAM) > Add > Add role assignment**.
3. Locate the Expel Azure Integration app or the custom app you created earlier, and assign the `Storage Blob Data Reader` role.
4. Select **Save**.

### Step 3: Adjust Firewall Settings

If your existing log storage account has network restrictions, you must adjust the firewall settings to allow Expel to access the logs.

{% hint style="info" %}
Access to these logs is still strictly controlled by the Storage Blob Data Reader role you assigned earlier. This setting simply ensures that Azure's network firewall does not block Expel's secure, authenticated access. All requests to this storage account from Expel will originate from our documented [static IP addresses](/workbench-setup/configure-an-ip-allow-list.md).
{% endhint %}

1. Navigate to the storage account.
2. From the menu, select **Security + networking > Networking**.
3. Scroll down to **Resource settings** and then select **View**.
4. Under **Exceptions**, make sure the **Allow read access to storage logging from any network** option is checked.

</details>

## Step 5: Configure Azure in Workbench

Now that we have the correct access configured and noted the credentials, we can integrate your tech with Workbench.

{% hint style="info" %}
Expel secures all login information our SOC analysts need about your devices in an MFA password product. Access to this login information is protected using our internal MFA processes. To learn more about the IP addresses all Expel traffic [comes from, go here.](/workbench-setup/configure-an-ip-allow-list.md)
{% endhint %}

1. In a new browser tab, log into <https://workbench.expel.io/settings/security-devices?setupIntegration=azure>.
2. Complete all fields using the credentials and information you collected in [Step 2](#step-2-enable-azure-application-access).
   * **SIEM** - select Expel Cloud Service.
   * **Name** - enter a name that might help you more easily identify this integration, such as “CompanyName Azure”; this name will display in Workbench under the Name column, and is a text string that you can filter on.
   * **Location** - enter the location of your integration, for example “cloud;” this is also a text string that you can filter on, so we recommend being consistent with location naming across your Expel integrations.
   * **Directory (tenant) ID** - enter your Directory/Tenant ID.
   * **Application (client) ID** - if you created a custom app, enter the Application (Client) ID.
   * **Application (client) Secret** - if you created a custom app, enter the Client Secret value.
3. Select **Save**.

Your device should be created successfully within a few seconds. A few reminders:

* After your connection is healthy, it will take some time for your device to begin polling and receiving data.
* To check on the status, select the downward arrow for your device in the first column and choose **View details**.
* Polling will happen first; data will be received after that. **You must refresh the page to see updates.**
* If your device does not begin polling within 15 minutes, and does not begin receiving data within 30 minutes, [contact our support team for help](/support/how-to-reach-us.md).
* To check if alerts are coming through, navigate to **Dashboards > Alert Analysis**. Scroll to the device you want to check, and select the **Expel Alerts** tab to reveal more alert information. It can take 36 to 72 hours for alerts to appear after setup, as we [tune your device](/workbench-reference/alerts/how-expel-alerts-work.md#device-tuning).

## Reference

### Azure RBAC Permissions and Roles

Workbench needs access to the following roles and operations in Azure.

**Microsoft Azure Integration Application Permissions**

<table><thead><tr><th width="238.09375">Permission</th><th>Purpose</th></tr></thead><tbody><tr><td><code>SecurityEvents.Read.All</code></td><td>Ingests VendorAlerts from a direct poller.</td></tr><tr><td><code>User.Read</code></td><td>Creates an application.</td></tr></tbody></table>

**RBAC Operations Needed to Read Azure Monitor Activity Log**

<table><thead><tr><th width="237.9921875">Operation</th><th>Purpose</th></tr></thead><tbody><tr><td>Action - Microsoft.Insights/eventtypes/values/read</td><td>List activity log events (management events) in a subscription. This permission applies to both programmatic and portal access to the activity log.</td></tr></tbody></table>

**RBAC Operations Needed to Read Storage Logs Using Microsoft Entra ID Auth**

<table><thead><tr><th width="238.0625">Operation</th><th>Purpose</th></tr></thead><tbody><tr><td>Action - Microsoft.Storage/storageAccounts/read</td><td>Returns the list of storage accounts or gets the properties for the specified storage account.</td></tr><tr><td>Action - Microsoft.Storage/storageAccounts/blobServices/containers/read</td><td>Returns a list of containers.</td></tr><tr><td>DataAction - Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read</td><td>Returns a blob or a list of blobs.</td></tr></tbody></table>

**RBAC Operations Needed to Read Storage Logs Using Shared Key Auth**

<table><thead><tr><th width="238.4609375">Operation</th><th>Purpose</th></tr></thead><tbody><tr><td>Action - Microsoft.Storage/storageAccounts/read</td><td>Returns the list of storage accounts or gets the properties for the specified storage account.</td></tr><tr><td>Action - Microsoft.Storage/storageAccounts/blobServices/containers/read</td><td>Returns a list of containers.</td></tr><tr><td>Action - Microsoft.Storage/storageAccounts/listKeys/action</td><td>Returns the access keys for the specified storage account.</td></tr></tbody></table>

**RBAC Operations Needed to Query Azure Log Analytics**

<table><thead><tr><th width="238.125">Operation</th><th>Purpose</th></tr></thead><tbody><tr><td>Action - Microsoft.OperationalInsights/workspaces/analytics/query/action</td><td>Search using new engine.</td></tr></tbody></table>

**Roles That Roll Up Under Built-In RBAC Roles**

<table><thead><tr><th width="238.1328125">Role</th><th>Purpose</th></tr></thead><tbody><tr><td><code>Global Reader</code></td><td>Read everything that a Global Administrator can, but not update anything. Required role to ingest logs.</td></tr><tr><td><code>Log Analytics Reader</code></td><td>View and search all monitoring data as well as view monitoring settings, including viewing the configuration of Azure diagnostics on all Azure resources. Required role to ingest logs.</td></tr><tr><td><code>Storage Blob Data Reader</code> or <code>Storage Account Contributor</code> (only if using shared key auth)</td><td><ul><li>Storage Blob Data Reader: read and list Azure Storage containers and blobs. Required role to ingest logs.</li><li>Storage Account Contributor: allows management of storage accounts. Provides access to the account key, which can be used to access data via Shared Key authorization. Required role to ingest logs.</li></ul></td></tr></tbody></table>

#### Remediation capabilities

<table><thead><tr><th width="237.59765625">Permission</th><th>Purpose</th></tr></thead><tbody><tr><td><code>Disable user account</code></td><td>Allows the app to enable and disable user accounts on behalf of the signed-in user.</td></tr></tbody></table>

[^1]: * [Log in to Workbench](https://workbench.expel.io/auth/login?orig=%2F).
    * Go to **Organization Settings > My Organization**.
    * On the organization's page, look for the Organization GUID and select the **Copy** button to copy the GUID.

[^2]: *Custom Entra ID apps only.*

[^3]: Make sure you copy the value, not the secret ID.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.expel.io/connect-your-technology/l-p-integrations/microsoft/microsoft-azure-setup-for-workbench.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
