WordPress 的安全性被非常重视,但就像任何其他系统一样,如果不采取一些基本的安全预防措施,可能会出现潜在的安全问题。本文将介绍一些常见的漏洞形式,以及您可以采取的措施来帮助保持 WordPress 安装的安全。

本文并不是解决您安全问题的终极快速修复方案。如果您有具体的安全担忧或疑虑,应与您信任的、具备足够的计算机安全和 WordPress 知识的人员进行讨论。

什么是安全性?

从根本上说,安全性并非关于完美的安全系统。这样的东西可能不切实际,或者难以找到和/或维护。然而,安全性实际上是风险降低,而不是风险消除。它涉及在合理范围内采用所有可用的适当控制措施,以改善您的整体态势,降低成为目标随后被黑客攻击的可能性。

网站托管商

在网站安全方面,一个好的起点通常是您的托管环境。如今,您有多种选择可用,虽然托管商会提供一定级别的安全保障,但重要的是要了解他们的责任在哪里结束,而您的责任从哪里开始。这里有一篇很好的文章解释了网站托管商与您的网站安全之间的复杂动态。安全的服务器保护服务器管理员控制的资源的隐私、完整性和可用性。

值得信赖的网站托管商的品质可能包括:

  • readily discusses your security concerns and which security features and processes they offer with their hosting.(随时讨论您的安全担忧以及他们提供的托管安全功能和流程。)
  • Provides the most recent stable versions of all server software.(提供所有服务器软件的最新稳定版本。)
  • Provides reliable methods for backup and recovery.(提供可靠的备份和恢复方法。)

通过确定需要保护的软件和数据的类型,来决定您需要在服务器上实现哪种安全级别。本指南的其余部分将帮助您完成此任务。

网站应用程序

很容易只看托管商并将安全责任推给他们,但网站上也有大量的安全责任在于网站所有者。托管商通常负责您的网站所在的底层基础设施,他们不负责您选择安装的应用程序。

要理解这为何重要以及在哪里重要,您必须了解网站是如何被黑客攻击的。很少归因于基础设施,大多数情况下归因于应用程序本身(即您负责的环境)。

安全主题

在考虑系统每个方面的安全性时,请记住一些一般性的想法:

限制访问

做出明智的选择,减少恶意人员可能进入的入口点。

隔离(Containment)

您的系统应配置为在遭到入侵时将损害降到最低。

准备和知识

定期备份并了解 WordPress 安装的状态。制定在灾难情况下备份和恢复安装的计划,可以在出现问题时帮助您更快地重新上线。

可信来源

不要从不信任的来源获取插件/主题。限制自己使用 WordPress.org 存储库或知名公司的资源。尝试从外部获取插件/主题可能会导致问题。

您计算机上的漏洞

确保您使用的计算机没有间谍软件、恶意软件和病毒感染。如果在您的计算机上有键盘记录器,那么 WordPress 或 Web 服务器上的任何安全措施都不会产生丝毫作用。

始终将操作系统及其上的软件(尤其是 Web 浏览器)更新到最新版本,以保护您免受安全漏洞的侵害。如果您浏览不可信的网站,我们还建议使用 no-script 等工具(或在浏览器中禁用 JavaScript/Flash/Java)。

WordPress 中的漏洞

像许多现代软件包一样,WordPress 会定期更新以解决可能出现的新安全问题。提高软件安全性始终是一个持续的关注点,因此您应该始终保持 WordPress 的最新版本。旧版本的 WordPress 不再提供安全更新。

更新 WordPress

主要文章:更新 WordPress。

WordPress 的最新版本始终可以从主 WordPress 网站 https://wordpress.org 获取。官方发布版本不可从其他网站获取——永远不要从除 https://wordpress.org 以外的任何网站下载或安装 WordPress。

自版本 3.7 以来,WordPress 已具备自动更新功能。利用此功能可以简化保持最新版本的流程。您还可以使用 WordPress 仪表板(Dashboard)了解更新信息。阅读仪表板中的条目或 WordPress 开发者博客,以确定您必须采取的步骤以进行更新并保持安全。

如果在 WordPress 中发现漏洞并发布了新版本来解决该问题,那么利用该漏洞所需的信息几乎肯定已公开。这使得旧版本更容易受到攻击,这也是您应该始终保持 WordPress 最新的主要原因之一。

如果您负责管理多个 WordPress 安装的管理员,可以考虑使用Subversion来简化管理工作。

报告安全问题

如果您认为发现了 WordPress 中的安全漏洞,可以通过报告该问题来帮助改进。有关如何报告安全问题的信息,请参阅安全常见问题解答。

如果您认为发现了一个错误(bug),请进行报告。请参阅提交错误以了解如何操作。您可能已经发现了一个漏洞,或者一个可能导致漏洞的错误。

Web 服务器漏洞

运行 WordPress 的 Web 服务器及其上的软件可能存在漏洞。因此,请确保您运行的是安全、稳定的 Web 服务器版本及其上的软件,或者确保您使用的是托管商为您处理这些问题的可信托管服务。

如果您处于共享服务器环境(托管其他网站而不仅仅是您的网站),并且同一服务器上的某个网站遭到入侵,即使您遵循本指南中的所有建议,您的网站也可能潜在地受到牵连。请务必询问您的Web 托管商他们采取了哪些安全预防措施。

网络漏洞

两端的网络——WordPress 服务器端和客户端网络端——都应该是可信的。这意味着更新您家庭路由器上的防火墙规则,并小心您工作的网络。在发送密码的互联网咖啡馆(无论是有线还是无线网络)等未加密连接的网络上不是可信网络。

您的 Web 托管商应确保其网络未被攻击者入侵,您也应这样做。网络漏洞可能导致密码和其他敏感信息被拦截。

密码

许多潜在的安全漏洞可以通过良好的安全习惯来避免。强密码是其中的重要方面。

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

WordPress 还具备密码强度计功能,在 WordPress 中更改密码时会显示。更改密码时使用此功能以确保其强度足够。

选择密码时应避免的事项:

  • 您真实姓名、用户名、公司名称或网站名称的任何变体。
  • 任何语言中的字典单词。
  • 短密码。
  • 仅数字或仅字母的密码(混合使用两者最佳)。

强密码不仅用于保护您的博客内容。黑客如果获取了您的管理员账户访问权,就可以安装恶意脚本,从而可能危及整个服务器。

除了使用强密码外,启用两步验证作为额外的安全措施也是一个好主意。

FTP

连接到您的服务器时,如果您的 Web 托管商提供 SFTP 加密,则应使用 SFTP 加密。如果您不确定您的 Web 托管商是否提供 SFTP,只需询问他们。

使用 SFTP 与 FTP 相同,只是您的密码和其他数据在您的计算机和网站之间传输时是加密的。这意味着您的密码永远不会以明文发送,因此无法被攻击者拦截。

文件权限

WordPress 的一些巧妙功能来自于允许 Web 服务器写入各种文件。然而,允许对您的文件进行写入访问可能存在潜在危险,特别是在共享托管环境中。

最好尽可能锁定您的文件权限,并在需要允许写入访问或创建具有较少限制以用于上传文件等特定文件夹的场合放松这些限制。

这里是一种可能的权限方案。

所有文件应归您的用户账户所有,并且应由您进行写入。任何需要从 WordPress 获得写入访问的文件,如果您的托管设置要求的话,应由 Web 服务器写入,这可能意味着这些文件需要由 Web 服务器进程使用的用户账户所属组拥有。

/

根 WordPress 目录:所有文件应仅可由您的用户账户写入,除非您希望 WordPress 自动为您生成重写规则,则 .htaccess 除外。

/wp-admin/

WordPress 管理区域:所有文件应仅可由您的用户账户写入。

/wp-includes/

WordPress 应用程序逻辑的主体部分:所有文件应仅可由您的用户账户写入。

/wp-content/

用户提供的内容:旨在由您的用户账户和 Web 服务器进程写入。

在 /wp-content/ 中您将找到:

/wp-content/themes/

主题文件。如果您想使用内置的主题编辑器,所有文件都需要由 Web 服务器进程写入。如果您不想使用内置的主题编辑器,所有文件可以仅由您的用户账户写入。

/wp-content/plugins/

插件文件:所有文件应仅可由您的用户账户写入。

与 /wp-content/ 一起存在的其他目录应由需要它们的任何插件或主题进行文档说明。权限可能会有所不同。

更改文件权限

如果您拥有服务器的 Shell 访问权限,可以使用以下命令递归地更改文件权限:

对于目录:

find /path/to/your/wordpress/install/ -type d -exec chmod 755 {} \;

对于文件:

find /path/to/your/wordpress/install/ -type f -exec chmod 644 {} \;

关于自动更新

当您指示 WordPress 执行自动更新时,所有文件操作均以拥有文件的用户身份执行,而不是 Web 服务器的用户。所有文件设置为 0644,所有目录设置为 0755,且仅可由用户写入,其他人(包括 Web 服务器)可读。

数据库安全

如果您在同一台服务器上运行多个博客,明智的做法是考虑将它们分别保存在由不同用户管理的独立数据库中。这在执行初始 WordPress 安装 时最好实现。这是一种遏制策略:如果入侵者成功破解了一个 WordPress 安装,这将使更改您的其他博客变得更加困难。

如果您自行管理 MySQL,请确保您了解您的 MySQL 配置,并禁用不必要的功能(例如接受远程 TCP 连接)。有关更多信息,请参阅 MySQL 安全。

限制数据库用户权限

对于正常的 WordPress 操作,例如发布博客文章、上传媒体文件、发表评论、创建新的 WordPress 用户和安装 WordPress 插件,MySQL 数据库用户仅需对 MySQL 数据库具有数据读取和数据写入权限;SELECT、INSERT、UPDATE 和 DELETE。

因此,可以撤销任何其他数据库结构和管理权限,例如 DROP、ALTER 和 GRANT。通过撤销这些权限,您也在改进遏制策略。

注意:某些插件、主题和主要的 WordPress 更新可能需要对数据库结构进行更改,例如添加新表或更改架构。在这种情况下,在安装插件或更新软件之前,您需要暂时允许数据库用户拥有所需的权限。

警告:尝试在没有这些权限的情况下进行更新可能会导致数据库架构更改时出现问题。因此,不建议撤销这些权限。如果您出于安全原因确实需要这样做,请确保首先制定一个可靠的备份计划,包括定期对整个数据库进行备份,并且您已测试过这些备份有效且可以轻松恢复。失败的数据库升级通常可以通过将数据库恢复到旧版本、授予适当的权限,然后让 WordPress 再次尝试数据库更新来解决。恢复数据库会将其恢复到该旧版本,WordPress 管理屏幕将检测到旧版本并允许您在上面运行必要的 SQL 命令。大多数 WordPress 升级不会更改架构,但有些会。只有主要点升级(例如从 3.7 到 3.8)才会更改架构。次要升级(从 3.8 到 3.8.1)通常不会。尽管如此,请定期备份。

保护 wp-admin

为 /wp-admin/ 添加服务器端密码保护(例如 BasicAuth)为您的博客管理区域、登录屏幕和文件增加了第二层保护。这迫使攻击者或机器人攻击这一第二层保护,而不是您的实际管理文件。许多 WordPress 攻击是由恶意软件机器人自主执行的。

仅仅保护 wp-admin/ 目录也可能破坏某些 WordPress 功能,例如 wp-admin/admin-ajax.php 处的 AJAX 处理器。有关如何正确密码保护您的 wp-admin/ 目录的更多文档,请参阅 资源 部分。

针对 WordPress 博客的最常见攻击通常分为两类。

  1. 向您的服务器发送特制的 HTTP 请求,其中包含特定漏洞的特定利用负载。这些包括旧版/过时的插件和软件。
  2. 尝试通过使用“暴力”密码猜测来获取对博客的访问权限。

这种“第二层”密码保护的最终实现是要求使用 HTTPS SSL 加密连接进行管理,以便所有通信和敏感数据均得到加密。请参阅 通过 SSL 进行管理。

保护 wp-includes

可以在脚本通常不打算由任何用户访问的地方添加第二层保护。一种方法是使用 .htaccess 文件中的 mod_rewrite 阻止这些脚本。注意:为了确保下面的代码不会被 WordPress 覆盖,请将其放置在 .htaccess 文件中的 # BEGIN WordPress 和 # END WordPress 标签之外。WordPress 可以覆盖这些标签之间的任何内容。

# Block the include-only files.
<IfModule mod_rewrite.c>
RewriteEngine On
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>
# BEGIN WordPress

请注意,这在 Multisite 上效果不佳,因为 RewriteRule ^wp-includes/[^/]+\.php$ - [F,L] 会阻止 ms-files.php 文件生成图像。省略该行将允许代码工作,但提供的安全性较低。

保护 wp-config.php

您可以将 wp-config.php 文件移动到 WordPress 安装目录之上。这意味着对于安装在您的 Web 空间根目录的网站,您可以将 wp-config.php 存储在 Web 根文件夹之外。

注意:有些人声称 将 wp-config.php 移出 Web 根目录的安全益处微乎其微,如果不小心操作,实际上可能会引入严重漏洞。其他人不同意。

请注意,wp-config.php 可以存储在 WordPress(其中包含 wp-includes)安装目录之上的一级。此外,请确保只有您(和 Web 服务器)可以读取此文件(通常意味着 400 或 440 权限)。

如果您使用带有 .htaccess 的服务器,您可以将其放在该文件的顶部以拒绝任何人访问:

<Files "wp-config.php">
Require all denied
</Files>

禁用文件编辑

WordPress 仪表板默认允许管理员编辑 PHP 文件,例如插件和主题文件。如果攻击者能够登录,这通常是他们首先使用的工具,因为它允许代码执行。WordPress 有一个常量可以禁用从仪表板进行编辑。将此行放在 wp-config.php 中相当于移除所有用户的 'edit_themes'、'edit_plugins' 和 'edit_files' 能力:

define( 'DISALLOW_FILE_EDIT', true );

这并不能阻止攻击者向您的网站上传恶意文件,但可能会阻止某些攻击。

插件

首先,确保您的插件始终处于更新状态。此外,如果您不使用某个特定插件,请将其从系统中删除。

防火墙

有许多插件和服务可以作为您网站的防火墙。其中一些通过修改您的 .htaccess
文件并在 Apache 处理之前限制某些访问来发挥作用。一个很好的例子是 iThemes Security 或 All in One WP Security。一些防火墙插件在 WordPress 层面运行,例如 WordFence 和 Shield,它们试图在 WordPress 加载过程中过滤攻击,但在完全处理之前。

除了插件外,您还可以在 Web 服务器上安装 WAF(Web 防火墙),以在内容被 WordPress 处理之前进行过滤。最流行的开源 WAF 是 ModSecurity。

网站防火墙也可以作为互联网流量和您的托管服务器之间的中间件添加。这些服务都充当反向代理,它们接受初始请求并将其重定向到您的服务器,剥离所有恶意请求。它们通过修改您的 DNS 记录来实现这一点,通过 A 记录或完整的 DNS 交换,允许所有流量首先通过新网络。这会导致所有流量在到达您的网站之前由防火墙过滤。有几家公司提供此类服务,例如 CloudFlare、Sucuri 和 Incapsula。

此外,这些第三方服务提供商默认充当内容分发网络 (CDN),引入性能优化和全球覆盖范围。

需要写入访问权限的插件

如果插件想要对您的 WordPress 文件和目录进行写入访问,请阅读代码以确保其合法或与您信任的人核实。可以检查的地方包括 支持论坛 和 IRC 频道。

代码执行插件

正如我们所说,加固 WordPress 的目标之一是在发生成功攻击时限制造成的损害。允许从数据库条目中任意执行 PHP 或其他代码的插件实际上放大了成功攻击时造成损害的可能性。

避免使用此类插件的一种方法是使用 自定义页面模板 来调用该函数。这种安全性的部分仅在您 禁止在 WordPress 内编辑文件 时才生效。

通过隐蔽性实现安全

通过隐蔽性实现安全 通常是一种不可靠的主要策略。然而,在 WordPress 的某些领域,隐藏信息 可能 有助于提高安全性:

  1. 重命名管理账户: 创建管理账户时,避免使用如 admin 或 webmaster 等容易被猜测的术语作为用户名,因为它们通常首先受到攻击。在现有的 WordPress 安装中,您可以使用类似以下的命令在 MySQL 命令行客户端中重命名现有账户:
UPDATE wp_users SET user_login = 'newuser' WHERE user_login = 'admin';

或者使用像 phpMyAdmin 这样的 MySQL 前端。
2. 更改表前缀: 许多已发布的 WordPress 专用 SQL 注入攻击都假设表前缀是 wp_(默认值)。更改此设置可以阻止至少一些 SQL 注入攻击。

数据备份

定期备份您的数据,包括 MySQL 数据库。参见主文章:备份您的数据库。

数据完整性对于可信的备份至关重要。加密备份、为每个备份文件保留独立的 MD5 哈希记录和/或将备份放置在只读媒体上可以增加您对数据未被篡改的信心。

一个合理的备份策略可能包括在受信任的位置保存整个 WordPress 安装(包括 WordPress 核心文件和数据库)的一组定期快照。想象一个每周制作快照的网站。这种策略意味着,如果网站在 5 月 1 日被入侵但直到 5 月 12 日才检测到入侵,网站所有者将拥有可在重建网站时使用的预入侵备份,甚至可能有后入侵备份,这将有助于确定网站是如何被入侵的。

日志记录

当您试图了解您网站的运行情况时,日志是您的最佳朋友,尤其是如果您试图进行取证分析。与普遍的看法相反,日志允许您看到做了什么、由谁以及何时做的。不幸的是,日志不会告诉您用户名是否已登录,但它将允许您识别 IP 和时间,更重要的是,攻击者可能采取的行动。您可以通过日志看到任何这些攻击——跨站脚本 (XSS)、远程文件包含 (RFI)、本地文件包含 (LFI) 和目录遍历尝试。您还可以看到暴力破解尝试。有各种 示例和教程 可帮助您指导解析和分析原始日志的过程。

如果您对日志更熟悉了,您将能够看到诸如主题和插件编辑器何时被使用、某人何时更新您的小部件以及何时添加帖子和页面等事情。这些都是对 Web 服务器进行取证工作的关键要素。还有一些 WordPress 安全插件也可以协助您完成此任务,例如 Sucuri 审计工具 或 Audit Trail 插件。

从安全角度来看,您希望在 Web 服务器上拥有两个关键的开源解决方案,这是一种分层的安全方法。

OSSEC 可以在任何 NIX 发行版上运行,也可以在 Windows 上运行。当配置正确时,它非常强大。其思想是关联和聚合所有日志。您必须确保配置它以捕获所有 access_logs 和 error_logs,如果您的服务器上有多个网站,请考虑这一点。您还将希望过滤掉噪音。默认情况下,您将看到很多噪音,并希望将其配置为真正有效。

监控

有时预防是不够的,您可能仍然会被黑客入侵。这就是为什么入侵检测/监控非常重要。它将允许您更快地做出反应,了解发生了什么并恢复您的网站。

监控您的日志

如果您在专用或虚拟专用服务器上,其中您拥有 root 访问权限的奢侈条件,您可以轻松配置事物以查看正在发生的事情。OSSEC 很容易促进这一点,这里有一篇简短的文章可能会帮助您 OSSEC for Website Security – Part I。

监控您的文件更改

当攻击发生时,它总会留下痕迹。要么在日志中,要么在文件系统上(新文件、修改的文件等)。如果您使用 OSSEC 之类的工具,它将监控您的文件并在它们更改时向您发出警报。

目标

文件系统跟踪的目标包括:

  • 监控已更改和添加的文件
  • 记录更改和添加
  • 能够还原细粒度更改
  • 自动警报
一般方法

管理员可以通过通用技术监控文件系统,例如:

  • 系统实用程序
  • 版本控制
  • OS/内核级监控
特定工具

文件系统监控的选项包括:

  • diff – 构建您网站的干净测试副本并与生产环境进行比较
  • Git – 源代码管理
  • inotify – OS 内核级文件系统监控服务,可在文件系统事件上运行命令
  • Watcher – Python inotify 库
  • OSSEC – 开源主机入侵检测系统,执行日志分析、文件完整性检查、策略监控、rootkit 检测、实时警报和主动响应。
考虑因素

在配置基于文件的监控策略时,有许多需要考虑的因素,包括以下内容。

以 root 身份运行监控脚本/服务

这将使攻击者难以禁用或修改您的文件系统监控解决方案。

在计划维护/升级期间禁用监控

这将在您对网站进行常规维护时防止不必要的通知。

仅监控可执行文件类型

仅监控可执行文件类型(如 .php 文件等)可能是相对安全的。过滤掉非可执行文件可以减少不必要的日志条目和警报。

使用严格的文件系统权限

阅读关于保护文件权限和所有权的说明。一般来说,应尽可能避免授予 执行 和 写入 权限。

从外部监控您的 Web 服务器

如果攻击者试图篡改您的网站或添加恶意软件,您也可以使用基于 Web 的完整性监控解决方案来检测这些更改。如今这类工具形式繁多,请使用您喜欢的搜索引擎查找“Web 恶意软件检测与修复”,您很可能会得到一长串服务提供商列表。

官方 WordPress 资源

参见