Tips para proteger tu Blog (Wordpress y otros CMS)

Por Luciano Laporta Podazza el 28/05/2009, en Seguridad, Software Libre

Un día más en nuestra vida, nos levantamos, tomamos el desayuno y seguridad wordpresscomenzamos a revisar nuestro correo electrónico y navegar por nuestras webs favoritas, ver noticias, etc.

Pero que pasó hoy?, salio un nuevo fallo de seguridad de algún sistema como ser joomla, wordpress, phpbb, solo por mencionar alguno de los cientos de sistemas de este tipo.

A su vez alguien aprovecho este fallo, desarrolló un exploit para crackear sitios masivamente y posiblemente algún conocido tuyo  o vos mísmo saliste damnificado.

Talvez pienses que es un tanto sensacionalista decir todo esto, pero los que están en el tema saben que esto es así y nadie esta excento de caer en un ataque por parte de usuarios maliciosos.

Es por eso que decidí escribir este artículo tratando de contemplar todas las posibles maneras en que un atacante podría comprometer nuestros sistemas y sus contramedidas.

Si bien este artículo estaba pensado específicamente para proteger Wordpress, también estas medidas de seguridad les servirán para otros CMS(lo aclararé a lo largo de los tips).

Sin mas preámbulos, vamos allá!!! :-D

[adsense]

Tips:

1. Mover el wp-config.php

Desde la versión 2.5 wordpress nos permite mover de ubicación el archivo de configuraciones wp-config.php(en e l cual se guarda información sensible del sistema).

De manera que podemos moverlo al mismo a un nivel superior en el árbol de directorios de tu instalación de wordpress,  osea que si suponemos que tienes tu instalacion en www.pepe.com (que apunta a la carpeta /home/tuusuario/public_html/ osea la raíz de tu servidor) entonces movemos el archivo wp-config.php una carpeta mas arriba logrando así una capa mas de seguridad, ya que por lo general los usuarios no pueden acceder a archivos y carpetas fuera de public_html.

Por lo general en los hostings la carpeta personal del usuario donde se publican los archivos de paginas webs estan ubicados en:

/home/tusuario/public_html/ (en GNU/Linux)

De manera que si movemos el archivo wp-config.php hacia /home/tusuario/ estariamos “escapandolo” del acceso web, protegiendo un poco más tus archivos sensibles.

* Tip aplicable a muchos otros CMS

2. Borrar el usuario Admin

Una vez que terminaste de instalar wordpress, automáticamente se crea un usuario admin, el cual posee todos los privilegios del sistema.

El problema de esto es que el usuario admin posee un id de usuario igual a “1″ en la base de datos de wordpress, por ende cuando un cracker quiere acceder a tu sistema, lo unico que debe hacer es focalizar el ataque hacia el usuario con id igual a “1″, romper el password y acceder con todos los privilegios.
Por eso recomiendo seguir estos pasos para eliminar el usuario admin:

  1. Crear un usuario con privilegios de administrador en el panel de administración.
  2. Desloguearse del panel de administración.
  3. Iniciar sesión con el nuevo usuario.
  4. Ir a la sección Usuarios.
  5. Borrar el usuario “admin” de la lista de usuarios.

Con esto logramos bastante seguridad para el sitio, ya que borramos el id conocido por los atacantes, el usuario típico “admin” y de ahora en más, nadie se enterará que el usuario que usas para publicar posts es un administrador.

Una recomendación mas es usar siempre un usuario con mínimos privilegios para publicar, editar o borrar posts para evitar así que si algo malo sucede, el atacante solo tenga acceso limitado a nuestro wordpress.

* Tip aplicable a muchos otros CMS


3.- Elegir passwords mas dificiles de atacar.

Uno de los factores que ayudan en el ataque de un sistema en general es la debilidad de los passwords, es por ello que es crucial elegir un password lo suficientemente fuerte. Supongamos que un usuario malicioso consigue los hashes de nuestro usuario de manera que solo le resta crackear la contraseña,  si hubiesemos elegido un buen password le sería casi imposible romperlo ya que le llevaria mucho tiempo y esfuerzo hacerlo.

Wordpress nos provee una herramienta muy intuitiva para ver si nuestro password es débil, bueno o fuerte(aparece en el panel del sistema cuando creamos usuarios, modificamos, etc.).

Aun así he aquí unas recomendaciones a seguir para fortalecer a los mismos:

  • Usar passwords de mínimo 7 caractéres.
  • Usar passwords alphanuméricos(letras y numeros)
  • Usar mayusculas y minúscuas(pAsSwORd)
  • Usar símbolos poco comunes como ! ” ? $ % ^ & ).
  • Que las palabras que usemos de passwords no se encuentren en un diccionario.
  • Un poco obvio pero: No anotar el password en algún lugar visible(suponiendo que tengamos que hacerlo).

* Tip aplicable a muchos otros CMS(Y cuentas de todo tipo como mail, ftp, etc.)


4. Ocultando información del login

Cuando accedemos a la carpeta wp-admin(para la administración de nuestro sistema) wordpress nos informa con un error cuando un usuario/contraseña no es válido y cuando sí lo es.

Así un atacante puede averiguar si un usuario es válido o no y a partir de ahí comenzar a crackear el password por ataques de Fuerza Bruta o por Diccionarios.

Por suerte podemos cambiar esto para que nuestro sistema no muestre ninguna información al respecto.

  1. Ingresamos al panel de administración.
  2. Vamos a aspecto -> Editor.
  3. En el panel de la derecha aparecen los archivos .php, elegimos functions.php
  4. Agregamos en cualquier parte del archivo la siguiente linea: add_filter(‘login_errors’,create_function(‘$a’, “return null;”));
  5. Guardamos los cambios y salimos.

Y listo, con esto, cuando iniciemos sesión en wordpress y nos devuelva algún error, no nos mostrará ninguna información de utilidad para un atacante.

Ej.:

wordpress login

5.  Restringir los intentos de logueo

Uno de los ataques mas populares son los Ataques por Fuerza Bruta,  los cuales consisten en probar todas las posibilidades de palabras para dar con la contraseña. Este tipo de ataques requieren de mucho más tiempo que un ataque por diccionario pero son mas efectivos,  de manera que para evitar estos intentos de penetración en nuestro querido wordpress, podemos utilizar un plug-in para el cometido: Login Lock Down también disponible en los repositorios de wordpress.

Con el mismo podemos restringir los intentos de inicio de sesión a por ejemplo 3 intentos y despues de esos intentos bloquear por 5min el login, como muestra la imagen de abajo. Esto haría poco prácticos los ataques por fuerza bruta, ergo el atacante desistiría en el intento.

Una cosa que no he encontrado pero es muy recomendable es que el tiempo de bloqueo sea incremental o aleatorio, de manera que el atacante no cuente con un “tiempo fijo” y programe sus exploits deacuerdo a nuestra configuración, logrando asi un poco mas de ventaja sobre el atacante.

El único problema con este tipo de mecanísmo de seguridad es que puede lograrse un efecto negativo como el deniego de servicio por bloqueo de cuentas cuando el tiempo de bloqueo es fijo.

Por eso planteo la posibilidad de emplear tiempos incrementales o aleatorios para evitar este tipo de problemas.

Ej.:

wordpress lock down

* Tip aplicable a muchos otros CMS

6.  Mantener el software actualizado

Wordpress nos ofrece un sistema automatizado para actualizar el sistema completo y sus plugins asi que ya no es un trabajo complicado como antes.

Por eso es recomendable revisar con regularidad las actualizaciones de los mismos.

Ej.:

wordpress updater

* Tip aplicable a muchos otros CMS


7. Cambiar valores por defeault de la instalación

Por lo general cuando sale un fallo de seguridad para wordpress, los atacantes  desarrollan exploits automatizados que comienzan a escanear la red en busca de instalaciones de wordpress vulnerables,  logrando así defaces masivos.

Lo que sucede es que estos exploits usan valores por default de wordpress como por ejemplo los  prefijos de las bases de datos(wp_loquesea), el usuario admin que comentabamos antes, ubicación de carpetas por default, etc.

De manera que si cambiamos estos valores por default estariamos logrando una capa mas de seguridad “anti-exploits” masivos, obvio que esto no nos protege de un ataque personalizado, osea un atacante real tratando de entrar por si mismo en tu sistema, pero si nos ayuda bastante.

Existe un plugin que nos facilita todo este trabajo: wp-securityscan

pantallazo-hack-it-e280ba-security-e28094-wordpress-mozilla-firefox-1

(click sobre la imagen para agrandar)

Con este plugin podremos cambiar muchos valores por default de nuestra instalación de wordpress, scanea y nos avisa de otros valores que podemos modificar de nuestro servidor que nos ayudarán a mejorar la seguridad del mismo.

* Tip aplicable a muchos otros CMS(El método, no el plugin)

8. Proteger el panel de administración

Esta es una de las mejores capas de seguridad que podemos usar, ya que nos sirve para proteger archivos (wp-login.php) y carpetas(wp-admin) con autenticación básica y avanzada y no depende del CMS que usemos, si no que lo que usamos es el propio servidor web Apache y sus directivas.

Para proteger carpetas de páginas web mediante autenticación HTTP de forma manual, se necesita únicamente modificar dos archivos:

.htaccess.htpasswd

Los archivos .htaccess y .htpasswd

Así se llaman los dos archivos más importantes para modificar cosas en nuestro servidor. No tienen ni extensión ni nombre, simplemente son así. El contenido está en texto plano, por lo que pueden ser editados con cualquier editor de texto.

El archivo .htaccess además de proteger carpetas, sirve para utilizarlo con el módulo mod_rewrite de Apache para el manejo de permalinks (enlaces permanentes o amigables) en las URLs(Pueden verlo en las direcciónes de mi blog).

En .htaccess se establece el tipo de permiso necesario y qué usuarios pueden acceder a qué archivos, mientras que en .htpasswd se guardan el nombre de usuario y contraseña de cada uno de ellos.

.htaccess

Este archivo lo colocaremos en la carpeta que queremos proteger. Editemos el .htaccess con algo similar a :

AuthUserFile /ruta/absoluta/hacia/.htpasswd
AuthName "Mensaje de ingreso"
AuthType Basic

require user usuario123

Veamos línea a línea

AuthUserFile /ruta/absoluta/hacia/.htpasswd

Le tenemos que indicar la ruta absoluta (del servidor) hacia nuestro archivo .htpasswd, lo normal es poner el archivo de contraseñas fuera del alcance de la web, como les mencionaba en el punto 1.

NOTA: En caso de que eso no sea posible dejar el .htpasswd fuera del public_html, se recomienda  cambiarlo de nombre por algo complicado del estilo .3st03sun53cr370. Aún así este método no es muy seguro, por lo que un cambio de servidor sería una buena idea.

AuthName "Mensaje de Ingreso"

Muestra el nombre del sitio, te aparecerá una ventana de dialogo con un formulario de acceso por nombre de usuario y contraseña con un mensaje similar a “Está intentando entrar a Mensaje de Ingreso, debe especificar un nombre de usuario y contraseña”. Da exactamente igual lo que pongas, no tiene un efecto sobre el nombre real de la carpeta o archivos.

AuthType Basic

Indica que el tipo de autentificación es básico.

require user usuario123

Indica que el único usuario que puede entrar es usuario123, cualquier otro -aunque la contraseña sea correcta- no será válido.
Tenemos variaciones de esa línea como por ejemplo :

require user usuario123 usuario124 usuario125

Donde podemos  especificar 2, 3 o más usuarios. Tambien tenemos :

require valid-user

Donde podrán entrar todos los usuarios especificados en el archivo .htaccess (u otro nombre si así lo indicaste en la primera línea).

Podemos incluso proteger sólo algunos archivos de la manera :

AuthUserFile /ruta/absoluta/hacia/.htpasswd
AuthName "Mensaje de Ingreso"
AuthType Basic

<Files "wp-login.php">
 Require valid-user
</Files>

<Files "info_sensible.html">
 Require user usuario123
</Files>

Como ven admite muchas formas de proteger archivos individuales o carpetas.

.htpasswd

Me referiré a .htpasswd como el nombre del archivo, pero como ya dije anteriormente, si no lo pueden esconder de la vista pública, al menos cámbienle el nombre.

Este archivo contiene una lista de nombres de usuario y contraseñas, en formato usuario:contraseña y cada nombre-clave en una línea independiente, por ejemplo :

usuario123:12JvVkeJRgm8A
otrousuario:$1$UNHEaBiV$NzwYQ8NhjzIOUmFyfGyrO/

Como ven, la contraseña está encriptada, por lo general con una variación del algoritmo MD5 realizada por Apache. Pueden encontrar en Internet varios sitios en donde encriptar las contraseñas (este por ejemplo).

Si disponemos de un servidor apache en local o acceso SSH a nuestro servidor web, podemos ejecutar el comando htpasswd para que nos cree el archivo, o nos devuelva la cadena en la misma consola :

htpasswd -nb usuario contraseña

Esta línea imprimirá en consola la cadena a agregar (manualmente) a nuestro archivo .htpasswd

htpasswd -cb .htpasswd usuario contraseña

Esta otra escribirá en el .htpasswd la cadena corespondiente.

Pueden ver un ejemplo en el panel de administración del Blog de Hack-IT

Todo esto le da una segunda capa de seguridad a los sistemas de login o cualquier lugar “sensible” que necesitemos proteger. Además esto también nos protege de los exploits, bots, robots indeseados, etc.  aunque nuestro wordpress sea vulnerable a algún ataque.

Ok, cansados? Si, se que es mucho, talvez un poco complicado o tedioso para los usuarios que se inician en el tema, pero les aseguro que todas estas prácticas  son totalmente necesarias y nos ahorrarán muchísimos dolores de cabeza el día de mañana.

Bueno pero ahora supongamos que todos estos métodos y tips que les explique para proteger nuestros sistemas, por algún motivo, no sean eficaces o estan usando algun CMS, Sistema propio, etc. que no cuenta con plugins o la seguridad suficiente en el desarrollo mismo.

¿Y ahora…quién podrá defenderme?

Les presento a nuestro próximo amigo: El Firewall de Aplicación.

En resumen un Firewall de Aplicación no es mas que un software, plugin  demod_security un servidor o filtro que se establece entre la Aplicación y la comunicación HTTP,  la cual es filtrada por el mismo para prevenir ataques de todo tipo.

Supongamos un escenario donde estamos desarrollando un sistema web o ya disponemos de un sistema “enlatado”(hecho, como wordpress) y lo ponemos en marcha.

Ahora supongamos que alguien descubre un fallo de seguridad en el mismo y se propone a arrasar con todos los sistemas de ese tipo por todo el Internet. Aquí es donde talvez nos suene los famosos “0day” o zero day, osea fallos de seguridad que no fueron reportados/parcheados y su uso es activo.

Obviamente nosotros estaríamos anotados en su lista de espera para recibir el ataque y salir heridos inexorablemente. Aquí es donde entran en juego los Firewalls de Aplicación que en base a un juego de reglas definidas por el sistema monitorean el tráfico HTTP  en busca de ataques como XSS,CSRF, SQL Injection, etc.

Podemos hacer una analogía con un antivirus, el cual puede detectar viruses que todavía no conoce, por su heurística, osea un sistema que observa comportamientos y patrones típicos de un virus y los bloquea.

Es eso lo que hace un Firewall de Aplicación y es altamente recomendable hacer uso de ellos en todos los entornos para una capa más de seguridad proactiva/testeo/debugging.

Como es un tema demasiado amplio y complejo, de momento les dejo un par de referencias de proyectos OpenSource muy buenos que podemos probar online o instalarlos  en nuestra PC o servidor.

PHPIDS(PHP Intrusion Detection Sistem)

GreenSQL

Webappsec

mod_security

9. Informarse

Como ultimo tip me gustaria invitarlos a que se informen regularmente sobre temas relacionados con la seguridad informática, ya que es un tema que encuentro muy apasionante. Esten al tanto de las noticias sobre la misma y sobre las vulnerabilidades que aparecen día a día.

Para ello pueden nutrirse de muchas fuentes:

Security Focus (Todo sobre seguridad)

Milw0rm (Los ultimos exploits para las ultimas vulnerabilidades)

Segu-Info (Uno de mis favoritos)

DragonJar (Ídem del anterior ;-) )

HispaSec

Y muchos mas que no recuerdo ahora…

A mi parecer con estos tips les haremos mucho mas difícil la tarea a los chicos malos ;-) , posiblemente se me escape alguna idea mas al respecto o haga falta hablar mas sobre algún que otro tema, pero básicamente es esto.

Mi intención con este post es tratar de llenar esos “huecos” en los temas que por ahi falta explicar más o que directamente no se los tratan.  Espero que les haya interesado, espero comentarios y me gustaria saber…

¿Ustedes, como se protegen? :-)

Luciano Laporta Podazza.

[adsense]




9 Comments for this entry

  • Laura

    sobre el punto 1. Después de cambiar de directorio el archivo, como le indicamos a wp donde buscarlo?

  • Luciano Laporta Podazza

    Hola Laura, wordpress busca el archivo solamente un directorio mas arriba de donde estaba(automaticamente), asi que el limite es solo una carpeta hacia arriba, nada mas.

    Gracias por tu comentario :)

  • Sergio

    Muy buenos consejos, la mayoría ni los conocía, y ya los voy a estar aplicando.

    Igual creo que te faltó nombrar algo importantísimo: hacer backups frecuentemente.

    No solamente te protegen de ataques, permitiendo restaurar lo que tenías sin problemas, sino que también te protege de pérdidas por errores, tanto nuestros o del proveedor de hosting (aunque no es tan malo si el dueño del hosting para compensarte te regala un mes y los demás te hace un 5% de descuento de por vida como me pasó a mí)

    Para wordpress hay plugins que hacen backups de la base de datos, las plantillas y los archivos que subimos periódicamente, e incluso nos los envían por mail. Estaría bueno que agregaras algo sobre esto.

  • Luciano Laporta Podazza

    Gracias man, la verdad que me re olvidé, ahora agrego lo que me dijiste, un abrazo!!! :-)

  • Prometeo

    Estoy intentando hacer el punto dos pero nada. Con el usuario nuevo no puedo borrar al antiguo. Y con el antiguo no puedo borrarme tampoco, je, je. ¿Qué es eso de desloguearme?

  • Luciano Laporta Podazza

    Desloguearse es cerrar tu sesión en el panel de administración, fijate que tu nuevo usuario tenga privilegios de administrador, asi podes borrar al usuario admin. Cualquier cosa no dudes en consultarme. Saludos!

  • Mr-K

    Excelentes recomendaciones de seguridad amigo!

    Leí, y puse en práctica varias… Aunque en cierta forma nos haría (o hace) ver un tanto paranóicos, los que alguna vez dedicamos tiempo al estudio de la seguridad informática tenemos en claro que NUNCA se es lo suficientemente precavido.

    Concuerdo con Sergio en las utilizaciones del backup, y también lo destaco como una de las medidas de seguridad a tener en cuenta.

    Siempre es bueno concientizar, y capacitar a los usuarios de los diferentes enlatados, para asi lograr una mejor postura de su parte a la hora de recibir un ataque, o ser víctimas de una vulnerabilidad.

    - “Because there is no patch for human stupidity”

    Gracias por tus consejos.

    Saludos.

    NOTA: Los links no me redireccionaron correctamente (el de wp-securityscan por ejemplo)

  • Luciano Laporta Podazza

    Gracias amigo!!! tanto tiempo que no se nada de vos ;) , ya voy a revisar bien los links, un abrazo enorme y espero verte nuevamente por estos pagos!! =)

  • Jorge Aguirre

    El tip 4 no me funcionó, antes por el contrario me iba “despapayando” el blog.

  • Richard Stallman en FLISOL 2009

  • Hack-IT apoya el Software Libre

    Libro Blanco

    Archives

    All entries, chronologically...