Developer Tools incompletas en OS X Lion

Después de hace unos meses de usar el OS X Lion y tener previamente instalado XCode 4 desde la App Store, me veo en la necesidad de instalar el comando watch con MacPorts, y cual es mi sorpresa que me muestra un error rarísimo, y un poco más tarde trato de instalar un módulo de Perl y oh sorpresa el comando make no esta instalado, por lo que me doy cuenta de que el XCode que instalas desde la App Store no viene la opción de “Command Line Tools” que en versiones pasadas era muy facil instalar, y bueno solo les dejo el tip de que para bajar dichas herramientas necesitan estar registrados como desarrolladores y bajarlas desde aqui una vez instaladas todo vuelve a la normalidad.

Que puedo decirles no estoy a favor de que Apple se olvide de los Power Users pero en fin…

Udacity la nueva universidad en línea y gratuita por Sebastian Thrun

Sebastian Thrun, lanzó la primera universidad en línea llamada Udacity la cual trata de dar clases de buen nivel a todo el mundo, después de que su experimento de “Introducton to AI” lanzado en conjunto con Stanford diera buenos resultados, yo tome el curso pasado y aprendí como nunca y ahora con Udacity ya la hemos probado nosotros y de hecho estamos inscritos a los cursos y vaya que son buenos.

La idea de estos cursos es que cada quien pueda tomarlos a la hora que mejor se le acomode, parece una idea muy prometedora!!

Cuando le preguntaron a Sebastian Thrun porque renunció a Stanford dijo:

Having done this, I can’t teach at Stanford again, you can take the blue pill and go back to your classroom and lecture to your 20 students, but I’ve taken the red pill and I’ve seen Wonderland.

Muy al estilo Matrix!! y además comentó:

I am against education that is only available to the top 1% of all students. I am against tens of thousands of dollars of tuition expenses. I am against the imbalance that the present system brings to the world. I want to empower the 99%. I want to democratize education. Education should be free. Accessible for all, everywhere, and any time.

Help me spread the world. I can’t do this alone.

Palabras de Sebastian Thrun

Fuentes:

http://www.msnbc.msn.com/id/46138856/ns/technology_and_science-innovation/#.T0yZjHJAYzB

http://robots.stanford.edu/index.html

Descuentón, Groupon, Groupalia, LetsBonus y Clickonero en un solo lugar

Hemos lanzado recientemente una página llamada Descuentón, donde podras ver los descuentos de Groupon, Groupalia, Letsbonus y Clickonero en un solo lugar, tiene varias ventajas que nosotros creimos que les faltan a todos ellos como:

  • Categorías: Podras ver los descuentos por categoría
  • Facebook Connect: Tiene la opción de guardar tus preferencias mediante facebook connect
  • Mapa de google maps con link: Podras dar click en los mapas para ver en donde es y te llevará a la página de google maps
  • HTML5 compatible con iPhone: Si visitas la página desde tu iphone podras ver una vista especialmente diseñada para el iphone, e instalarlo como app

Y todo completamente gratis, espero que les guste, pruébalo ahora.

Ir a Descuentón

Tag Cloud en PHP

Necesitaba hoy de un tag cloud sencillo en php y encontré muchos ejemplos que no se me hicieron muy buenos, así que programé uno. Se los dejo para que lo usen:

/**
$wordlist en la forma array('palabra1' => array('numero' => 5), 'palabra2' => array('numero' => 3))
*/
function tagCloud($wordlist, $fmax) {
	//esto sive para que el tamaño minimo de la letra sea 10px
	if($fmax < 20) {
            $fmax = 10;
 	} else {
	     $fmax -= 10;
        }
        //primera recorrida para obtener el maximo y el minimo
        $tmin = 0;
        $tmax = 0;
        foreach($wordlist as $key => $value) {
		if($value['numero'] > $tmax || $tmax == 0)
			$tmax = $value['numero'];
		if($value['numero'] < $tmin || $tmin == 0)
                        $tmin = $value['numero'];
         }
         foreach($wordlist as $key => $value) {
		if($value['numero'] > $tmin) {
                        $si = ceil(($fmax * ($value['numero'] - $tmin) / ($tmax - $tmin)))+10;
                } else {
			$si = 10;
		}
		$wordlist[$key]['size'] = $si;
	}
	return $wordlist;
}

Su uso es bastante sencillo. Tenemos que meter todos los elementos a un array de la siguiente forma:

$wordlist = array('palabra1' => array('numero' => 5), 'palabra2' => array('numero' => 3));
//30 es el tamaño máximo de la letra
$wordlist = tagCloud($wordlist, 30);
foreach($wordlist as $key => $value) {
     echo '<span style="font-size: '.$value['size'].'px;">'.$key.'</span> ';
}

Nótese que en el array podemos meter los valores que queramos y que necesitemos, sólo debe estar presente la llave llamada numero.

Me basé en el artículo de wikipedia: http://en.wikipedia.org/wiki/Tag_cloud

Cloud Computing aplicado a las empresas

El Cloud Computing es uno de los terminos más sonados en revistas y en diversos artículos en los últimos meses. Algunos alabándolo y otros criticándolo, pero hablando siempre de tecnologías futuristas y suponiendo que la nube es internet, cuando internet es sólo una parte de la nube.

La nube, como todo, tiene ventajas y desventajas. Por ejemplo, algunas ventajas son: no necesitas de una computadora con muchos recursos, no hay necesidad de instalar aplicaciones y sería muy difícil perder tus datos; pero una de sus desventajas es que deberás confiar en un tercero para que tus datos estén “seguros”.

Siempre se ha criticado mucho desde el aspecto de la seguridad y es por ello que muchas empresas ni consideran adoptarlo, aunque esas son las mismas empresas que se niegan a usar las redes sociales y prefieren bloquear twitter que usarlo para algo útil. Pero queramos o no todas las tecnologías van hacia ese rumbo pues cada vez hay más smartphones y computadoras con acceso a internet con menos recursos y más baratas. Todo parece apuntar a que en un futuro los smartphones serán los que dominen en internet. Si observamos el entorno es claro que las aplicaciones de escritorio desaparecerán en un futuro no muy lejano, la multiplataforma es lo que está en voga y más gente está usando las tecnologías de internet para intercomunicarse, por lo que sinceramente dudo mucho que las empresas puedan frenar este avance.

Es impresionante ver como la gran mayoría de las empresas siguen tan ciegas y centran sus esfuerzos en detener a los usuarios para usar las nuevas tecnologías. Llegan a poner proxies para limitar el acceso a facebook y twitter; para el correo electrónico compran sistemas para evitar enviar correos a personas que la compañía no considere confiables y usan filtros de spam poco útiles para el usuario final; gastan recursos humanos en revisar los antivirus de los usuarios y monitorear la red en busca de fugas de información, y prohíben a las personas instalar ciertos programas como iTunes por “problemas de seguridad potenciales”.

Pero ¿qué diferencía a las compañias con gran tecnología y productos realmente interesantes de las otras?

No piensan cómo es que podrían beneficiar las nuevas tecnologías a la empresa.

El cloud computing tiene muchas caras que ofrecer y depende de las empresas buscar una cara que les beneficie. Si pensamos en el Cloud Computing como una nube que sólo está dentro de la red de la empresa, entonces empieza a volverse interesante y es probable que las empresas adopten ese modelo.

Pero antes de seguir quiero aclarar que al hablar de cloud computing no me refiero sólo a aplicaciones web que hacen consultas con AJAX a un servidor central, o una aplicación que hace consultas SOAP o tiene web services. Cloud computing realmente es mucho más que eso.

Tomemos como ejemplo Google. Es una empresa totalmente dedicada a la nube, y sus tecnologías son realmente avanzadas, mucho más de lo que muchos creen. Bien se sabe que no sólo es un motor de búsqueda, es una gran parte de Internet y tiene tecnologías que se pueden aplicar perfectamente a las empresas como GMail, Google Docs, Google Calendar y Google Wave, además de otras tecnologías para desarrollar aplicaciones como Google App Engine y Google Web Toolkit; y tiene también su propio sistema operativo Google Chrome OS (totalmente enfocado a la nube) y su navegador Google Chrome.

Google Chrome OS, que aún continúa en su versión beta y no se le ha prestado suficiente atención, resulta ser una versión de Linux a la cual no se le puede instalar ninguna aplicación y que no tienen ningún medio de almacenamiento; toda tu información está en la nube, ni siquiera la música se puede guardar en el disco, a lo mucho se pueden guardar datos en un USB ¿qué locura no?. El sistema operativo completo funciona como un navegador: cuando cierras la sesión guarda el estado en el que te quedaste para que luego puedas continuar en cualquier otra computadora que tenga Chrome OS instalado; por lo cual las computadoras necesarias para correrlo no necesitan de mucho disco duro, ni de una capacidad de procesamiento brutal. Y es cierto para muchos esto puede parecer desconcertante e inservible, pero para la gran masa de usuarios podría funcionar perfectamente.

Hagamos ahora un ejercicio de imaginación y apliquemos la nube a una empresa como Coca Cola. Supongamos que tiene varios datacenters: uno en México, varios en Estados Unidos y en muchos otros países; y, en esos datacenters tuvieran instalados los appliances de Google, los cuales pudieran guardar la información correctamente duplicada en diferentes lados del mundo; luego supongamos que la empresa les diera a sus empleados una Laptop con un disco de estado sólido suficiente para alojar una versión de Chrome OS que se conectara a la VPN de Coca Cola.

Esto sería realmente seguro, pues al contratar a un empleado bastaría con dar de alta una nueva cuenta en la empresa con los privilegios de las aplicaciones que necesitara, usando la política del mínimo privilegio. Cuando el empleado necesitara conectarse a sus documentos podría hacerlo desde cualquier computadora y la información nunca estaría guardada en el disco duro, por lo que si se pediera una laptop en el aeropuerto no habría ningún problema ya que necesitarían de la contraseña para poder entrar a algo importante.

Pensemos también que el costo de mantenimiento se vería reducido totalmente, pues no habría que reinstalar prácticamente nada y podrían trabajar desde cualquier computadora que tuviera acceso a la red de Coca Cola mediante Chrome OS. El costo de todas las aplicaciones como antivirus, protectores contra intrusos y demás desaparecerían pues el sistema operativo no se podría modificar y estaría reducido a lo que el navegador te permitiera.

Es un hecho que todas las aplicaciones de Coca Cola necesitarían funcionar mediante Web, pero no me imagino alguna que actualmente no pudiera implementarse para funcionar en Web.

Los problemas de seguridad se verían reducidos de manera importante, pues se tendría mucho más control de todos los datos y éstos estarían alojados en los servidores de Coca Cola. Y aunque seguirían existiendo los mismos problemas de siempre: contraseñas débiles, fallas en la configuración, problemas de XSS en las aplicaciones web, servidores vulnerables y demás; ya no habría que preocuparse tanto por la seguridad de cada usuario final de la empresa. Sería ahora más complicado que pudiera haber una fuga importante de información y en todo caso se tendría registrado por dónde ocurrió.

Google es un ejemplo de empresa que ha aprovechado la nube y muchas más podrían estar incursionando en estos momentos, pero hay cosas de Google que ya funcionan muy bien y a menos que algunas empresas quieran reinventar la rueda bien podrían ya empezar a usarlas para satisfacer sus necesidades.

Port Knocking : Evita ataques masivos a tu puertos

El port knocking se refiere a una combinación de puertos que debemos “tocar” para que el servidor nos de acceso a un servicio. Por ejemplo, cuando alguien establece una conexión por ssh implícitamente va un paquete al puerto 22 intentando iniciar la conexión, y esto sería “tocar” el puerto 22.

¿Para qué?

Si tenemos un servidor accesible desde internet, es común que recibamos ataques automáticos por diccionario contra nuestro servidor; esto es así porque hay muchas botnets que realizan ataques masivos contra todo lo que encuentren en internet. Pero al implementar port knocking estas botnets ignorarán nuestro servidor, y además los escaneos de puertos no podrán ver abiertos los puertos sensibles, aunque nosotros sí tengamos acceso a ellos.

Por otro lado, cuando un servicio como ssh o mysql están recibiendo un ataque por diccionario, la política automática por defecto es aumentar el tiempo de espera para hacer login, por lo que empezaríamos a notar comportamientos extraños en nuestro servidor (lentitud al realizar operaciones que requieran conexión a esos servicios).

Funcionamiento

El funcionamiento es simple: lo que va a pasar es que aparecerá cerrado el puerto 22, pues se está esperando a que le mandemos una combinación de puertos, supongamos la combinación 1200, 234, 654, 4509, 12; y, una vez enviada la combinación podremos establecer la conexión al puerto 22 (el del ssh).

Ya en la práctica tendríamos lo siguiente:

      Intentamos entrar al puerto 22 (aparece cerrado)
      Abrimos una conexión con el puerto 1200 (responderá que esta cerrado) pero el servidor sigue en espera de las demás conexiones
      Abriimos una conexión con el puerto 234 (nos aparece cerrado) el servidor ya sabe que tenemos las primeras dos combinaciones bien
      Abrimos una conexión con el puerto 654, luego 4509 y luego el 12
      Ahora tenemos 5 segundos para iniciar la conexion por ssh
      Iniciamos la conexión exitosamente

El port knocking es como si metieramos a una caja fuerte nuestra laptop, y aún después de poner la combinación se tendrían que poner el password de la computadora. Esto obviamente aumenta la seguridad en una forma considerable.

Hay que recordar que esto a pesar de ser una buena forma de asegurar un puerto, necesita tener dentrás una buena contraseña y unas buenas políticas, pues si para alguien que estuviera analizando nuestro tráfico sería trivial obtener la combinación de puertos.

Implementación con iptables

Con ayuda de iptables podríamos hacerlo suponiendo la combinacion 100, 200, 300, 400, ssh(22):

HOST_IP="12.34.56.78"

/sbin/iptables -N INTO-PHASE2
/sbin/iptables -A INTO-PHASE2 -m recent --name PHASE1 --remove
/sbin/iptables -A INTO-PHASE2 -m recent --name PHASE2 --set
/sbin/iptables -A INTO-PHASE2 -j LOG --log-prefix "INTO PHASE2: "

/sbin/iptables -N INTO-PHASE3
/sbin/iptables -A INTO-PHASE3 -m recent --name PHASE2 --remove
/sbin/iptables -A INTO-PHASE3 -m recent --name PHASE3 --set
/sbin/iptables -A INTO-PHASE3 -j LOG --log-prefix "INTO PHASE3: "

/sbin/iptables -N INTO-PHASE4
/sbin/iptables -A INTO-PHASE4 -m recent --name PHASE3 --remove
/sbin/iptables -A INTO-PHASE4 -m recent --name PHASE4 --set
/sbin/iptables -A INTO-PHASE4 -j LOG --log-prefix "INTO PHASE4: "

/sbin/iptables -A INPUT -m recent --update --name PHASE1

/sbin/iptables -A INPUT -p tcp --dport 100 -m recent --set --name PHASE1
/sbin/iptables -A INPUT -p tcp --dport 200 -m recent --rcheck --name PHASE1 -j INTO-PHASE2
/sbin/iptables -A INPUT -p tcp --dport 300 -m recent --rcheck --name PHASE2 -j INTO-PHASE3
/sbin/iptables -A INPUT -p tcp --dport 400 -m recent --rcheck --name PHASE3 -j INTO-PHASE4

/sbin/iptables -A INPUT -p tcp -s $HOST_IP --dport 22 -m recent --rcheck --seconds 5 --name PHASE4 -j ACCEPT

Y para hacer el knocking sería de esta forma:

$telnet 10.1.1.1 100 ; telnet 10.1.1.1 200 ; telnet 10.1.1.1 300 ; telnet 10.1.1.1 400 ; ssh 10.1.1.1

Luego presionamos Ctrl+C 4 veces y listo.

(Fuente: Debian Administration)

One-Time Pad el cifrado perfecto

Hay quienes creen que no existe un método de cifrado perfecto, o un cifrado que te pueda garantizar seguridad absoluta y se equivocan.

El método de cifrado de One-Time Pad, que fue inventado en 1917 por el Mayor Joseph Mauborgne y Gilbert Vernam de AT&T. Claude Shannon, 25 años después, se encargó de demostrar con la teoría de la información que este cifrado cumple con ser un secreto perfecto, lo que quiere decir que el contenido del mensaje no puede aportar nada de información a un atacante.

Es un método que sin importar el poder computacional que se tenga o si se haya inventado la computadora cuántica o si los extraterrestres de Andrómeda vengan a la tierra con sus métodos computacionales inimaginables, aún asi será seguro.

Preliminares

Necesitamos una llave de la misma longitud que el mensaje, la cual deberá ser de verdad aleatoria y no pseudo aleatoria. Además esta llave se supone que las dos partes la deben conocer (problema de intercambio de llaves) y cuando una parte cifre el mensaje debe destruir esa llave de alguna forma que no pueda recuperarse y luego enviar el mensaje cifrado, luego la otra parte va a descifrarlo y al terminar de hacerlo debe destruir la llave de nuevo.

Es primordial que no se vuelva a usar la misma llave dos veces pues un criptoanalista podría romper el cifrado sabiendo dos mensajes diferentes que se encriptaron con la misma llave.

¿Cómo funciona?

Es algo muy simple de entender, teniendo el texto:

Teniendo la llave:

El texto cifrado sería:

Porque:
A + R mod 26 = S
M + F mod 26 = S
A + T mod 26 = U

Suponiendo que A vale 1 y R vale 17: 1+17 = 18 y 18 / 26 nos daría como residuo 18, entonces el 18 corresponde a la letra S.

Es importante ver que no puede romperse incluso si pudieramos calcular todas las posibilidades y buscar mensajes coherentes, pues al decifrarlo podría decir SIVOY como NOVOY entonces es imposible saber cual es el mensaje cifrado sin saber la llave. Según dicen, los Rusos cifraron algunos mensajes con este método y siguen hasta la fecha sin poderse descifrar, y así seguirán para siempre.

El problema con este método y en general con cualquier método de cifrado simétrico es el intercambio de llaves, pues ¿cómo podrías intercambiar la clave del One Time Pad de una manera segura?

Fin

Si quieren profundizar más en el tema podrían leer en la página 15 del libro Applied Cryptography escrito por Bruce Schneier que explica con un poco más de detalle este algoritmo.

Con este código en javascript podríamos obtenerlo:

var charCodeCero = ("A".charCodeAt(0))-1;
function oneTimePad(mensaje, llave) {
	mensaje = mensaje.toUpperCase();
	llave = llave.toUpperCase();
	var cifrado = "";
        for(var i = 0; i &lt; mensaje.length; i++) {
		cifrado += String.fromCharCode((( mensaje.charCodeAt(i) - charCodeCero +
                                                 llave.charCodeAt(i) - charCodeCero 
                                                 ) % 26) + charCodeCero);
	}
	return cifrado;
}