Continuando el
primer artículo de esta serie de recomendaciones sobre cómo proteger Wordpress, abordaremos esta vez una serie de recomendaciones para configurar en nuestro servidor web privado.
Nos apoyaremos en este caso en el fichero .htaccess, un archivo de configuración muy conocido en entornos web php y que nos permite aplicar políticas de acceso a directorios y ficheros. No es objeto de este artículo explicar cómo funciona htaccess, partimos de la base de que ya existe ese conocimiento y partiremos de ahí para hacer nuestras recomendaciones.
Desactivar la navegación de directorios
Wordpress trae habilitada por defecto la navegación de directorios en varias partes de su estructura. Por citar sólo algunos ejemplos podríamos encontrar:
Para deshabilitar esta característica añadiremos la línea:
Es posible identificar los usuarios de una instalación de Wordpress de una manera bastante sencilla. Las peticiones:
Para evitar esta práctica podemos redirigir al atacante a una url externa cada vez que la petición coincida con el patrón mencionado anteriormente. Podemos añadir las siguientes líneas:
Siendo example.com el sitio al que enviar la redirección.
Bloquear ficheros readme.html readme.txt y similares
Por consenso y estandarización, todos los desarrolladores de plugins y plantillas han de incluir el fichero readme.txt en su paquete de instalación. En dicho fichero se hace una descripción del plugin o plantilla: su desarrollador, la versión, una descripción del mismo, o instrucción de instalación entre otras.
De la misma forma, en cada versión nueva que se lanza, Wordpress añade el fichero readme.html donde igualmente se muestra la versión instalada.
Éstos son solo dos ejemplos, pero existen más ficheros con información de configuración, y para evitar estas filtraciones de seguridad vamos a bloquear el acceso a todos estos ficheros:
Proteger el área de administración restringiendo por IP
En el primer artículo de esta serie, comentábamos la necesidad de proteger el portal de login de Wordpress contra ataques de fuerza bruta. En dicho artículo recomendábamos el uso del algún plugin de seguridad que permitiera el bloqueo de usuarios por intentos fallidos al introducir contraseña.
En este sentido gracias al fichero .htaccess vamos a añadir una capa de seguridad antes del propio Wordpress. En los casos en los que la administración de la página siempre se haga desde unas localizaciones físicas con IP estática, se puede restringir el acceso para que exclusivamente se pueda hacer desde esas IPs:
Proteger el acceso al área de administración con usuario y contraseña
En los casos en los que no se pueda restringir por IP o en los que se quiera añadir una capa adicional, podemos configurar un acceso por usuario y contraseña al portal del login.
Tendremos que crear un fichero con las credenciales:
Donde /path es la ruta donde queremos dejar el fichero, que debe estar fuera del esquema de carpetas del servidor web. usuario es el username de la credencial. El comando nos pedirá por duplicado la contraseña.
A continuación creamos un fichero .htaccess en el directorio /wp-admin/ con las siguientes líneas:
Bloquear tráfico XMLRPC
El protocolo XMLRPC es un protocolo de comunicación via HTTP de datos en formato XML. Este protocolo se utiliza como si se tratase de una API para conectar el Wordpress con aplicaciones de terceros. Esta comunicación se hace a través del fichero:
http://ejemplo.com/xmlrpc.php
Este protocolo tiene el riesgo de sufrir ataques de denegación de servicio, así que en caso de no utilizarse es recomendable bloquear su acceso:
Redirigir todas las páginas de error del servidor web a una página estándar
Habitualmente los atacantes consiguen inferir bastante información de las aplicaciones web con los mensajes de error. Por ejemplo, si se hace una petición a un recurso y éste no existe devolverá un error 404 (not found) con su página correspondiente, pero si el recurso existe pero no se tiene permisos sobre él obtendremos un 403 (Forbidden) y otra página de error. Aquí ya se puede deducir información.
Por este motivo una buena práctica es capturar estas respuestas y devolver una web genérica en su lugar para que el atacante no reciba los mensajes a primera vista:
En el siguiente artículo, abordaremos algunas recomendaciones de seguridad bajo el concepto de Seguridad por ocultación.
Autor: Gonzalo Sánchez Delgado
Dpto. Auditoría
Nos apoyaremos en este caso en el fichero .htaccess, un archivo de configuración muy conocido en entornos web php y que nos permite aplicar políticas de acceso a directorios y ficheros. No es objeto de este artículo explicar cómo funciona htaccess, partimos de la base de que ya existe ese conocimiento y partiremos de ahí para hacer nuestras recomendaciones.
Desactivar la navegación de directorios
Wordpress trae habilitada por defecto la navegación de directorios en varias partes de su estructura. Por citar sólo algunos ejemplos podríamos encontrar:
http://192.168.10.3/wp-content/uploads/ http://192.168.10.3/wp-includes/ http://192.168.10.3/wp-content/plugins/plugin-name/Esto permite a un atacante navegar por los directorios pudiendo tener acceso a ficheros ocultos.
Para deshabilitar esta característica añadiremos la línea:
Options All -IndexesBloquear la enumeración de usuarios
Es posible identificar los usuarios de una instalación de Wordpress de una manera bastante sencilla. Las peticiones:
http://ejemplo.com/?author=0 http://ejemplo.com/?author=1 http://ejemplo.com/?author=2automáticamente redirigen a unas url con el enlace permanente donde se muestra el username real de quien escribió:
http://ejemplo.com/author/usuario0/ http://ejemplo.com/author/usuario1/ http://ejemplo.com/author/usuario2/Incluso añadiendo el nombre en el título la página:
Para evitar esta práctica podemos redirigir al atacante a una url externa cada vez que la petición coincida con el patrón mencionado anteriormente. Podemos añadir las siguientes líneas:
<IfModule mod_rewrite.c> RewriteCond %{QUERY_STRING} ^author=([0-9]*) [NC] RewriteRule .* http://example.com/? [L,R=302] </IfModule>
Siendo example.com el sitio al que enviar la redirección.
Bloquear ficheros readme.html readme.txt y similares
Por consenso y estandarización, todos los desarrolladores de plugins y plantillas han de incluir el fichero readme.txt en su paquete de instalación. En dicho fichero se hace una descripción del plugin o plantilla: su desarrollador, la versión, una descripción del mismo, o instrucción de instalación entre otras.
De la misma forma, en cada versión nueva que se lanza, Wordpress añade el fichero readme.html donde igualmente se muestra la versión instalada.
Éstos son solo dos ejemplos, pero existen más ficheros con información de configuración, y para evitar estas filtraciones de seguridad vamos a bloquear el acceso a todos estos ficheros:
RewriteRule (?:readme|license|changelog|-config|- sample)\.(?:php|md|txt|html?) - [R=404,NC,L]
Proteger el área de administración restringiendo por IP
En el primer artículo de esta serie, comentábamos la necesidad de proteger el portal de login de Wordpress contra ataques de fuerza bruta. En dicho artículo recomendábamos el uso del algún plugin de seguridad que permitiera el bloqueo de usuarios por intentos fallidos al introducir contraseña.
En este sentido gracias al fichero .htaccess vamos a añadir una capa de seguridad antes del propio Wordpress. En los casos en los que la administración de la página siempre se haga desde unas localizaciones físicas con IP estática, se puede restringir el acceso para que exclusivamente se pueda hacer desde esas IPs:
AuthUserFile /dev/null AuthGroupFile /dev/null AuthName "WordPress Admin Access Control" AuthType Basic <LIMIT GET> order deny,allow deny from all # oficina allow from xx.xx.xx.xxx # VPN allow from zz.zz.zz.zz </LIMIT>
Proteger el acceso al área de administración con usuario y contraseña
En los casos en los que no se pueda restringir por IP o en los que se quiera añadir una capa adicional, podemos configurar un acceso por usuario y contraseña al portal del login.
Tendremos que crear un fichero con las credenciales:
htpasswd -c /path/.htpasswd usuario
Donde /path es la ruta donde queremos dejar el fichero, que debe estar fuera del esquema de carpetas del servidor web. usuario es el username de la credencial. El comando nos pedirá por duplicado la contraseña.
A continuación creamos un fichero .htaccess en el directorio /wp-admin/ con las siguientes líneas:
AuthName "Panel de admin" AuthUserFile /path/.htpasswd AuthGroupFile /dev/null AuthType basic require valid-userDonde /path es la ruta donde se dejó el fichero .htpasswd.
Bloquear tráfico XMLRPC
El protocolo XMLRPC es un protocolo de comunicación via HTTP de datos en formato XML. Este protocolo se utiliza como si se tratase de una API para conectar el Wordpress con aplicaciones de terceros. Esta comunicación se hace a través del fichero:
http://ejemplo.com/xmlrpc.php
Este protocolo tiene el riesgo de sufrir ataques de denegación de servicio, así que en caso de no utilizarse es recomendable bloquear su acceso:
<Files xmlrpc.php> order deny,allow deny from all </Files>
Redirigir todas las páginas de error del servidor web a una página estándar
Habitualmente los atacantes consiguen inferir bastante información de las aplicaciones web con los mensajes de error. Por ejemplo, si se hace una petición a un recurso y éste no existe devolverá un error 404 (not found) con su página correspondiente, pero si el recurso existe pero no se tiene permisos sobre él obtendremos un 403 (Forbidden) y otra página de error. Aquí ya se puede deducir información.
Por este motivo una buena práctica es capturar estas respuestas y devolver una web genérica en su lugar para que el atacante no reciba los mensajes a primera vista:
ErrorDocument 403 /error.html ErrorDocument 404 /error.html ErrorDocument 500 /error.html
En el siguiente artículo, abordaremos algunas recomendaciones de seguridad bajo el concepto de Seguridad por ocultación.
Autor: Gonzalo Sánchez Delgado
Dpto. Auditoría