WordPress 中的安全性受到非常重视,但与任何其他系统一样,如果不采取一些基本的安全预防措施,可能会出现潜在的安全问题。本文将介绍一些常见形式的漏洞,以及您可以采取哪些措施来帮助确保 WordPress 安装的安全。
本文并不是解决您安全问题的最终快速解决方案。如果您有特定的安全问题或疑问,您应该与您信任的对计算机安全和 WordPress 有足够了解的人讨论。
什么是安全性?
从根本上说,安全性并不是关于完全安全的系统。这样的东西很可能是不切实际的,或者不可能找到和/或维护。然而,安全是降低风险,而不是消除风险。这是关于在合理范围内使用所有可用的适当控制措施,让您改善整体姿势,减少成为目标,随后被黑客入侵的几率。
网站主机
通常,在网站安全方面,一个好的起点是您的托管环境。今天,您有多种选择,虽然房东在一定程度上提供了安全保障,但重要的是要了解他们的责任在哪里结束,您的责任从哪里开始。这是一篇很好的文章,解释了网络主机和您网站安全之间的复杂动态。安全服务器可保护服务器管理员控制下的资源的隐私、完整性和可用性。
值得信赖的网络主机的品质可能包括:
- 轻松讨论您的安全问题以及他们为托管提供哪些安全功能和流程。
- 提供所有 Server 软件的最新稳定版本。
- 提供可靠的备份和恢复方法。
通过确定需要保护的软件和数据,确定服务器上需要的安全保护。本指南的其余部分将帮助您解决这个问题。
网站应用
查看网络主机并将安全责任转嫁给他们很容易,但网站所有者也面临着巨大的安全性。Web 主机通常负责您网站所在的基础设施,他们不负责您选择安装的应用程序。
要了解这在何处以及为什么很重要,您必须了解网站是如何被黑客入侵的,它很少归因于基础设施,而大多数情况下归因于应用程序本身(即您负责的环境)。
安全主题
在考虑系统各个方面的安全性时,请记住一些一般概念:
限制访问
做出明智的选择,减少恶意人员可用的可能入口点。
遏制
您的系统应配置为在受到威胁时可能造成的损害最小化。
准备和知识
定期保留备份并了解 WordPress 安装的状态。制定计划在发生灾难时备份和恢复您的安装可以帮助您在出现问题时更快地恢复在线。
可信来源
不要从不受信任的来源获取插件/主题。将自己限制在 WordPress.org 存储库或知名公司。尝试从外部获取插件/主题可能会导致问题。
计算机上的漏洞
确保您使用的计算机没有间谍软件、恶意软件和病毒感染。如果您的计算机上有键盘记录器,WordPress 或 Web 服务器上的安全保护再多也不会产生丝毫影响。
始终使您的操作系统及其上的软件(尤其是 Web 浏览器)保持最新状态,以保护您免受安全漏洞的影响。如果您正在浏览不受信任的网站,我们还建议您在浏览器中使用 no-script(或禁用 javascript/flash/java)等工具。
WordPress 中的漏洞
与许多现代软件包一样,WordPress 会定期更新以解决可能出现的新安全问题。提高软件安全性始终是一个持续的问题,为此,您应该始终保持最新版本的 WordPress。旧版本的 WordPress 没有使用安全更新进行维护。
更新 WordPress
最新版本的 WordPress 始终可从 https://wordpress.org 的 WordPress 主网站获得。官方版本无法从其他网站获得 — 切勿从 https://wordpress.org 以外的任何网站下载或安装 WordPress。
从 3.7 版本开始,WordPress 具有自动更新功能。使用此功能可简化保持最新状态的过程。您还可以使用 WordPress 仪表板随时了解更新。阅读 Dashboard 或 WordPress 开发人员博客中的条目,以确定您必须采取哪些步骤来更新并保持安全。
如果在 WordPress 中发现漏洞并发布新版本来解决该问题,则几乎可以肯定利用该漏洞所需的信息属于公共领域。这使得旧版本更容易受到攻击,这也是您应该始终保持 WordPress 最新的主要原因之一。
如果您是负责多个 WordPress 安装实例的管理员,请考虑使用 Subversion 来简化管理。
报告安全问题
如果您认为您在 WordPress 中发现了安全漏洞,您可以通过报告问题来提供帮助。有关如何报告安全问题的信息,请参阅安全常见问题解答。
如果您认为您发现了 Bug,请报告它。有关如何执行此操作,请参阅 提交 Bug。您可能已经发现了一个漏洞,或者一个可能导致漏洞的错误。
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 访问权限,则可以使用以下命令递归更改文件权限:
对于目录:
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
添加服务器端密码保护(例如 BasicAuth)于/wp-admin/做为博客的管理区域、登录屏幕和文件添加第二层保护。这会迫使攻击者或机器人攻击第二层保护,而不是您的实际管理员文件。许多 WordPress 攻击是由恶意软件机器人自主执行的。
仅保护wp-admin/目录还可能会破坏某些 WordPress 功能,例如wp-admin/admin-ajax.php的ajax处理,请参阅 参考资料 部分,了解有关如何正确使用密码保护wp-admin/目录的更多文档。
针对 WordPress 博客的最常见攻击通常分为两类。
- 向您的服务器发送特制的 HTTP 请求,其中包含针对特定漏洞的特定漏洞利用负载。这些包括旧的/过时的插件和软件。
- 试图通过使用 “brute-force” 密码猜测来访问您的博客。
这种“第二层”密码保护的最终实现是需要一个 HTTPS SSL 加密连接进行管理,以便所有通信和敏感数据都被加密。请参阅通过 SSL 进行管理。
保护 wp-includes
在通常不打算让任何用户访问脚本的地方,可以添加第二层保护。一种方法是在 .htaccess 文件中使用 mod_rewrite 阻止这些脚本。注意:为确保以下代码不被 WordPress 覆盖,请将其放在 .htaccess 文件中的 and 标签之外。WordPress 可以覆盖这些标签之间的任何内容。# BEGIN WordPress# END 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 上效果不佳,因为会阻止 ms-files.php 文件生成图像。省略该行将允许代码工作,但提供的安全性较低。
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
保护 wp-config.php
您可以将文件移动到 WordPress 安装上方的目录中。这意味着对于安装在 Web 空间根目录中的站点,您可以存储在 web-root 文件夹之外。wp-config.phpwp-config.php
注意:有些人断言,移动wp-config.php安全的好处微乎其微,如果不小心操作,实际上可能会引入严重的漏洞。其他人不同意。
请注意,可以把wp-config.php存储在 WordPress(wp-includes 所在的位置)安装之上的一个目录级别。此外,请确保只有您(和 Web 服务器)可以读取此文件(通常意味着 400 或 440 权限)。
如果你使用带有 .htaccess 的服务器,你可以将以下内容放在该文件(最顶部)中,以拒绝任何浏览它的人的访问:
<Files "wp-config.php">
Require all denied
</Files>
禁用文件编辑
默认情况下,WordPress 仪表板允许管理员编辑 PHP 文件,例如插件和主题文件。如果能够登录,这通常是攻击者使用的第一个工具,因为它允许执行代码。WordPress 有一个常数可以禁用 Dashboard 的编辑。将此行置于wp-config.php相当于删除所有用户的 ‘edit_themes’, ‘edit_plugins’ 和 ‘edit_files’ 功能:
define( 'DISALLOW_FILE_EDIT', true );
这不会阻止攻击者将恶意文件上传到您的网站,但可能会阻止某些攻击。
插件
首先,确保您的插件始终更新。此外,如果您未使用特定插件,请将其从系统中删除。
防火墙
有许多插件和服务可以充当您网站的防火墙。其中一些工作方式是修改您的 .htaccess文件并在 WordPress 处理之前限制 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 中的某些区域,模糊信息可能有助于确保安全性:
- 重命名管理帐户:创建管理帐户时,请避免使用容易猜到的术语,例如 或 as username,因为它们通常首先受到攻击。在现有的 WordPress 安装中,您可以使用如下命令在 MySQL 命令行客户端中重命名现有帐户:
adminwebmaster
UPDATE wp_users SET user_login = 'newuser' WHERE user_login = 'admin';
或者使用 phpMyAdmin 等 MySQL 前端。
2. 更改table_prefix:许多已发布的特定于 WordPress 的 SQL 注入攻击都假设 table_prefix 是 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,并且如果您在服务器帐户上有多个网站。您还需要确保过滤掉噪声。默认情况下,您将看到很多 noise,并且您需要将其配置为真正有效。
监测
有时,仅预防是不够的,您仍然可能被黑客入侵。这就是为什么入侵检测/监控非常重要的原因。它将使您能够更快地做出反应,找出发生了什么并恢复您的网站。
监控您的日志
如果您使用的是专用或虚拟专用服务器,并且您拥有免费的 root 访问权限,则可以轻松配置内容,以便查看正在发生的事情。OSSEC 很容易促进这一点,这里有一些小文章可以帮助您了解 OSSEC 网站安全 – 第一部分。
监视文件的更改
当攻击发生时,它总是会留下痕迹。在日志或文件系统上(新文件、修改的文件等)。例如,如果您使用的是 OSSEC,它将监控您的文件并在文件发生更改时提醒您。
目标
文件系统跟踪的目标包括:
- 监视已更改和添加的文件
- 日志更改和添加
- 能够还原粒度更改
- 自动警报
一般方法
管理员可以通过通用技术监控文件系统,例如:
- 系统实用程序
- 修订控制
- OS/内核级别监控
特定工具
文件系统监控选项包括:
- diff – 构建网站的干净测试副本并与生产进行比较
- Git – 源代码管理
- inotify 和 incron – 操作系统内核级文件监控服务,可以对文件系统事件运行命令
- Watcher – Python inotify 库
- OSSEC – 开源的基于主机的入侵检测系统,可执行日志分析、文件完整性检查、策略监控、rootkit 检测、实时警报和主动响应。
考虑
在配置基于文件的监控策略时,有许多注意事项,包括以下内容。
以 root 身份运行监控脚本/服务
这将使攻击者难以禁用或修改您的文件系统监控解决方案。
在计划维护/升级期间禁用监控
这将防止在您对站点执行定期维护时收到不必要的通知。
仅监视可执行文件类型
仅监控可执行文件类型(如 .php 文件等)可能是相当安全的。筛选掉不可执行的文件可能会减少不必要的日志条目和警报。
使用严格的文件系统权限
阅读有关保护文件权限和所有权的信息。通常,请尽可能避免允许执行和写入权限。
从外部监控 Web 服务器
如果攻击者试图破坏您的网站或添加恶意软件,您还可以使用基于 Web 的完整性监控器解决方案来检测这些更改。今天它有多种形式,使用您最喜欢的搜索引擎并寻找 Web 恶意软件检测和修复,您可能会获得一长串服务提供商。

发表回复