Etiqueta : seguridad

Cómo proteger WordPress de ataques de fuerza bruta con un sencillo plugin

Por Antonio Casado
Developer en OpenSistemas

La seguridad en Internet es cada día más complicada y aunque utilicemos herramientas seguras y verificadas como es el caso de WordPress, nuestra web siempre está disponible (24×7) para que un asaltante trate de hacerse con la contraseña a la fuerza.

Lo ideal sería elegir contraseñas robustas y difíciles de recordar y cambiar la contraseña habitualmente, pero no todos nuestros sitios web merecen tal cantidad de sacrificio y por eso existen algunos plugins de WordPress que nos ayudan a proteger nuestra web. (más…)

La seguridad web desde WordPress como Framework de Desarrollo

post image

Por Carlos Mendoza
Consultor Open Source en OpenSistemas

Wordpress_security_whiteLa tendencia actual para el desarrollo de aplicaciones es utilizar un framework, debido a la capacidad de abstracción que este puede generar y, por consiguiente, el tiempo que nos reduce para desarrollar nuevas funcionalidades. Muchos de estos traen sus propias capas de seguridad integradas, y es necesario aprender bien de ellos para no echar a perder el tiempo empleado por los creadores para desarrollar dicho framework.

De la misma manera, algunos desarrolladores han creado herramientas para Gestión de Contenidos Web (CMS por sus siglas en inglés) como, por ejemplo Joomla!, Drupal o WordPress. Estas herramientas ayudan a crear sitios web o aplicaciones web mucho más rápido que desarrollándose desde cero. Una ventaja muy especial que tienen los CMSs es que permiten integrar nuevas funcionalidades a modo de plugins y plantillas para la visualización a modo de temas. Es justamente en esta parte donde entra el desarrollador, ya que muchos desarrolladores de la comunidad que integran los CMSs mencionados son terceros que desean ayudar al crecimiento y mejora de estas herramientas. Muchas veces, por simple desconocimiento, los desarrolladores crean nuevas funcionalidades sin considerar las propiedades que el CMS provee, ya sea por estar acostumbrados a programar de una manera específica o por hacerlo más rápido, pero esto provoca que se creen varios fallos de seguridad en el momento de utilizarlos en un entorno de producción.

WordPress como framework de desarrollo

WordPress es una herramienta libre que en sus inicios fue creada para montar rápida y fácilmente un entorno para blogs, permitiendo al usuario invertir más tiempo en lo que verdaderamente deseaba: Crear publicaciones en su blog. Con el paso de los años y con el avance de las tecnologías web, esta herramienta pasó a ser de un “simple” entorno de blogs a un CMS mucho más general, que permite crear diversos tipos de aplicaciones web como tiendas online, galerías de fotos para publicidad o entornos visuales de contenido, por citar unos ejemplos.

Esta herramienta permite integrar nuevas funcionalidades a modo de plugins, como por ejemplo, crear nuevos tipos de contenido, taxonomías, etc. WordPress provee una API de desarrollo, en su mayor parte documentada y explicada con ejemplos, que permite a los desarrolladores crear las nuevas funcionalidades que desean, facilitando varios problemas de seguridad que se puedan producir al escribir código desde cero y evitando también que se modifique el “core” del CMS a través de “hooks”.

Para enfrentar diferentes problemas de seguridad, WordPress proporciona una serie de funciones, algunas de las cuales se describen a continuación.

1. Autenticación y autorización
WordPress utiliza una clase llamada PHPass para tratar con el tema de la seguridad de la contraseña. Dentro de esta clase se encuentra el método HashPassword, que es el que se encarga de encriptar la contraseña ingresada por el usuario al registrarse o al hacer login en la aplicación. Esto lo hace utilizando la función crypt de PHP, enviándole también un parámetro generado aleatoriamente como un salt.

Como el primer fallo de autenticación es el fallo humano, es recomendable no utilizar nombres “estándar” para usuarios, como “admin”, “administrator”, “wordpress”, ya que son los usuarios que primero se utilizarán para un ataque.

La segunda táctica de entrada sería la debilidad de la contraseña. En las últimas versiones de WordPress se ha incluido un generador de contraseñas para ayudar a los usuarios a tener una contraseña segura y evitar que su usuario sea vulnerable. Existen plugins que se encargan de reforzar la seguridad de login de WordPress, como por ejemplo Login Security Solution y Stop User Enumeration, este último evita que se pueda “adivinar” nombres de usuarios de WordPress en el front utilizando la página de autor.

Cuando se trata de formularios, WordPress se asegura de que el origen de la petición sea desde la misma aplicación, mediante el uso de nonce. Nonce puede ser utilizado a modo de variable (en caso de enviar por GET) o campo en un formulario. Para crear un nonce, WordPress ofrece la función wp_create_nonce($action), esto permite que se genere un token que será utilizado una única vez. El parámetro $action determina un valor particular para el nonce que se desea crear, esto es para poder aplicar filtros particulares para esta acción mediante un plugin. También existe la función wp_nonce_field(), que crea un campo de tipo hidden para el formulario. Esta función recibe algunos parámetros para indicar el nombre del nonce y otras condicionales para generar también un campo con el referer, de tal manera que se pueda asegurar la procedencia del formulario.

El valor generado para nonce será verificado posteriormente por la función wp_verify_nonce().

2. SSL
WordPress permite configurar que las diferentes peticiones que se realicen entre el cliente y el backend (Administración) sean mediante SSL. Esto se logra definiendo una constante en el fichero de configuración llamada FORCE_SSL_ADMIN.

<?php define('FORCE_SSL_ADMIN', true);?>

3. Ataques XSS
Con el propósito de evitar ataques XSS, WordPress ofrece una serie de funciones que permiten validar los datos de entrada, especialmente para los formularios y para la creación de nuevas entradas en el blog. Estas funciones se clasifican de acuerdo a su uso y son:

Slugs
sanitize_title( $title ) crea un slug a partir del título de la entrada o página para ser identificado, reemplazando espacios y ciertos caracteres por “-“.
sanitize_user( $username, $strict = false ) que filtra el nombre de usuario al crear uno nuevo, de tal manera que omita caracteres no permitidos para nombres de usuario. En caso de que $strict sea true, sólo permitirá caracteres alfanuméricos y _, espacio, ., -, *, @

HTML
balanceTags( $html ) / force_balance_tags( $html ) analiza el texto html que se inserta en el contenido de la entrada para evitar que se queden etiquetas html sin cerrar para que dicho contenido sea válido.

tag_escape( $thml_tag_name ) reemplaza los caracteres que no sean de tipo a-zA-Z0-9_:, para crear el slug por el que será identificada la etiqueta.
sanitize_html_class( $class, $fallback ) filtra los valores para nombres de clase y que éstos sean válidos para html.

Email
is_email( $email_address ) permite validar que la dirección de correo electrónico insertada sea válida al realizar ajustes en el campo email de usuario.
De la misma manera, existe un conjunto de funciones que filtran la salida de los campos, como el contenido de una entrada, para filtrar por etiquetas o códigos (scripts) no permitidos.

Por último, la mayoría de estas funciones aceptan diferentes tipos de hooks, que pueden ser acciones o filtros, permitiendo agregar nuevos tipos de validaciones dependiendo del valor que se le pasa.

Cabe recalcar que estas funciones pueden ser reutilizadas en diferentes ámbitos, por lo que sirven también durante el desarrollo de plugins, facilitando la validación de los mismos.

4. Robo de sesiones
Con la idea de prevenir un robo de sesión, WordPress permite configurar que el login se realice por SSL, basta con definir la constante FORCE_SSL_LOGIN en el archivo wp-config.php. Con esto se evita que las contraseñas sean enviadas en texto claro.

<?php define('FORCE_SSL_LOGIN', true);?>

Aún así, existen plugins que pueden reforzar este tipo de seguridad, como la doble autenticación de Google Authenticator.

5. SQL Injection

Cuando se trata de manejar valores en las diferentes operaciones en una BBDD, WordPress ofrece varias funcionalidades para evitar posibles ataques por inyección sql.

La base de datos de WordPress consta de unas tablas generales o estándar, que son las principales tablas que se utilizan durante la sesión y la navegación. Estas tablas tienen nombres por defecto y una persona con conocimientos generales de una base de datos de WordPress podría identificar fácilmente dichas tablas.

Para evitar que se pueda atacar directamente a las tablas, en el fichero de configuración de WordPress se puede modificar el prefijo que se utilizará como parte del nombre de las tablas de la base de datos, de tal manera que un atacante no sepa en primera instancia los nombres de dichas tablas. Si se llegara a dar un ataque por inyección, al menos no habría que ponérselo tan fácil al atacante, ¿no?

Por otro lado, para el envío de valores a través de un formulario, WordPress proporciona una función llamada “prepare”, que es muy similar a mysql_real_escape_string de PHP, pero la diferencia radica en que WordPress agrega las comillas simples en los tipos de formato establecidos (%s por ejemplo) y a su vez también permite aplicar filtros para los parámetros en algún caso en particular. Estos filtros podrían ser validaciones propias del creador del plugin. Para esto es necesario utilizar la variable global $wpdb (una instancia de la clase wpdb) que es quien gestiona los datos de conexión en WordPress. Esta clase contiene los nombres de las tablas estándar de una base de datos de WordPress, de tal manera que no sea necesario escribir el nombre de la tabla. Por ejemplo, una query para consultar la tabla de usuarios filtrando por el login podría ser:

<?php $wpdb->prepare("SELECT * FROM $wpdb->users WHERE user_login = %s", $user_login);?>

Para el caso de sentencias donde se desea insertar, actualizar o eliminar datos, wpdb ofrece métodos que permiten realizar dichas sentencias, permitiendo también las restricciones por formato. Por ejemplo, para insertar un nuevo registro en una tabla rs_suscripciones creada en un plugin:

<?php $wpdb->insert(
    $wpdb->prefix."suscripciones",
    array("user_id" => $user_id, "blog_id" => get_current_blog()),
    array("%d", "%d")
);?>
<?php $wpdb->update(
    $wpdb->prefix."suscripciones",
    array( "blog_id" => get_current_blog()),
    array( "user_id" => $user_id), //where
    array( "%d" ),
    array( "%d" ) //formato del where
);?>

Como se puede observar, la forma sugerida para el nombre de la tabla es conservar el prefijo estándar para la instancia de WordPress, de tal forma que se mantenga la homogeneidad.

Conclusión

Las diferentes funciones que ofrece WordPress permiten que los desarrolladores de plugins puedan crear nuevas funcionalidades tomando en cuenta la seguridad, incluso también crear nuevos plugins que incrementen la seguridad del portal web. Aún así, es necesario quienes montan el entorno deben tomar las medidas necesarias para evitar los ataques más básicos. Asimismo, no es muy recomendable confiar en cualquier plugin que se encuentre, es mejor buscarlos en sitios determinados y oficiales, como la misma página de WordPress, donde la comunidad puede valorar el funcionamiento y compatibilidad de los plugins.

Backups LANFREE mediante copia de punteros

Por Juan Manuel Conde
Software engineer at OpenSistemas

Cuando necesitamos hacer backup de una gran cantidad de información de un servidor, puede llegar a ser inviable hacerlo por red. No obstante, existen agentes de backup que permiten realizar estas copias por fibra (LANFREE), pero si nuestro software de backup no dispone de ellos, podemos hacerlo aprovechando la copia de punteros con la que cuentan la mayoría de las cabinas de disco hoy en día.
(más…)

Reflexiones: Software Libre y Google

Por Fernando Monera
CINO de OpenSistemas

Desde el principio me aproximé al Software Libre desde un punto de vista nada idealista. Por supuesto me parecía muy interesante toda la parte sociológica, pero la decisión por el Software Libre como uno de los pilares sobre los que basar mi futuro fue por razones mucho más naturales. Las bases del Software Libre eran muy sólidas, lo suficiente como para confiar que puede ser un pilar sólido para cualquier cosa que quiera hacer o crear. (más…)

Fuentes del código del DNI electrónico en Linux

Leo en este hilo de Kriptópolis que por fin se ha publicado el código fuente del paquete opensc-dnie. Recordemos la absurda decisión de dar una falsa sensación de seguridad (con la oscuridad, vamos) que hasta ahora brindaba el DNIe, al negarse a entregar las fuentes. Aun quedan varios puntos poco claros (releyendo mi post de hace más de un año los encontraremos). Pero ahora añadimos alguno más: ¿qué sentido tiene que, como se comenta en Kriptopolis, que hayan eliminado las claves necesarias para establecer el canal seguro? Me pregunto esto porque, primero, pueden obtenerse por ingeniería inversa (que no olvidemos, es totalmente legal en la mayoría de los casos). Y segundo, porque además la propia DGP las ha publicado en otro lugar. De aquí, a juntarlo todo y hacer un paquete útil al ciudadano es un paso (como de hecho se puede observar en el mencionado hilo de Kriptópolis). Pero estas cosas deberían dárnoslas hechas: a fin de cuentas ya les pagamos ese trabajo con nuestros impuestos.