与专注于软件漏洞的黑客攻击不同,暴力破解攻击是一种最简单的方法,通过不断尝试用户名和密码,直到成功进入网站。尽管被认为是“笨拙”的方法,但在人们使用如“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"> |
密码保护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 |
# 保护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 { |
文件名路径相对于Nginx配置文件nginx.conf所在的目录。
文件格式应如下:
makefile
user:pass |
在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 |
你可以添加多个允许的IP地址,使用:
apache
# 阻止访问wp-login.php |
如果您使用的是Apache 2.4或者Apache模块mod_authz_host,那么语法稍有不同:
apache
# 阻止访问wp-login.php |
如果要添加多个IP地址,可以使用:
apache
# 阻止访问wp-login.php |
对于Nginx,可以在server块内添加一个location块,工作原理与上述Apache示例相同。
nginx
error_page 403 https://hostease.com/forbidden.html; |
注意:允许/拒绝的顺序至关重要。在上述示例中交换顺序会导致拒绝所有地址的访问。
同样,在IIS Web服务器上,可以使用web.config文件限制有访问权限的IP地址。最好在额外的<location指令中添加。
xml
<location path="wp-admin"> |
拒绝无引用请求的访问
你可以使用此方法防止任何没有提交登录表单的人访问它:
apache
# 阻止垃圾邮件攻击登录和评论 |
Nginx – 拒绝无引用请求的访问:
nginx
location~* (wp-comments-posts|wp-login)\.php$ { |
Windows Server IIS – 拒绝无引用请求的访问:
xml
<rule name="block_comments_without_referer" patternSyntax="ECMAScript" stopProcessing="true"> |
将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来帮助减轻这些攻击。