複数のログイン試行の制限

インターネットサービスを標的とした攻撃の中で最も一般的なものの一つが、ブルートフォースログイン攻撃です。この攻撃の形態では、悪意のある者がWordPressのユーザー名とパスワードを推測しようとします。攻撃者は、攻撃を行うためにユーザーサイトのURLだけが必要です。ボットネットを使用してこれらの攻撃を実行するためのソフトウェアが容易に入手可能であり、ますます複雑なパスワードを見つけることが容易になっています。

この種の攻撃に対する最良の保護は、WordPressユーザーに対して強力なパスワードを設定し、推奨し、または強制することです。

可能な場合は、ホストがネットワークおよびサーバーレベルでログイン試行を制限することをお勧めします。サイトごとの最大ログイン数と、サーバーまたはインフラ全体でのIPごとの最大試行数を制限することが、ボットによるパスワードのブルートフォース攻撃を軽減するのに役立ちます。これはプラグインレベルでも実行できますが、これらの攻撃中に発生する追加のリソース利用を伴います。

自分を守る

WordPressの一般的な攻撃ポイントは、wp-login.phpファイルを何度も叩いて侵入するか、サーバーがダウンするまでです。自分を守るためにできることがあります。

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

攻撃の大多数は、初期のWordPressバージョンがデフォルトでこのユーザー名を使用していたため、人々が‘admin’というユーザー名を使用していると仮定しています。このユーザー名をまだ使用している場合は、新しいアカウントを作成し、すべての投稿をそのアカウントに移行し、‘admin’を購読者に変更するか(または完全に削除してください)。

ユーザー名を変更するには、プラグインChange Usernameを使用することもできます。

良いパスワード

パスワードの目標は、他の人が推測するのを難しくし、ブルートフォース攻撃が成功するのを難しくすることです。安全なパスワードを作成するために使用できる多くの自動パスワード生成ツールがあります。

WordPressには、パスワードを変更する際に表示されるパスワード強度メーターもあります。パスワードを変更する際にこれを使用して、その強度が十分であることを確認してください。

ユーザーに強力なパスワードを設定させるために、Force Strong Passwordプラグインを使用できます。

パスワードを選択する際に避けるべきこと:

  • 自分の本名、ユーザー名、会社名、またはウェブサイトの名前の任意の順列。
  • 辞書の単語(任意の言語)。
  • 短いパスワード。
  • 数字のみまたはアルファベットのみのパスワード(両方の混合が最適です)。

強力なパスワードは、ブログのコンテンツを保護するためだけでなく必要です。管理者アカウントにアクセスできるハッカーは、サーバー全体を危険にさらす可能性のある悪意のあるスクリプトをインストールできます。

パスワードの強度をさらに高めるために、Two Step Authenticationを有効にしてブログをさらに保護できます。

プラグイン

サイトでのログイン試行の回数を制限するための多くのプラグインがあります。あるいは、wp-adminへのアクセスを完全にブロックするために使用できる多くのプラグインもあります。

サーバーを保護する

wp-login.phpまたはwp-adminをロックダウンすることに決めた場合、これらのページにアクセスすると404または401エラーが表示されることがあります。それを避けるために、.htaccessファイルに次の内容を追加する必要があります。

  1. ErrorDocument 401 default

401を401.htmlにポイントさせることができますが、ポイントはWordPressではないことを目指すことです。

Nginxでは、error_pageディレクティブを使用できますが、絶対URLを指定する必要があります。

  1. error_page 401 https://example.com/forbidden.html;

IISウェブサーバーでは、web.config内のhttpErrors要素を使用し、errorMode="custom"を設定できます:

  1. <httpErrors errorMode="Custom">
  2. <error statusCode="401"
  3. subStatusCode="2"
  4. prefixLanguageFilePath=""
  5. path="401.htm"
  6. responseMode="File" />
  7. </httpErrors>

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

wp-login.phpファイル(およびwp-adminフォルダー)をパスワード保護することで、サーバーに追加のレイヤーを追加できます。wp-adminをパスワード保護すると、フロントエンドでajaxを使用するプラグインが壊れる可能性があるため、通常はwp-login.phpだけを保護するのが十分です。

これを行うには、.htpasswdファイルを作成する必要があります。多くのホストにはこれを行うためのツールがありますが、手動で行う必要がある場合は、このhtpasswdジェネレーターを使用できます。あなたの.htaccessファイル(拡張子のみのファイル)と同様に、.htpasswdにもプレフィックスはありません。

このファイルを公開ウェブフォルダーの外(つまり、/public_html/や/domain.com/ではなく、ホストに応じて)に置くか、同じフォルダーに置くことができますが、その場合は.htaccessファイルで追加のセキュリティ作業を行う必要があります。

さて、.htpasswdファイルをアップロードしたら、.htaccessにその場所を教える必要があります。仮に.htpasswdをユーザーのホームディレクトリに置き、htpasswdのユーザー名がmysecretuserである場合、.htaccessに次のように記述します:

  1. # Apacheが.ht*ファイルを提供しないようにする
  2. <Files ~ "^\\.ht">
  3. Order allow,deny
  4. Deny from all
  5. </Files>
  6. # wp-login.phpを保護する
  7. <Files wp-login.php>
  8. AuthUserFile ~/.htpasswd
  9. AuthName "プライベートアクセス"
  10. AuthType Basic
  11. require user mysecretuser
  12. </Files>

AuthUserFileの実際の場所はサーバーによって異なり、‘require user’は選択したユーザー名に基づいて変更されます。

Nginxを使用している場合は、HttpAuthBasicModuleを使用してwp-login.phpファイルをパスワード保護できます。このブロックはサーバーブロック内に配置する必要があります。

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

ファイル名のパスはnginx設定ファイルnginx.confのディレクトリに対して相対的です。

ファイルは次の形式である必要があります:

  1. user:pass
  2. user2:pass2
  3. user3:pass3

残念ながら、Windows Server IISでパスワード保護されたwp-login.phpを構成する簡単な方法はありません。Helicon Apeのような.htaccessプロセッサを使用している場合は、上記の.htaccessの例を使用できます。それ以外の場合は、ホスティングプロバイダーにBasic Authenticationの設定を依頼する必要があります。

すべてのパスワードは関数crypt(3)によってエンコードされる必要があります。オンラインのhtpasswdジェネレーターを使用してパスワードを暗号化できます。

複数のログイン試行の制限

インターネットサービスを標的とした攻撃の中で最も一般的なものの一つが、ブルートフォースログイン攻撃です。この攻撃の形態では、悪意のある者がWordPressのユーザー名とパスワードを推測しようとします。攻撃者は、攻撃を行うためにユーザーサイトのURLだけが必要です。ボットネットを使用してこれらの攻撃を実行するためのソフトウェアが容易に入手可能であり、ますます複雑なパスワードを見つけることが容易になっています。

この種の攻撃に対する最良の保護は、WordPressユーザーに対して強力なパスワードを設定し、推奨し、または強制することです。

可能な場合は、ホストがネットワークおよびサーバーレベルでログイン試行を制限することをお勧めします。サイトごとの最大ログイン数と、サーバーまたはインフラ全体でのIPごとの最大試行数を制限することが、ボットによるパスワードのブルートフォース攻撃を軽減するのに役立ちます。これはプラグインレベルでも実行できますが、これらの攻撃中に発生する追加のリソース利用を伴います。

IPによるwp-login.phpへのアクセス制限

管理エリアにログインする必要があるのが自分だけで、固定IPアドレスを持っている場合は、.htaccessまたはweb.configファイルを使用して、他のすべての人からwp-login.php(およびwp-admin/フォルダー)へのアクセスを拒否できます。これはしばしばIPホワイトリストと呼ばれます。

注意: ISPやコンピュータが頻繁にIPアドレスを変更する可能性があるため、これは動的IPアドレッシングと呼ばれ、固定IPアドレッシングではありません。これは、コストを節約するなどのさまざまな理由で使用される可能性があります。これが当てはまると思われる場合は、コンピュータの設定を変更する方法を調べるか、ISPに連絡して固定アドレスを取得してください。この手順を使用するために。

すべての例では、203.0.113.15を自分のIPアドレスに置き換える必要があります。インターネットプロバイダーがIPアドレスの特定を手伝ってくれます。また、What Is My IPのようなオンラインサービスを使用することもできます。

複数のIPアドレスの例も提供されています。これは、複数のインターネットプロバイダーを使用している場合や、小さなIPアドレスプールを持っている場合、またはサイトのダッシュボードにアクセスできる人が数人いる場合に最適です。

プレーンテキストエディタで.htaccessというファイルを作成し、次の内容を追加します:

  1. # wp-login.phpへのアクセスをブロックする。
  2. <Files wp-login.php>
  3. order deny,allow
  4. allow from 203.0.113.15
  5. deny from all
  6. </Files>

許可されたIPアドレスを追加するには、次のようにします:

  1. # wp-login.phpへのアクセスをブロックする。
  2. <Files wp-login.php>
  3. order deny,allow
  4. allow from 203.0.113.15
  5. allow from 203.0.113.16
  6. allow from 203.0.113.17
  7. deny from all
  8. </Files>

Apache 2.4およびApacheモジュールmod_authz_hostを使用していますか?その場合は、少し異なる構文を使用する必要があります:

  1. # wp-login.phpへのアクセスをブロックする。
  2. <Files wp-login.php>
  3. Require ip 203.0.113.15
  4. </Files>

複数のIPアドレスを追加したい場合は、次のようにします:

  1. # wp-login.phpへのアクセスをブロックする。
  2. <Files wp-login.php>
  3. Require ip 203.0.113.15 203.0.113.16 203.0.113.17
  4. # またはネットワーク全体に対して:
  5. # Require ip 203.0.113.0/255.255.255.0
  6. </Files>

Nginxでは、サーバーブロック内にApacheの上記の例と同じように機能するロケーションブロックを追加できます。

  1. error_page 403 https://example.com/forbidden.html;
  2. location /wp-login.php {
  3. allow 203.0.113.15
  4. # or for the entire network:
  5. # allow 203.0.113.0/24;
  6. deny all;
  7. }

deny/allowの順序は非常に重要です。アクセス指令の順序を入れ替えればすべてが機能すると思うかもしれませんが、実際にはそうではありません。上記の例で順序を入れ替えると、すべてのアドレスへのアクセスが拒否されます。

再度、IISウェブサーバーでは、web.configファイルを使用してアクセスできるIPアドレスを制限できます。これは、追加の<locationディレクティブに追加するのが最適です。

  1. <location path="wp-admin">
  2. <system.webServer>
  3. <security>
  4. <ipSecurity allowUnlisted="false"> <!-- this rule denies all IP addresses, except the ones mentioned below -->
  5. <!-- 203.0.113.x is a special test range for IP addresses -->
  6. <!-- replace them with your own -->
  7. <add ipAddress="203.0.113.15" allowed="true" />
  8. <add ipAddress="203.0.113.16" allowed="true" />
  9. </ipSecurity>
  10. </security>
  11. </system.webServer>
  12. </location>

リファラーなしのリクエストへのアクセスを拒否する

Combatting Comment Spamから拡張されており、ログインフォームを送信していない人がアクセスできないようにするために使用できます:

  1. # スパム攻撃のログインとコメントを停止する
  2. <IfModule mod_rewrite.c>
  3. RewriteEngine On
  4. RewriteCond %{REQUEST_METHOD} POST
  5. RewriteCond %{REQUEST_URI} .(wp-comments-post|wp-login)\.php*
  6. RewriteCond %{HTTP_REFERER} !.*example.com.* [OR]
  7. RewriteCond %{HTTP_USER_AGENT} ^$
  8. RewriteRule (.*) https://%{REMOTE_ADDR}/$1 [R=301,L]
  9. </IfModule>

Nginx – リファラーなしのリクエストへのアクセスを拒否する

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

Windows Server IIS – リファラーなしのリクエストへのアクセスを拒否する:

  1. <rule name="block_comments_without_referer" patternSyntax="ECMAScript" stopProcessing="true">
  2. <match url="(.*)" ignoreCase="true" />
  3. <conditions logicalGrouping="MatchAll">
  4. <add input="{URL}" pattern="^/(wp-comments-post|wp-login)\.php" negate="false"/>
  5. <add input="{HTTP_REFERER}" pattern=".*example\.com.*" negate="true" />
  6. <add input="{HTTP_METHOD}" pattern="POST" />
  7. </conditions>
  8. <action type="CustomResponse" statusCode="403" statusReason="Forbidden: Access is denied." statusDescription="No comments without referrer!" />
  9. </rule>

example.comを自分のドメインに変更してください。マッピングされたドメインを使用しているマルチサイトを使用している場合は、example.comを(example.com|example.net|example.org)に変更する必要があります。Jetpackコメントを使用している場合は、リファラーとしてjetpack.wordpress.comを追加することを忘れないでください: (example.com|jetpack\.wordpress\com)

ModSecurity

ModSecurityを使用している場合は、Frameloss – WordPressに対するブルートフォースログインを停止するのアドバイスに従うことができます。これはサーバーへのルートレベルのアクセスを必要とし、ホスティングプロバイダーの支援が必要な場合があります。

ModSecurity 2.7.3を使用している場合は、代わりにルールを.htaccessファイルに追加できます。

Fail2Ban

Fail2banは、バックグラウンドで実行されるPythonデーモンです。Apache(またはSSHなど)によって生成されたログファイルをチェックし、特定のイベントに基づいてファイアウォールルールを追加できます。正規表現を使用したフィルターを使用します。その正規表現が例えば5分間に5回発生した場合、そのIPアドレスを60分間(または他の任意の数字)ブロックできます。

Fail2banのインストールと設定にはルートアクセスが必要です。

ブロックリスト

ほとんどのブルートフォース攻撃は、ロシア、カザフスタン、ウクライナからのホストによるものであるようです。これらの国から発信されるIPアドレスをブロックすることを選択できます。インターネット上にはダウンロード可能なブロックリストがあります。シェルスクリプトを使用して、iptablesでブロックルールを読み込むことができます。

正当なユーザーと攻撃者の両方をブロックしていることに注意してください。その決定を顧客にサポートし、説明できることを確認してください。

国ごとのブロックリストに加えて、悪名高いスパマーのIPアドレスのリストもあります。これらを使用してiptablesでブロックすることもできます。これらのリストは定期的に更新することが重要です。

ブロックリストとiptablesの設定にはルートアクセスが必要です。

クラウド/プロキシサービス

CloudFlareやSucuri CloudProxyのようなサービスは、サーバーに到達する前にIPをブロックすることで、これらの攻撃を軽減するのに役立ちます。

関連情報

変更履歴