前回やったこと
前回、WordPressのプラグイン User Login History について詳しくまとめましたが、その記事を書いたあと5時間程度経つと、19ページにも渡ってログイン試行の履歴が残されていました。
びっしりですね……
過去の記事でセキュリティ設定やfirewalldでのブラックリスト、WordPress管理画面のアクセス制限等、対策は取っているにも関わらず、このアクセス試行数です。
拙い個人のブログをハッキングしても何の得にもならんだろうとは思いますが、1日で何百ものログイン試行があるのはさすがに気持ちが悪いので対策することにしました。
WPSCANをインストールしてチェックしてみたところ、「xmlrpcが有効になっている」と怒られました。
XML-RPCとは何かを検索してみました。
XML-RPCとは、遠隔手続き呼出し (RPC) プロトコルの一種であり、エンコード(符号化)にXMLを採用し、転送機構にHTTPを採用している。非常に単純なプロトコルで、少数のデータ型やコマンドだけを定義しているだけであり、その仕様は2枚の紙にまとめられる。これは多くのRPCシステムが膨大な量の規格を規定し、実装に多量のプログラミングを要することに比べると、際立った特徴と言える。
1998年、ユーザーランド・ソフトウェアがマイクロソフトと共同で開発した。その後、これに新たな機能を追加したものがSOAPへと発展した。しかし、SOAP よりも単純で扱いやすいXML-RPCを好む人もいる。
類似の RPCプロトコルとして JSON-RPC がある。
XML-RPCを無効化する理由
どうしてXML-RPCを無効にしなくてはならないのか?
XML-RPCの用途はリモート投稿などですが、XML-RPCを利用することで次のことが可能になるとも書いてありました。
- pingback:誰かがあなたの投稿を引用したときに、元の投稿にpingを送り返す機能
- ブルートフォース:総当たり攻撃
詳しくはこちらに書かれています。
また、XML-RPCは無効化するべきだという情報もいくつか散見されましたが、特に強調したいのがこちらになります。
現在では、REST APIがXML-RPCに取って代わったため、サイトのxmlrpc.phpは無効にするのがいいでしょう。
(引用:kinsta「WordPressのxmlrpc.php詳細ガイド(xmlrpc.phpとは、セキュリティリスク、無効にする方法)
有効にしておく必要はありませんね。
XML-RPCを無効化する方法
Nginxの設定ファイルに追記する
以下のファイルを開きます。
1 |
/etc/opt/kusanagi/nginx/プロファイル名.conf |
次の記述をserverディレクティブ内に追記します。
1 2 3 4 |
location = /xmlrpc.php { deny all; return 403; } |
保存したらnginxをリスタートさせます。
1 |
# kusanagi nginx |
ブラウザからアクセスしてXML-RPCが無効になったかを確認します。
403が返ってくればOKです。
1 |
【自サイトのURL】/xmlrpc.php |
IPアドレス制限を設定する
先ほどXML-RPCへのアクセスを遮断しましたが、念には念を入れる意味でIPアドレス制限を設定します。
アクセス制限国別のIPアドレスをまとめているhttp://nami.jp/ipv4bycc/サイトさんからcidr.txt.gzをダウンロードして、/etc/opt/kusanagi/nginx/conf.d/ip_deny_list.txtを読み込んでIPアドレス制限を実現する方法です。
1 2 3 4 |
# wget http://nami.jp/ipv4bycc/cidr.txt.gz # gunzip cidr.txt.gz # sed -E 's/^(CN|KR|DE|GB|BR|FR|CA|AU|IT|NL|RU|IN)\t(.*)/\2 NG;/g' cidr.txt | grep 'NG;' >> /etc/opt/kusanagi/nginx/conf.d/ip_deny_list.txt # kusanagi nginx |
/etc/opt/kusanagi/nginx/プロファイル名.confを開き、geoディレクティブを使用してアクセスフィルターを設定します。
1 2 3 4 |
geo $access_filter { default OK; include /etc/nginx/conf.d/ip_deny_list.txt; } |
次にsereverディレクティブに次のコードを記述します。
1 2 3 4 5 |
# black list if ($access_filter = "NG") { return 404; } } |
過度アクセスへの対策
1秒あたり数十~数百ものリクエストしてくる攻撃者には、limit_reqでリクエスト制限を設定します。
以下を定義とします。
① limit_req_zoneにて「攻撃者の同IPからアクセスが秒間1回以上の制限する」定義をする。
② limit_reqで秒間5回までのリクエストを受け付ける。
/etc/opt/kusanagi/nginx/nginx.confを開き、httpディレクティブ内に次のコードを追記します。
1 2 3 |
# dos対策, レスポンス 403で返却 limit_req_log_level error; limit_req_status 403; |
/etc/opt/kusanagi/nginx/conf.d/【プロファイル名】.confを開き、serverディレクティブ内に次のコードを追記します。
1 2 3 4 |
location = / { # dos 1秒あたり 5リクエストは受け付け、それ以外は破棄=403 limit_req zone=one burst=5 nodelay; } |
保存したらnginxをリスタートさせます。
1 |
# kusanagi nginx |
今回は以上となります。
お疲れ様でした。
コメント