Azureの監査ログアラートからWebhookの流れで楽をする

Posted on Apr 6, 2016

監査ログからアラートを上げられるようになります

Azureの監査ログからアラートを上げる機能のプレビューがはじまりました。これ、地味ですが便利な機能です。日々の運用に効きます。

どんな風に使えるか

ルールに合致した監査ログが生成された場合、メール通知とWebhookによる自動アクションができます。可能性無限大です。

たとえば、「特定のリソースグループにVMが生成された場合、そのVMに対し強制的にログ収集エージェントをインストールし、ログを集める」なんてことができます。

これは「生産性を上げるため、アプリ開発チームにVMの生成は委任したい。でもセキュリティなどの観点から、ログは集めておきたい」なんてインフラ担当/Opsの課題に効きます。開発チームに「VM生成時には必ず入れてね」とお願いするのも手ですが、やはり人間は忘れる生き物ですので、自動で適用できる仕組みがあるとうれしい。

これまでは監視用のVMを立てて、「新しいVMがあるかどうか定期的にチェックして、あったらエージェントを叩き込む」なんてことをしていたわけですが、もうそのVMは不要です。定期的なチェックも要りません。アラートからアクションを実現する仕組みを、Azureがマネージドサービスとして提供します。

実装例

例としてこんな仕組みを作ってみましょう。

  • 西日本リージョンのリソースグループ"dev"にVMが作成されたら、自動的にメール通知とWebhookを実行
  • WebhookでAzure AutomationのRunbook Jobを呼び出し、OMS(Operations Management Suite)エージェントを該当のVMにインストール、接続先OMSを設定する
  • OMSでログ分析

準備

以下の準備ができているか確認します。

  • Azure Automation向けADアプリ、サービスプリンシパル作成
  • サービスプリンシパルへのロール割り当て
  • Azure Automationのアカウント作成
  • Azure Automation Runbook実行時ログインに必要な証明書や資格情報などの資産登録
  • Azure Automation Runbookで使う変数資産登録 (Runbook内でGet-AutomationVariableで取得できます。暗号化もできますし、コードに含めるべきでない情報は、登録しましょう。後述のサンプルではログイン関連情報、OMS関連情報を登録しています)
  • OMSワークスペースの作成

もしAutomationまわりの作業がはじめてであれば、下記記事を参考にしてください。とてもわかりやすい。

勤務時間中だけ仮想マシンを動かす(スケジュールによる自動起動・停止)

Azure Automation側の仕掛け

先にAutomationのRunbookを作ります。アラート設定をする際、RunbookのWebhook URLが必要になるので。

ちなみにわたしは証明書を使ってログインしています。資格情報を使う場合はログインまわりのコードを読み替えてください。

param ( 
    [object]$WebhookData		  
)

if ($WebhookData -ne $null) {  
    $WebhookName    =   $WebhookData.WebhookName
    $WebhookBody    =   $WebhookData.RequestBody  
    $WebhookBody = (ConvertFrom-Json -InputObject $WebhookBody)
       
    $AlertContext = [object]$WebhookBody.context
    
    $SPAppID = Get-AutomationVariable -Name 'SPAppID'
    $Tenant = Get-AutomationVariable -Name 'TenantID'
    $OMSWorkspaceId = Get-AutomationVariable -Name 'OMSWorkspaceId'
    $OMSWorkspaceKey = Get-AutomationVariable -Name 'OMSWorkspaceKey'
    $CertificationName = Get-AutomationVariable -Name 'CertificationName'
    $Certificate = Get-AutomationCertificate -Name $CertificationName
    $CertThumbprint = ($Certificate.Thumbprint).ToString()    

    $null = Login-AzureRmAccount -ServicePrincipal -TenantId $Tenant -CertificateThumbprint $CertThumbprint -ApplicationId $SPAppID   

    $resourceObj = Get-AzureRmResource -ResourceId $AlertContext.resourceId
    $VM = Get-AzureRmVM -Name $resourceObj.Name -ResourceGroupName $resourceObj.ResourceGroupName

    $Settings = @{"workspaceId" = "$OMSWorkspaceId"}
    $ProtectedSettings = @{"workspaceKey" = "$OMSWorkspaceKey"}

    if ($VM.StorageProfile.OsDisk.OsType -eq "Linux") {  
        Set-AzureRmVMExtension -ResourceGroupName $AlertContext.resourceGroupName -Location $VM.Location -VMName $VM.Name -Name "OmsAgentForLinux" -Publisher "Microsoft.EnterpriseCloud.Monitoring" -ExtensionType "OmsAgentForLinux" -TypeHandlerVersion "1.0" -Settings $Settings -ProtectedSettings $ProtectedSettings;
    }
    elseif ($VM.StorageProfile.OsDisk.OsType -eq "Windows")
    {
        Set-AzureRmVMExtension -ResourceGroupName $AlertContext.resourceGroupName -Location $VM.Location -VMName $VM.Name -Name "MicrosoftMonitoringAgent" -Publisher "Microsoft.EnterpriseCloud.Monitoring" -ExtensionType "MicrosoftMonitoringAgent" -TypeHandlerVersion "1.0" -Settings $Settings -ProtectedSettings $ProtectedSettings;
    }
    else
    {
	    Write-Error "Unknown OS Type."
    }
}
else 
{
    Write-Error "This runbook is meant to only be started from a webhook." 
}

Runbookができたら、Webhookを作ります。詳しくはこちら

WebhookのURLを控えておいてください。

Azure 監査ログアラート側の仕掛け

Powershellでアラートルールを作ります。実行アカウントの権限に気をつけてください。

PS C:\work> $actionEmail = New-AzureRmAlertRuleEmail -CustomEmail yourname@example.com

PS C:\work> $actionWebhook = New-AzureRmAlertRuleWebhook -ServiceUri https://abcdefgh.azure-automation.net/webhooks?token=your_token

PS C:\work> Add-AzureRmLogAlertRule -Name createdVM -Location "Japan West" -ResourceGroup dev -OperationName Microsoft.Compute/virtualMachines/write -Status Succeeded  -SubStatus Created -TargetResourceGroup dev -Actions $actionEmail,$actionWebhook

以上。これで"dev"リソースグループにVMが作られた場合、自動でOMSエージェントがインストールされ、ログ収集がはじまります。

なお、メールも飛んできますので、うっとおしくなったらメール通知はアクションから外すか、ルールでさばいてくださいね。