除非你有专职的系统管理员或运维人员,否则你时不时会需要扮演系统管理员的角色。掌握良好的 Linux 和 WordPress 安全知识将大大有助于你避免因服务器被入侵而陷入代价高昂且尴尬的境地。我曾经有个客户的网站中了木马,将页面转向菠菜网站,我花了5个小时使用了各种办法与杀毒插件都没办法彻底清除,最后花钱请了个网安程序员进行了清理,前后花了5百多块钱。
这个章节我们将重点讨论安装了 WordPress 的共享服务器场景。在这种模式下,主机提供商(例如 LeguHost、Hostinger等)负责管理服务器,包括服务器本身的更新和补丁,以及确保服务器不会崩溃。在这种情况下,你唯一需要担心的安全问题就是 WordPress 新漏洞以及你上传到服务器的任何内容(破解主题与破解插件所留的后门)。这本身就是一件好事,因为你无需担心整个服务器,只需关注你的网站即可。
设置 WordPress 文件权限来保护网站安全
现在是时候运用所学知识,确保 WordPress 的文件权限设置正确了。使用 SFTP 程序或 cPanel(同样适用于DirectAdmin或其他面板) 中的文件管理器,验证每个文件和目录的权限模式。WordPress 在服务器上的父目录会因您选择的托管服务提供商而异。找到父目录后,你需要为每个文件和目录分配以下权限:
- 每个目录的权限模式应为 755 (drwxr-xr-x)。
- 每个文件的权限模式都应该是 644 (-rw-r–r–)
- wp-config.php 文件的权限模式应设置为 600 (-rw——-)。这有助于防止其他人(包括所有人)查看您的数据库密码。
有没有更简单的方法来设置 WordPress 安装的文件权限?当然有,但你需要通过SSH访问服务器并对命令行有相当的了解,这有点超纲了,如果你需要这方面的知识,你可以谷歌进行拓展学习。现在,最好先学习使用 cPanel 或其他运维面板的使用方式,因为你很可能要先使用共享主机,直到你准备好升级到 VPS 或独立服务器。
阻止扫描或攻击的安全措施
我们的目标是阻止人们认为你的网站值得攻击。目前,大多数人使用工具扫描网络,根据网站特征寻找易受攻击的网站。我们需要清除网站特征,避免你的网站被列入黑名单。
首先,我们要保护你的 .ht 文件,包括 .htaccess 和 .htpasswd 文件,这样任何人都无法绕过您的第二层保护。然后就是一些WordPress 的核心文件,这样只有通过您的主机账户登录的人才能读取这些文件:
# PROTECT wp-config.php
<Files wp-config.php>
order allow,deny
deny from all
</Files>
# BLOCK THE readme.html
<Files readme.html>
order allow,deny
deny from all
</Files>
# BLOCK THE license.txt
<Files license.txt>
order allow,deny
deny from all
</Files>
# BLOCK .HT FILES
<Files ~ "^\.ht">
order allow,deny
deny from all
</Files>
# BLOCK xmlrpc.php REQUESTS
<Files xmlrpc.php>
order allow,deny
deny from all
</Files>
# NO DIRECTORY BROWSING
Options All -Indexes
# 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>
你可以根据需要选择所需内容,但也可以将它们组合到一个 `<Files>` 指令中。你看到的这段代码阻止了未经身份验证的用户读取 wp-login.php 文件,以及一些 WordPress 上传的垃圾文件,例如 readme.html 和 license.txt。这些文件会显示你正在使用的 WordPress 版本,并用于扫描匹配的漏洞,与其每次更新时都删除它们,不如直接阻止访问。
如上所述,我们也阻止了对 .ht 文件的访问,此外,我们还阻止了对 XMLRPC.php 的所有请求。XMLRPC.php 是一种远程访问协议,允许攻击者通过其他软件编辑器、电子邮件或其他您可能根本不会使用的手段向您的网站发布内容。恶意攻击者会全天候不停地 ping 这个地址,消耗带宽,降低服务器速度,并试图入侵您的服务器。只需阻止访问,并确保使用下面的代码块来禁用它即可。
清除网站内部痕迹
我们刚刚处理了文件痕迹,但还需要移除那些渲染到 HTML 中的痕迹,例如 WordPress 反复向外界透露您正在使用的版本。为了方便起见,我会提供一些代码块的复制粘贴示例。
使用 Code Snippets 插件禁用功能
…待更新…
清除网站各处的 WordPress 版本痕迹
不要成为攻击目标。当然,要保持 WordPress 核心代码的更新,但不要向爬虫程序透露您的版本信息。这里同样你需要使用Code Snippets插件使代码生效。
// Get Rid of WP Version Footprint Throughout Site
function ryu_remove_version() {
return '';
}
add_filter('the_generator', 'ryu_remove_version');
从 wp_head 函数中移除痕迹和搜索引擎干扰
移除大量不必要的元数据,例如指向数百万个 RSS 源(如分类、评论)的链接。移除不需要的页面关联链接,例如“上一页”和“下一页”。您可以根据需要选择要移除的内容,因为并非所有内容都与安全直接相关,但可以阻止一些不必要的爬虫和扫描。
// Remove Footprints and Search Engine Confusion from wp_head Function
remove_action('wp_head', 'wlwmanifest_link');
remove_action('wp_head', 'rsd_link');
remove_action('wp_head', 'wp_generator');
remove_action('wp_head', 'start_post_rel_link');
remove_action('wp_head', 'index_rel_link');
remove_action('wp_head', 'feed_links_extra', 3 );
remove_action('wp_head', 'feed_links', 2 );
remove_action('wp_head', 'parent_post_rel_link', 10, 0 );
remove_action('wp_head', 'start_post_rel_link', 10, 0 );
remove_action('wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);
禁用 XML-RPC
XML-RPC 是一种老旧技术,用于在移动设备上远程发布其他应用程序的内容。像 IFTTT 这样的服务会使用它,所以请确保您确实想要禁用它。传统上,Windows Live Writer 和 Market Samurai 等工具会使用它,以便您可以从一个中央应用程序发布到所有网站。
// Disable XMLRPC
add_filter('xmlrpc_enabled', '__return_false');
最小权限原则
最小权限原则是“计算机安全入门”的一部分。简而言之,它指的是只授予用户或进程完成当前任务所需的最小权限,不多不少。如果你的合作伙伴只负责撰写内容,那就授予他们“编辑”权限。如果你的合作伙伴负责撰写客座文章,那就授予他们“投稿人”权限。如果遇到需要驱赶的苍蝇,那就用苍蝇拍,别动用核武器。
你应该只设置一个管理员帐户,用于更新 WordPress、添加/删除用户等。所有其他用户都应该拥有“编辑”或更低的访问权限。这意味着你自己的个人网站帐户不应该拥有管理员权限。
使用Temporary Login Without Password – 无需密码的临时登录
…待更新…
强密码
理想情况下,你应该使用强密码。我个人一般借助密码管理软件(LastPass或Bitwarden浏览器插件)来记录各个管理网站的密码。
- 长度至少为 12 个字符
- 混合使用大小写字母
- 不要包含字典词汇
- 包含 1 个或多个符号(例如 !$%^#)
WordPress安全插件
插件方面,我奉行“少即是多”的原则。插件会改变 WordPress 的运行方式,最终结果可能好也可能坏。作为开发者,你可以创建几乎任何你需要的插件,让 WordPress 执行各种它原本不该执行的操作。
仔细想想,插件可以帮助营销人员赚取数百万美元,也可以危及你的网站安全。有时,开发者技能不足甚至代码错误都可能使你的网站容易受到攻击。
Wordfence
…wf配置…
保持 WordPress 更新
我个人倾向于自动更新到最新版本,包括WordPress 最新版本、插件、以及主题,因为我理解的更新是基于安全漏洞或bug的修复,不只是新功能的增加。保持最近版本的状态,有利于应付互联网世界的潜在威胁。
备份你的网站
使用WordPress备份插件
备份插件在大多数情况下你只需要选择一个。备份方式的话,除了网站插件备份,你还可以选服务器备份。
All-in-One WP Migration and Backup
这个插件对于备份、还原、迁移网站来说,是完美的。至少我很少碰到出问题的情况。如果你有服务器的权限,并懂得修改PHP限制,免费版对于小一点的备份文件就够用了。不然你需要购买收费版的各种插件以拓展功能。
WPvivid Backup & Migration
这个也是我常用的一个备份插件,好处在于备份目标相较于ALL-IN-ONE很多是免费的整合功能,我经常用于将网站备份到Onedrive空间。它还能分割备份文件,功能很多。大多数情况下是好用的,但是它在数据库还原方面有时总会卡住那么一下,我不确定是否我哪里没配置好。
UpdraftPlus
这个插件是我最早接触的一款备份插件了,但也是我第一个放弃继续使用的插件。大多数情况下,它是简单方便好用的,但我总会碰到几次还原错误,并无从下手。
异地备份
123