@wokamoto さん作の WordPress へのログイン履歴を保存するプラグインを使ってみたら、そこそこブルートフォースアタックの形跡があったので、良い機会でしたので WordPress の管理画面にアクセス制限をかけてみました。
※2013.12.26 追記
Nginxの場合は @wokamoto さんがIPアドレスで制限するスクリプトを書かれていたのでそちらを参考に。
WordPress の管理画面を IP アドレスで制限する | dogmap.jp
目次
WordPress へのログイン履歴を保存するプラグイン「Crazy Bone(狂骨)」
「Crazy Bone(狂骨)」は @wokamoto さん作のWordPressへのログイン履歴を保存し、ダッシュボード上で可視化できるプラグインです。
もちろん、サーバー上のログを解析するのが本筋なのですが、ログイン履歴(WordPress管理画面へのブルートフォースアタック)だけ分かれば良いというのであれば、このプラグインを入れてみましょう。 試しにこのブログへのログインを試みてエラーになっているBotはこんな感じです。
そもそも、アメリカにもウクライナにも私は行っていないし、WindowsやNetscape(しかも3.0とかって何年前)も使っていないのですが、存在しない admin でのブルートフォースアタックの他、メインで使っているユーザー名でのアタックもあります(ユーザー名が容易に推測できる事については後述します)。
まだ、実害が無いとはいえ良い機会ですので管理画面へのアクセス制限をかけました。
ユーザーの権限を見直す
万が一を考えて、頻繁に管理画面にアクセスするユーザーの権限グループを低い物にしておきましょう。
記事を書くだけなら編集者や投稿者(寄稿者)でOKです。また、@miya0001 さん作のプラグイン「WP Total Hacks」には管理者と編集者の中間に当たる「Webmaster」という権限グループを追加できる機能があります。
具体的にどの権限グループでどんなことができるのかはCodexを参照にしてください。
- 日本語Codex:ユーザーの種類と権限
- WP Total Hacks – 20項目以上のカスタマイズができるWordPressプラグイン | firegoby.
- WordPress › WP Total Hacks « WordPress Plugins.
自分しか更新しないという場合、多くの方が「管理者」のままだと思います。 その場合は
- 「管理者」ユーザーを一つ用意する
- 新しく作った管理用のユーザーでログインし、今まで使っていたユーザーの権限グループを「編集者」に変更する。
の手順で変更しましょう (こうしないと既にある作成者アーカイブや投稿したユーザー名を変更することになります)。
アクセス制限の手法
アクセス制限のかけ方は色々あります。
プラグインでログインに失敗したIPアドレスを記録し、一定回数ログインに失敗したら一定時間ログインを拒否する物もありますし、Googleの2段階認証を使うプラグインもあります。オーソドックスにBasic認証でもOKです。
- WordPress › Limit Login Attempts « WordPress Plugins.
- WordPress › Google Authenticator « WordPress Plugins.
どの手法をとるかは、どの程度ユーザーにダッシュボードへのアクセスを許可するか(例えばユーザーが多いか少ないか、IPアドレスが特定できるのか、できないのか)で変わると思いますので、サイトにあわせて検討してみてください。
WordPressの管理画面にアクセス制限を行う時の対象となるファイル・ディレクトリ
WordPressの管理画面にアクセス制限を行いたい場合は以下のファイル・ディレクトリを対象とします。
- /wp-login.php
- /wp-admin/ ※ただし admin-ajax.php を除く
/wp-login.php はログインパネルです。管理画面(ダッシュボード)は /wp-admin/ 以下になるのですが、admin-ajax.php のみプラグインで使っている物があるのでアクセス制限の対象から除外してください。
余談
数年前のTipsで async-upload.php、wp-cron.php、xmlrpc.php もアクセス制限から外すように書かれている物があります。
しかし、WordPress3.5.1の場合、wp-cron.php、xmlrpc.php は /wp-admin/ に入っていないので、書かなくても問題無いです。
async-upload.php は /wp-admin/ の中にあり、既にBasic認証をパスしているのであえて除外しなくても大丈夫です。
IPアドレスやBasic認証による制限
サーバーの機能を使って制限をかけて、WordPressが無駄に起動しないようにします。
ただし、この方法は不特定多数の人が管理するコミュニティ系のサイトの場合不向きです。そういった場合は先にあげたプラグインを活用したり、権限グループやパスワードの強度を見直してください。
.htaccess(Apache) の場合
ベタに .htaccess(及び、basic認証の場合は .htpasswd)を使います。スーパーできる人は httpd.conf でやった方が良いです。
あと念のため .htpasswd は URLでアクセスできない場所に置きましょう(ファイルの作り方は割愛します)。
まずは wp-login.php と同じ階層に .htaccess を設置します。
Basic認証の場合
<Files wp-login.php> AuthType Basic AuthUserFile /vhost/example/.htpasswd AuthGroupFile /dev/null AuthName "Please enter your ID and password" require valid-user </Files>
特定のIPアドレスのみ許可する場合
<Files wp-login.php> Order deny,allow Deny from all Allow from 123.45.67.89 #許可するIPアドレス </Files>
次に /wp-admin/ に .htaccess を設置します。
Basic認証の場合
AuthType Basic AuthUserFile /vhost/example/.htpasswd AuthGroupFile /dev/null AuthName "Please enter your ID and password" Require valid-user <FilesMatch "(admin-ajax.php)$"> Satisfy Any Order allow,deny Allow from all Deny from none </FilesMatch>
特定のIPアドレスのみ許可する場合
Order deny,allow Deny from all Allow from 123.45.67.89 #許可するIPアドレス <FilesMatch "(admin-ajax.php)$"> Satisfy Any Order allow,deny Allow from all Deny from none </FilesMatch>
Nginxの場合
※2013.12.26 追記
Nginxの場合は @wokamoto さんがIPアドレスで制限するスクリプトを書かれていたのでそちらを参考に。
WordPress の管理画面を IP アドレスで制限する | dogmap.jp
私は上記の方法で制限をかけたのですが、何かの参考になるかもしれませんので記事は残しておきます。
AWS EC2+網元など Nginx では .htaccess が使えませんので、 /etc/nginx/conf.d/default.conf
を編集します。
ターミナル.appなどでSSHでログインしておきます。黒い画面の説明になりますが、頑張りましょう。
Basic認証を行いたい場合は、.htpasswd を作成しておきます。
ファイルパスは網元の場合です。ユーザー名(wpbasic)は適宜おきかえてください。
# htpasswd -c /etc/nginx/conf.d/.htpasswd wpbasic
コマンドが通ると新しいパスワードと再入力を求められます。
New password: Re-type new password:
成功すると以下の様に表示されます。
Adding password for user wpbasic
なお、# cat /etc/nginx/conf.d/.htpasswd
で内容を確認できます。 (最もパスワード自体は暗号化されて保存されているので控えておきましょう)
次に /etc/nginx/conf.d/default.conf
に設定(3行目〜19行目)を追記します(例は網元の場合です)
https://gist.github.com/gatespace/5611265
※IPアドレスの制限とBasic認証を併記していますので、使わない方はコメントアウトしてください。
保存したらNginxを再起動してください。
Nginx部分で参考にしたサイト
おまけでパスワードについて
「WordPressのadminユーザーは危険」という論調がありますが、これは正確ではありません。
そもそも、世界的にシェア率の高いWordPressであれば(的が大きいので)標的になりやすいです。
「下手な鉄砲も数打ちゃ当たる」という言葉の通り、「ログインURL+ログインユーザー名(以前はデフォルトだったadminが多い)+パスワード総当たり」というのが最近のbotの手口です(現に、WordPressのインストールしていないサーバーに対して同様のアタックがあります)。
また先に示した画像の通り、WordPressの作成者アーカイブのスラッグにログインユーザー名が使用される=誰でも分かるので、「admin」じゃなければ安心ということでもありません。
一番危険なのは「類推されやすいパスワード」です。
adminユーザーであっても複雑で桁数の多いパスワードであればブルートフォースアタックでも解読に時間がかかります。
今一度、パスワードを見直し、強度インジケーター(「新しいパスワード」欄にあります)などを利用してパスワードの強度をあげてください。