limpia tú pc

30 de abril de 2008

Paso esta dirección que he encontrado navegando y recapacito de lo dura y sucia que es el vida del Informático. Lo más duro que me he encontrado dentro de un PC fue una vez una peseta. ¿como puede meterse una peseta dentro de un ordenador? ¿la ha aspirado el ventilador?.

acceder a paginas amarillas

27 de abril de 2008

Supongamos que somos un fabricante de tornillos y queremos introducir nuestro producto en diferentes tiendas como pueden ser ferreterías, grandes almacenes, centros de bricolaje, etc. Pues bien hay una manera más fácil que ir recorriendo todas las calles de nuestras ciudades buscando estos centros y es consultar directamente sobre paginas amarillas.

El objetivo es tener nuestra propia base de datos con posibles clientes y poder así cruzarla con los clientes que ya tenemos.
Dado que estamos tratando datos de carácter personal, que los estamos almacenando informáticamente en nuestras base datos y que posteriormente realizaremos una comunicación (electrónica o no) con estos posibles clientes, tendremos en primer lugar que registrar nuestra base de datos en la Agencia de protección de datos y luego al iniciar una comunicación con nuestros posibles clientes advertir de donde hemos sacado sus datos y de su derecho a cancelarlos. Recomiento leer esta resolución.

El objetivo de este post es explicar como extraer estos datos. Para ello utilizaremos un software Open llamado Web-Harvest que es un extractor de datos Web programado en Java. En las nuevas versiones creo que ya trae un editor grafico para configurar.

El problema ahora es encontrar la mejor fuente de paginas amarillas para extraer estos datos. Lo lógico es irse directamente a www.paginas-amarillas.es y sacarlos de allí, el problema es que está complicado: primero porque devuelve un numero limitado de registros y hay que acotar la búsqueda, y segundo su código HTML es difícil de manipular (los registros y la posición de los datos personales no siempre están en la misma posición).
Hay que navegar bastante hasta encontrar una pagina Web que se alimente de paginas amarillas, que de todos los registros sin necesidad de acotar y por ultimo el formato de los registros sea constante. Hay muchos portales que tienen contratado con paginas amarillas un buscador, entre ellos y el que mejor me ha resultado es el buscador de paginas amarillas de Ya.com.

Si nos vamos al buscador de paginas amarillas de Ya.com y buscamos todas las ferreterías de españa tenemos que en total hay 11.743 repartidas en 783 paginas y en cada una de ellas se muestran 15 registros siempre con un mismo formato HTML.

Veamos en HTML como se muestra cada resultado. Cada resultado se muestra dentro de una etiqueta Div (resultado) y seguidamente tenemos el nombre de la ferretería, una descripción, una Web y su dirección.

<div class="resultado">
   <h6><a target="_blank" href="http://www.paginasamarillas.es/functions/jump.asp?
site=xpaol&dest=www.comenza.com&c=128462084&t=IL&IPalianza=64.157.2.173
&producto=PAO&a=001&id_busq=xpao262793052024641203737573387486727&posicion=2
&ip_usuario=82.29.132.38">COMENZA</a></h6>
   <p>Productos de alta calidad, fabricados usando las últimas tecnologías.</p>
   <p><a target="_blank" href="http://www.comenza.com">www.comenza.com</a></p>   
   <p><span>Avenida Benigno Rivera, s/n (pol. ind. Ceao) LUGO LUGO 27290</span></p>
</div>
También vemos que la URL de paginas amarillas siempre se mantiene igual:

 http://paginas-amarillas.ya.com/SPagAmarillas/search?actividad=ferreterias&page=XXX
y lo único que varia es el parámetro page. Sabemos que tenemos 783 paginas (serán también el numero de consultas que tendrá que hacer nuestro programa).

Ahora solo nos queda instalar el programa Web-Harvest y lanzarlo para que vaya realizando las 783 peticiones Web y extraiga los datos de estas paginas. Hay que decir que los resultados se dejan en formato XML que posteriormente lo tendremos que cargar en nuestra base de datos o donde sea.

1) Nos instalamos el Java JDK y si ya lo tenemos hacemos una "java version" para ver que versión tenemos.
2) Nos descargamos el Web-Harvest y lo descomprimimos en una carpeta temporal. También necesitaremos estos jars adicionales que deberán copiarse en la misma carpeta.
3) Descomprimir estos archivos XML con la configuración ya hecha para atacar directamente contra Ya.com buscando ferreterias.
4) Lanzar el programa con "java -Xms32m -Xmx1000m -jar webharvest05.jar config=busca_ya.xml workdir=c:\temp debug=yes".

Dado que se procesan muchos registros antes de escribir en disco el XML con el resultado, es necesario aumentar la pila de Java a 1Gb con el parámetro -xmx1000m.

Una vez lanzado nos toca esperar. Como hemos lanzado la aplicación Java en modo debug iremos viendo como vamos realizando las 783 peticiones (es en este momento cuando loas administradores se llevan las manos a la cabeza y dices “Dios cuantas peticiones de una misma IP!”)

El archivo clave para la configuración es busca_ya.xml. De el sólo nos interesan las siguientes lineas:
<call-param name="pageUrl">http://paginas-amarillas.ya.com/SPagAmarillas/search?
actividad=ferreterias;page=1</call-param>
<call-param name="baseUrl">http://paginas-amarillas.ya.com/SPagAmarillas/search?
actividad=ferreterias&page=</call-param>
<call-param name="itemXPath">//div[@class="resultado"]</call-param>
<call-param name="maxloops">783</call-param>
La primera de ella nos indica cual será la primera pagina que accederemos. La segunda nos indica el formato de la URL para las siguientes peticiones. La tercera nos indica en formato XPath donde se encuentra los registros con los resultados. Por ultimo, la cuarta línea nos indica el numero de peticiones Web que tenemos que hacer.

Web-Harvest es una aplicación muy potente que nos puede dar ideas para muchas cosas. Recomiendo ver su librería de ejemplos y también este manual de XPath para poder realizar búsquedas correctas dentro del HTML.

Si te falta el número de teléfono puedes utilizar este programa para atacar contra Google Map que si te muestra el numero de teléfono.

descargar archivos fuentes del ejemplo

mi nueva camara

Mi Canon PowerShot G6 paso a la historia. Ahora tengo una más "profesional" la Canon EOS 400D que aunque me ha salido más barata que la anterior seguro que me da más juego. Aquí estan las primeras fotos y rapidamente me doy cuenta que el zoom que trae de serie en la optica se me quedará corto.

direcciones de correo Zimbra en PHP

26 de abril de 2008

Para obtener un listado de direcciones de correo del Zimbra es posible acceder via PHP al servidor de LDAP donde se guarda toda la información de los usuarios dados de alta. De esta forma podemos publicar en nuestra intranet corporativa un listado siempre actualizado de las direcciones de todos los empleados.

Desde la base de datos LDAP podremos consultar el nombre del usuario, su dirección de correo, teléfono, estado de la cuenta, etc.
Lo que recomiendo primero es utilizar algún LDAP Explorer para conectarse al servidor de LDAP del Zimbra y ver su estructura para comprender el nombre de los campos del siguiente código en PHP.

Supongamos que nuestro servidor de correo esta en 10.10.10.10 y que nuestro dominio de correo es midominio.com. El código PHP para acceder a LDAP seria:

   $ad = ldap_connect("ldap://10.10.10.10");
   ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3);
   $ldapbind = ldap_bind($ad,"","");      
   //*** buscamos todos los detarpamentos o Unidades Organizativas (OU)
   $result = ldap_search($ad, "ou=people,dc=midominio,dc=com","(uid=*)");
   ldap_sort($ad,$result,"uid");
   $info = ldap_get_entries($ad, $result);

   echo "<table border=0>";
   echo "  <tr>";
   echo "   <td>usuario";
   echo "   <td>direccion";
   echo "   <td>departamento";
   echo "   <td>telefono";
   echo "   <td>estado";
   echo "  </tr>";

   for ( $i=0; $i<$info["count"]; $i++ ) {
      $r = "uid=".$info[$i]["uid"][0].",ou=people,dc=midominio,dc=com";
      $result = ldap_search($ad, $r,"(sn=*)");
      $info2 = ldap_get_entries($ad, $result);
      for ($j=0; $j<$info2["count"]; $j++) {
         if ( ($info2[$j]["displayname"][0]<>"") && ($info2[$j]["objectclass"][3]<>"zimbraCalendarResource") ) {

            echo "   <tr>";
            echo "      <td>" .$info2[$j]["displayname"][0]. "";
            echo "      <td>" .$info2[$j]["mail"][0] ."";
            echo "      <td>" .utf8_decode($info2[$j]["ou"][0]) ."";
            echo "      <td>" .$info2[$j]["telephonenumber"][0].$info2[$j]["objectclass"][3]."</td>";

            $estado = "";
            if ($info2[$j]["zimbramailstatus"][0]=="disabled")
               $estado = "CERRADO!";
            echo "<td>".$estado."</td>";
            echo "</tr>";

        }
      }
   }

   echo "<</table>";
   ldap_close($ad);
Para hacer funcionar este código asegúrate que primero tú servidor PHP tiene soporte para LDAP, de lo contrario tendrás que instalarlo y segundo asegúrate que el firewall donde tengas instalado el Zimbra te deja acceder al puerto de LDAP.

zimbra y spamassessin: bajar los niveles de las puntuaciones

20 de abril de 2008

Zimbra trae una configuración por defecto en Spamassessin que puede o no ser la adecuada para cada empresa.
En mi caso, con el tiempo me di cuenta que no era así y tuve que comenzar a ir modificando parámetros cuando empezaron a detectarse correo validos como spam (fasos positivos). Imagínate si trabajas en un sexshop o en una farmacia; tendrías un montón de correos validos que los detectaría como spam y por tanto estarías obligado a modificar todos los parámetros de spamassessin para ajustarlos a tu política.

Para entendernos mejor empezaremos con un mail que ha sido analizado por Spamassessin. Cualquier mail que pase por Zimbra encontraremos en el cuerpo del mail algo como (el resto de headers no interesan ahora mismo):

   ...
   X-Spam-Flag: YES
   X-Spam-Score: 10.565
   X-Spam-Level: **********
   X-Spam-Status: Yes, score=10.565 tagged_above=-10 required=4
      tests=[BAYES_99=3.5, FH_HOST_ALMOST_IP=1.751, RCVD_IN_PBL=0.905,
      RCVD_IN_SORBS_DUL=0.877, RCVD_IN_XBL=2.033, URIBL_SBL=1.499]
   ...
Este mail a sido detectado como Spam porque a recibido una puntuación de 10.565. Dado que esta puntuación es mayor que required=4 se marca como spam. Los test que ha hecho spamassessin para detectar que esto es una spam son: BAYES_99, FH_HOST_ALMOST_IP, RCVD_IN_PBL, RCVD_IN_SORBS_DUL, RCVD_IN_XBL, URIBL_SBL. Cada uno de estos test está configurado para recibir una puntuación en caso de darse cierto el test.

En esta pagina podéis encontrar todos los tests, que hace cada uno de ello y la puntuación que recibe.

Volviendo a mi problema, si un correo es detectado como spam tenemos 4 posibilidades:

1. Ir al Webmail del usuario, entrar dentro de la carpeta Basura (Junk), seleccionar el correo detectado como basura y pulsar sobre el botón "No basura".
2. Modificar los parámetros generales para especificar la puntuación mínima para un spam.
3. Añadir al usuario a una lista blanca.
4. Modificar los scores para los diferentes test que hace el spamassessin.

La primera solución parece la más correcta porque le decimos a Zimbra que ese correo no lo detecte como spam, pero en mi caso no funciona porque el 99% de los usuarios acceden por Outlook y por tanto esta funcionalidad no la pueden usar.
Para la segunda opción si ejecutamos "./zmprov gacf" o entramos en la Web de administración de Zimbra, tendremos dos parámetros por los cuales se define cuando un correo es spam. Estos dos parámetros son:
   zimbraSpamKillPercent: 75
   zimbraSpamTagPercent: 20
El SpamTag define cuando un correo es considerado Spam y el otro cuando es considerado spam y por tanto debe eliminarse directamente (no aparece ni en la carpeta Basura del usuario).

En ejemplo anterior son necesarios 4 puntos para marcar el correo como spam. Este valor sale de:

   ZimbraSpamTagPercent * 20% = 20 * 0,2  = 4
Por el otro lado tenemos que 15 son los puntos necesarios para eliminar el correo:
   ZimbraSpamKillPercent * 20% = 75 * 0,2 = 15
Por tanto cambiando el valor de estos dos parámetros (con el comando zmprov o desde la Web de administración) podemos cambiar el comportamiento del spam.

Para el tercer método, añadiremos al remitente a una lista blanca. En mi caso tuve muchos problemas con todos los mails que vienen de amadeus.net. Esta empresa es la que gestiona todas las reservas de billetes de avión, hoteles, barcos, etc, y por tanto todos los mails de confirmaciones de billetes iban al spam. Era necesario evitar esto. Para ello hay que meter este dominio dentro del archivo /opt/zimbra/conf/spamassessin/60_whitelist.cf

Hay que añadir al final del archivo algo como esto y reiniciar Zimbra (o reiniciar el Amavis):

   whitelist_from_rcvd *@*.amadeus.net   amadeus.net
Recomiendo echar un vistazo a todos los archivos de esta carpeta.

Para finalizar, la cuarta opción es modificar los scores directamente dependiendo de nuestras necesidades. Para ello necesitamos saber que scores cambiar y que es lo que hace ese test para recibir ese score. Si editamos /opt/zimbra/conf/spamassession/50_scores.cf podremos ver las diferentes puntuaciones asignadas a las tests.

Por ejemplo, dado la naturaleza de mis correos, muchos correos se envían por el asunto en mayúsculas o sin asunto y el spamassession le asigna un puntuación un poco alta. Entonces lo que podemos hacer es (por ejemplo) bajar un punto a las pruebas MISSING_SUBJECT y SUBJ_ALL_CAPS.

Ahora solo tendremos que reiniciar el Zimbra y hacer una prueba para ver como cambian las puntuaciones en el mail sin nuestras modificaciones y con las nueva modificaciones.

41 horas encerrado

15 de abril de 2008

El otro día comentaba en el trabajo que pasaría si un fin de semana al migrar algún servidor nos quedamos encerrados en el montacargas... y sólo estamos nosotros en la empresa. Pues supongo que haríamos lo mismo que este tío que se quedo 41 horas encerrado en el ascensor.

parte 5: activación de dyndns

13 de abril de 2008

Todos los que tenemos un ISP que nos proporciona IP dinámica tenemos el mismo problema para acceder al router desde fuera, ¿cual es la IP asignada al router una vez levantada la interfaz?.
El software de IOS nos proporciona el mecanismo para registrar la IP asignada a un servicio de DNS. Este servicio lo tenemos que contratar (gratis) para que cada vez que obtengamos una IP dinámica se actualice nuestro DNS.

A partir de la IOS 12.2 Cisco proporciona Dynamic DNS que es implementación de como a través de llamadas HTTP actualizar la IP dinámica con el servicio de DNS.

Lo primero que tenemos que hacer es irnos a un servicio gratuito de DynDNS y darnos de alta. Simplemente necesitaremos a mano el nombre de usuario, la contraseña, el dominio seleccionado y la URL para la actualización de la IP.

Una vez tengamos estos datos ya podemos configurar el router:

(config)# ip domain lookup
(config)# ip name-server 194.179.1.100
(config)# ip name-server 194.179.1.101
(config)# ip ddns update method myddns
(DDNS-update-method)# http
(DDNS-HTTP)# add http://<usr>:<psw>@members.dyndns.org/nic/update?system=dyndns&hostname=<h>&myip=<a>
(DDNS-HTTP)# remove http://<usr>:<psw>@members.dyndns.org/nic/update?system=dyndns&hostname=<h>&myip=<a>
Nota: Para introducir el carácter especial "?" hay que pulsar Ctrl+v, soltar y luego escribir "?".

Los valores de "<usr>" y "<psw>" son los que hemos seleccionados en la pagina de registro del servicio.

Ahora solo queda aplicar esta configuración a la interfaz a la que quiero actualizar la dirección IP. En mi caso a la interfaz de ADSL:
(config)# interface dialer 0
(config-if)# ip ddns update hostname <mi dominio seleccionado>
(config-if)# ip ddns update myddns
# copy running-config startup-config
# reload
Donde "<mi dominio seleccionado>" es el dominio que he contratado con el servicio gratuito. Por ejemplo "mirouter.dyndns.org".

Para ver si todo esta funcionando correctamente podemos hacer desde nuestra maquina un "ping mirouter.dyndns.org" para ver si se traduce con la IP asignada a nuestro router. Si no es así podemos activar el debug de Dynamic DNS y ver que esta pasando:
(config)# debug ip ddns update
(config))# interface dialer 0
(config-if)# shutdown
(config-if)# no shutdown
Más configuraciones en no-ip.com.

parte 3: Configuración para acceso por VPN por IpSec

En esta parte configuraremos el router para dar acceso por VPN y acceder de forma segura a la Lan interna de nuestra red.
Existen diferentes formas de crear VPNs, y la que utilizaremos aquí será una VPN a través de los protocolos de Ipsec y una validación del clientes a través de Radius. En el caso de los cliente generaran la VPN a través del Cisco VPN Client.

Los pasos que debemos seguir son:

+ Preparación de IKE e Ipsec, donde decidiremos los algoritmos de cifrado y hash que queremos utilizar así como los parámetros TCP/IP que recibirán los clientes una vez conectados a la VPN.
+ Configuración de la primera fase de IKE. En nuestro caso utilizaremos cifrado 3DES y una autentificación de clave precompartida.
+ Configuración de la segunda fase de IKE (o configuración de IpSec). Para esta parte también utilizaremos 3DES para el cifrado, SHA para las funciones de Hash y Radius para la validación del cliente.
+ Por ultimo comprobaremos y verificaremos IKE para ver si funciona correctamente cuando los clientes empiecen a conectarse por VPN.

Comenzamos pues con la configuración de la primera fase de IKE:

(config)# crypto isakmp policy 1
(config-isakmp)# encr 3des
(config-isakmp)# authentication pre-share
(config-isakmp)# group 2
(config)# ip local pool vpnpool 192.168.2.1 192.168.2.255
(config)# crypto isakmp client configuration group thevpn
(config-isakmp-group)# key 1827hdyha2
(config-isakmp-group)# dns 212.73.32.3 212.73.32.67
(config-isakmp-group)# pool vpnpool
(config-isakmp-group)# max-users 3
(config-isakmp-group)# netmask 255.255.255.0
(config-isakmp-group)# acl 101
Configuramos la segunda fase de IKE o Ipsec:

(config)#crypto ipsec transform-set ESP-3DES-SHA esp-3des esp-sha-hmac
(config)#crypto dynamic-map dynmap1 1
(config-crypto-map)#set security-association idle-time 3600
(config-crypto-map)#set transform-set ESP-3DES-SHA
(config-crypto-map)#reverse-route
Utilizamos el Radius local que ya habíamos configurado para la Wireless:

(config)#aaa authorization network authovpn local
(config)#aaa authentication login authenvpn local
(config)#crypto map mymap client authentication list authenvpn
(config)#crypto map mymap isakmp authorization list authovpn
(config)#crypto map mymap client configuration address respond
(config)#crypto map mymap 65535 ipsec-isakmp dynamic dynmap1
Aplicamos el mapa de Ipsec a la interfaz de ADSL que es la que queremos que escuche las conexiones de VPN:

(config)#interface dialer 0
(config-if)#crypto map mymap
Configuramos las ACLs necesarias:

(config)# access-list 101 permit ip 192.168.1.0 0.0.0.255 any
(config)# access-list 102 deny ip 192.168.1.0 0.0.0.255 192.168.2.0 0.0.0.255
(config)# access-list 102 permit ip 192.168.1.0 0.0.0.255 any
(config)# route-map myrm permit 1
(config-route-map)# match ip address 102
(config)# no ip nat inside source list 1 interface Dialer0 overload
(config)# ip nat source route-map myrm interface dialer 0 overload
Ahora ya podemos configurar nuestro cliente de VPN con la IP de la ADSL, el grupo y la password y probar si podemos conectarnos por VPN.
Podemos utilizar los comanndos "debug crypto isakmp" y "debug crypto ipsec" para ver que todo es correcto.
Una vez creada la VPN y que sabemos que todo funciona podemos modificar la configuración para validarnos por el Radius y no por local como hasta ahora. Para validarnos por Radius, utilizaremos el Radius local que ya habiamos configurado:

(config)# no aaa authentication login authenvpn local
(config)# aaa authentication login authenvpn group rad_eap