こんにちは、クラウドソリューション事業部の本田です。気温も上がってきて、春らしい日が続いていますね。気温が上がってくると体が楽ですね。
今回はWordPress関連でブログを書きたいと思います。WordPressはすごくポピュラーなCMSですよね。弊社も色々な案件をやっておりますし、WordPressが関わる案件のお話はよくいただきます。
落ちないWordPressサイトなど色々と要件はありますが、一番重要視されるところとしてはセキュリティの面ではないでしょうか?そういった中で弊社の方ではAWS WAFの導入などを勧めております。今回書く内容は、WordPressのコンテンツ(ここでは本体のプログラム、プラグインのプログラムを指します)の改ざんチェックを行い、それをAWS SecurityHubに送信するという方法です。前提として改ざんの被害に遭わないようにサーバーのポートを不用意に開けない、パスワードは簡易なものにしないなどがありますのでこちらはしっかりできているかご注意いただければと思います。
AWS SecurityHubについて

今回改ざんチェックの結果をAWS SecurityHubに送信します。AWSにはセキュリティチェックに使えるサービスが色々とあります。Amazon GuardDuty、Amazon InspectorやAmazon Macieなどがあり、これらを使った際に問題があった場合にアラートを受け取ることができますが、そのままだとそれぞれの画面で見ることになり結果が集約できていません。これらのセキュリティチェックの結果をまとめることができるのがAWS SecurityHubです。AWS Orgnizations配下であれば、配下のアカウントの集計結果もまとめることが可能です。そしてセキュリティチェックの結果はAWSのサービスだけでなく、サードパーティの製品や自前で行ったチェック結果もAWS SecurityHubに送ることができます。
WordPressの改ざんチェック
WordPressの改ざんチェックは、WP-CLIというWordPressを管理するコマンドラインインターフェイスを使って行います。具体的には以下コマンドで改ざんチェックを行うことができます。
・WordPress本体の改ざんチェック
1wp core verify-checksums
・WordPressプラグインの改ざんチェック
1wp plugin verify-checksums --all
いずれもWordPressがダウンロードされているディレクトリで実行します。–pathで対象ディレクトリを指定することが可能です。実際に実行してみるとこんか感じになります。(docker execがついているのは無視してください、dockerでWordPressを動かしているだけです。)
・本体のチェック
1docker exec wordpress-production wp core verify-checksums 2>&1
2 Success: WordPress installation verifies against checksums.
・プラグインのチェック
1docker exec wordpress-production wp plugin verify-checksums --all 2>&1
2 Success: Verified 1 of 1 plugins.
上記はそれぞれ改ざんされていない場合の実行結果です。ちょっと改ざんしてみてましょう。
・本体のチェック
1docker exec wordpress-production wp core verify-checksums 2>&1
2 Warning: File doesn't verify against checksum: wp-mail.php
3 Error: WordPress installation doesn't verify against checksums.
wp-mail.phpの内容を少し編集してみたところ、上記のエラーが出ました。
・プラグインのチェック
1docker exec wordpress-production wp plugin verify-checksums --all 2>&1
2 plugin_name file message
3 akismet akismet.php Checksum does not match
4 Error: No plugins verified (1 failed).
インストールしているプラグインにphpファイルを一部編集してみると上記のようなエラーが出ました。このスクリプトをcronなどで回しても良いですが、セキュリティ系の情報はSecurityHubにまとめるという意味で、SecurityHubに送信してみましょう。
SecurityHubに送信する

EC2(docker on EC2)でWordPressを構築していて、改ざんチェックの結果をSecurityHubに飛ばす場合は、以下のようなスクリプトで飛ばします。
1#!/bin/bash
2
3region=ap-northeast-1
4datetime=`TZ=JST-9 date +%Y-%m-%dT%H:%M:%S%z`
5account_id=`aws sts get-caller-identity | jq -r .Account`
6instance_id=`curl http://169.254.169.254/latest/meta-data/instance-id`
7wp_core_check_prd=$(docker exec wordpress-production wp core verify-checksums 2>&1)
8wp_plugin_check_prd=$(docker exec wordpress-production wp plugin verify-checksums --all 2>&1)
9wp_core_subject="wp_core_check"
10wp_plugin_subject="wp_plugin_check"
11
12
13function batchimport() {
14 aws securityhub batch-import-findings --region $region --findings '[{
15 "AwsAccountId": "'$account_id'",
16 "CreatedAt": "'$datetime'",
17 "Description": "'"$description"'",
18 "GeneratorId": "'$subject'",
19 "Id": "ap-northeast-1/'$account_id'/'$subject''$datetime'",
20 "ProductArn": "arn:aws:securityhub:ap-northeast-1:'$account_id':product/'$account_id'/default",
21 "Resources": [{
22 "Type": "Other",
23 "Id": "'$instance_id'"
24 }],
25 "SchemaVersion": "2018-10-08",
26 "Severity": {
27 "Product": 90,
28 "Normalized": 90
29 },
30 "Compliance": {
31 "Status": "FAILED"
32 },
33 "Title": "Security Finding from Custom Software",
34 "Types": [
35 "Software and Configuration Checks/Vulnerabilities/CVE"
36 ],
37 "UpdatedAt": "'$datetime'"
38 }]'
39}
40
41
42## wp_coreの改ざんチェック(本番)
43if [ "`echo $wp_core_check_prd | grep 'Error'`" ]; then
44 echo "failed wp_core_check"
45 echo $wp_core_check_prd
46 subject=prd_$wp_core_subject
47 description=`echo ${wp_core_check_prd} | tr -d '[:cntrl:]'`
48 batchimport $description $subject
49fi
50
51## wp_pluginの改ざんチェック(本番)
52if [ "`echo $wp_plugin_check_prd | grep 'Error'`" ]; then
53 echo $wp_plugin_check_prd
54 subject=prd_$wp_plugin_subject
55 description=`echo ${wp_plugin_check_prd} | tr -d '[:cntrl:]' | sed -e 's/\[31\;1m//g' -e 's/\[0m//g'`
56 batchimport $description $subject
57fi
EC2でcronで実行しています。EC2には以下の権限が必要になります。
1{
2 "Version": "2012-10-17",
3 "Statement": [
4 {
5 "Sid": "VisualEditor0",
6 "Effect": "Allow",
7 "Action": "securityhub:BatchImportFindings",
8 "Resource": "*"
9 }
10 ]
11}
実際に改ざんがあると、SecurityHubの画面では以下のような通知がきます。

EventBridgeでこの通知があったときに、Slackで飛ばすなどをしてもいいですね。
最後に
改ざんのチェックのコマンドは便利ですが、例えばcoreのチェックをする際はサーバー上にあるダウンロードされたソースコードとWordPressを再度ダウンロードして差分をみるというようなチェックをしているように見えます。ですでの、消したくなるReadmeとかも消すとチェックに引っかかってしまいます。そういった仕様もあるので実際に使われる際はご注意くださいませ。