web-dev-qa-db-ja.com

ブルートフォース攻撃からWordPress=を保護する方法は?

WordPress=サイトの1つがブルートフォースで絶えず攻撃されています。WordFenceおよびClefプラグインをインストールしています。ログインの試行回数は1つに制限されています。パスワードは非常に強力です。ユーザー名は「管理者」ではありません。Clefプラグインが設定されていると、攻撃者がログイン&パスワードフォームにアクセスする方法を知りたいのですが、ブロックされた試行についてWordFenceから通知を受け取り続けます。この攻撃を防ぐ方法はありますか?これらのレイヤーはセキュリティは十分ですか?

更新:

WordFenceからの通知の例を次に示します。

次の理由により、IPアドレス{IP}のユーザーがサインインまたはパスワード再設定フォームを使用してロックアウトされました:無効なユーザー名「admin」を使用してサインインしようとしました。

ユーザーIP:{IP}

ユーザーのホスト名:{ホスト名}

ユーザーの場所:{国}

また、ログでxmlrpc.phpファイルへのリクエストを確認できます。

クレフは役に立たないと思います。アプリでログインに失敗すると、通常のログインフォームが表示されるからです。

誰もがwp-loginへのアクセスをブロックし、Clefのオーバーライド機能のようなある種のシークレットトークンを使用しないとアクセスできないようにすることは可能ですか。

http://your-site-name.com/wp-login.php?override=fhfd87382rfjsh0
2
Nikita

サーバーにアクセスできる場合は、 fail2ban をインストールできます。

wordpress /etc/fail2ban/jail.d/wordpress.confの刑務所を設定する必要があります

[wordpress]
enabled = true
filter = wordpress
logpath = /var/log/auth.log
port = http,https

$ service fail2ban restart

詳細については BjørnJohansen:fail2banを使用してブロックするWordPressログイン攻撃 を確認してください。

デフォルトのユーザー名(admin)を使用していないことを確認し、強力なパスワードを使用してください。

総当たり攻撃から保護するもう1つの方法は、wp-loginを制限することです

<Location /wp-login.php>
                Order deny,allow
                deny from all
                allow from 192.168.1.1 <- put your ip here
</Location>

別の解決策は、htaccessでwp-loginを保護することです。

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

ブルートフォース攻撃に対する保護の詳細については、こちらをご覧ください https://wordpress.org/support/article/brute-force-attacks/

4
Mirsad

失敗したログインの多くが米国以外の国から取得されていると思います。

WordPressをお勧めするのは、プラグインからIPブロッカーをダウンロードすることです。これにより、特定の国または必要な国以外のすべての国をブロックすることができます。私の場合、ウェブサイトがあります。これは米国でのみ表示されるため、他の国々では私のウェブサイトの表示をブロックしましたが、これは私にとって最も効果的でした。

また、IPがブロックされている場合は、IPアドレスごとに一定時間Webサイトにアクセスできないように設定することができます。

最後に、ログインの制限を1や2などの低い数値に減らします。そうすると、誰かがログインに失敗した場合、IPアドレスをブロックしたため、別のIPアドレスを使用してログインする必要があります。

お役に立てれば。

1
Carlos Alan

CloudFlareを使用すると(コメントの1つで述べたように)、2つのことが起こります。

サーバーとアプリケーションはどちらも、CloudFlare(リバースプロキシ)が使用されていることを認識していません。これを修正するには、使用されているソフトウェア(WordPressおよびfail2ban)に、この元のビジターIPの場所を通知する必要があります。それ以外の場合は、CloudFlare IPを使用します(これが新しい着信IPになるためです)。

WordPressの場合、以下をご覧になることをお勧めします: https://support.cloudflare.com/hc/en-us/articles/201717894-Using-CloudFlare-and -WordPress-Five-Easy-First-Steps

Fail2Banについては、以下をご覧になることをお勧めします: https://support.cloudflare.com/hc/en-us/articles/204073570-Can-I-still-use-fail2ban-while-using- CloudFlare-

0
Bob Ortiz

私たちのサーバーには、すでに Config Server Firewall (CSF)がインストールされています。 fail2banと同様に機能する「ログイン失敗デーモン」(LFD)と呼ばれるツールが付属しています。ログファイルに基づいて攻撃を検出し、IPを禁止できます。

LFDを使用してこの種の攻撃を緩和するために、次のことを行いました。

  1. LFDに/etc/csf/csf.confに追加して、nginxログファイルを監視するように伝えます

    CUSTOM1_LOG = "/var/log/nginx/access.log"
    
  2. 次の検出ルールを/usr/local/csf/bin/regex.custom.pmに追加します

    if (
        ($globlogs{CUSTOM1_LOG}{$lgfile})
        and
        ($line =~ /^(\d+\.\d+\.\d+\.\d+) .*"(POST|GET) \/wp-login.php.*" (403|499|502) /)
    ) {
        return ("Failed wordpress login from",$1,"mywplogin1","5","80,443","3600");
    }
    
  3. ルールが整ったら、次のコマンドでLFDサーバーを再起動します。

    service lfd restart
    

このルールは、失敗したログイン試行を行っているクライアントのログファイルを監視します。 1時間以内に同じIPアドレスから5回の試行が検出された場合、LFDはそのIPがポート80またはポート443に1時間(3,600秒)アクセスするのをブロックします。


この回答を書いてから、ブロックできる他の攻撃をいくつか見つけました。そこで、次の一連のルールをお勧めします。

# Block brute force password attempts
if (($globlogs{CUSTOM1_LOG}{$lgfile}) and ($line =~ /^(\d+\.\d+\.\d+\.\d+) [^"]*"(POST|GET) \/wp-login\.php[^"]*" (403|499|502|550) /)) {
    return ("Failed wordpress login from",$1,"mywplogin1","5","80,443","3600");
}

# Block hackers who are scanning for insecure PHP scripts (usually 404 Not Found)
if (($globlogs{CUSTOM1_LOG}{$lgfile}) and ($line =~ /^(\d+\.\d+\.\d+\.\d+) [^"]*"(POST|GET) [^"]*\.php[^"]*" (404|499|502|550) /)) {
    return ("Many failed scans for php files",$1,"mywpscanner1","60","80,443","3600");
}

# Block attackers using /xmlrpc.php for bruteforce (this may get 200 success responses)
# Although there are legitimate uses for this route, so I have put the threshold quite high
if (($globlogs{CUSTOM1_LOG}{$lgfile}) and ($line =~ /^(\d+\.\d+\.\d+\.\d+) [^"]*"(POST|GET) [^"]\/xmlrpc.php[^"]*" (200|404|499|502|550) /)) {
    return ("Many requests to xmlrpc.php",$1,"mywpxmlrpc1","60","80,443","3600");
}
0
joeytwiddle