Azure Web Appsでの改ざん検知をWeb ジョブとSchedulerを組み合わせで実施する

Azure App Service の Web App でPowershellを使って簡易的に改ざん検知を実施する方法をサンプルスクリプトも含めて紹介します。

概要

Powershell で、改ざんされていないファイル群のハッシュを作成し保存し、定期的に、そのデータと、現在のハッシュデータを比較し、相違があればメールを送信するというスクリプトサンプルです。

事前準備

このスクリプトを実行するにあたって、別途SMTPサーバーが必要です。自前のSMTPサーバーを利用しても、Azureのマーケットプレイスで取得できる、Sendgrid (無料プランでOKです)を使っても構いません(以下の例では、Sendgridを利用しています)。

手順1スクリプトの作成

作成するPowershell スクリプトは、以下の2つです。

ハッシュ情報DBの作成Powershellスクリプト(例:CreateHashDb.ps1)

 
$loc = "D:\home\site\wwwroot" 
$ignore = @("bin",”temp2”); 
$ignoreExt =@("*.exe"); 
$dbPath = "D:\home\site\integritychecker.xml"; 

$files = Get-ChildItem -Path $loc -Recurse -Exclude $ignoreExt | ? { !$_.PSIsContainer } | % { $relative = $_.FullName.Replace($loc,""); $nomatch = $true; foreach ($folder in $ignore) { ifelative -like "*\$folder\*") { $nomatch = $false } }; if ($nomatch) { $_ } } Get-FileHash $files | Export-CliXml $dbPath; 
exit; 

ハッシュ情報dbと現在のファイルを比較するPowershellスクリプト(例: IntegrityCheck.ps1)

 
# Setting variable
$loc = "D:\home\site\wwwroot"
$ignore = @("bin","temp2");
$ignoreExt = @("*.exe");
$dbPath = "D:\home\site\integritychecker.xml";
$PSEmailServer = "smtp.sendgrid.net"
$EmailID = "XXXXXX@azure.com"
$EmailPassword = "????????????????"
$from = "abc@defgh.com";
$to = " admin@lmnop.com";
$subject = "Integrity found!";

# check integrity
$HashDb = Import-CliXml $dbPath;
$Files = Get-ChildItem -Path $loc -Recurse -Exclude $ignoreExt | ? { !$_.PSIsContainer } | % { $relative = $_.FullName.Replace($loc,""); $nomatch = $true; foreach ($folder in $ignore) { ifelative -like "*\$folder\*") { $nomatch = $false } }; if ($nomatch) { $_ } }
$CurrentHash = Get-FileHash $Files;
$Result = Compare-Object $HashDb $CurrentHash -CaseSensitive -Property Path,Hash;
$Result | sort Path -unique | Format-Table @{Expression={$_.Path};Label="Modification"} -wrap -autosize;
$credentials = new-object Management.Automation.PSCredential $EmailID, ($EmailPassword | ConvertTo-SecureString -AsPlainText -Force);
$enc = New-Object System.Text.utf8encoding;
$body = $Result | sort Path -unique | Format-Table @{Expression={$_.Path};Label="Modification"} -wrap -autosize | Out-String;
Send-MailMessage -port 587 -From $from -Encoding $enc -To $to -Subject $subject -Body $body -UseSsl -Credential $credentials;
exit;

それぞれのPowershellの設定情報の部分をサイトに合わせて修正します。$loc, $ignore, $ignoreExt, $dbPath については、2つのPowershellファイルの内容を同一の値にします。修正が修正したら、それぞれのファイルzip化します。

変数名

設定する情報

$loc

チェックするファイルのルートフォルダ

D:\home\site\wwwroot

$ignore

除外するフォルダ名

@("bin","temp2")

$ignoreExt

除外するファイル拡張子

@("*.exe")

$dbPath

Hash情報保存ファイル

D:\home\site\integritychecker.xml

$PSEmailServer

SMTPサーバー情報

smtp.sendgrid.net

$EmailID

SMTPログイン情報

XXXXXX@azure.com

$EmailPassword

SMTP パスワード

 

$from

メール送信元アドレス

abc@defgh.com

$to

メール送信先アドレス

admin@lmnop.com

$subject

メールのタイトル

Integrity found!

手順2 Webジョブの登録

2つのPowershellスクリプトをWebジョブに登録します。登録にはクラシックポータルを利用します。CreateHashDb.ps1の実行方法を「オンデマンドで実行」に、 IntegrityCheck.ps1 の実行方法を「スケジュールに従って実行」を選択し、任意のスケジュールを設定します。
※ CreateHashDb.ps1の手動実行以前に、CreateHashDb.ps1がスケジュール実行されてしまうと、hashのデータベースが存在しないことになってしまうので、IntegrityCheck.ps1をWebジョブに登録する前に、手順3のCreateHashDb.ps1を実行しておくことをお勧めします。

  

手順3 データベースの更新

改竄されていないファイルのハッシュを作成するために、CreateHashDb.ps1 を実行します。実行には、クラシックポータルの最下部の「一度だけ実行する」を選択すればOKです。

使い方

コンテンツ更新した際に、手動で、CreateHashDb.ps1 を実行します。クラシックポータルのUI上で実行しても、Powershellで Start-AzureWebsiteJob コマンドを使って実行してもよいです。

コンテンツ更新した際に、CreateHashDb.ps1 を実行しないと、意図したコンテンツ更新自体が、改竄と検知されていまいますので、コンテンツ更新時には、忘れずにCreateHashDb.ps1を実行してください。

注意点、その他

  • このスクリプトは、改竄検知を簡易的に発見・メール通知するサンプルスクリプトで、改竄検知を保証するものではありません。
  • この2つのサンプルスクリプトは、意図しないコンテンツの更新を改竄として検知し、その検知をメールで通知しますが、コンテンツの復旧はしませんので、コンテンツの復旧は、任意の方法で実施が必要です(一般的には、復旧以前に、改竄検知された原因を特定し、対策する必要があります)。
  • Webジョブのログを確認することで、改竄検知スクリプトの実行状況を確認いただけます。
  • IntegrityCheck.ps1実行時に改竄が検知されない場合、IntegrityCheck.ps1内のSend-MailMessage でエラーが発生しますが、そのエラー原因は、hashの情報に相違点が無いということになりますので、機能的には、今のままで問題ないと思いますが、気になる場合は、特定条件下で、メール送信したりするように変更いただければと思います。
  • kuduのdebugコンソールをなど使って、データベースが作成されているか?確認できます。
  • ftpアカウント情報などの流出による不正アクセスの場合、スクリプト自体を削除・改変される可能性があるので、ご注意ください。
  • gitなどからのデプロイであれば、webhookを使ってCreateHashDb.ps1実行を自動化できるかもしれません。

最後になりますが、このサンプル作成に多大なご協力をデプロイ王子にいただきましたー。多謝!