• 赤色のリンクは、まだ日本語Codexに存在しないページ・画像です。英語版と併せてご覧ください。(詳細

このWikiはいつでも誰でも編集できます

ブルートフォース攻撃

提供: WordPress Codex 日本語版
移動先: 案内検索

このページ「ブルートフォース攻撃」は一部未翻訳です。和訳や日本語情報を加筆してくださる協力者を求めています

ソフトウェアの脆弱性に着目する攻撃とは異なり、ブルートフォース攻撃(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 をブロックすることで、これらの攻撃を沈静化するのに役立つでしょう。

外部資料

最新英語版: WordPress Codex » Brute Force Attacks最新版との差分