WordPressのセキュリティ対策を見直したらサイトの速度が50msも改善されました。衝撃の結果が出たので詳しく紹介しようと思います。
1.現状
このサイトはmuninとhttpingプラグインでサイトの表示速度を計測しているのですが、速度のブレが大きいのがずっと懸念点でした。例えば・・・PHP7.2導入時の記事をみてみるとこんなグラフが残っています。
しかし何を試しても解決しないのでVPSサーバのCPU性能自体がブレているのではないかという結論にたどり着き、改善を諦めていました。
2.発端
朝の通勤時間にLogwatchを読むのがサラリーマンの嗜み。ということで毎日Requests with error response codesを追っかけているのですが、最近「/?author=**」のポーリングをされる頻度が増えてきています。
functions.phpにknockout_author_queryを追加して最低限の対策は行っていますが、エラーコードの貼り方などでサイトに登録しているユーザ数がバレてしまうのが悔しいところ。ならばphpで対処をするのではなく、httpd(.htaccess)でauthorポーリングに対してリダイレクトを掛けてしまえ良いのでは?と思いついたわけです。
3.試したこと
まず「/?author=*」アクセスに対しhttpd側の設定でhttp://0.0.0.0にリダイレクトを掛けるため、RewriteCondに{QUERY_STRING}で条件を設定します。
## Brute Force Atack >> Redirect 0.0.0.0
RewriteCond %{REQUEST_URI} wp_admin* [OR]
+ RewriteCond %{QUERY_STRING} ^/?author=([0-9]*) [OR]
RewriteCond %{REQUEST_URI} ^/phpmyadmin* [NC]
RewriteRule ^(.*)$ "http\:\/\/0\.0\.0\.0\/" [R=301,L]
次に不要になったknockout_author_queryをコメントアウトしておきます。
// prevent the leakage of user name by author query on WordPress.
//function knockout_author_query() {
// // disable author rewrite rule
// global $wp_rewrite;
// $wp_rewrite->flush_rules();
// $wp_rewrite->author_base = '';
// $wp_rewrite->author_structure = '/';
// // for author query request
// if (isset($_REQUEST['author']) && !empty($_REQUEST['author'])) {
// $user_info = get_userdata(intval($_REQUEST['author']));
// if ($user_info && array_key_exists('administrator', $user_info->caps) && in_array('administrator', $user_info->roles)) {
// wp_redirect(home_url());
// exit;
// }
// }
//}
//add_action('init', 'knockout_author_query');
必要に応じてhttpdを再起動し、アクセスするブラウザも念のため再起動しておきます。
4.結果
サイトの/?author=*にアクセスし0.0.0.0にリダイレクトされることを確認しました。
5.速度改善結果
これで一件落着と思っていたのですが、設定変更後からmuninのhttp responseのグラフの波が大人しくなったことにきづきました。
VPSサーバは他のサーバの影響を受けやすいので丸一日以上様子見してみましたが傾向は変わらず。
長期グラフで見てみると50msほど表示速度が改善されていることがわかりました。
6.所感
改善された原因を追究できるほどPHPに精通しているわけではないので的外れかもしれませんが、knockout_author_queryは遅いと言われているflush_rules関数をinitアクションで呼び出しているのが原因なのかも?
原因はともかく長年の懸念が解決できてテンションが高めな筆者でした。