WordPress 主机托管手册

title: "安全" post_status: publish comment_status: open taxonomy: category: - hosting-handbook post_tag: - Repos - Data - Docs Translate


安全

本页面的目标是告知管理 WordPress 网站的用户关于环境层面(如文件权限)和应用层面(如设置适当的用户角色)的通用安全最佳实践,以便他们在未进行额外配置的情况下部署 WordPress 时,能拥有更好的安全基础。

WordPress 安全最重要的事项是保持 WordPress 本身以及所有已安装插件和主题的更新。同时鼓励用户选择持续接收更新的主题和插件。

WordPress 致力于为用户提供安全体验。关于 WordPress 官方安全立场及 WordPress 整体安全目标的讨论,请参阅 WordPress.org 安全页面

本指南大量借鉴了 WordPress Codex 中关于强化 WordPress 的指南。由于该指南可公开编辑,应谨慎对待其中的建议。

保持任何系统(不仅仅是 WordPress)的安全是一项持续的工作。良好的安全需要周密的规划、监控和定期维护。

安全主要包括降低风险和规划恢复。大多数安全计划仅侧重于最小化未经授权访问的风险,但风险永远无法成功降至零。只要存在风险,就必须规划恢复方案,以便在发生问题时,用户网站不会完全丢失,并能快速恢复正常运行。

安全也不仅仅是 WordPress 的问题。它还涉及确保您的托管环境安全,以及您的个人在线实践和行为保持安全。良好的安全取决于所使用的技术和使用技术的人员。过时或陈旧的技术可能存在漏洞,使您的 WordPress 网站面临风险。人们的不良在线实践也可能使您的 WordPress 网站面临风险。重要的是不仅要确保您使用的技术保持最新和维护,还要确保员工在使用互联网以及与托管平台或客户 WordPress 网站互动时遵循安全最佳实践。

限制多次登录尝试

针对互联网服务最常见的攻击类型之一是暴力登录攻击。在这种攻击形式中,恶意方试图猜测 WordPress 用户名和密码。攻击者仅需用户站点的 URL 即可发起攻击。利用僵尸网络执行此类攻击的软件唾手可得,使得日益复杂的密码更容易被破解。

防范此类攻击的最佳方法是为 WordPress 用户设置、推荐和/或强制执行强密码。

同时建议主机在可能的情况下在网络和服务器层面限制登录尝试。限制每个站点在一段时间内的最大登录次数,以及限制服务器或基础设施中每个 IP 地址在一段时间内的最大尝试次数,有助于缓解僵尸网络密码暴力攻击。这也可以在插件层面实现,但无法避免在这些攻击期间产生的额外资源消耗。

关于用户名的说明

部分 WordPress 安全指南建议为管理员账户设置独特的用户名。虽然初衷良好,但 WordPress 的 REST API 允许任何人查看您网站上的许多用户信息。您可以通过向 /wp-json/wp/v2/users 端点发送请求来自行验证这一点。

WordPress 项目不认为用户名或用户 ID 属于私密或安全信息。用户名是您在线身份的一部分,其作用是标识(而非验证)您的身份。验证身份是密码的职责。

双重身份验证

双重身份验证(又称 2FA 或两步验证)是一种登录方案,当用户尝试登录已启用双重身份验证的服务时,需要使用独立的第二种身份验证形式。具体的双重身份验证设置因服务而异,但通常涉及在尝试登录服务时输入验证码或通过智能手机应用进行交互。WordPress 默认不提供双重身份验证功能;不过,有多个插件可为自托管的 WordPress 网站提供双重身份验证

文件系统

您托管账户的文件系统配置会对 WordPress 的安全性产生重大影响。设置正确的文件权限和所有权对于确保未经授权的用户无法访问或修改 WordPress 文件至关重要。

文件权限

本节关于文件权限的内容完全专注于 Linux 服务器上的文件权限。如果您使用的是 Windows 服务器,请咨询您的主机提供商或 Windows 服务器管理员以获取设置正确权限的帮助。

Linux 文件权限 主要由三个部分组成——文件或文件夹所有者拥有的权限、拥有该文件或文件夹的组成员拥有的权限,以及任何其他人访问或修改该文件和文件夹的权限。这三个权限部分通常用三个数字表示,顺序是所有者权限级别、组权限级别和所有人的权限级别。从技术上讲还有第四个部分,但这超出了保护 WordPress 所需了解的范围,此处将不予讨论。

对于用户、组和其他人,各有三种访问类型。它们是读取访问、写入访问和执行访问。读取访问允许您读取文件或目录的内容。写入访问允许您修改文件或目录。执行访问允许您像运行程序或脚本一样运行文件。

文件权限的数字表示

Linux 在内部将这些不同类型的访问权限存储为比特位(即二进制形式)。它们通常以人类可读的数字形式表示:4(读取权限)、2(写入权限)和 1(执行权限)。这些数字相加可以表示三种访问权限的不同组合。

文件权限的符号表示

某些程序会使用字母而非数字来表示不同类型的访问权限。在使用符号表示时,访问权限类型仍为读取、写入和执行权限。这些权限类型分别用"r"(读取)、"w"(写入)、"x"(执行)表示,并通过字母组合(如"rwx"、"rw"、"wx"等)来呈现三种访问权限的不同组合方式。

Examples of Linux File Permissions

Symbolic Numeric Permissions
---------- 000 no permissions
-r-------- 400 read only for user
-rw------- 600 read & write only for user
-rwx------ 700 read, write, & execute only for user
-rwxr-xr-x 755 read, write, & execute for user, only read & execute for group and everyone else
-rw-r--r-- 644 read & write for user, only read for group and everyone else
-rwxrwxrwx 777 read, write, and execute for user, group, and everyone else. Do not use. Security Risk.

推荐的 Linux 文件默认权限

文件权限将根据需求和服务器设置而有所不同。应尽可能限制文件权限,避免授予不必要的权限。请注意,WordPress 需要能够写入其自身文件以进行更新,包括自动安全更新。

用户账户

WordPress 网站应以非特权用户身份运行。如有可能,应将不同的 WordPress 网站配置为不同用户运行,以实现网站间的相互隔离。此外,用于处理 WordPress PHP 脚本和请求的 Web 服务器应配置为以非特权用户身份处理请求。具体的用户与 Web 服务器配置将根据您的服务器环境、Web 服务器选择及已安装的服务器模块而有所不同。

核心与上传目录的写入权限

为确保自动安全更新正常运行,PHP 必须能够覆写 WordPress 的核心文件。若未在基础设施层面处理自动更新,建议采用此配置方案。

此外,WordPress 默认将资源文件与用户上传内容存储在位于根目录 /wp-content/uploads 的特殊上传目录中。该上传目录需具备网络可访问性,浏览器才能加载用户内容与上传资源。同时,PHP 需拥有用户上传文件夹的写入权限,以便 WordPress 处理用户内容上传。

WordPress 用户与角色

WordPress 自身定义了 5 种默认用户类型(如果启用了 WordPress 多站点 功能,则为 6 种)。它们是:

超级管理员、管理员和编辑都被视为“可信”用户,这意味着他们拥有的权限可能被滥用以破坏或危害 WordPress 网站。

首次安装 WordPress 时,会自动创建一个管理员账户。

插件和主题可以修改现有的用户类型和能力,也可以在默认基础上为 WordPress 添加额外的用户类型和能力。插件和主题通常使用这些额外选项来管理它们为 WordPress 添加的功能。

HTTPS 与 TLS / SSL

当安装并配置好 TLS / SSL 证书供 Web 服务器使用时,WordPress 可完全兼容 HTTPS。强烈建议启用 HTTPS 支持,以保障 WordPress 登录和网站访问者的安全。

缓存安全

虽然缓存能显著提升 WordPress 网站性能,但如果缓存提供程序配置不当,也可能使网站暴露于新的安全风险。常见漏洞包括但不限于:网站访问其他网站的缓存数据,或缓存应用提供错误的缓存数据/文件。各类缓存应用通常都设有安全设置与配置选项,以便在享受缓存性能优势的同时保障运行环境的安全。

OpCache 安全

如 WordPress 托管手册的性能章节所述,PHP 操作码缓存能显著提升 WordPress 网站的 PHP 处理性能。然而,若配置不当,PHP 操作码缓存可能导致用户未经授权访问其他用户的 PHP 文件。存在重要的 PHP 配置选项可缓解此类漏洞,例如未经授权访问文件。

验证权限

以下设置使 PHP 检查当前用户是否具有访问缓存文件的必要权限。应在根 php.ini 配置级别启用此设置,以防止用户访问其他用户的缓存文件。
opcache.validate_permission = On

此设置默认未启用。且仅在 PHP 7.0.14 及更高版本中可用。

验证根目录

以下设置可防止 PHP 用户访问 chroot 目录之外的文件,这些文件通常他们无权访问。此设置也应添加到根 php.ini 配置级别,以防止未经授权访问文件。
opcache.validate_root = On

此设置默认未启用。且仅在 PHP 7.0.14 及以上版本中可用。

限制 API 访问权限

通常,任何 PHP 用户都可以访问 opcache API 来查看当前缓存的文件并管理 PHP 操作码缓存。然而,在某些 PHP 配置中,服务器上的所有用户共享同一个 PHP 操作码缓存内存。这意味着所有用户都能查看和访问 PHP 操作码缓存,并能访问其他用户缓存的 PHP 文件。限制 Opcache API 可以防止在未授权目录中运行的 PHP 脚本查看缓存文件,以及通过 PHP 脚本手动与 PHP 操作码缓存交互。以下设置定义了 PHP 脚本必须从哪个目录路径开始才能访问 Opcache API:
opcache.restrict_api = '/some/folder/path'

该设置的默认值为 '',这意味着对哪些 PHP 脚本可以访问 Opcache API 没有限制。此设置应在 PHP 配置的根 php.ini 文件中定义,以防止用户覆盖它。

对象缓存安全

WordPress 有多种提供数据库对象缓存的解决方案。每种方案在使用数据库对象缓存时,都有其特定的配置要求以确保环境安全。

Redis

Redis 是一款轻量级、高性能的键值数据库服务器,常用于缓存 WordPress 数据库查询结果。在默认配置中,Redis 使用单一数据库,无需用户名和密码即可访问。同时,Redis 应仅允许来自授权网络主机的访问。

Redis 数据库

Redis 默认提供 16 个数据库,编号从 0 到 15。Redis 客户端应配置为使用不同的数据库,而非默认数据库(编号 0)。Redis 可配置为拥有更多数据库,但这超出了本文档的范围。

Redis 用户凭证

若计划将 Redis 用于数据库对象缓存,应配置 Redis 服务器要求访问凭证。

Redis 网络主机

默认配置下 Redis 服务器监听 6379 端口。可在 Redis 配置中修改端口,但无论使用哪个端口,都应通过防火墙进行保护以防止未授权访问。

Redis 缓存键盐值

若使用 Redis 进行数据库对象缓存,采用唯一的 Redis 缓存键盐值有助于防止缓存冲突——即两个网站尝试使用相同键名缓存内容的情况。缓存冲突可能导致网站访问其他网站的缓存数据,并引发其他非预期的不良行为。Redis 缓存键盐值通常通过 Redis 缓存插件或 Redis 客户端进行配置,用于在 WordPress 网站中启用 Redis 数据库对象缓存。

Memcached

Memcached 是一种内存对象缓存解决方案,常用于为 WordPress 提供数据库对象缓存。使用 Memcached 时最重要的配置注意事项之一是防止其被公共互联网访问。将 Memcached 服务器置于防火墙之后,是安全地将其用于 WordPress 数据库对象缓存的最关键环节之一。

WordPress 自动更新

WordPress 具备自动应用安全更新的能力。在几乎所有情况下都应启用此功能。唯一的例外是出于安全考虑,wp-content/uploads 目录外的文件不可写。此时,应提供一种替代、便捷且最好是自动的更新流程。有关自动更新配置的详细信息,请参阅配置自动后台更新

[info]如果您有兴趣改进本手册,请查看 Github 手册仓库,或在官方 WordPress Slack#hosting 频道中留言。[/info]

负责任披露

负责任披露意味着:如果您发现 WordPress 核心软件相关的安全漏洞(或薄弱环节),我们希望尽快获知。WordPress 社区高度重视安全漏洞。我们感谢您负责任地披露发现,并将尽力认可您的贡献。

如需报告安全问题,请访问 WordPress HackerOne 项目并提交工单。

如果您在托管文档中发现安全问题或不安全的建议,请在 hosting-handbook Github 仓库 中提交问题。