Fichero .htaccess en Wordpress

Strict Transport

Ahora si os parece bien vamos a retocar el fichero .htaccess. Lo primero va a ser configurar el Strict Transport y unas cuantas políticas de seguridad básicas:

strict_transport.png

Si me permitís os voy a explicar qué hace cada una de estas políticas para que no tengáis que hacer un acto de fe en vuestros Wordpress:

El texto para copiar es el siguiente:

#STRICT TRANSPORT Y PERMISION POLICY
<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000; preload" env=HTTPS
Header always set Content-Security-Policy "upgrade-insecure-requests"
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
Header always set Expect-CT "max-age=7776000, enforce"
Header always set Referrer-Policy: "no-referrer-when-downgrade"
Header always set Permissions-Policy "geolocation=(); midi=();notifications=();push=();sync-xhr=();accelerometer=(); gyroscope=(); magnetometer=(); payment=(); camera=(); microphone=();usb=(); xr=();speaker=(self);vibrate=();fullscreen=(self);"
Header always append X-Frame-Options SAMEORIGIN
</IfModule>

Forzar a www con https

El siguiente pasó estará más enfocado a forzar que nuestra página funcione siempre con https y con www:

forzar_www_con_https.png

El significado de estas líneas es el siguiente:

RewriteEngine On: Esta línea activa el motor de reescritura de URLs de Apache. Es necesario para poder utilizar las directivas de reescritura (RewriteRule, RewriteCond, etc.) en el archivo .htaccess.

Si queréis copiar el código, aquí os dejo:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^loseduardos.com [NC]
RewriteRule ^(.*)$ https://www.loseduardos.com/$

Bloqueo de wp-config.php

Es importante que bajo ningún motivo el fichero wp-config.php sea accesible desde fuera del servidor. En ese fichero es donde tenemos la configuración de nuestro Wordpress y es crítico que esté protegido.

bloqueowponfig.png

El significado de estas líneas es el siguiente:

Para que podáis copiar el texto:

#BLOQUEO ACCESO AL wp-config.php
<files wp-config.php>
order allow,deny
deny from all
</files>

Proteger ficheros sueltos

En Wordpress, como en cualquier otro CMS es muy importante que sólo se sirvan los ficheros que tienen que servirse y no otros.

Es muy común en administradores poco experimentados que dejen copias en el servidor de backups. Estos backups pueden incluir ficheros sql con copias de la base de datos, ficheros comprimidos con los ficheros o cualquier otra combinación, así que es importante a ese tipo de ficheros no darle acceso desde fuera.

secure_loose.png

Esta configuración de un archivo .htaccess está diseñada para mejorar la seguridad de un sitio web al restringir el acceso a ciertos archivos que podrían ser sensibles o no destinados a ser accesibles públicamente. La configuración usa mod_alias para redireccionar ciertas solicitudes a un error 403, lo que significa "Prohibido" o "Acceso Denegado".

Por supuesto haz uso de tu imaginación y revisa tus necesidades para adaptar estas líneas a las necesidades que tu tengas.

Si necesitáis el texto os lo dejo aquí para copiar y pegar:

# SECURE LOOSE FILES
# http://m0n.co/04
<IfModule mod_alias.c>
RedirectMatch 403 (?i)(^#.*#|~)$
RedirectMatch 403 (?i)/readme\.(html|txt)
RedirectMatch 403 (?i)\.(ds_store|well-known)
RedirectMatch 403 (?i)/wp-config-sample\.php
RedirectMatch 403 (?i)\.(7z|bak|bz2|com|conf|dist|fla|git|inc|ini|log|old|psd|rar|tar|tgz|save|sh|sql|svn|swo|swp)$
</IfModule>

Bloqueo al wp-login.php y al xmlrpc.php

Hay dos ficheros en Wordpress que son el interfaz por el que se introducen los datos, el primero es el wp-login.php. Aquí es donde los autenticaremos para poder subir contenido al Wordpress. En mi caso concreto uso una VPN para conectarme a la administración del Wordpress y tampoco permito que se pueda acceder al xmlrpc desde fuera.

El fichero xmlrpc.php sirve para habilitar la interoperabilidad entre WordPress y otros sistemas mediante el protocolo XML-RPC. XML-RPC es un protocolo que permite que sistemas en diferentes entornos se comuniquen entre sí, enviando llamadas RPC (Remote Procedure Calls, o Llamadas a Procedimientos Remotos) codificadas en XML a través de HTTP.

Con XML-RPC se pueden realizar publicaciones remotas, gestionar contenidos, comentarios, en fin, se pueden hacer muchas cosas y desde el punto de vista de seguridad pues es una preocupación, aunque es cierto que en las versiones más modernas de Wordpress, por ejemplo la introducción de la API REST en WordPress 4.7 fue un gran avance.

No obstante nosotros vamos a bloquearlo todo.

bloqueo_ficheros_no_accesibles.png

En este ejemplo os muestro como bloquear ambos ficheros, en el caso de xmlrpc.php fijaté que permito el acceso desde la 192.0.64.0/18.

edu@andromeda:~$ whois 192.0.64.0
NetRange:       192.0.64.0 - 192.0.127.255
CIDR:           192.0.64.0/18
NetName:        AUTOMATTIC
NetHandle:      NET-192-0-64-0-1
Parent:         NET192 (NET-192-0-0-0-0)
NetType:        Direct Allocation
OriginAS:       AS2635
Organization:   Automattic, Inc (AUTOM-93)
RegDate:        2012-11-20
Updated:        2021-12-14
Ref:            https://rdap.arin.net/registry/ip/192.0.64.0

Este rango es el de Automattic y se utiliza para plugins como por ejemplo el JetPack.

Esta configuración tiene la siguiente explicación:

Bloqueo del Spam no referido

Los malos son gente muy ingeniosa y tenemos que protegernos de muchas cosas, como por ejemplo que un comentario sólo pueda ser introducido si se viene desde el propio post, algo que parece muy obvio, pero que no lo es tanto, esto también lo puedes bloquear en el .htaccess:

bloqueo_spam_no_referido.png

Seguro que quieres saber qué hace cada línea, así que vamos allá:

Si quieres copiar el código, aquí te lo dejo:

# BLOQUEO SPAM NO REFERIDO
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
RewriteCond %{HTTP_REFERER} !^http(s)?://([^.]+\.)?loseduardos\.com [NC]
RewriteCond %{REQUEST_URI} /wp-comments-post\.php [NC]
RewriteRule .* - [F,L]
</IfModule>

Bloquear los crawlers

Los rawlers supuestamente deberíamos de poder bloquearlos con el robots.txt, pero muchas veces no hacen mucho casí, así que una de las formas que tenemos es bloquearlos utilizando el user-agent:

loquear_crawlers.png

De esta manera bloqueamos todos los user-agents que queramos y al final pues podemos bloquear los crawlers por extensión.

Aquí dejo el código para copiar y pegar.

#BLOQUEAR CRAWLERS INDESEADOS
RewriteCond %{HTTP_USER_AGENT} (VelenPublicWebCrawler|Baiduspider|magpie-crawler|CCBot|okhttp|GPTBot) [NC]
RewriteRule .* - [R=403,L]

Configurar la cache

También podemos ayudar con la caché utilizando el .htaccess, para ello podemos realizar la siguiente configuración:

cache.png

Este código es sobretodo importante para mejorar el rendimiento de nuestro wordpress, vamos a ver línea a línea qué hace esto:

El código para copiar y pegar es el siguiente:

# START Browser cache
<IfModule mod_expires.c>
ExpiresDefault                              "access plus 1 month"
ExpiresByType text/html                     "access plus 1 seconds"
ExpiresByType text/xml                      "access plus 1 seconds"
ExpiresByType text/plain                    "access plus 1 seconds"
ExpiresByType application/xml               "access plus 1 seconds"
ExpiresByType application/json              "access plus 1 seconds"
ExpiresByType application/rss+xml           "access plus 1 hour"
ExpiresByType text/css                      "access plus 1 month"
ExpiresByType text/javascript               "access plus 1 month"
ExpiresByType application/font-woff         "access plus 1 month"
ExpiresByType application/font-woff2        "access plus 1 month"
ExpiresByType application/font-sfnt         "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
ExpiresByType application/javascript        "access plus 1 month"
ExpiresByType application/x-javascript      "access plus 1 month"
ExpiresByType image/x-ico                   "access plus 1 month"
ExpiresByType image/x-icon                  "access plus 1 month"
ExpiresByType image/gif                     "access plus 1 month"
ExpiresByType image/png                     "access plus 1 month"
ExpiresByType image/jpe                     "access plus 1 month"
ExpiresByType image/jpg                     "access plus 1 month"
ExpiresByType image/jpeg                    "access plus 1 month"
ExpiresByType font/truetype                 "access plus 1 month"
ExpiresByType font/opentype                 "access plus 1 month"
ExpiresByType font/ttf                      "access plus 1 month"
ExpiresByType font/woff                     "access plus 1 month"
ExpiresByType font/woff2                    "access plus 1 month"
ExpiresByType application/x-font-woff       "access plus 1 month"
ExpiresByType video/ogg                     "access plus 1 month"
ExpiresByType audio/ogg                     "access plus 1 month"
ExpiresByType video/mp4                     "access plus 1 month"
ExpiresByType video/webm                    "access plus 1 month"
ExpiresByType image/svg                     "access plus 1 month"
ExpiresByType image/svg+xml                 "access plus 1 month"
ExpiresByType application/pdf               "access plus 1 month"
ExpiresByType application/vnd.ms-fontobject "access plus 1 month"
</IfModule>
# END Browser cache

Configurar la compresión

Otro factor importante a tener en cuenta para mejorar el rendimiento de nuestro Wordpress es la compresión: