My site was hacked again the other day – this is common enough for WordPress sites. If you’re not on top of it you could have it hacked, pretty much automatically.
This part I knew. It still got hacked, and I learned a few more things.
1 Back up your site! This could mean a DB and files backup (plugins, themes & uploads folder) but it really should be more thorough. Use something like UpdraftPlus to create scheduled backups. If you’re running VestaCP, you may have daily backups of your whole user setup. All of this is a good start!
Now at this point if something happens, there is no need to panic when something goes south! You can definitely recover from bad stuff, even if you need to get help. You’ve done good already and are ahead of the game.
2 Upload those backups to an offsite location – Google Drive, OneDrive, S3, a local drive on your personal system through SFTP or whatever. It should be set-and-forget. This is not something you want to have to remember to do. You will have to either only backup once a week or use some technique to thin backups. If you need daily backups, you probably don’t need daily backups going back several months! Figure out what makes sense for your storage capacity and security. Check it occasionally to make sure it’s working.
3 Know how to restore your backups – and know how to do it in a worst case scenario – i.e. you can’t run WordPress because it’s still hacked. Learn how to do it from the command line or from uploading a known good set through SFTP. VestaCP has a fantastic web-based restore tool but if you are using older backups, you might need to understand how to do it on the command line. It’s not easy, but it’s in your hands. Remember, don’t panic. You’re in charge.
4 Install a security plugin. Sucuri and Wordfence are two highly recommended ones, and they will help you get set up and harden your site against attacks. They can help you recover after attacks as well, by restoring plugins and themes from known good sources. The basic (and very comprehensive) plugin features are free. Just install it and set it up.
5 Monitor. If you have something like Jetpack (you should) it will tell you about your site being offline. Something like Sucuri can let you know if your site has changed (e.g. if it’s been hijacked to forward to a malware/scamware site). If you get alerts quickly, restoring to the previous day’s backup is MUCH easier and quicker than having to go back to find out exactly when the hack happened, in case you don’t see your site for weeks at a time – like me.
6 When you have a success story, write down what you did and what you wish you did. Publish it just like I’m doing now. Help others, especially your future self to recover from what could otherwise be disasters.
Update 1: Reinfected today – but I was instantly notified by email. I restored via my control panel, which took about 3 minutes. I also firewall banned the IP address I got in the security report, so it wouldn’t happen again.
- #5 above is amazing. I didn’t lose anything because I acted quickly. I was able to restore from a backup that was a few hours old because Sucuri emailed me immediately.
- Sucuri didn’t harden my upload directory like they said it would. It was still infected from a zip file upload and php file in that directory. I added the following .htaccess file to my uploads directory:
<Files *.php> Deny from all </Files>
- Apparently there is a decent free web app firewall called BulletProof. It will do the next step and block attackers and brute force. Although I haven’t had these types of attacks, (probably because I have host access and I can use fail2ban and handle my own firewall) I am investigating it. It’s definitely ugly but maybe with some research it will be worthwhile to install.
- Sucuri’s site scanner works pretty good, it showed a dropped infected file that hung around after cleanup. You can click all of the files that show up and delete them (or ignore them) en masse.
- When you do a restore, such as with VestaCP, it does not remove additional files, this is good but note that it will leave infected files in place.