ブルートフォース攻撃

ソフトウェアの脆弱性に着目する攻撃とは異なり、ブルートフォース攻撃 (Brute Force Attack) は、非常に単純な方法でアクセス権を取得しようとします。ユーザー名とパスワードを入力し、ログイン成功するまで繰り返します。美しくないですが、ユーザー名 admin パスワード 123456 のようなものを採用している場合、攻撃が成功しやすいです。

手短に言うと、ウェブサイトのセキュリティで一番脆い場所、つまり、あなた、を狙っているのです。

攻撃の性質上、サーバーのメモリ上限に達してパフォーマンス低下を引き起こすかもしれません。http リクエストの数 (あなたのサイトを訪問する回数) が非常に多いため、サーバーがメモリ不足になるからです。

この攻撃は、WordPress 特有のものではありません。すべてのウェブアプリケーションに起こりえます。しかし WordPress は良く利用されているため、攻撃の標的となりやすいです。

自分を守る

WordPress へのよくある攻撃の場合、wp-login.php ファイルに繰り返しアクセスし、ログインできるかサーバーがダウンするかするまで継続します。自分を守るために、いくつかの方法があります。

トップ ↑

ユーザー名 admin を使用しない

WordPress のデフォルトのユーザー名が admin のため、admin を使用していると仮定した攻撃が多いです。ユーザー名 admin を使用している場合は、新しいアカウントを作成し、全ての投稿を新しいアカウントに移譲し、admin を購読者に変更してください (あるいは削除してください)。

プラグイン Admin Renamed Extended を使用して自身のユーザー名を変更できます。

トップ ↑

良いパスワードを使用する

パスワードの目的は、他者が推測しずらく、ブルートフォース攻撃が成功しにくいものにすることです。安全なパスワードを作成することができる、多くの automatic パスワード生成ツール (google 検索) があります。

WordPress にはパスワード強度を示すメーターがあり、パスワードを変更するときに表示されます。パスワードを変更するときは、十分な強度であることを確かめておきましょう。

プラグイン Force Strong Password を使用して、強固なパスワードを強制することができます。

パスワード生成時に避けたほうが良い事:

  • 本名、ユーザー名、会社名、ウェブサイトの名前やそれらの組み合わせ。
  • どんな言語であれ、辞書にある単語。
  • 短いパスワード。
  • 数字のみ、またはアルファベットのみのパスワード (両方を混ぜるのが良い)。

強固なパスワードは、ブログ投稿を守るのに必要ですが、それだけではありません。管理者アカウントのアクセスを取得した攻撃者が、悪意あるスクリプトをインストールし、サーバー全体が危うくなることがあります。

パスワードの強度をさらに上げ、ブログを守るために、二段階認証を有効にすることができます。

トップ ↑

プラグイン

プラグインを用いて、ログイン試行回数を制限したり、wp-admin へのアクセスを禁止したりできます。There are many plugins available to limit the number of login attempts made on your site. Alternatively, there are also many plugins you can use to block people from accessing wp-admin altogether.

トップ ↑

サーバーを守る

wp-login.php あるいは wp-admin をロックする事を決めた場合、これらのページへアクセスすると、404または401エラーに遭遇するでしょう。これを避けるには、.htaccess ファイルに下記のように記述します。

ErrorDocument 401 default

401エラーを 401.html に向けることもできます。ここで重要なのは、 WordPress でない、ということです。

Nginxの場合は、error_pageディレクティブを使用することができますが、URLを完全に指定する必要があります。

error_page  401  http://example.com/forbidden.html;

トップ ↑

wp-login.php をパスワード保護する

wp-login.php ファイル (と wp-admin フォルダ)をパスワード保護することにより、防御壁を増やすことができます。wp-admin をパスワード保護すると、フロントエンドで ajax を使用するプラグインを破壊するため、wp-login を保護するだけで通常は良いでしょう。

パスワード保護するには、.htpasswd ファイルを作成する必要があります。多くのホスティングでは生成ツールを提供してますが、もし手作業で作成する必要がある場合は、htpasswd generator を使用することができます。.htaccess ファイル (拡張子のみを持つファイル) と同様、.htpasswd も拡張子のみです。

このファイルをウェブ公開領域(public_html や domain.com 等。ホスティングにより異なる)の外に置くことができます。同じフォルだに置くこともできますが、こうする場合は .htaccess ファイルに追加でセキュリティ対策を施す必要があります。

.htpasswd ファイルをアップロードしたら、どこにあるかを .htaccess に伝える必要があります。.htpasswd をホームディレクトリに置き、htpasswd ユーザー名が mysecretuser の場合、.htaccess に下記のように記述します。

# Stop Apache from serving .ht* files
<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>

# Protect wp-login
<Files wp-login.php>
AuthUserFile ~/.htpasswd
AuthName "Private access"
AuthType Basic
require user mysecretuser
</Files>

AuthUserFile の実際の位置はサーバーに依存します。また ‘require user’ にはユーザー名を指定してください。

もしあなたが Nginx を使用している場合は、HttpAuthBasicModuleを使用することにより、wp-login.php を守ることができます。このブロックは、サーバーブロックの内部に設置すべきです。

location /wp-login.php {
    auth_basic "Administrator Login";
    auth_basic_user_file .htpasswd;
}

ファイル名のパスは、Nginx のコンフィギュレーションファイル (nginx.conf) のディレクトリに関連付けられています。

そのファイルは、以下のようなフォーマットにするべきです:

user:pass
user2:pass2
user3:pass3

パスワードは、必ず crype(3) によりエンコードしてください。これは、htpasswd generatorを使用することにより、オンラインで暗号化することもできます。

トップ ↑

wp-admin へのアクセスを IP アドレスで制限する

自分だけが管理画面にログインする必要がある場合、もしあなたが固定 IP アドレスを持っていれば、.htaccess ファイルを用いて自分以外の wp-admin へのアクセスを拒否することができます。

Note: Beware your ISP or computer may be changing your IP address frequently, this is called dynamic IP addressing, rather than fixed IP addressing. This could be used for a variety of reasons, such as saving money. If you suspect this to be the case, find out out how change your computer's settings, or contact your ISP to obtain a fixed address, in order to use this procedure.

.htaccess をテキストエディタで開き、下記を追加する:

# Block access to wp-admin.
order deny,allow
allow from x.x.x.x 
deny from all

x.x.x.x は自分の IP アドレスに置き換えてください。インターネットサービスプロバイダに問い合わせると、自分の IP アドレスが分かるでしょう。あるいは What Is My IP のようなオンラインサービスを使用することもできます。

Nginxについては、locationブロックをサーバーブロックの内部に追加することにより、前述のApacheの例と同様に機能させることができます。

error_page  403  http://example.com/forbidden.html;
location /wp-admin {
  deny    192.168.1.1;
  allow   192.168.1.0/24;
  allow   10.1.1.0/16;
  deny    all;
}

deny/allow の順序が重要である事に注意してください。アクセス指定順を変えても上手くいく、と思うかもしれません。実際はそうではありません。上記の例の順序を変えると、全てのアドレスからのアクセスを拒否します。

テーマやプラグインが AJAX を使用している場合、.htaccess に追加の設定を記述して、それらがうまく動作するようにする必要があります。

# Allow access to wp-admin/admin-ajax.php
<Files admin-ajax.php>
    Order allow,deny
    Allow from all
    Satisfy any
</Files>

このファイルを保存し、wp-admin フォルダにアップロードしてください。

Nginx の場合、もしあなたが wp-admin と ajax へのアクセスを制限している場合、別の location ブロックをサーバーブロックに追加する必要があるでしょう。

location /wp-admin/admin-ajax.php {
    allow all;
}

許可する IP アドレスを複数指定することができます。

# Block access to wp-admin.
order deny,allow
allow from x.x.x.x 
allow from y.y.y.y 
allow from z.z.z.z 
deny from all

複数のインターネットサービスプロバイダを使用する場合 (モバイル環境から管理画面にアクセスする場合、等)や、何人かが管理画面にアクセスできるようにする場合に役立ちます。

IP アドレスブロックを許可する場合は、下記のように記述します。

# Block access to wp-admin.
order deny,allow
allow from x.x.x.* 
deny from all

例えば、192.168.1.* を設定すると、IP アドレス範囲 192.168.1 を許可します。

トップ ↑

リファラーの無いアクセスを拒否する

Combatting Comment Spam の発展として、これを使用してサイトにアクセスしないでログインフォームにアクセスされたものを拒否することができます。

# Stop spam attack logins and comments
<IfModule mod_rewrite.c>
	RewriteEngine On
	RewriteCond %{REQUEST_METHOD} POST
	RewriteCond %{REQUEST_URI} .(wp-comments-post|wp-login)\.php*
	RewriteCond %{HTTP_REFERER} !.*example.com.* [OR]
	RewriteCond %{HTTP_USER_AGENT} ^$
	RewriteRule (.*) http://%{REMOTE_ADDR}/$1 [R=301,L]
</ifModule>

Nginx – リファラの無いアクセスリクエストを拒否する

location ~* (wp-comments-posts|wp-login)\.php$ {
        if ($http_referer !~ ^(http://example.com) ) {
          return 405;
        }
      }

example.com は自分のドメインに変更してください。マルチサイトで複数ドメインを使用している場合は、(example.com|example.net|example4.com) のように変更してください。

トップ ↑

ModSecurity

ModSecurity を使用する場合は、Frameloss – Stopping brute force logins against WordPress の指示に従ってください。サーバーのルート権限が必要になります。ホスティング業者の手助けが必要かもしれません。

ModSecurity 2.7.3 を使用している場合は、ルールを .htaccess ファイルに追記することもできます。

トップ ↑

Fail2Ban

Fail2ban は、Python is a Python でかかれた常駐プログラムです。Fail2ban は、Apache (あるいは、SSHなど) をチェックし、特定のイベントが発生した場合に、ファイアウォールのルールを追加します。Fail2ban は、正規表現を使用したフィルタを使用します。もし、設定した正規表現にマッチしたイベントが例えば5分間に5回発生したら、そのIPアドレスを60分間 (あるいは任意の期間) ブロックすることができます。Fail2ban のインストール及び設定には、 root 権限が必要です。

トップ ↑

Blocklists

多くのブルートフォース攻撃は、ロシア、カザフスタン、ウクライナのホストから行われています。これらの国々のIPアドレスブロックを選択し、ブロックすることができます。インターネット上に、このようなブロックリストが公開されており、ダウンロードすることができます。また、シェルスクリプトにより、 iptables にブロックルールを読み込ませることも可能です。ただし、これにより、攻撃のためのアクセスではない、合法なユーザーをブロックしてしまうことに注意してください。これについて、サポートが可能か確認し、またカスタマーにこの決断について説明を行いましょう。国ごとのブロックリストに加え、よく知られたスパマーのIPアドレスのリストがあります。このようなリストも、 iptables に使用することができます。これらのリストは定期的に更新した方がよいでしょう。

ブロックリストと iptables の設定には、root 権限が必要です。

トップ ↑

Cloud/Proxy サービス

CloudFlare や Sucuri CloudProxy のようなサービスは、攻撃者がサーバーに到達する前に IP をブロックすることで、これらの攻撃を沈静化するのに役立つでしょう。

トップ ↑

外部資料

この記事は役に立ちましたか ? どうすればさらに改善できますか ?