Help us understand the problem. What is going on with this article?

Azure Sentinel を MSSP で提供するためのマルチテナント管理 - Azure Lighthouse

I. イントロダクション

Azure Sentinel とは?

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

*参考記事

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

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

本記事について

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

Azure Lighthouse とは?

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

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

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

Azure Lighthouse の仕組み

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

image.png

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

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

必要条件

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

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

az provider register --namespace Microsoft.ManagedServices

① Azure AD グループの作成(委任先)

Lighthouse における、RBAC の指定先はユーザーではなく、グループ(セキュリティグループ)になるので、必ず事前に委任先(プロバイダー側)にてグループをご作成ください。のちほど、このグループの ID が必要になります。

image.png

image.png

② パラメーターファイルの作成(委任元)

下記の JSON ファイルの中の、<>の部分を変更し、parameter.jsonとして保存します。リソースグループに関しては、Sentinelのリソースが属するリソースグループ名を指定します。Sentinel は複数のリソースの集合体として機能するため、すべてを同じリソースグループに格納しておくと管理が便利です。委任先の Azure AD ID や Azure AD のグループをここで指定します。

{
    "$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のグループを指定>",
                    "roleDefinitionId": "<組み込みロールのIDを指定 - 例:閲覧者=acdd72a7-3385-48ef-bd42-f606fba81ae7>",
                    "principalIdDisplayName": "<グループ名を入力>"
                }
            ]
        }
    }
}

*組み込みロールについて

Azure Lighthouse では、組み込みロールのみが利用可能です。(カスタムロールは利用できません。)Sentinelでは、リソースグループ単位の管理になるため、基本的には共同作成者または閲覧者が利用されます。各ロールの ID については下記ウェブサイトをご参照ください。
https://docs.microsoft.com/ja-jp/azure/role-based-access-control/built-in-roles

③ 委任用のテンプレートの実施(委任元)

下記をtemplate.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であれば、パッケージのインストールなども不要で便利です。

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

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

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

④補足:確認方法(委任元&委任先)

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

image.png

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

Portal.png

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

image.png

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

III. (補足)マルチワークスペースの管理

今日時点で、Azure Sentinel の各オペレーションは基本的にシングルワークスペースへのものがほとんどです。

ただ、クエリに関しては、union オペレーターを利用してマルチワークスペースに対して同時実行することができます。

<クエリ例>

union SecurityAlert, workspace('<Second Workspace Name>').SecurityAlert, workspace(‘<Third Workspace Name>’).SecurityAlert
| where TimeGenerated > ago(7d)

Azure Sentinel はリリースされたばかりの製品であり、特に MSSP 向け機能については拡張が予定されています。ぜひ、今日時点でも利用できる機能の利用やPoCを進めていただければ幸いです。

YoshiakiOi
日本マイクロソフト株式会社 Azure & Security プリセールスエンジニア。 記事は個人の見解に基づいた内容であり、所属する会社の公式見解ではありません。また、記事中の情報はいかなる保証を与えるものでもありません。正式な情報は、各製品の販売元にご確認ください。
microsoft
マイクロソフトのメンバーが最新の技術情報をお届けします。Twitterアカウント(@msdevjp)やYouTubeチャンネル「クラウドデベロッパーちゃんねる」も運用中です。
https://aka.ms/MSFT-Docs-JPN
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away