Bloquear red TOR en nuestro Apache y otras medida preventivas
Consultando las estadísticas de este modesto site veo que el tráfico llega desde los lugares más insospechados, para un blog que está completamente en Castellano (Croacia, EEUU, Serbia, India, Bulgaria, China, Bangladesh.... y en 10ª posición España!!!)
Obvio, el mundo está plagado de bots que andan buscando cualquier resquicio por el que poder obtener información más o menos sensible, poder vulnerar el site o simplemente romperlo.
No había pensado en hacer ningún tipo de restricción en el servidor web, pero va a ser mejor tomar algunas medidas preventivas, en el fondo esto es como ponerle el candado a tu moto o no, si se la quieren llevar se la van a llevar con el mejor candado del mundo, pero si al lado de la tuya hay otra que no tiene puesto nada, esa otra moto tiene más papeletas de que sea la que se lleven.
Vamos por tanto a poner unos "candados" al site.
Empezamos por cortar las peticiones que vengan desde la red Tor. No es que tenga nada en contra de esta red y soy usuario habitual cuando quiero navegar bajo anonimato, pero también conozco todo lo que se puede llegar a hacer bajo ese anonimato y a este blog no le aporta nada, por tanto lo cerramos.
Se deniega el servicio de páginas por configuración de Apache a las ips de este red, pero ¿cuales son esas Ips?, cambian constantemente. Hay varios sitios de donde podemos sacarlas, el que más me gusta es dan.me.uk, el único problema que podéis tener con este servicio es que no os va a dejar descargar el fichero más que una vez cada hora (media hora parecer ser que ahora lo han bajado), creo que suficiente.
Descargamos el fichero programado con crontab sobre la ruta de configuración de apache, cada hora, construyendo el fichero de exclusión en la misma línea.
@hourly wget -q https://www.dan.me.uk/torlist/ -O - | sed "s/^/Require not ip /g; 1i\<RequireAll\>\nRequire all granted" | sed '$a\<\/RequireAll\>' > /etc/apache2/tor-ip.txt
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
Include /etc/apache2/tor-ip.txt
</Directory>
@hourly wget -q https://www.dan.me.uk/torlist/ -O - | sed "s/^/Require not ip /g; 1i\<RequireAll\>\nRequire all granted" | sed '$a\<\/RequireAll\>' > /etc/apache2/tor-ip.txt; /usr/sbin/apachectl graceful
root@ip-172-31-22-120:~# sudo mkdir -p /etc/apache2/custom.d
root@ip-172-31-22-120:~# sudo wget https://raw.githubusercontent.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/master/Apache_2.4/custom.d/globalblacklist.conf -O /etc/apache2/custom.d/globalblacklist.conf
--2019-06-05 12:08:20-- https://raw.githubusercontent.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/master/Apache_2.4/custom.d/globalblacklist.conf
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.60.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.60.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 400140 (391K) [text/plain]
Saving to: ‘/etc/apache2/custom.d/globalblacklist.conf’
/etc/apache2/custom.d/globalblacklist.conf 100%\[=====================================================================================================>] 390.76K --.-KB/s in 0.05s
2019-06-05 12:08:21 (7.72 MB/s) - ‘/etc/apache2/custom.d/globalblacklist.conf’ saved [400140/400140]
root@ip-172-31-22-120:~# sudo wget https://raw.githubusercontent.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/master/Apache_2.4/custom.d/whitelist-ips.conf -O /etc/apache2/custom.d/whitelist-ips.conf
--2019-06-05 12:09:11-- https://raw.githubusercontent.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/master/Apache_2.4/custom.d/whitelist-ips.conf
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.60.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.60.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1268 (1.2K) [text/plain]
Saving to: ‘/etc/apache2/custom.d/whitelist-ips.conf’
/etc/apache2/custom.d/whitelist-ips.conf 100%\[=====================================================================================================>] 1.24K --.-KB/s in 0s
2019-06-05 12:09:11 (179 MB/s) - ‘/etc/apache2/custom.d/whitelist-ips.conf’ saved [1268/1268]
root@ip-172-31-22-120:~# sudo wget https://raw.githubusercontent.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/master/Apache_2.4/custom.d/whitelist-domains.conf -O /etc/apache2/custom.d/whitelist-domains.conf
--2019-06-05 12:09:18-- https://raw.githubusercontent.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/master/Apache_2.4/custom.d/whitelist-domains.conf
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.16.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.16.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1714 (1.7K) [text/plain]
Saving to: ‘/etc/apache2/custom.d/whitelist-domains.conf’
/etc/apache2/custom.d/whitelist-domains.conf 100%\[=====================================================================================================>] 1.67K --.-KB/s in 0s
2019-06-05 12:09:18 (229 MB/s) - ‘/etc/apache2/custom.d/whitelist-domains.conf’ saved [1714/1714]
Ejemplo de como quedaría la lista blanda de dominios:
SetEnvIfNoCase Referer ~*pruebadeconcepto\.nsupdate\.info good_ref
Ahora bajamos la configuración de la lista negra de bloqueo de Ips, que podremos igualmente editar para añadir las que queramos (ojo si actualizamos que se pierden nuestros cambios...)
sudo wget https://raw.githubusercontent.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/master/Apache_2.4/custom.d/blacklist-ips.conf -O /etc/apache2/custom.d/blacklist-ips.conf
sudo wget https://raw.githubusercontent.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/master/Apache_2.4/custom.d/bad-referrer-words.conf -O /etc/apache2/custom.d/bad-referrer-words.conf
sudo wget https://raw.githubusercontent.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/master/Apache_2.4/custom.d/blacklist-user-agents.conf -O /etc/apache2/custom.d/blacklist-user-agents.conf
<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
Include /etc/apache2/tor-ip.txt
Include custom.d/globalblacklist.conf
</Directory>
root@ip-172-31-22-120:/etc/apache2# apachectl restart
root@ip-172-31-22-120:/etc/apache2# wget https://raw.githubusercontent.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/master/update-apacheblocker.sh
--2019-06-05 12:48:15-- https://raw.githubusercontent.com/mitchellkrogza/apache-ultimate-bad-bot-blocker/master/update-apacheblocker.sh
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.60.133
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.60.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5342 (5.2K) [text/plain]
Saving to: ‘update-apacheblocker.sh’
update-apacheblocker.sh 100%\[=====================================================================================================>] 5.22K --.-KB/s in 0s
2019-06-05 12:48:15 (80.1 MB/s) - ‘update-apacheblocker.sh’ saved [5342/5342]
@daily /etc/apache2/update-apacheblocker.sh
root@ip-172-31-22-120:/etc/apache2# chmod u+x update-apacheblocker.sh
He instalado y configurado el plugin All In One WP Security, es todo muy sencillo, ir entrando por las pestañas y habilitando todo aquello que queramos.
En caso de necesitar alguna actuación sobre el servidor nos lo va a indicar, instalar tal componente de php, cambiar algún permiso de fichero poco restrictivo, todo bastante fácil.
Y un último candado, si todo falla el sitio se va a la porra, una buena copia de seguridad.
Lo ideal sería poder tener snapshot del volumen de nuestra instancia, a diario, si algo cae se restaura el backup y en segundos estamos online otra vez, pero la capa gratuita solo nos deja creo recordar que 1Gb de espacio para este tipo de copias.
La solución es instalar un plugin de copias, que nos permita llevarnos todo nuestro Wordpress a un almacenamiento en nube, esto es, nuestro Wordpress, la contribución (uploads) y la base de datos.
Yo estoy usando este UpdraftPlus - Backup/Restore, y estoy volcando sobre una cuenta que tengo en dropbox con bastantes gigas libres (esto en su día con las invitaciones y un script en Perl.. fue un filón de gigas... da para una entrada en informática viejuna).
Os pedirá instalar algún componente de php, creo que curl y poco más, la configuración sencilla, periodicidad de la copia, opciones, el destino (este es de los más completos, dropbox, s3, Swift, sftp, google drive, onedrive, etc) y la retención del backup.
En unos minutos la copia estará programada.
Espero no tener que usar estas copias nunca.