chesio / bc-security
一款帮助保护WordPress网站安全的WordPress插件。
Requires
- php: ^8.1
- composer/installers: ^1.0 || ^2.0
Requires (Dev)
- brain/monkey: ^2.3
- mockery/mockery: ^1.4
- php-parallel-lint/php-parallel-lint: ^1.3
- phpunit/phpunit: ^10.5
- slevomat/coding-standard: ^8.0
- squizlabs/php_codesniffer: ^3.2
- szepeviktor/phpstan-wordpress: ^1.0
- yoast/phpunit-polyfills: ^2.0
README
一款帮助保护WordPress网站安全的WordPress插件。
要求
限制
- BC Security尚未在WordPress多站点安装上进行测试。
- BC Security尚未在Windows服务器上进行测试。
安装
BC Security不在WordPress插件目录中,但您可以通过其他几种方式获取它。
使用WP-CLI
如果您已安装WP-CLI,则可以使用单个命令安装(可选)并激活BC Security
wp plugin install [--activate] https://github.com/chesio/bc-security/archive/master.zip
使用Composer
Composer 是管理PHP项目依赖项的强大工具。尽管WordPress本身并不容易使用Composer来管理整个WordPress安装,但有多种方法可以实现。
BC Security可在 Packagist 中找到,因此只需像往常一样运行 composer require chesio/bc-security
即可。
使用Git
主分支始终包含最新稳定版本,因此您可以从您的插件目录中克隆它来安装BC Security
cd [your-project]/wp-content/plugins
git clone --single-branch --branch master https://github.com/chesio/bc-security.git
更新非常简单
cd [your-project]/wp-content/plugins/bc-security
git pull
使用Git Updater插件
BC Security可以通过Git Updater插件进行安装和更新。
直接下载
这种方法不太推荐,但它不需要其他工具。您可以直接从 GitHub 下载BC Security。请确保将插件解压到正确的目录,并从文件夹名称中删除版本号。
设置
BC Security的几个功能依赖于对远程IP地址的了解,因此您需要让插件知道您的服务器如何连接到互联网。您可以通过设置页面或使用BC_SECURITY_CONNECTION_TYPE
常量来设置连接类型。
如果您想检查您的网站是否违反了Google安全浏览列表中的不安全网络资源,您也可以选择提供Google API密钥。该密钥必须已启用Google安全浏览 API。与连接类型一样,您可以通过设置页面或使用BC_SECURITY_GOOGLE_API_KEY
常量来配置密钥。
注意:如果您已设置BC Security的安装并想以相同的方式设置另一个安装,您可以从之前的安装中导出插件设置(包括连接类型),并将其导入到后面的安装中。
功能
清单
BC Security可以帮助您发现潜在的安全问题或甚至是入侵的迹象。
由于开发安装的安全措施不需要像实际安装那样严格,因此一些检查仅在实际环境中运行。一个实际环境是指wp_get_environment_type()
函数返回production
或staging
的情况,但有一个专用过滤器可以用来覆盖实际环境的检测。
基本检查
基本检查涵盖了常见的安全实践。它们不需要从第三方来源获取任何信息来执行,因此不会泄露任何关于您网站的信息。
- 插件和主题PHP文件的远程编辑是否被禁用?
- 目录列表是否被禁用?
- 上传目录中的PHP文件执行是否被禁止?
- PHP错误显示默认是否关闭?此检查仅在实际环境中运行。
- 错误日志文件是否不公开?此检查仅在
WP_DEBUG
和WP_DEBUG_LOG
常量都设置为true时运行。 - 系统上是否没有像admin或administrator这样的常见用户名?
- 用户密码是否使用比WordPress默认使用的MD5更安全的哈希算法进行哈希?
- PHP版本是否仍然受支持?
高级检查
高级检查需要来自外部源的数据,因此它们会泄露一些关于您网站的信息,并且需要更多时间来执行。
目前,已安装的插件列表(仅限具有readme.md或readme.txt文件的插件)与WordPress.org共享,站点URL与Google共享。
WordPress核心完整性检查
WordPress核心文件验证分为两个阶段
- 使用WordPress.org的官方md5校验和来确定核心文件是否已被修改。
- 检查根目录、wp-admin目录(包括子目录)和wp-includes目录(包括子目录)中的所有文件,以与官方校验和列表进行比较,以找出任何未知文件。
此检查使用与core verify-checksums
命令相同的校验和API,该命令来自WP-CLI。
插件完整性检查
插件文件验证仅适用于从插件目录安装的插件。验证过程类似于核心文件验证,尽管API略有不同(见相关Trac问题和规范)。
重要:任何在版本控制下(Git或Subversion)的插件都会自动从检查中排除。
已删除插件检查
尽管可以从插件目录中删除插件,原因有很多(不仅仅是由于它们有安全漏洞),但使用已删除的插件是不推荐的。显然,此检查也仅适用于从插件目录安装的插件。
安全浏览检查
检查您的网站是否包含在Google的任何不安全网络资源列表中——这通常是妥协的可靠指标。注意,要运行此检查,您必须通过插件设置提供正确配置的API密钥。此检查仅在实际环境中运行。
清单监控
基本检查和高级检查都可以从后端专门的页面手动运行,也可以配置为在后台定期(每天一次)运行。基本检查通过单个cron作业运行,而每个高级检查都通过单独的cron作业运行。
WordPress加固
BC安全让您能够
- 禁用pingback
- 禁用需要身份验证的XML RPC方法
- 禁用应用程序密码
- 通过REST API请求和用户枚举防止用户名发现
- 禁用使用电子邮件登录或使用用户名登录以降低暴力破解或凭证填充攻击的风险。
- 使用Pwned Passwords数据库和API检查和/或验证用户密码
密码检查
在用户登录时检查密码。如果密码在Pwned Passwords数据库中,则在后端显示不可取消的警告,鼓励用户更改密码。默认情况下,警告显示在所有页面上,但可以通过过滤器进行自定义。
密码验证
在用户创建、密码更改或密码重置时验证密码。如果密码在Pwned Passwords数据库中,则操作会因错误信息而中止,要求用户选择不同的密码。
登录安全
- BC安全允许您限制来自单个IP地址的登录尝试次数。此功能的实现受到了流行的Limit Login Attempts插件的极大启发,并增加了立即阻止特定用户名(如admin或administrator)的额外功能。
- BC安全提供了一个选项,在提供错误的用户名、电子邮件或密码时,只显示通用的错误消息作为失败的登录尝试的结果。
不良请求横幅
扫描您的网站以寻找弱点的远程IP地址可以被自动阻止一段时间。这样的扫描器通常很容易检测到,因为当扫描网站时,它们会触发大量的404错误,它们尝试访问的URL与“有效”的404错误不同:通常它们试图找到一个已知的易受攻击的插件、遗忘的备份文件或用于管理目的的PHP脚本。
有五个内置规则可用(它们默认不激活)
- 当请求不存在的APS文件时(任何以
.asp
或.aspx
结尾的URL) - 当请求不存在的PHP文件时(任何以
.php
结尾的URL) - 当请求不存在的存档文件时(任何以
.tgz
或.zip
结尾的URL) - 当请求不存在的备份文件时(任何以
backup
在基本名中或以.back
、.old
或.tmp
扩展名的文件) - 当访问不存在的
readme.txt
文件时
您还可以定义自定义规则(正则表达式的形式)。
重要提示:使用此功能时,强烈建议激活与.htaccess
文件的同步!
内部阻止列表
BC 安全性维护了一个具有有限访问权限的 IP 地址列表。该列表由 登录安全 和 不良请求横幅 模块自动填充,但也可以手动添加 IP 地址。
过时的记录会自动从列表中删除,由每晚运行的 WP-Cron 作业处理。如果需要,可以在后端禁用此作业。
与 .htaccess 文件的同步
在 Apache 网络服务器 2.3 版本或更高版本上,具有“网站”访问范围的阻止规则可以自动与 .htaccess
文件同步。这使得访问阻止功能更强大,因为所有对网络服务器的请求都以此方式阻止,而不仅仅是 WordPress 处理的请求。
然而,此功能必须手动设置 - 以下两行必须添加到根 .htaccess
文件顶部才能使其生效
# BEGIN BC Security # END BC Security
设置完成后,您可以等待在下一个 锁定 事件上自动启动同步,或者从管理页面手动运行同步。
外部阻止列表
除了 内部阻止列表 之外,BC 安全性还可以配置为从外部来源获取要阻止的 IP 地址列表。目前只能使用这种方式使用 Amazon AWS IP 范围。
与内部阻止列表一样,外部阻止列表可以用于限制对整个网站或仅登录过程的访问。
通知
BC 安全性允许在以下情况下向配置的收件人发送自动电子邮件通知
- WordPress 更新可用。
- 插件更新可用。
- 主题更新可用。
- 具有管理员权限的用户已登录。
- 已知的 IP 地址已被锁定(见以下说明)。
- 检查表监控 触发警报。注意:如果任何基本检查失败,则发送一条通知,但如果任何高级检查失败,则发送单独的通知。
- BC 安全性插件已被停用。
注意:已知 IP 地址 是曾经成功尝试登录的 IP 地址。有关成功登录尝试的信息从 事件日志 中获取。
您可以通过将常量 BC_SECURITY_MUTE_NOTIFICATIONS
设置为 true
来禁用所有电子邮件通知,方法是在 define('BC_SECURITY_MUTE_NOTIFICATIONS', true);
中。如果您在多个环境中(开发、预发布、生产等)运行网站,您可能会发现从开发或除生产以外的任何环境接收电子邮件通知很麻烦。如果您使用 多环境设置,则仅声明特定环境的常量非常容易。
事件记录
以下由 BC 安全性触发的事件将被记录
(*) 注意:如果内部阻止列表与 .htaccess
文件同步,则 HTTP 请求在传递给 WordPress 处理之前就会被网络服务器阻止,因此插件无法记录这些请求。
以下由 WordPress 核心触发的事件将被记录
- 使用不良 cookie 进行身份验证的尝试
- 登录尝试失败和成功
- 导致404页面请求
日志存储在数据库中,可以在后端查看。日志根据其年龄和整体大小自动删除:默认情况下,最多保留20,000条记录,任何超过365天的日志记录都将被删除,但这些限制可以配置。
自定义
上述列出的一些模块带有设置面板。可以通过插件提供的过滤器进行进一步的自定义。
bc-security/filter:is-admin
- 过滤布尔值,确定当前用户是否被视为管理员用户。此检查确定是否应向特定用户发送管理员登录通知。默认情况下,具有manage_options
权限的任何用户都视为管理员(或多站点上的manage_network
)。bc-security/filter:is-live
- 过滤布尔值,确定您的网站是否正在运行在实时环境中。bc-security/filter:plugin-changelog-url
- 过滤给定插件的变更日志URL。如果插件不在插件目录中托管,可能会很有用。bc-security/filter:obvious-usernames
- 过滤通过清单检查检查的常见用户名数组。默认情况下,该数组包含admin和administrator值。bc-security/filter:plugins-to-check-for-integrity
- 过滤应检查完整性的插件数组。默认情况下,该数组包含所有安装的具有readme.md或readme.txt文件的插件。请注意,受版本控制的插件将自动排除。bc-security/filter:plugins-to-check-for-removal
- 过滤要检查其是否存在于WordPress.org插件目录中的插件数组。默认情况下,该数组包含所有安装的具有readme.md或readme.txt文件的插件。bc-security/filter:modified-files-ignored-in-core-integrity-check
- 过滤不应在核心WordPress文件的校验和验证中报告为已修改的文件数组。默认情况下,该数组包含wp-config-sample.php和wp-includes/version.php值。bc-security/filter:unknown-files-ignored-in-core-integrity-check
- 过滤不应在核心WordPress文件的校验和验证中报告为未知的文件数组。默认情况下,该数组包含.htaccess、wp-config.php、liesmich.html、olvasdel.html和procitajme.html值。bc-security/filter:show-pwned-password-warning
- 过滤是否应在当前屏幕上显示当前用户的“受攻击的密码”警告。bc-security/filter:internal-blocklist-default-manual-lock-duration
- 过滤用于手动内部封锁列表表单中锁定持续时间字段的默认秒数。默认情况下,该值等于一个月的秒数。bc-security/filter:is-ip-address-locked
- 过滤布尔值,确定给定的IP地址是否目前处于内部封锁列表中(在给定的范围内)。bc-security/filter:is-ip-address-blocked
- 过滤布尔值,确定给定的IP地址是否目前被外部或内部封锁列表封锁(在给定的范围内)。bc-security/filter:log-404-event
- 过滤布尔值,确定当前HTTP请求是否导致404响应,是否应该被记录。要完全禁用404事件的记录,可以将__return_false
函数附加到过滤器。bc-security/filter:events-with-hostname-resolution
- 过滤涉及IP地址的hostname应通过反向DNS查找解析的事件ID数组。默认情况下,以下事件已注册:使用错误的cookie进行身份验证的尝试、登录失败和成功的登录尝试以及封锁事件。请注意,此功能仅与后端的事件日志报告相关 - 如果发送电子邮件通知,则报告的IP地址的hostname(如果有的话)始终单独解析。bc-security/filter:username-blacklist
- 过滤黑名单用户名的数组。在创建新账户时,黑名单用户名无法注册,使用不存在的黑名单用户名尝试登录将触发长时间锁定。没有默认值,但过滤器在模块设置中设置的账户名上运行,因此可以用来强制执行特定用户名的黑名单。
致谢
- 登录安全功能受到Limit Login Attempts插件的启发,该插件由Johan Eenfeldt开发。
- WordPress核心完整性检查受到了Checksum Verifier插件的强烈启发,该插件由Sergej Müller开发。
- 一些功能(如"已移除插件检查"或"防止用户名发现")受到了Wordfence Security的启发,该插件由Defiant提供。
- 密码检查和密码验证功能使用了Have I Been Pwned项目提供的API和数据,该项目由Troy Hunt创建。
- 非常感谢Vincent Driessen,他的"A successful Git branching model"文章在我每次进行BC Security的相关工作时都非常有用。
- 非常感谢Viktor Szépe,他向我介绍了PHPStan。
- 插件中包含了psr/log代码库的一部分。
替代方案(以及为什么我不使用它们)
- Wordfence Security - 可能是当前WordPress安全领域最受欢迎的插件。我使用Wordfence的问题在于,使用[Wordfence]时,会自动收集您的网站访客统计数据(请参阅完整的使用条款和隐私政策)。换句话说,为了提供一些其出色的功能,Wordfence会进行远程通信。
- All In One WP Security & Firewall - 另一个非常受欢迎的WordPress安全插件。我使用AIOWPSF有一段时间了;它有很多功能,但也有许多小错误(有时并非微不足道)。我曾经为此插件做出贡献,但代码库相当混乱,经过一段时间后,我厌倦了与之斗争。