WordPressにはwlwmanifest.xmlというマニフェストファイルが用意されています。デフォルトでは公開。
でもこのファイル、不正アクセスで利用されています。Microsoft製ブログ編集ツールで使うんですが、これをしないかぎり非公開設定をするべき。
wlwmanifest.xmlってなんだ?
マニフェストファイルは、外部のサービスからある程度操作を認め必要な情報を提供するものです。
"manifest" は訳すると『明確にする。はっきりさせる。証明する。』。
ここでは証明書が近いかな?『wlwで使う証明書』みたいな感じ。wlwという訳が分からないものが出てきましたが『Windows Live Writer』の略です。
wlwはMicrosoft製のブログ編集ツールで、WordPressにかぎらず有名なCMSと連携して使うもの。CMSの種類にとらわれず使い慣れたアプリで編集できるということらしい。
ただ、『ブラウザで作業すればいいじゃん』と思う人も多い(はず)ので、WordPressから連携を許可する意味を感じません。
より多くの人に使ってもらいたいという意図は分かりますが。
Windows Live Writerは古いアプリで今はOpen Live Writerという後継ツールがある。
2つともつい最近まで知らなかったし、これからも使うつもりはない。
Wordを使ってるように感じるほどUIデザインが似ているので使いやすいみたいだが。
WindowsのStoreから入手できます。
wlwmanifest.xmlは不正アクセスに利用されている!
Webサーバーには不正アクセスの痕跡があるんですが、みなさんは定期的に確認しているでしょうか?
wlwmanifest.xmlも不正アクセスの試行で使われています。ログ情報がこれ。
0.729 - - 159.242.234.106 - - [17/Apr/2021:06:23:06 +0900] "GET //wp-includes/wlwmanifest.xml HTTP/1.1" 200 1045 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4240.193 Safari/537.36" "-"
で、見られてる情報がこれ。
<manifest xmlns="http://schemas.microsoft.com/wlw/manifest/weblog">
<script/>
<options>
<clientType>WordPress</clientType>
<supportsKeywords>Yes</supportsKeywords>
<supportsGetTags>Yes</supportsGetTags>
</options>
<weblog>
<serviceName>WordPress</serviceName>
<imageUrl>images/wlw/wp-icon.png</imageUrl>
<watermarkImageUrl>images/wlw/wp-watermark.png</watermarkImageUrl>
<homepageLinkText>View site</homepageLinkText>
<adminLinkText>Dashboard</adminLinkText>
<adminUrl>
<![CDATA[ {blog-postapi-url}/../wp-admin/ ]]>
</adminUrl>
<postEditingUrl>
<![CDATA[ {blog-postapi-url}/../wp-admin/post.php?action=edit&post={post-id} ]]>
</postEditingUrl>
</weblog>
<buttons>
<button>
<id>0</id>
<text>Manage Comments</text>
<imageUrl>images/wlw/wp-comments.png</imageUrl>
<clickUrl>
<![CDATA[ {blog-postapi-url}/../wp-admin/edit-comments.php ]]>
</clickUrl>
</button>
</buttons>
</manifest>
何も編集していないデフォルトの状態です。
WordPressの管理画面のホーム、各投稿の編集ページ、コメントの編集ページのURLが書かれています。これ自体は見られてもかまわない情報なんですが、不正アクセスされてることが気持ち悪い。
見られても構わないといいましたが、絶対に大丈夫ではありません。ログインユーザー名・パスワードが知られてしまったらアウトな情報です。
気持ち悪さと、絶対ではないことから、Open Live Writer (Windows Live Writer) を使わないんであれば、無効化しましょう。これはWordPressのセキュリティ対策でよく知られているものの1つです。
ユーザー名・パスワードを知られた時点でどのみちアウトなので、有効になってても良いという考えもあります。
しかし、不正アクセスをしようとする人は最初のステップでまず疎通できるかを見ます。
セキュリティ意識があると判断するとあっさりあきらめる傾向がある。ピンポイントで自分を狙う執着がないかぎり。
そこは空き巣と同じ。空き巣はプロであればあるほど最初に面倒だと思ったらすぐ辞めるらしい。
(反対側の警察官が言っていた。)
セキュリティ対策をしている(と思わせる)ことが大事。
Webサーバーで無効化
前置きが思った以上に長くなりましたが、無効化作業をしましょう。
wlwmanifest.xmlをWordPressで参照拒否してもいいんですが、Webサーバーから弾くほうがいいです。WebサーバーからWordPressのPHPプログラムへ処理を移譲する負荷が馬鹿にならないので。
Webサーバーがリクエストを受信。
↓
WebサーバーからPHP(Wordpress)起動。これが無駄
↓
WebサーバーがPHPからレスポンスを受け取る。これが無駄
↓
Webサーバーがレスポンスを返す。
Nginxの拒否設定
server {
# 追加
# 不正アクセス対応(Open Live Writer (Windows Live Writer )の無効化)
location ~* /wlwmanifest\.xml$ {
return 444;
}
}
/etc/nginx/ 下にある ***.confファイルの serverセクションに、wlwmanifest.xmlからのリクエストは444を返す処理を追加します。
ステータスコード444はHTTPステータスにないものでNginxが独自に設定したもの。444はリクエストを受けるだけでレスポンスを返しません。
404(Not Found)などでもいいですが、これらは一応、レスポンスを返します。その分だけ通信トラフィックが発生するのでNginxでは444を使いましょう。
ブラウザからアクセスするとサイトが無いかのように表示されます。
メッセージを見て『サイトが無くなった!』と勘違いしそうですが、wlwmanifest.xmlだけ拒否っているのでサイト自体は存在します。
あと、設定ファイルの反映も忘れずに。
systemctl reload nginx
Nginxは .htaccessを使いません。.htaccessはApache HTTPサーバーの設定ファイルです。
Apache HTTP (.htaccess) の拒否設定
Webサーバーのアクセス設定でよく見られるのは .htaccessに書き込むことです。ボクは444ステータスがあることや総合的なパフォーマンスからApacheを使ってないんですが、利用者はこっちのほうが多いのかな?
<Files wlwmanifest.xml>
Order allow,deny
Deny from all
</Files>
この設定は403(Forbidden)を返します。
今のレンタル/クラウド/VPSサーバーでは、管理画面で.htaccessファイルを編集する機能がついているので馴染みがあるでしょう。
HTMLの<head>からwlwmanifest.xmlのリンクを削除
WordPressでは、HTMLの<head>にwlwmanifest.xmlへのリンクが追加されます。いつものwp_head()の処理ですね?
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="https://sample.com/wp-includes/wlwmanifest.xml" />
これも外しましょう。
remove_action( 'wp_head', 'wlwmanifest_link' );
テーマのfunctions.phpや(plugin name).phpファイルから実行できるようにしてください。
よくテーマのfunctions.phpにコードを挿入する説明が見られますが、よくありません。テーマは本来機能を入れるものではないので。
本来やるべきではありませんが、テーマに入れる場面ではfunctions.phpにいろいろな処理を入れると、数百行、へたすると千単位にもわたる縦長のソースコードになってしまいます。
その記述はプログラマの書くものではありません。機能、役割ごとにファイルを分割するのがプログラミングの基本中の基本。
functions.phpは、requireを使って各機能のphpファイルをロードする親ファイルに徹してください。
WordPress.org公式リファレンス
WordPress Core ソースコード
Webサーバーのリクエスト拒否設定はいろんなパターンで使えます。たとえばxmlrpcとか。(やってることは同じ。)
正規表現でも指定できて応用が効くので、覚えといたほうが良いです。