与专注于软件漏洞的黑客攻击不同,暴力破解攻击是一种最简单的方法,通过不断尝试用户名和密码,直到成功进入网站。尽管被认为是“笨拙”的方法,但在人们使用如“123456”和“admin”这样的密码和用户名时,暴力破解攻击非常有效。

由于这种攻击会产生大量的HTTP请求(即访问您的网站的次数),导致服务器内存使用飙升,从而引发内存不足导致的性能问题。

这种攻击并不仅限于WordPress,任何网络应用程序都可能受到这种攻击,但由于WordPress的普及,它成为了一个常见的攻击目标。

限制多次登录尝试

在这种攻击形式中,恶意方试图猜测WordPress用户名和密码。攻击者只需要用户站点的URL即可发动攻击。利用现成的软件和僵尸网络,这些攻击甚至可以破解越来越复杂的密码。

防御这种攻击的最佳方法是为WordPress用户设置强密码,且建议主机在网络和服务器级别限制登录尝试次数。对每个站点的登录次数和每个IP的尝试次数进行限制,可以有效减轻僵尸网络暴力破解攻击的影响。虽然也可以通过插件级别进行设置,但这样会在攻击期间增加额外的资源消耗。

保护自己免受攻击

WordPress上的一个常见攻击点是不断尝试wp-login.php文件,直到成功进入或服务器崩溃。您可以采取一些措施来保护自己:

不要使用“admin”用户名

大多数攻击都会优先假设人们使用“admin”用户名,因为早期版本的WordPress默认使用“admin”作为用户名。如果你仍然使用这个用户名,建议创建一个新帐户,将所有文章和管理权限转移到该帐户,然后将“admin”更改为订阅者角色(或完全删除)。

您也可以使用插件(如Change Username)来更改你的用户名。

高强度的密码

设置密码的目的是使其他人难以猜测,并使暴力破解攻击难以成功。有许多自动密码生成器可以用于创建安全密码。

WordPress还具有密码强度计量器,会根据强度对您的密码设置进行分级,使用此功能可以确保密码的强度足够。

设置密码时应避免以下情况:

1.您的真实姓名、公司、网站名称等信息的组合

2.单词或拼音

3.短密码

4.纯数字或者纯字母的密码,最好设置数字和密码的组合

为了进一步提高密码的强度,可以启用两步验证以进一步保护你的网站。

插件

有许多插件可以限制在你网站上的登录尝试次数,也有许多插件可以用来完全阻止用户访问wp-admin,如有必要,也可以安装类似的插件来防范。

保护你的服务器安全

如果你决定封锁wp-login.php或wp-admin,可能会导致访问这些页面时遇到404或401错误。为了避免这种情况发生,可在.htaccess文件中添加以下内容:

apache



ErrorDocument 401 default



您可以将401指向401.html,但注意不要将其指向WordPress。

对于Nginx,可以使用error_page指令,但必须提供一个绝对URL。

nginx



error_page 401 https://hostease.com/forbidden.html;




在IIS Web服务器上,可以在web.config中使用httpErrors元素,设置errorMode="custom":

xml



<httpErrors errorMode="Custom">
<error statusCode="401"
subStatusCode="2"
prefixLanguageFilePath=""
path="401.htm"
responseMode="File" />
</httpErrors>



密码保护wp-login.php

使用密码保护你的wp-login.php和wp-admin目录可以为你的服务器增加一层额外保护。但是由于密码保护wp-admin会影响在前端使用ajax的插件,因此一般只保护wp-login.php就足够了。

为此,您需要创建一个.htpasswd文件,您可以将这个文件放在你的公共Web文件夹之外(例如,不在/public_html/或/domain.com/,取决于你的主机),或者可以将其放在同一个文件夹中,但如果这样做,你需要在.htaccess文件中进行一些额外的安全设置。

上传了.htpasswd文件之后,您需要告诉.htaccess文件它的位置。假设你将.htpasswd放在用户的主目录中,且你的htpasswd用户名是mysecretuser,则在.htaccess中添加以下内容:

apache



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

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



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

AuthUserFile的位置取决于你的服务器,‘require user’则根据你选择的用户名进行更改。

如果使用Nginx,可以使用HttpAuthBasicModule保护你的wp-login.php文件。这个块应该放在你的服务器块内。

nginx



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



文件名路径相对于Nginx配置文件nginx.conf所在的目录。

文件格式应如下:

makefile



user:pass
user2:pass2
user3:pass3




在Windows Server IIS上没有简单的方法配置受密码保护的wp-login.php。如果你使用.htaccess处理器如Helicon Ape,可以使用上述的.htaccess示例。否则,你需要请你的主机提供商设置基本认证。

所有密码必须由crypt(3)函数编码。可以使用在线htpasswd生成器加密密码。

限制多次登录尝试

互联网上最常见的攻击之一是暴力破解登录攻击。在这种攻击形式中,恶意方试图猜测Word

限制通过IP访问wp-login.php

如果你是唯一需要登录到后台管理区域的人,并且你有固定的IP地址,可以通过.htaccess或web.config文件拒绝除你之外的所有人访问wp-login.php(以及wp-admin/文件夹)。

注意:你的ISP或电脑可能会频繁更改IP地址,这称为动态IP地址,如果你怀疑是这种情况,请了解如何更改电脑的设置,或联系ISP获取固定地址,以使用此方法。

您需要将示例中203.0.113.15替换为你的IP地址。

apache



# 阻止访问wp-login.php
<Files wp-login.php>
orderdeny,allow
allow from 203.0.113.15
deny from all
</Files>



你可以添加多个允许的IP地址,使用:

apache



# 阻止访问wp-login.php
<Files wp-login.php>
orderdeny,allow
allow from 203.0.113.15
allow from 203.0.113.16
allow from 203.0.113.17
deny from all
</Files>




如果您使用的是Apache 2.4或者Apache模块mod_authz_host,那么语法稍有不同:

apache



# 阻止访问wp-login.php
<Files wp-login.php>
Require ip 203.0.113.15
</Files>




如果要添加多个IP地址,可以使用:

apache



# 阻止访问wp-login.php
<Files wp-login.php>
Require ip 203.0.113.15 203.0.113.16 203.0.113.17
# 或者为整个网络:
# Require ip 203.0.113.0/255.255.255.0
</Files>




对于Nginx,可以在server块内添加一个location块,工作原理与上述Apache示例相同。

nginx



error_page 403 https://hostease.com/forbidden.html;
location /wp-login.php {
allow 203.0.113.15
# 或者为整个网络:
# allow 203.0.113.0/24;
deny all;
}



注意:允许/拒绝的顺序至关重要。在上述示例中交换顺序会导致拒绝所有地址的访问。

同样,在IIS Web服务器上,可以使用web.config文件限制有访问权限的IP地址。最好在额外的<location指令中添加。

xml



<location path="wp-admin">
<system.webServer>
<security>
<ipSecurity allowUnlisted="false"><!-- 该规则拒绝所有IP地址,除非下文中提到的地址 -->
<!-- 203.0.113.x是一个特殊的测试范围IP地址 -->
<!-- 请替换为你自己的地址 -->
<add ipAddress="203.0.113.15" allowed="true" />
<add ipAddress="203.0.113.16" allowed="true" />
</ipSecurity>
</security>
</system.webServer>
</location>



拒绝无引用请求的访问

你可以使用此方法防止任何没有提交登录表单的人访问它:

apache



# 阻止垃圾邮件攻击登录和评论
<IfModule mod_rewrite.c>
RewriteEngineOn
RewriteCond%{REQUEST_METHOD} POST
RewriteCond%{REQUEST_URI} .(wp-comments-post|wp-login)\.php*
RewriteCond%{HTTP_REFERER} !.*hostease.com.* [OR]
RewriteCond%{HTTP_USER_AGENT} ^$
RewriteRule (.*) https://%{REMOTE_ADDR}/$1 [R=301,L]
</ifModule>



Nginx – 拒绝无引用请求的访问:

nginx



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



Windows Server IIS – 拒绝无引用请求的访问:

xml



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



将hostease.com更改为你的域名。如果使用多站点映射域名,需要将hostease.com更改为(hostease.com|hostease.net|hostease.org)等。如果使用Jetpack评论,不要忘记添加jetpack.wordpress.com作为引用者:(hostease.com|jetpack.wordpress.com)

ModSecurity

如果你使用ModSecurity,可以遵循Frameloss的建议–阻止针对WordPress的暴力破解登录。这需要对你的服务器有根级访问权限,可能需要你的主机协助。

如果你使用的是ModSecurity 2.7.3,可以将规则添加到你的.htaccess文件中。

Fail2Ban

Fail2ban是一个在后台运行的Python守护进程。它检查由Apache(或SSH例如)生成的日志文件,并在某些事件发生时可以添加防火墙规则。它使用一个带有正则表达式的过滤器。如果该正则表达式在5分钟内出现例如5次,可以将该IP地址封锁60分钟(或任何其他设置的数字)。

安装和设置Fail2ban需要root权限。

阻止列表

大多数暴力破解攻击似乎来自俄罗斯、哈萨克斯坦和乌克兰的IP地址。你可以选择阻止这些国家的IP地址。有可供下载的阻止列表。通过一些shell脚本,你可以用iptables加载阻止规则。

需要意识到的是,你在阻止攻击者的同时也在阻止合法用户。确保你能支持并解释这一决定给你的客户。

除了每个国家的阻止列表,还有包含知名垃圾邮件发送者IP地址的列表。你也可以通过iptables使用这些列表来阻止它们。

设置阻止列表和iptables需要根级访问权限。

云/代理服务

像CloudFlare和Sucuri CloudProxy这样的服务也可以通过在IP到达你的服务器之前阻止这些IP来帮助减轻这些攻击。