WordPress非常重视安全性,但与任何其他系统一样,如果不采取一些基本的安全预防措施,可能会出现潜在的安全问题。本文将介绍一些常见形式的漏洞,以及您可以采取哪些措施来帮助确保您的 WordPress 安装安全。
本文不是解决您的安全问题的最终快速解决方案。如果您有特定的安全问题或疑虑,您应该与您相信对计算机安全和 WordPress 有足够知识的人讨论。
什么是安全? #
从根本上说,安全并不是完全安全的系统。这样的事情很可能是不切实际的,或者不可能找到和/或维护。然而,安全是降低风险,而不是消除风险。这是关于在合理范围内使用所有可用的适当控件,使您可以改善整体姿势,从而降低使自己成为目标并随后被黑客入侵的可能性。
网站主机
通常,在网站安全方面,一个好的起点是您的托管环境。今天,您可以选择多种选择,虽然房东提供了一定程度的安全性,但重要的是要了解他们的责任在哪里结束,而您的责任从哪里开始。这是一篇很好的文章,解释了网络主机之间的复杂动态和您网站的安全性。安全服务器保护服务器管理员控制下的资源的隐私、完整性和可用性。
受信任的虚拟主机的质量可能包括:
- 随时讨论您的安全问题以及他们提供的托管安全功能和流程。
- 提供所有服务器软件的最新稳定版本。
- 提供可靠的备份和恢复方法。
通过确定需要保护的软件和数据来确定您在服务器上需要哪种安全性。本指南的其余部分将为您提供帮助。
网站应用
查看网络主机并将安全责任转嫁给他们很容易,但网站所有者也有大量的安全性。Web 主机通常负责您的网站所在的基础架构,而不负责您选择安装的应用程序。
要了解这在哪里以及为什么重要,您必须了解网站是如何被黑客入侵的,它很少归因于基础设施,而最常见的是归因于应用程序本身(即您负责的环境)。
安全主题 #
在考虑系统各个方面的安全性时,请记住一些一般性想法:
限制访问
做出明智的选择,以减少恶意人员可用的可能入口点。
遏制
您的系统应进行配置,以最大程度地减少在受到损害时可能造成的损害。
准备和知识
定期保存备份并了解 WordPress 安装的状态。制定在发生灾难时备份和恢复安装的计划可以帮助您在出现问题时更快地恢复在线。
可信来源
不要从不受信任的来源获取插件/主题。仅限于 WordPress.org 存储库或知名公司。尝试从外部获取插件/主题可能会导致问题。
计算机上的漏洞 #
确保您使用的计算机没有间谍软件、恶意软件和病毒感染。如果您的计算机上有键盘记录器,那么 WordPress 或您的 Web 服务器上的任何安全性都不会产生丝毫影响。
始终保持您的操作系统及其上的软件,尤其是您的 Web 浏览器为最新版本,以保护您免受安全漏洞的侵害。如果您正在浏览不受信任的网站,我们还建议您在浏览器中使用无脚本(或禁用 javascript/flash/java)等工具。
WordPress 中的漏洞 #
与许多现代软件包一样,WordPress 会定期更新以解决可能出现的新安全问题。提高软件安全性始终是一个持续关注的问题,为此您应该始终了解最新版本的 WordPress。旧版本的 WordPress 不使用安全更新进行维护。
更新 WordPress #
主条目:更新 WordPress。
最新版本的 WordPress 始终可从 WordPress 主网站 https://wordpress.org 获得。其他网站不提供官方版本 —切勿从 https://wordpress.org 以外的任何网站下载或安装 WordPress。
从 3.7 版开始,WordPress 具有自动更新功能。使用此功能可以简化保持最新状态的过程。您还可以使用 WordPress 仪表板随时了解更新。阅读仪表板或 WordPress 开发人员博客中的条目,以确定您必须采取哪些步骤来更新和保持安全。
如果在 WordPress 中发现了一个漏洞并发布了一个新版本来解决这个问题,那么利用该漏洞所需的信息几乎可以肯定是在公共领域。这使得旧版本更容易受到攻击,并且是您应该始终保持 WordPress 最新的主要原因之一。
如果您是负责多个 WordPress 安装的管理员,请考虑使用Subversion来简化管理。
报告安全问题 #
如果您认为您在 WordPress 中发现了安全漏洞,您可以通过报告问题来提供帮助。有关如何报告安全问题的信息,请参阅安全常见问题解答。
如果你认为你发现了一个错误,请报告它。请参阅提交错误了解如何执行此操作。您可能已经发现了一个漏洞,或者一个可能导致漏洞的错误。
Web 服务器漏洞 #
运行 WordPress 的 Web 服务器及其上的软件可能存在漏洞。因此,请确保您正在运行安全、稳定的 Web 服务器版本及其上的软件,或者确保您使用的是可信任的主机来为您处理这些事情。
如果您使用的是共享服务器(托管除您自己之外的其他网站的服务器)并且同一服务器上的网站遭到入侵,即使您遵循本指南中的所有内容,您的网站也可能遭到入侵。请务必询问您的网络主机他们采取了哪些安全预防措施。
网络漏洞 #
两端的网络——WordPress 服务器端和客户端网络端——应该是可信的。这意味着更新家庭路由器上的防火墙规则,并注意您使用的网络。您通过未加密连接(无线或其他方式)发送密码的网吧不是受信任的网络。
您的虚拟主机应该确保他们的网络没有受到攻击者的破坏,您也应该这样做。网络漏洞可能允许拦截密码和其他敏感信息。
密码 #
良好的安全习惯可以避免许多潜在的漏洞。强密码是其中的一个重要方面。
使用您的密码的目的是让其他人难以猜到,并使暴力攻击难以成功。许多自动密码生成器可用于创建安全密码。
WordPress 还具有密码强度计,在 WordPress 中更改密码时会显示该计。在更改密码时使用它以确保其强度足够。
选择密码时要避免的事情:
- 您自己的真实姓名、用户名、公司名称或您的网站名称的任何排列。
- 字典中的一个词,任何语言。
- 一个简短的密码。
- 任何仅含数字或仅含字母的密码(最好混合使用)。
强密码不仅是为了保护您的博客内容,也是必要的。访问您的管理员帐户的黑客能够安装可能危及您的整个服务器的恶意脚本。
除了使用强密码外,最好启用两步验证作为额外的安全措施。
FTP #
连接到您的服务器时,如果您的网络主机提供 SFTP 加密,您应该使用它。如果您不确定您的虚拟主机是否提供 SFTP,请询问他们。
使用 SFTP 与 FTP 相同,除了您的密码和其他数据在您的计算机和您的网站之间传输时被加密。这意味着您的密码永远不会被明文发送,也不会被攻击者截获。
文件权限 #
WordPress 的一些简洁功能来自于允许 Web 服务器可写入各种文件。但是,允许对您的文件进行写访问是有潜在危险的,尤其是在共享主机环境中。
最好尽可能锁定您的文件权限,并在您需要允许写访问的情况下放松这些限制,或者创建限制较少的特定文件夹以执行诸如上传文件之类的操作。
这是一种可能的权限方案。
所有文件都应该归您的用户帐户所有,并且应该可以由您写入。任何需要 WordPress 写入权限的文件都应该可以由 Web 服务器写入,如果您的主机设置需要它,这可能意味着这些文件需要由 Web 服务器进程使用的用户帐户归组所有。
/
WordPress 根目录:所有文件都应该只能由您的用户帐户写入,除非.htaccess
您希望 WordPress 自动为您生成重写规则。
/wp-admin/
WordPress 管理区域:所有文件只能由您的用户帐户写入。
/wp-includes/
大部分 WordPress 应用程序逻辑:所有文件都应该只能由您的用户帐户写入。
/wp-content/
用户提供的内容:旨在由您的用户帐户和 Web 服务器进程写入。
你/wp-content/
会发现:
/wp-content/themes/
主题文件。如果您想使用内置的主题编辑器,所有文件都需要可由 Web 服务器进程写入。如果您不想使用内置主题编辑器,则所有文件只能由您的用户帐户写入。
/wp-content/plugins/
插件文件:所有文件只能由您的用户帐户写入。
可能存在的其他目录/wp-content/
应由需要它们的插件或主题记录。权限可能会有所不同。
更改文件权限 #
如果您对服务器具有 shell 访问权限,则可以使用以下命令递归更改文件权限:
对于目录:
查找 /path/to/your/wordpress/install/ -type d -exec chmod 755 {} \;
对于文件:
查找 /path/to/your/wordpress/install/ -type f -exec chmod 644 {} \;
关于自动更新 #
当您告诉 WordPress 执行自动更新时,所有文件操作都以拥有文件的用户身份执行,而不是以 Web 服务器的用户身份执行。所有文件都设置为 0644,所有目录都设置为 0755,并且只有用户可以写入,其他所有人(包括 Web 服务器)都可以读取。
数据库安全 #
如果您在同一台服务器上运行多个博客,明智的做法是考虑将它们保存在不同的数据库中,每个数据库由不同的用户管理。这最好在执行初始WordPress 安装时完成。这是一种遏制策略:如果入侵者成功破解了一个 WordPress 安装,这会使更改您的其他博客变得更加困难。
如果您自己管理 MySQL,请确保您了解 MySQL 配置并且禁用不需要的功能(例如接受远程 TCP 连接)。请参阅Secure MySQL Database Design以获得很好的介绍。
限制数据库用户权限 #
对于正常的 WordPress 操作,例如发布博客文章、上传媒体文件、发表评论、创建新的 WordPress 用户和安装 WordPress 插件,MySQL 数据库用户只需要对 MySQL 数据库的数据读取和数据写入权限;选择、插入、更新和删除。
因此,可以撤销任何其他数据库结构和管理权限,例如 DROP、ALTER 和 GRANT。通过撤销此类特权,您也在改进遏制政策。
注意:某些插件、主题和主要 WordPress 更新可能需要进行数据库结构更改,例如添加新表或更改架构。在这种情况下,在安装插件或更新软件之前,您需要暂时授予数据库用户所需的权限。
警告:在没有这些权限的情况下尝试更新可能会在发生数据库架构更改时导致问题。因此,它不是建议撤销这些权限。如果您出于安全原因确实需要这样做,那么请确保您首先有一个可靠的备份计划,并且您已经测试过的定期整个数据库备份是有效的并且可以轻松恢复。数据库升级失败通常可以通过将数据库恢复到旧版本,授予适当的权限,然后让 WordPress 再次尝试数据库更新来解决。恢复数据库会将其返回到旧版本,然后 WordPress 管理屏幕将检测旧版本并允许您在其上运行必要的 SQL 命令。大多数 WordPress 升级不会更改架构,但有些会更改。只有主要的升级点(例如 3.7 到 3.8)会改变架构。小升级(3.8 到 3.8.1)一般不会。尽管如此,保持定期备份。
保护 wp-admin #
添加服务器端密码保护(例如BasicAuth)以/wp-admin/
在博客的管理区域、登录屏幕和文件周围添加第二层保护。这迫使攻击者或机器人攻击第二层保护而不是您的实际管理文件。许多 WordPress 攻击是由恶意软件机器人自动执行的。
简单地保护wp-admin/
目录也可能会破坏一些 WordPress 功能,例如wp-admin/admin-ajax.php
. 有关如何正确使用密码保护目录的更多文档,请参阅参考资料部分。wp-admin/
针对 WordPress 博客的最常见攻击通常分为两类。
- 向您的服务器发送特制的 HTTP 请求,其中包含针对特定漏洞的特定利用负载。这些包括旧的/过时的插件和软件。
- 试图通过使用“蛮力”密码猜测来访问您的博客。
这种“第二层”密码保护的最终实现是需要一个 HTTPS SSL 加密连接来进行管理,以便所有通信和敏感数据都被加密。请参阅SSL 上的管理。
保护 wp-includes #
在脚本通常不打算由任何用户访问的情况下,可以添加第二层保护。一种方法是在 .htaccess 文件中使用 mod_rewrite 阻止这些脚本。注意:为确保以下代码不会被 WordPress 覆盖,请将其放在.htaccess 文件中的# BEGIN WordPress
and标记之外。# END WordPress
WordPress 可以覆盖这些标签之间的任何内容。
# 阻止仅包含文件。 <IfModule mod_rewrite.c> 重写引擎开启 RewriteBase / RewriteRule ^wp-admin/includes/ - [F,L] RewriteRule !^wp-includes/ - [S=3] RewriteRule ^wp-includes/[^/]+\.php$ - [F,L] RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L] RewriteRule ^wp-includes/theme-compat/ - [F,L] </IfModule> # 开始 WordPress
请注意,这在多站点上效果不佳,因为RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
会阻止 ms-files.php 文件生成图像。省略该行将允许代码工作,但提供的安全性较低。
保护 wp-config.php #
您可以将wp-config.php
文件移动到 WordPress 安装上方的目录。这意味着对于安装在您的网站空间根目录中的站点,您可以存储wp-config.php
在 web-root 文件夹之外。
注意:有些人断言移动 wp-config.php 的安全优势很小,如果不小心操作,实际上可能会引入严重的漏洞。其他人不同意。
请注意,wp-config.php
可以存储在 WordPress(wp-includes 所在的位置)安装之上的一个目录级别。此外,请确保只有您(和 Web 服务器)可以读取此文件(通常意味着 400 或 440 权限)。
如果您使用带有 .htaccess 的服务器,您可以将其放在该文件中(在最顶部),以拒绝任何人访问它:
<文件 wp-config.php> 命令允许,拒绝 否认一切 </文件>
禁用文件编辑 #
默认情况下,WordPress 仪表板允许管理员编辑 PHP 文件,例如插件和主题文件。如果能够登录,这通常是攻击者将使用的第一个工具,因为它允许执行代码。WordPress 有一个常量来禁用从仪表板进行编辑。将此行放在 wp-config.php 中相当于删除所有用户的 ‘edit_themes’、’edit_plugins’ 和 ‘edit_files’ 功能:
定义('DISALLOW_FILE_EDIT',真);
这不会阻止攻击者将恶意文件上传到您的站点,但可能会阻止某些攻击。
插件 #
首先,确保您的插件始终更新。此外,如果您没有使用特定插件,请将其从系统中删除。
防火墙 #
有许多插件和服务可以充当您网站的防火墙。
其中一些通过在 WordPress 处理之前修改您的 .htaccess文件并在 Apache 级别限制某些访问来工作。一个很好的例子是iThemes Security或All in One WP Security。一些防火墙插件在 WordPress 级别起作用,例如WordFence和Shield,并在 WordPress 加载时尝试过滤攻击,但在它被完全处理之前。
除了插件之外,您还可以在 Web 服务器上安装 WAF(Web 防火墙),以便在 WordPress 处理内容之前对其进行过滤。最流行的开源 WAF 是 ModSecurity。
还可以添加网站防火墙作为来自 Internet 的流量和您的托管服务器之间的中介。这些服务都充当反向代理,它们接受初始请求并将它们重新路由到您的服务器,从而去除所有恶意请求。他们通过修改您的 DNS 记录、通过 A 记录或完整的 DNS 交换来实现此目的,允许所有流量首先通过新网络。这会导致所有流量在到达您的站点之前被防火墙过滤。少数公司提供此类服务,如CloudFlare、Sucuri和Incapsula。
此外,这些第三方服务提供商默认充当内容分发网络 (CDN),引入性能优化和全球影响力。
需要写权限的插件 #
如果插件想要对您的 WordPress 文件和目录进行写访问,请阅读代码以确保其合法或与您信任的人核实。可以检查的地方是支持论坛和IRC 频道。
代码执行插件 #
正如我们所说,强化 WordPress 的部分目标是控制攻击成功时造成的损害。允许从数据库中的条目执行任意 PHP 或其他代码的插件有效地放大了成功攻击时造成损害的可能性。
避免使用此类插件的一种方法是使用调用该函数的自定义页面模板。仅当您禁止在 WordPress 中编辑文件时,它提供的部分安全性才有效。
通过默默无闻的安全 #
通过默默无闻的安全通常是一个不健全的主要策略。但是,在 WordPress 中,隐藏信息可能有助于提高安全性:
- 重命名管理帐户:创建管理帐户时,请避免使用容易猜到的术语,例如用户名
admin
或webmaster
用户名,因为它们通常首先受到攻击。在现有的 WordPress 安装中,您可以使用类似的命令重命名 MySQL 命令行客户端中的现有帐户UPDATE wp_users SET user_login = 'newuser' WHERE user_login = 'admin';
,或者使用类似phpMyAdmin的 MySQL 前端。 - 更改 table_prefix:许多已发布的特定于 WordPress 的 SQL 注入攻击都假设 table_prefix 是
wp_
默认值。改变它至少可以阻止一些 SQL 注入攻击。
数据备份 #
定期备份您的数据,包括您的 MySQL 数据库。请参阅主要文章:备份您的数据库。
数据完整性对于可信备份至关重要。加密备份、为每个备份文件保留 MD5 哈希的独立记录和/或将备份放在只读媒体上可以增加您对数据未被篡改的信心。
完善的备份策略可能包括将整个 WordPress 安装(包括 WordPress 核心文件和数据库)的一组定期快照保存在受信任的位置。想象一个制作每周快照的网站。这样的策略意味着,如果一个站点在 5 月 1 日遭到入侵,但直到 5 月 12 日才检测到入侵,则站点所有者将拥有可帮助重建站点的入侵前备份,甚至可能是有助于重建站点的入侵后备份。确定网站是如何被入侵的。
日志记录 #
在了解您的网站发生的事情时,日志是您最好的朋友,尤其是在您尝试进行取证时。与流行的看法相反,日志可让您查看所做的事情以及由谁以及何时完成。不幸的是,日志不会告诉你是谁、用户名、登录的,但它可以让你识别 IP 和时间,更重要的是,攻击者可能采取的行动。您将能够通过日志查看任何这些攻击——跨站点脚本 (XSS)、远程文件包含 (RFI)、本地文件包含 (LFI) 和目录遍历尝试。您还可以看到蛮力尝试。有各种示例和教程可帮助指导您完成解析和分析原始日志的过程。
如果您对日志更加熟悉,您将能够看到诸如何时使用主题和插件编辑器、何时有人更新您的小部件以及何时添加帖子和页面。在您的 Web 服务器上进行取证工作时的所有关键要素。还有一些 WordPress 安全插件也可以帮助您,例如Sucuri 审计工具或审计跟踪插件。
从安全角度来看,您需要在 Web 服务器上使用两个关键的开源解决方案,这是一种分层的安全方法。
OSSEC 可以在任何 NIX 发行版上运行,也可以在 Windows 上运行。如果配置正确,它非常强大。这个想法是关联和聚合所有日志。您必须确保将其配置为捕获所有 access_logs 和 error_logs,如果您在服务器帐户上有多个网站。您还需要确保过滤掉噪音。默认情况下,您会看到很多噪音,您需要将其配置为真正有效。
监控 #
有时预防是不够的,您仍然可能被黑客入侵。这就是入侵检测/监控非常重要的原因。它可以让您更快地做出反应,找出发生的事情并恢复您的网站。
监控您的日志 #
如果您在专用或虚拟专用服务器上,您可以在其中享受 root 访问权限,那么您可以轻松配置内容,以便查看正在发生的事情。OSSEC很容易做到这一点,这里有一个小文章,可能会帮助您了解OSSEC 的网站安全 – 第 I 部分。
监控文件的更改 #
当攻击发生时,它总是会留下痕迹。在日志或文件系统(新文件、修改文件等)上。例如,如果您使用OSSEC,它将监控您的文件并在它们发生更改时提醒您。
目标 #
文件系统跟踪的目标包括:
- 监控更改和添加的文件
- 记录更改和添加
- 能够还原细粒度的更改
- 自动警报
一般方法 #
管理员可以通过通用技术监控文件系统,例如:
- 系统实用程序
- 修订控制
- 操作系统/内核级别监控
具体工具 #
文件系统监控的选项包括:
- diff – 为您的站点构建干净的测试副本并与生产进行比较
- Git——源代码管理
- inotify和incron – 可以在文件系统事件上运行命令的操作系统内核级文件监控服务
- Watcher – Python inotify 库
- OSSEC – 基于主机的开源入侵检测系统,可执行日志分析、文件完整性检查、策略监控、rootkit 检测、实时警报和主动响应。
注意事项 #
在配置基于文件的监控策略时,有很多注意事项,包括以下内容。
以 ROOT 身份运行监控脚本/服务 #
这将使攻击者难以禁用或修改您的文件系统监控解决方案。
在计划的维护/升级期间禁用监控 #
当您在站点上执行定期维护时,这将防止不必要的通知。
仅监控可执行文件类型 #
仅监视可执行文件类型(例如 .php 文件等)可能是相当安全的。过滤掉不可执行的文件可能会减少不必要的日志条目和警报。
使用严格的文件系统权限 #
阅读有关保护文件权限和所有权的信息。通常,尽可能避免允许执行和写入权限。
从外部监控您的网络服务器 #
如果攻击者试图破坏您的网站或添加恶意软件,您还可以使用基于 Web 的完整性监控解决方案来检测这些更改。如今,它以多种形式出现,使用您最喜欢的搜索引擎并查找 Web Malware Detection and Remediation,您可能会得到一长串服务提供商。
资源 #
- 如何提高 WordPress 安全性(信息图)
- 安全插件
- 穿过 BS 的 WordPress 安全性
- 电子书:锁定 WordPress
- wpsecure.net 有一些关于如何锁定 WordPress 的指南。
- 加强 WordPress 的初学者指南
- 布拉德·威廉姆斯:把它锁起来(视频)
- 保护 WordPress 网站的 21 种方法
- 有关如何使用 .htaccess 文件对目录进行密码保护的官方文档
- 关于如何使用密码保护 WordPress 管理区域并修复 404 错误的简单教程