💻

Windows クライアントに Azure Monitor エージェントをインストール

2024/08/08に公開

はじめに

Windows クライアントからログを収集する方法として、以前は Log Analytics エージェントのインストーラが提供されていました。しかし、Azure Monitor エージェントに関しては、基本的に Azure Arc とセットで使用されることが前提となっています。Windows クライアントに関しては、専用のインストーラは提供されていますが、事前に様々な設定が必要となるようなので、動作確認していきます。
https://learn.microsoft.com/ja-jp/azure/azure-monitor/agents/azure-monitor-agent-windows-client

考慮すべき前提条件

特に注意すべき前提条件は以下になります。

  • Windows クライアント OS バージョン 10 RS4 以降
  • Windows クライアントは Microsoft Entra 参加もしくは Microsoft Entra ハイブリット参加が必要
    • サーバーの場合はマネージド ID を使用してログ送信時のアクセス認証をするが、クライアントの場合は Microsoft Entra デバイス トークンを使用する仕様のため
  • Windows クライアント個々にデータ収集ルール (DCR) を割り当てられず、すべてのクライアントで共通の DCR が適用される
  • プライベート リンクは未サポート
  • 常時接続された Windows デスクトップまたはワークステーション用に設計されており、ノート PC (ラップトップ) 向けにバッテリーとネットワーク観点で最適化されていない
  • インストール後のエージェント設定の更新をサポートしておらず、更新には再インストールが必要
  • 自動バージョンアップはされない

エージェント インストール

設定していきます。まず以下のダウンロード リンクからインストーラを取得します。
https://go.microsoft.com/fwlink/?linkid=2192409

PowerShell を開き、インストーラを格納したフォルダに移動、以下コマンドでインストールします。

デフォルトでインストールの場合
msiexec /i AzureMonitorAgentClientSetup.msi /qn
カスタムでインストールの場合
msiexec /i AzureMonitorAgentClientSetup.msi /qn DATASTOREDIR="C:\example\folder"

コマンド実行結果

インストール後のコントロール パネル画面

インストール後のサービス画面

監視対象オブジェクトの作成と DCR の関連付け

次に Azure 側で設定していきます。設定の流れは以下です。なお主要な設定はポータルではサポートしていないため、API で設定していきます。

  • 設定するアカウントに対してルート スコープで所有者ロールを割り当て
  • 監視対象オブジェクト共同作成者ロールの割り当て
  • 監視対象オブジェクトの作成
  • 監視対象オブジェクトと DCR の関連付け

ルート スコープで所有者ロールを割り当て

Azure 側で Windows クライアントを示す監視対象オブジェクトはサブスクリプションに属さないテナントレベルのリソースになり、設定にはルート スコープで所有者ロールが必要になります。
まず、以下手順でルート スコープでユーザー アクセス管理者ロールを取得します。 (Microsoft Entra のグローバル管理者が必要)
https://learn.microsoft.com/ja-jp/azure/role-based-access-control/elevate-access-global-admin?tabs=azure-portal

次に管理グループの Tenant Root Group を開き、アクセス制御から所有者ロールを割り当てます。

監視対象オブジェクト共同作成者ロールの割り当て

監視対象オブジェクトを作成するために監視対象オブジェクト共同作成者ロールを操作しているアカウントに割り当てます。なお、割り当ててもポータル側には表示されませんでした。

# テナント ID 指定
$tenantId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"

# Azure PowerSHell ログイン
Connect-AzAccount -Tenant $tenantId

# 操作者のプリンシパル ID を取得
$user = Get-AzADUser -UserPrincipalName (Get-AzContext).Account.Id
$principalId = $user.Id

#### 監視対象オブジェクト共同作成者ロールの割り当て ###
#uri の作成
$guid = [guid]::NewGuid()
$uri = "/providers/microsoft.insights/providers/microsoft.authorization/roleassignments/$($guid)?api-version=2021-04-01-preview"

# ペイロードの作成
$payload = @"
{
    "properties":
    {
        "roleDefinitionId":"/providers/Microsoft.Authorization/roleDefinitions/56be40e24db14ccf93c37e44c597135b",
        "principalId": "$principalId"
    }
}
"@

# API リクエスト
Invoke-AzRestMethod -Path $uri -Method PUT -Payload $payload

監視対象オブジェクトの作成

ロール割り当て後、Windows クライアントに相当する監視対象オブジェクト (リソース) を作成します。ロールを割り当てたので、再認証が必要になります。

#### 監視対象オブジェクト作成###
# 再認証
Disconnect-AzAccount
Connect-AzAccount -Tenant $tenantId

# データ収集ルールのリソース ID を指定
$dataCollectionRuleId = "/subscriptions/154d3ea0-35fb-4ce5-b754-6437002f0548/resourceGroups/rg-monitor/providers/Microsoft.Insights/dataCollectionRules/dcr-cus-winsecevent"

# 監視対象オブジェクト作成用 uri
$uri = "/providers/Microsoft.Insights/monitoredObjects/$($tenantId)?api-version=2021-09-01-preview"

# ペイロードの作成
$payload = @"
{
    "properties":
    {
        "location":"centralus"
    }
}
"@

# API リクエスト
Invoke-AzRestMethod -Path $uri -Method PUT -Payload $payload

監視対象オブジェクトと DCR の関連付け

最後に DCR と関連付けます。

#### 監視対象オブジェクトに DCR を関連付け ####

# データ収集ルールのリソース ID を指定
$dataCollectionRuleId = "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/myrg/providers/Microsoft.Insights/dataCollectionRules/mydcr"

# 関連付け用 uri
$uri = "/providers/Microsoft.Insights/monitoredObjects/$tenantId/providers/microsoft.insights/datacollectionruleassociations/dcr-associations-winclient?api-version=2021-09-01-preview"

# ペイロードの作成
$payload = @"
{
    "properties":
    {
        "dataCollectionRuleId": "$dataCollectionRuleId"
    }
}
"@

# API リクエスト
Invoke-AzRestMethod -Path $uri -Method PUT -Payload $payload

# 関連付けを確認
Invoke-AzRestMethod -Path $uri -Method GET

確認

ここまでで設定は完了したので、動作を確認していきます。
DCR のリソースでは custom monitored object と表示されています。ですが、対象リソースは何も情報がありません。

Heartbeat テーブルの確認です。サーバーと同じようにログが取れており、OSName がクライアント OS になっています。

SecurityEvent テーブルの確認です。こちらもサーバーと同じように取れていることが分かります。

補足

今回は順を追って確認しましたが、ドキュメントにまとめて実行するためのスクリプトがありますので、細かく内容を把握する必要がないということであればこちらをご利用ください。(前述の 設定方法ではトークンの管理が不要になるように Invoke-AzRestMethod を使用するなど一部差分があります)
https://learn.microsoft.com/ja-jp/azure/azure-monitor/agents/azure-monitor-agent-windows-client#using-powershell-for-onboarding

Microsoft (有志)

Discussion