Azure Lighthouse - Microsoft Sentinel を MSSP や複数 Azure AD 環境で管理するためのマルチテナント管理の構成方法

# I. イントロダクション

:::note info
本記事は2020年の記事ですが、一部2023年4月時点での情報に更新しています。
:::

## Microsoft Sentinel とは？

Microsoft Sentinelは、マイクロソフトが 2019年9月にリリースしたクラウドネイティブ SIEM です。Microsoft 365 や Azure、ファイアウォール・プロキシやオンプレミスのサーバー、セキュリティ製品など、幅広くセキュリティログ・アラートを収集し、分析やイベント管理を行うことができます。

### ＊参考記事
* 公式ドキュメント- Azure の公式ドキュメントです。基本的な情報はここに揃っています。

https://docs.microsoft.com/ja-jp/azure/sentinel/

* ここで使える Azure Sentinel - 手前味噌ですが ITmedia 様に投稿させていただいた記事です。より具体的なシナリオなどについて記載しています。

https://www.atmarkit.co.jp/ait/articles/1909/13/news016.html

## 本記事について

この記事では、Microsoft Tech Community 記事 [Using Azure Lighthouse and Azure Sentinel to Monitor Across Multiple Tenants ](https://techcommunity.microsoft.com/t5/Azure-Sentinel/Using-Azure-Lighthouse-and-Azure-Sentinel-to-Monitor-Across/ba-p/1043899) を元に、マルチテナント上にある Azure Sentinel リソースを管理する方法をご紹介します。（リソースグループ単位の委任に内容を若干変更しています。）

https://techcommunity.microsoft.com/t5/Azure-Sentinel/Using-Azure-Lighthouse-and-Azure-Sentinel-to-Monitor-Across/ba-p/1043899

## Azure Lighthouse とは？

Sentinel に限らず、他の Azure AD テナントに紐づく Azure リソースを管理するには、Azure Lighthouse を利用します。これは例えば、エンドカスタマーがAzure リソースの運用管理を他社に委任する場合や、プロバイダーがエンドカスタマー側のテナントを利用してサービス提供する場合に非常に便利です。

公式ドキュメントに、一通りのデプロイ方法がまとめられております。

https://docs.microsoft.com/ja-jp/azure/lighthouse/how-to/onboard-customer

Qiita では、こちらの記事が Azure Lighthouse について詳細にまとめてくださっています。

https://qiita.com/yukiki0621/items/8e44a2f651191b89253b


### Azure Lighthouse の仕組み

ざっくりとした仕組みは、下記になります。Customer (エンドカスタマー） 側が、Managing (プロバイダー）側に対して特定のリソース（この記事では Sentinel を管理するリソースグループ）の管理を委任します。すると、Managing 側で定義された Azure AD グループに対して、Azureの組み込みロールを利用して RBAC (ロールベースアクセスコントロール）を適用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/39ca59e5-d415-f89b-5c48-284a97899e72.png)

# II. 実際の設定方法について

ここから具体的に、Sentinel のリソース管理を別テナントに委任していく手順を見ていきます。各項目について委任元作業か、委任先作業か記載していますのでご確認ください。

## 必要条件

* 委任する側の実施者が委任元のサブスクリプションの所有者権限を有すること
* 委任する側が、委任先の Azure AD のテナント ID とオブジェクト ID を取得しておくこと
* 委任する側のサブスクリプションでリソースプロバイダーの Microsoft.ManagedServices の登録（これは通常登録されていないことが多いので、Portal のサブスクリプションメニューなどから、ご設定ください）


もしくは下記、Azure CLI でも簡単に実施可能です。

```bash
az provider register --namespace Microsoft.ManagedServices
```

## ① Azure AD グループの作成（委任先）

Lighthouse における、RBAC の指定先となるグループ（セキュリティグループ）を作成します。（ユーザーやサービスプリンシパルも利用可能です。）のちほど、このグループの ID (オブジェクト ID) が必要になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/d7489a11-592f-4e4c-17e4-edbe06a909a5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/8e8f4be1-6221-58f3-26a3-366b9c64b53e.png)


## ② パラメーターファイルの作成（委任元）

下記の JSON ファイルの中の、<>の部分を変更し、parameter.jsonとして保存します。リソースグループに関しては、Sentinel のリソースが属するリソースグループ名を指定します。Sentinel は複数のリソースの集合体として機能するため、すべてを同じリソースグループに格納しておくと管理が便利です。委任先の Azure AD のテナント ID や Azure AD のグループ (オブジェクト ID) をここで指定します。（なおサブスクリプションごと委任することも可能です。テンプレートが異なりますので、下記をご参照ください。）

https://learn.microsoft.com/ja-jp/azure/lighthouse/how-to/onboard-customer#create-your-template-manually

```JSON
{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "mspOfferName": {
            "value": "<任意のMSP Offer Nameを入力>"
        },
        "rgName": {
            "value": "<委任したいAzure Sentinelのワークスペースが所属するリソースグループを指定>"
        },
        "mspOfferDescription": {
            "value": "<任意のMSP Offer Descriptionを入力>"
        },
        "managedByTenantId": {
            "value": "<委任先のAzure ADのテナントIDを入力>"
        },
        "authorizations": {
            "value": [
                {
                    "principalId": "<委任先のテナント内のAADのグループ (オブジェクトID) を指定>",
                    "roleDefinitionId": "<組み込みロールのIDを指定 - 例：閲覧者＝acdd72a7-3385-48ef-bd42-f606fba81ae7>",
                    "principalIdDisplayName": "<グループ名を入力>"
                }
            ]
        }
    }
}
```

### ＊組み込みロールについて
Azure Lighthouse では、組み込みロールのみが利用可能です。（カスタムロールは利用できません。）Sentinelでは、必要になるアクセス権が複雑なので、下記ドキュメントで必要なロールをご確認ください。

https://learn.microsoft.com/ja-jp/azure/sentinel/roles

また、テンプレートに入力する各ロールの ID については下記ウェブサイトをご参照ください。

https://docs.microsoft.com/ja-jp/azure/role-based-access-control/built-in-roles

## ③ 委任用のテンプレートの実施（委任元）

下記を template.json として保存します。変更は特に必要ありません。

```JSON
{
    "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "mspOfferName": {
            "type": "string",
            "metadata": {
                "description": "Specify the name of the offer from the Managed Service Provider"
            }
        },
        "mspOfferDescription": {
            "type": "string",
            "metadata": {
                "description": "Name of the Managed Service Provider offering"
            }
        },
        "managedByTenantId": {
            "type": "string",
            "metadata": {
                "description": "Specify the tenant id of the Managed Service Provider"
            }
        },
        "authorizations": {
            "type": "array",
            "metadata": {
                "description": "Specify an array of objects, containing tuples of Azure Active Directory principalId, a Azure roleDefinitionId, and an optional principalIdDisplayName. The roleDefinition specified is granted to the principalId in the provider's Active Directory and the principalIdDisplayName is visible to customers."
            }
        },
        "rgName": {
            "type": "string"
        }              
    },
    "variables": {
        "mspRegistrationName": "[guid(parameters('mspOfferName'))]",
        "mspAssignmentName": "[guid(parameters('rgName'))]"
    },
    "resources": [
        {
            "type": "Microsoft.ManagedServices/registrationDefinitions",
            "apiVersion": "2019-06-01",
            "name": "[variables('mspRegistrationName')]",
            "properties": {
                "registrationDefinitionName": "[parameters('mspOfferName')]",
                "description": "[parameters('mspOfferDescription')]",
                "managedByTenantId": "[parameters('managedByTenantId')]",
                "authorizations": "[parameters('authorizations')]"
            }
        },
        {
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2018-05-01",
            "name": "rgAssignment",
            "resourceGroup": "[parameters('rgName')]",
            "dependsOn": [
                "[resourceId('Microsoft.ManagedServices/registrationDefinitions/', variables('mspRegistrationName'))]"
            ],
            "properties":{
                "mode":"Incremental",
                "template":{
                    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.0",
                    "parameters": {},
                    "resources": [
                        {
                            "type": "Microsoft.ManagedServices/registrationAssignments",
                            "apiVersion": "2019-06-01",
                            "name": "[variables('mspAssignmentName')]",
                            "properties": {
                                "registrationDefinitionId": "[resourceId('Microsoft.ManagedServices/registrationDefinitions/', variables('mspRegistrationName'))]"
                            }
                        }
                    ]
                }
            }
        }
    ],
    "outputs": {
        "mspOfferName": {
            "type": "string",
            "value": "[concat('Managed by', ' ', parameters('mspOfferName'))]"
        },
        "authorizations": {
            "type": "array",
            "value": "[parameters('authorizations')]"
        }
    }
}
```

そして、これらを Azure CLI の実施環境にアップロードします。Azure Portal で利用できる Azure Cloud Shellであれば、パッケージのインストールなども不要で便利です。

アップロードが終わったら、その環境で、以下コマンドを実行します。（パスが異なる場合は変更ください。）

```bash
az deployment create --location <Region> --template-file <テンプレートのファイルのパス> --parameters <テンプレートのパラメータのパス> --verbose
```

うまくいけば数分で作業が完了します。コマンドが成功しても Portal で反映されない場合は一度サインアウトしてみてください。

## ④補足：確認方法（委任元＆委任先）

エンドカスタマー側は、Azure Portal の サービスプロバイダーページの委任の項目から現在の委任状況が一元管理できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/85aba80b-3c39-ea2a-24ac-be5bcae25961.png)

プロバイダー側は、Azure Lighthouse のページから顧客の項目から委任を受けているリソースの一覧が確認できます。

![Portal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/4c4f7fd2-4045-8dcf-6259-e063c6091c13.png)

また、サブスクリプションのフィルターで委任元のテナントにチェックを入れると、委任元のリソースも見えるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276225/b8d93e9e-4ed1-76bc-c6da-4b16d4dec072.png)

以上にて、Azure Lighthouse の設定は完了です。思った以上に簡単に委任が完了できたのではないでしょうか。

# 最後に

Azure Lighthouse を利用することで、Microsoft Sentinel のみならず、多くの Azure サービスをテナントをまたいで一元的に管理することができます。マネージドサービスを提供される会社様や、一企業内で複数の Azure AD をお持ちの法人・団体様などは、この Lighthouse を利用する機会が多くなるかと思います。本記事がその利用開始にあたっての一助となれば幸いです。

また、Sentinel と Defender for Cloud において Lighthouse を構成した時にどう活用できるかに関して、下記記事を公開しております。

https://qiita.com/YoshiakiOi/items/ecf2839490deb9399b18

Lighthouse を構成した後に、管理をどうするかをご検討される際にご覧いただけますとさいわいでｓ

＊本稿は、個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、いかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。