Azure Automation アカウント+LogAnalytics+SendGridを利用してログ検索結果をメールする

 

Azure上で利用できる機能のみを使用して、ログ収集、検索、結果をメール送信を検証してみました。

Log Analyticsにてログ収集、検索を行い、Automationアカウントで実際のログ分析結果をMail送信をしました。メール送信にはSendGridを使っています。

今回は事前に下記のセットアップが終わっている前提です進めています。

    • LogAnalyticsでのログ収集の設定が完了している。
    • Automationアカウントを作成済みである。
    • Azure Power Shellで自動ログインできる環境が準備できている。
    • SendGridのセットアップが完了している事

 2.Automation にモジュールを追加する。

Automationアカウントで、LogAnalyticsを使う場合、モジュールの追加が必要になります。

1. 以下の URL より LogAnalyticsQuery.psm1 のモジュールをダウンロードします。

https://blogs.technet.microsoft.com/cbernier/2018/02/15/windows-update-compliance-querying-azure-log-analytics-data-using-powershell/

2. ダウンロードしたファイルを zip ファイルとして圧縮します。
3. Automation アカウント -> <Automation アカウント名> -> モジュール の画面へと遷移します。
4. 画面上部の [モジュールの追加] をクリックし、ダウンロード後圧縮した zip ファイルを選択します。

3.AutomationアカウントでRunbookを作成する。

Automationアカウントで実行するジョブは、Runbookのへの登録が必要になります。

1. Runbook をクリックし画面上部の [Runbook の追加] をクリックします。
2. [新しい Runbook を作成します。] をクリックします。
3. [名前] には任意の名称を入力し、[Runbook の種類] は [PowerShell] を選択します。
4. [作成] をクリックします。

5. Runbook の編集画面にて以下の内容を先頭に記述します。

# Import AzureADUtils Module
Import-Module LogAnalyticsQuery

編集が終わったら、保存をクリックします。

4.Runbookサンプル

今回は、以下のクエリを実行し、メール送信を行うようにしています。

・対象ログはメールログ

・検索条件は、24時間以内に、SASL Loginを実行してきたIPの抽出を行う

# Import AzureADUtils Module
Import-Module LogAnalyticsQuery


# 認証する部分
$Conn = Get-AutomationConnection -Name AzureRunAsConnection
Connect-AzureRmAccount -ServicePrincipal -Tenant $Conn.TenantID `
-ApplicationId $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint


# 実行するクエリ部分

$query = “Syslog | where SyslogMessage contains ‘SASL LOGIN authentication failed’ | where TimeGenerated > now() – 24h |summarize count() by Mail_SourceIP_CF”
$LogAnaResult = Invoke-LogAnalyticsQuery `
-WorkspaceName LogAnalyticsのワークスペース名 `
-SubscriptionId サブスクリプションID `
-ResourceGroup RG名 `
-Query $query | `
ConvertTo-HTML

# SendGrid の資格情報を取得
$SmtpCredential = Get-AutomationPSCredential -Name “Sendグリッドの資格情報名

function EncodeSubject($s) {
$enc = [Text.Encoding]::GetEncoding(“csISO2022JP”)
$s64 = [Convert]::ToBase64String($enc.GetBytes($s), [Base64FormattingOptions]::None)
return [String]::Format(“=?{0}?B?{1}?=”, $enc.HeaderName, $s64)
}

$From = “Fromアドレス
$Subject = EncodeSubject(EncodeSubject(“Mail Subject名“))

Send-MailMessage `
-To “送信先アドレス” `
-Subject $Subject `
-Body “$LogAnaResult” `
-UseSsl `
-Port 587 `
-SmtpServer ‘smtp.sendgrid.net’ `
-BodyAsHtml `
-From $From `
-Encoding ([System.Text.Encoding]::UTF8) `
-Credential $SmtpCredential

5.送信テストおよび実際に送信されたサンプル

Runbookの作成が終わったら、テスト、公開(利用開始)、スケジュール登録を行います。

1. 画面上部の [テストウィンドウ] をクリックします。
2. 画面上部の [開始] をクリックします。
3. 結果にErrorが表示されないことを確認します。
4. 画面上部の [公開] をクリックし Runbook を公開します。

5.Runbookのスケジュールをクリックしスケジュールの登録を行います。

スケジュールの時間に、以下のようなメールが送られる形になります。

・メール本文例

{“tables”:[{“name”:”PrimaryResult”,”columns”:[{“name”:”Mail_SourceIP_CF”,”type”:”string”},{“name”:”count_”,”type”:”long”}],”rows”:[[“IPアドレス”,回数]

今回送られたIPをNSGに登録する事で、不正アクセスのIPをBlockすることが可能になります。