Manteniendo tu Drupal Seguro

Antes de comenzar a describir una serie de tips y recomendaciones para tener tu instalación drupal segura, voy a explicar un poco desde donde nace todo y el valor que tiene el Open Source y porque es tan importante para nuestra seguridad.

El software libre tiene una particularidad que ningún otra pieza de software puede tener. La comunidad que la respalda.

Cuando hablamos de software libre nos referiremos a un software o parte de este, de uso completamente autónomo que quiero decir con esto, lo puedo modificar, vender, reutilizar pero siempre aceptando que el producto que tu logres en base a ese software libre siempre siga siendo libre. Este ingenioso modelo de desarrollo ha posibilitado desarrollar tecnologías increíblemente robustas en poco tiempo y tirar al tacho de la basura otras que no merecían seguir creciendo, algo así como selección natural pero en el ámbito de la informática.

Todo el mundo puede crear su pieza de software y al soltarlo al mundo, este se valida por sus propias virtudes y no por la cantidad de dinero que invierte una empresa de desarrollo de software en publicidad, creando un producto al alcance de todos pero con algunos bemoles que describiremos mas adelante.

¿Y que tiene que ver esto con Drupal y su seguridad?

 - Todo .... así de simple.

Drupal el Tecnología Open Source que creció porque los usuarios lo encontraron interesante y fueron aportando y modelando hasta lo que hoy en día es, el CMS mas flexible y popular por lo menos en esta parte del mundo.

Drupal al ser desarrollado colaborativa mente con la comunidad, cada pieza de código es revisada no por una o dos personas, por cientos de personas que corrigen y mejora cada bloque de código escrito para drupal lo que convierte a la comunidad en una inmensa empresa de testing de drupal completamente gratuito para todo el que lo usa. 

Lo que una empresa de software tarda en encontrar, recopilar y reparar un error, la comunidades de código libre tardan lo demora que al menos 100 personas tardarían en encontrar y resolver un problema. Esto es impagable para cualquier empresa de software si quisiéramos monetizar las HH que se invertirían en esta tarea, por lo que el open source y particularmente drupal no tiene competencia. Algo así como stream programming pero cada uno en su casa.

1. Actualizaciones de Seguridad

Nuestro primer tip de seguridad para nuestros sitios Drupal, es nunca ignorar las alertas de seguridad de drupal.

Detrás de cada recuadro rojo de alerta de seguridad existe un ejercito de personas que analizo y reparo un error grave para nuestros sistemas y que por lo general nosotros como expertos programadores o usuarios de drupal, nos pasamos por la quilla a todo este ejercito de personas al decir ¿Que tontera tengo que actualizar ahora? ó ¿Que se les ocurrió ahora que esta mal?

Actualiza .... si para ti es tedioso este proceso usa drush que te simplifica esta tarea de sobremanera y lo amaras incluso mas que a tu mascota.

 2. Filtro código PHP

Es útil tener a nuestra disposición ejecución PHP dentro de drupal, pero a la ves es tremendamente peligroso. Sobre todo cuando no lo configuramos bien o el cliente, programador o cualquiera involucrado en el desarrollo del sitio no es de nuestra confianza.

Si puedes evitar habilitar esta particularidad hazlo.

[[{"type":"media","view_mode":"media_original","fid":"19","attributes":{"alt":"","class":"media-image","height":"190","width":"568"}}]] 

 Pero si no puedes preocupate de mantener las siguiente precaución.

 [[{"type":"media","view_mode":"media_original","fid":"20","attributes":{"alt":"","class":"media-image","height":"142","width":"713"}}]]

 Nunca, pero nunca permitir que los usuarios anónimos puedan utilizar este filtro.

 3. XSS

La definición mas clara es :

XSS, del inglés Cross-site scripting es un tipo de inseguridad informática o agujero de seguridad típico de las aplicaciones Web, que permite a una tercera parte inyectar en páginas web vistas por el usuario código JavaScript o en otro lenguaje script similar (ej: VBScript), evitando medidas de control como la Política del mismo origen. Este tipo de vulnerabilidad se conoce en español con el nombre de Secuencias de comandos en sitios cruzados.

Es uno de los ataques mas frecuentes a sitios Drupal, no representan un peligro grave pero no esta demás darle un poco de atención.

El ataque es relativamente simple, por ejemplo si nuestro sitio permite dejar comentarios de usuarios anónimos y el campo donde el visitante ingresa el comentario no es filtrado correctamente antes de ser insertado en la base de datos, nuestro sitio podría se víctima de este ataque.

El usuario ingresa junto con un comentario positivo como "Esta genial tu sitio!!!" pero además agrega código javascript aprovechando alguna vulnerabilidad del sistema basta que nosotros autenticados como administrador visitemos esa pagina y el código se ejecutara como administrador del sitio y podría hacernos pasar un mal rato.

Afortunadamente es simple protegerse de este ataque:

  1. Revise sus filtros de entrada, nunca permita HTML sin filtrar en sus contenidos. Solo permita etiquetas confiables.
  2. Actualice regularmente sus módulos si presentan fallas de seguridad.
  3. Si programa sus propios módulos, siga las normas de seguridad.

4. SQL injector

Esto si es muy grave y debemos poner mucha atención cuando programamos o instalamos módulos nos muy confiables.

Por lo general ocurre con programadores inexpertos o a veces con descuidos a la hora de desarrollar nuestros algoritmos, este ataque se basa en aprovechar una brecha de seguridad al pasar parámetros desde el sitio web a nuestro código (modulo), basta con usar el camino rápido para irnos directo al desastre.

Esto es una sentencia SQL recomendada a la hora de hacer querys en nuestros módulos

= db_query("SELECT nid FROM {node} WHERE type = '%s'", );

Pongan atención a esta sección de la sentencia type = '%s'", , aqui lo que estamos haciendo es pasar a la query un valor dinámico de string que indica el tipo de pagina que deseamos obtener, esta sentencia una ves realizada quedaría como esto:

"SELECT nid FROM {node} WHERE type = 'page'"

Al utilizar esta sentencia, evitamos la Inyección de código a nuestra query. Al momento de procesar el argumento el sistema limpia toda presencia de código mal intencionado y posteriormente completa la Query.

Ahora voy a mostrar una mala practica y sus consecuencias.

= db_query("SELECT nid FROM node WHERE type = ''");

Acá estamos en presencia de un potencial peligro si lo unimos con un argumento obtenido desde la url, fácilmente podría transformarse en esto.

= db_query("SELECT nid FROM node WHERE type = ''; DELETE FROM users;--

si ponemos como argumento '; DELETE FROM users;--.

Y todos nuestros usuarios se van de paseo, pero un paseo sin regreso.

 Bueno eso es todo por el momento les dejo algunos links interesantes para que puedan profundizar