<WordPress編>Azure Web Appsでの改ざん検知をWebジョブとSchedulerの組み合わせで実施してみる。

Pocket

webjob_ttl
Azure Web Appsでの改ざん検知をWebジョブとSchedulerを組み合わせで実施する」という記事を見て、早速WordPressサイトで実際に試してみました~。

改ざん検知の方法

今回は2つのPowershellスクリプトとWebジョブ+scheduler+外部SMTPを利用します。
2つのPowerShellスクリプトの役目はこんな感じ。

  • CreateHashDbは「DBを作るとき実行する」
  • IntegrityCheckは「定期的に実行する」

図解してみると、このようなイメージになります。
webjob01
改ざんされていないファイル群のハッシュを作成し保存し、定期的に現在のハッシュデータを比較して相違があればメールを送信。
これでサイトの改ざんを検知します。
今回の設定は全てクラシックポータルで行います。

外部SMTPはMARKETPLACEのSendGridを利用する

外部SMTPが必要となるので、今回はMARKETPLACEで提供されているSendGridを使ってみました。
webjob02
今回のスクリプトの修正で必要な情報は赤枠部分(接続情報)をクリックすると表示されます。

スクリプトを作成する

WordPressサイト用に内容を改良しています。
コメントを入れてもらっているので、わかりやすくなっているかと!
ちなみにスクリプトの修正ですが、特殊なエディタは必要なく、普通にメモ帳で編集できます。(保存時の拡張子に注意するくらい)

ハッシュ情報DBの作成Powershellスクリプト

今回は「CreateHashDb.ps1」という名前にします。

$loc = "D:\home\site\wwwroot"; # チェックするファイルのルートフォルダ
$ignore = @("bin","wp-contents"); # 除外するフォルダの名前、カンマ区切りで
$ignoreExt =@("*.exe"); # チェック対象から除外するファイルの拡張子、カンマ区切りで
$dbPath = "D:\home\site\integritychecker.xml"; # ハッシュのDBファイルの場所

$files = Get-ChildItem -Path $loc -Recurse -Exclude $ignoreExt | ? { !$_.PSIsContainer } | % { $relative = $_.FullName.Replace($loc,""); $nomatch = $true; foreach ($folder in $ignore) { if($relative -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","wp-contents"); # 除外するフォルダの名前、カンマ区切りで
$ignoreExt =@("*.exe"); # チェック対象から除外するファイルの拡張子、カンマ区切りで
$dbPath = "D:\home\site\integritychecker.xml"; # ハッシュのDBファイルの場所
$PSEmailServer = "smtp.sendgrid.net"; # メールサーバ名
$EmailID="xxxxxxxxxxx@azure.com"; # SMTP-AUTHのID
$EmailPassword="xxxxxxxxxxx"; # SMTP-AUTHのPassword
$from = "xxxxxx@xxx.com"; # 送信者アドレス
$to = "xxxxxxx@gmail.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) { if($relative -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;

$loc, $ignore, $ignoreExt, $dbPath については、2つのPowershellファイルの内容が同一の値になるようにします。

webjob03
修正が終わったら、それぞれのファイルをzip化します。

Webジョブを登録する

作成した2つのPowerShellスクリプトを登録します。

webjob04
クラシックポータルの[Webアプリ]からWebジョブを追加したいWebアプリを選びます。

webjob05
「ジョブの追加」をクリック。

webjob06
まずは「CreateHashDb.ps1」の登録から。
名前はファイル名にあわせておく方がわかりやすいかと。
実行方法は「オンデマンドで実行」を選びます。

webjob07
登録が完了したら[一度だけ実行する]をクリックして、スクリプトを実行します。

webjob08
[+追加]をクリック。

webjob09
次は「IntegrityCheck.ps1」を登録します。
名前はファイル名にあわせておく方がわかりやすいかと。
実行方法は「スケジュールに従って実行」を選びます。

webjob010
繰り返しを「定期的なジョブ」にします。
繰り返し間隔は頻度が高くても特に問題はないとのこと。
図では10分にしてますが、1時間くらいがいいのかなぁと思います。

CreateHashDb.ps1の手動実行以前にIntegrityCheck.ps1がスケジュール実行されてしまうと、hashのデータベースが存在しないことになってしまいます。
IntegrityCheck.ps1をWebジョブに登録する前に、CreateHashDb.ps1を実行しておきましょう。

以上でWebジョブの設定は終わりです。

サイトの更新をした場合の対応

改ざん検知スクリプトの流れはこのような感じ。
webjob013

webjob011
ですので、コンテンツを正しく更新した場合は【手動で】createDBしましょう。
これをやらないと「サイト改ざんされた判定」されてしまいます…。

実際に改ざんがあった場合どうなる?

次に改ざんがあった場合にどういう内容のメールが送信されるのかを確認してみます。
webjob012
Webジョブを設定したWordPressサイトの「sidebar.php」というファイルの中身を変更してFTPでアップロードしてみました。
このように、「どのファイルが改ざんされているか」がキチンと表示されています。

ちなみに、このお知らせメールは対処するまで(CreateHashDb.ps1の手動実行するまで)スケジュールに従って送信されます…。
このときは「10分おき」にしていたのでメッチャメールきました(白目)

今回は1ファイルのみでしたが、改ざん被害に会った時は「全ファイルが改ざんされている」などあると思います。
そのときの復旧も、Azureバックアップを設定しておけばワンクリックで復旧できるので、保険としてはとてもよいのではないでしょうか?

最後に

今回のスクリプトですが、@kazumiHirose さんにWordPressに対応するよう修正していただきました。(元のスクリプトを作った方に最適化してもらった件)
毎度のことながらありがとうございますありがとうございます!!

このWebジョブ(改ざん検知スクリプト)は、各Webアプリ単位で指定することができます。
なので、運用しているサイト毎に細かく合わせてスケジュールを変更していくことが可能なところも便利ポイント!
通常のレンタルサーバーの場合、サイト改ざんの検知サービスは有料な場合が多いのかな?と思うので(私の調査不足かもですが…)、このスクリプトは簡易的とはいえ、良い仕組みだと思いました。
ただ、更新頻度の高いサイトの場合は「Webジョブを主導で実行する」というのが手間になるかな?とも感じるので、このあたりは運用とバランス見ながら使う感じがオススメ。更新頻度があまり高くないサイト向きかなーと思います。
Gitをうまく使えばもっといい感じの運用にできそうなので、もう少し色々試してみたいと思いますw

また、Azure WebAppsを利用してWordPressサイトを構築・運用のご依頼をいただいた場合、この方法を活かした「改ざん検知」を実装いたします。
お仕事のご相談も絶賛お待ちしております!

参考にさせていただきました

Azure Web Appsでの改ざん検知をWebジョブとSchedulerを組み合わせで実施する
http://blogs.technet.com/b/mskk-cloudos/archive/2015/12/25/azurewebapps_2d00_integritycheckpowershellscript.aspx

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>