La versión 7 de Drupal, trae como característica el bloqueo de ataques de fuerza bruta, es decir, cuando una IP falla el login, Drupal mete la IP en la tabla ‘flood’ de MySQL; cuando se llega a X intentos, Drupal bloquea el acceso a dicha IP y no podrá volver a hacer login en X tiempo (todo esto es configurable en settings.php).
Dicha característica está muy bien cuando el frontal web está de cara al público y no se encuentra tras un Proxy o Balanceador, en este último caso, dicha “feature” se puede convertir en un infierno, ya que los intentos fallidos para Drupal, se muestran con la IP interna del Proxy o Balanceador y esto puede provocar, que si hay un bloqueo por intentos fallidos, absolutamente tooooodos los usuarios de Drupal, estén donde estén, sean bloqueados y no puedan hacer login en la aplicación.
La ñapa de esto, es hacer un ‘TRUNCATE’ de la tabla flood, al vaciarla, se volverá a acceder.
La solución a esto, es utilizar la variable X-FORWARDED-FOR para que Drupal vea exactamente la ip origen del cliente y bloquee correctamente las IPs (toda la info de esta variable se encuentra en el settings.php).
Ahora demos una vuelta de tuerca más, si la web está tras un Proxy o un Balanceador, tendremos todas sus IPs y será fácil de configurar, pero que pasa, si nuestro Drupal está en una instancia tras un Load Balancer de Amazon.
Pues que tenemos un problema.
Amazon es muy divertido y bonito para muchas cosas, pero como esas cosas son suyas, hay elementos a los que les cambia la IP como le apetece y cuando le apetece.
Por otro lado, todos podemos conocer la IP pública de un Balanceador de Amazon, sin embargo, no podemos saber realmente la IP interna de dicho Balanceador, eso si, nos aparecerá en todos los logs de acceso de las aplicaciones que tengamos y en la tabla ‘flood’ de Drupal, también. XD
Si echáis un vistazo a la configuración de X-FORWARDED-FOR en el settings.php, veréis que nos pide una IP fija, pero no la tenemos.
Gracias al IRC de #drupal-es y a NITEMAN en especial que me atendió y me dio muchísima información, pude sacar la solución.
Esta solución se basa en este link:
Y un poco modificado, hizo que las IPs de origen, fueran realmente las de los clientes, provocando así un bloqueo real de las IPs.
Mi configuración final en el settings.php de Drupal, ha sido la siguiente:
*/Hay que descomentar esta línea y marcarla como TRUE para que active este modo.
$conf['reverse_proxy'] = TRUE;
/**
* Specify every reverse proxy IP address in your environment.
* This setting is required if $conf['reverse_proxy'] is TRUE.
*/
#Se agregan estas líneas para que Drupal no bloquee todos los accesos, ya que solo verificaba la IP interna del balanceador
#Esta línea captura la IP interna del balanceador.
$conf['reverse_proxy_addresses'] = array_map('gethostbyname', array_map('gethostbyaddr', gethostbynamel($_SERVER['REMOTE_ADDR'])));
/**
* Set this value if your proxy server sends the client IP in a header
* other than X-Forwarded-For.
*/
#Esta línea, cambia la IP interna del balanceador por la IP origen del cliente.
$conf['reverse_proxy_header'] = 'HTTP_X_FORWARDED_FOR';
#Información adicional sobre las variables utilizadas:
#Tanto REMOTE_ADDR como HTTP_X_FORWARDED_FOR se ha sacado del acceso a Drupal, en la siguiente ruta
#Informes -> Informe de estado -> PHP ** clikar en "mas información"
#se abrirá el PHPINFO de Drupal y en Apache Environment, tendremos estas variables.
#REMOTE_ADDR tendrá que indicarnos la IP interna del Balanceador
#HTTP_X_FORWARDED_FOR tiene que darnos la IP origen del cliente.
Con estos cambios que hemos realizado, al hacer un login fallido, en la tabla ‘flood’ de Drupal, deberían aparecer las IP origen del cliente.
Espero que os sirva a esos que estáis empezando a implementar Drupal en Amazon con Balanceadores!!
Un saludo a todos.
ACTUALIZACIÓN: Es muy importante, que si utilizáis esto verifiquéis, que el acceso a esta web, solamente se puede hacer a través del balanceador. Si un usuario malintencionado averigua la IP real de la máquina y tiene acceso vía web, puede enviar cabeceras modificadas y hacer cositas con nuestra web.