|
去年秋天,网站一个做独立博客的保护朋友凌晨两点给我发消息,说他的网站站被刷了。不是保护DDoS那种大流量,而是网站有人盯上了他WordPress后台的登录接口,用字典跑密码。保护等他早上醒来,网站数据库已经被清空,保护备份是网站三个月前的。这事让我重新翻了一遍自己维护的保护几个小站,发现很多防护措施其实早就该做,网站只是保护一直拖着。 最容易被忽略的网站是登录入口。默认的保护/wp-admin或/admin路径,等于告诉扫描器“来试这里”。网站改掉它,或者加一层HTTP Basic认证,能挡掉八成自动化脚本。我自己的做法是在Nginx里给后台路径加一个IP白名单,不在名单内的直接返回444,连页面都不给看。有人觉得这太麻烦,出差换网络就进不去。那就退一步,至少把登录失败次数限制住。Wordfence或者Fail2ban都能干这事,连续错五次封IP一小时,成本几乎为零。 密码本身反而最不值得多谈。强制复杂密码、开启两步验证,这些已经是常识。真正的问题是很多人只在登录环节做了防护,忘了API接口。WordPress的xmlrpc.php是个经典漏洞,攻击者可以用它一次性尝试上百个密码。如果你不用Jetpack或者某些老式客户端,直接在Nginx里把xmlrpc.php禁掉,一行location = /xmlrpc.php { deny all; }就完事。我查过自己服务器的访问日志,禁掉之后每天少了几百条POST请求。 文件权限是另一个暗坑。很多教程让你把整个网站目录设成777,图省事。这等于把门拆了。正确的做法是目录755、文件644,wp-config.php可以设成600。上传目录尤其要小心,PHP文件绝不应该出现在/wp-content/uploads/下面。我见过一个案例,攻击者上传了一个伪装成图片的PHP文件,然后通过它执行任意命令。后来我在Nginx里加了一条规则,上传目录下的PHP文件一律不解析,直接返回403。这条规则救过我两次。 数据库这块,很多人只改前缀就以为安全了。改前缀确实有用,但不够。数据库用户权限要收窄,只给SELECT、INSERT、UPDATE、DELETE,别给DROP或者FILE。这样即使网站被注入,攻击者也没法直接删库或者读服务器文件。另外,数据库不要监听公网IP,只绑127.0.0.1。我见过有人图方便开了3306端口,结果被勒索软件扫到,整库加密,要比特币才给解密。 最后说备份。备份不是防护,但它是你被攻破之后的唯一退路。我现在的策略是本地一份、对象存储一份、异地一份,保留最近七天的每日备份和最近四周的每周备份。备份文件本身也要加密,别用backup.zip这种名字放在网站根目录下,那等于把钥匙插在门上。有一次我帮人恢复站点,发现他的备份文件就在/wp-content/backups/里,攻击者顺手删了。后来我给他写了个脚本,每天凌晨用mysqldump导出,加密后传到另一台服务器,本地只留当天的。 这些方法没有哪个是万能的,但叠在一起,能把攻击成本抬高到大多数脚本小子懒得碰的程度。真正要紧的是别等出事再补,那时候往往已经晚了。 |