Ideas para una red anónima
Recientemente he estado probando y estudiando sistemas para compartir archivos de forma segura como Freenet, Mute y MNet.
En general no me han acabado de convencer, por lo que he empezado a hacer un cóctel de ideas y a escribir un borrador de lo que podría ser una red anónima.
El borrador está bastante verde, pero me gustaria que lo destripasen para ver si puede servir para algo...
Accesible aquí: Borrador red anónima
Cualquier idea o sugerencia será bien recibida.

- 6903 lecturas
Twitter

Freenet merece más
Freenet merece algo más que "no me convence" ;-)
Yo lo he estado usando y al principio es muy engorroso pero cuando llevas una semana con el nodo enchufado todo va ya un poquito más rápido. Y junto con Frost y Freemail tienes algo así como "news" y email.
RE: Freenet merece más
No te lo tomes a mal. Me encanta el proyecto Freenet y considero que cumple perfectamente sus objetivos principales: anonimato, imposibilidad de censura, etc.
De la misma manera admiro la originalidad de Mute y las características peculiares de otros proyectos como Mnet, Iris y un largo etc. No es mi intención criticarlos, solo aprender de ellos.
Por otra parte despues de hacer algunas pruebas, no me convencen sus características generales. Por ejemplo, el problema que le veo a Freenet es su rendimiento. Por mucho que lo deje una semana o más funcionando.
De todas formas mi ojetivo nunca ha sido competir con Freenet o similares. Simplemente, tengo algunas ideas que creo que pueden ser interesantes y deseo compartirlas. Que gente con mayores conocimientos que yo haga sus comentarios y/o críticas, que se aporten nuevas ideas, ... y si la cosa pinta bien, quizás realizar una implementación en un futuro no muy lejano.
Espero haberte inspirado a realizar algún comentario sobre el borrador en cuestión.
Buenas, me parece una gran
Buenas, me parece una gran idea que le des al coco en este tema, pero creo que el problema es bastante más complejo de lo que planteas, el diseño que propones deja muchas huellas de paso, en primer lugar, respecto al nodo aleatorio que planteas, en principio el nodo origen de una petición tendrá necesariamente que comunicarse con el nodo aleatorio al que vas a suplantar para que este sepa que cuando le llegue el contenido te lo tiene que enviar a ti, si esto lo haces 'n' veces como planteas cuando el grado de anonimato>0, en realidad estás construyendo un "circuito virtual", no se si me explico con claridad. Si para pedir un contenido vas a hacer la petición suplantando la identidad ip de un nodo aleatorio C, los contenidos de vuelta le llegarán a C y, por tanto, C debe saber que los tiene que pasar a A, por tanto C debe mantener memoria sobre A, este es el principio de Freenet, la construcción de circuitos virtuales en el momento de las búsquedas y su destrucción con el camino de vuelta.
Solo que el diseño de Freenet acapara la tolerancia a fallos y la replicación. Tu idea no es del todo mala, si te rompes el coco llegarás a conclusiones ya conocidas, por eso lo mejor es que partas de documentarte mejor sobre los diseños actuales, esto es dificil porque la documentación está poco visible y es algo caótica.
Ten en cuenta que tu diseño no contempla para nada ningun tipo de balanceo de carga, ni control de congestión.
Otra duda que me surge es, ¿el grado de anonimato ese que defines en función de qué varía?, es decir, qué tienes en cuenta para que un nodo tenga grado 3 y otro grado 4? ten en cuenta que en función de este grado tendrás nodos débiles, a partir de los cuales se podrían coordinar ataques para desvelar la identidad de un nodo.
Un nivel de cifrado justo por encima de udp/tcp sería muy deseable, además del cifrado del propio contenido.
Si troceas los contenidos en bloques de N kB (cómo me ha parecido entender) necesitarás una política de distribución de dichos bloques, para que la búsqueda sea eficiente, si realizas las búsquedas por desbordamiento y usas un nivel de cifrado de, por ejemplo, 5 o 6, el rendimiento de la red bajará exponencialmente, si a esto le sumamos que la red no es tolerante a fallos te encontrarás con que en el 99 % de los casos los contenidos quedarán incompletos al faltar un determinado bloque, ya sea porque se ha caido un nodo (no hablas de política de replicación) o, lo más probable, se de por perdido al estar completamente desbordada la red con 'handshaking's' de búsqueda. Esto empeora si las inserciones de bloques las realizas sobre toda la red y no sobre una sola de las "zonas" que propones.
Por cierto, la existencia de servidores de listas de IP es un punto muy flaco en el diseño, yo intentaría mantener la gestión de IP's también distribuida.
Tómatelo con calma, yo cuando empecé también veía las cosas muy simples, empecé colaborando con Freenet, después decidí desarrollar mi propio diseño, y tras mucho tiempo de documentación (no solo sobre métodos de anonimato, sino también sobre sistemas tolerantes a fallos, replicación, redes de contenidos balanceadas, escalabilidad, control de congestión) comencé a desarrollar mi propio diseño, intentando mantener el grado de anonimato de Freenet(muy alto) pero cambiando el punto de vista, intentando mejorar el rendimiento añadiendo balanceo de carga y mejorando el tiempo de respuesta, aún esta en desarrollo y con muchas pegas, forma parte de mi PFC que presentaré este Junio.
Si quieres podemos intercambiar ideas y dudas (que siempre ayudan) es muy bueno conocer distintos diseños para intentar lograr lo mismo.
Un saludo,
Bnext.
"La única manera de ocultar tus secretos es no tenerlos"
RE:
Bueno, en algo hay que romperse el coco no?:)
Por partes:
Primero de todo agradecerte el tiempo dedicado, veo que has hecho una lectura
profunda del borrador.
Respecto al grado de anonimato, es un factor que deberá elegir el usuario. Por
eso hay un grado de anonimato para A (NAa) y un grado de anonimato para B (NAb).Si a A le interesa poco su anonimato, podrá elgir NAa=0, es su problema. Lo
único que estará pasando es que perderá anonimato para ganar velocidad. Lo
mismo ocurre con B.
Respecto a las búsquedas, es un tema que lo he rellenado como he podido. No conozco las opciones por lo que las estoy estudiando. Actualmente estoy
leyendo algo sobre DHT (Distributed Hash Tables).
Por lo demás, bueno, el tema de las redes distribuídas, descentralizadas, que mantengan el anonimato, no censurables, etc, es un tema que ha empezado a interesarme hace poco con la instalación de Freenet. Lo encuentro muy
interesante y tengo intención dedicarle unos cuantos ratos libres.
Por otra parte, soy consciente de que acabo de empezar y a mis ideas les falta
mucho rodaje. Por lo que si llevas tiempo en estos temas me encantaría que me
pasases algunos enlaces donde documentarme, pues no encuentro mucho material didáctico.
Si sigues el enlace del borrador encontrarás mi mail, agradeceré que contactes
conmigo.
Un saludos.
RE: Freenet merece más
Creo que Freenet es un proyecto muy interesante y es digno de mención, pero su uso diario puede llegar a hacer perder la paciencia en algunos momentos.
Considero que cuantas más ideas se aporten para avanzar en temas como el anonimato y la confidencialidad, mejor para todos.
Sugerencias al borrador:
- Creo que la idea de usar claves asimétricas para las transmisiones haría ralentizar bastante el cifrado / descifrado de los datos. Sugiero que en lugar de usar claves asimétricas en toda la transmisión, se intercambie una clave simétrica cifrada con la clave pública de A, con esa clave se cifrarían / descifrarían los datos.
- También se tendría que estudiar el uso del ancho de banda de cada nodo (C y D), puesto que se podría dar el caso de que uno de ellos tuviera un ancho de banda limitado. Se debería poder elegir automáticamente el nodo C / D óptimo para relizar la transmisión mediante consulta previa de la carga / ancho de banda.
RE: Sugerencias al borrador:
Lo de la clave simétrica me parece buena idea.
Respecto a lo del ancho de banda, ya lo había pensado, solo que no tengo muy claro como hacerlo. Es decir, si le pregunto al nodo por su ancho de banda, el nodo puede engañarme y decirme que tiene poco para que no lo elija como nodo aleatorio, y no consuma sus recursos.
¿Se te ocurre alguna idea? ¿Quizás un sistema que dé prioridad de descarga a los más activos en la red?
Sobre el grado de anonimat
Sobre el grado de anonimato, date cuenta de que si A comunica con B y B tiene un grado 0, con esto está poniendo en peligro también a A, al fin y al cabo los paquetes pasarán por el mismo número de hosts.
Sobre las búsquedas decirte que yo tiré del balanceo de carga que usan redes como Chord (del MIT)y estructuras de red en anillo ya que tienen los mejores rendimientos y balanceo óptimo (reparten los bloques de contenidos uniformemente por la totalidad de los nodos online de la red), se apoyan en una muy buena función de hash que garantiza la dispersión uniforme de la tabla por toda la red, solo que tienen problemas a la hora de replicar los contenidos y con la tolerancia a fallos.
La idea de dividir la red en zonas es buena, deberías preguntarte si un contenido dividido en bloques estará accesible sin salir de una de esas zonas, quiero decir: si quieres descargarte un fichero, ¿todos los bloques de ese fichero los podrás encontrar en la misma zona? ¿o tendrás que buscar por toda la red los bloques de ese fichero?. A partir de tomar esa decisión puede que te interese tener subredes independientes relacionadas por algo (por ejemplo divididas ordenando por hash de los contenidos).
Un ejemplo simple, puedes dar un rango de la tabla de hash a cada zona y que cada zona mantenga los contenidos cuyo hash este en ese rango, dentro de ese rango usarías tu idea de elegir un nodo aleatorio, etc.. y mantener algun tipo de enlace con otras zonas, por ejemplo, mantener en cada nodo un enlace a un nodo aleatorio de cada una de las otras zonas, entonces podrías replicar contenidos en distintas zonas, o usar dos o más funciones de hashing para identificar a un contenido, de forma que tendrías tantas réplicas como funciones diferentes uses. Si estas decidido a buscar por desbordamiento las zonas deberían ser pequeñas (tipo grupos de usuarios como en las news) si no deberías usar algún algoritmo más avanzado (de tipo DHT, por ejemplo), el desbordamiento puede ser eficiente según qué casos, mírate por ejemplo cómo funciona Bit Torrent o GNUtella, aunque no nos vale para lograr anonimato son ejemplos de rendimiento y tolerancia a fallos.
Por supuesto, olvida usar clave pública, usa simétrica, AES o 3DES para contenidos, y yo usaría una capa de cifrado entre nodos (no para los contenidos sino para las comunicaciones) y compresión de contenidos también para suavizar la carga.
No te preocupes, cuando llegue a casa (ahora estoy en el curro) miro a ver que tengo para enviarte para que veas las distintas metodologías que usa la gente.
Por ahora, si fuera tu, me miraría de nuevo Freenet, para que veas que está muy bien pensada, te dejo un enlace de un artículo ("Cinco horas con Fred") de Saqueadores Edición Técnica donde Lindir describe el protocolo y sus usos, es la versión completa y no la incompleta que cuelga de freenethelp.org:
http://www.set-ezine.org/archivo/pdf/set28.pdf
Por lo demás puedes buscar sobre overlay networks y ver cómo suelen enrutar y demás.
Un Saludo,
Bnext.
"La única manera de ocultar tus secretos es no tenerlos"
RE: Sobre el grado de anonimat
La idea del nivel de anonimato no es otra que permitir aumentar el anonimato del que lo desee, posibilitando al que le importa menos el anonimato tener que pasar por demasiados nodos.
Es decir, si A se comunica con B, el cual tiene un nivel de anonimato cero, esto solo pondrá en peligro a A si el nivel de anonimato de éste también es cero. Pero si A aprecia su intimidad, seguramente habrá configurado su sistema con el nivel de anonimato suficiente.
Si A y B tienen un nivel de anonimato muy alto, la conexión será más lenta. De la misma forma, si ni a A ni a B les interesa demasiado mantener el anonimato y ambos utilizan un nivel cero, tendrán una conexión más rápida, ya que solo pasará por dos nodos adicionales (C y D).
Mi objetivo inicial es una red de intercambio de archivos con la posibilidad de cierto anonimato y seguridad (Pero sin llegar al extremo de Freenet, pues para eso está Freenet no?:), y con un rendimiento que no se aleje mucho de las redes p2p como e-donkey o similares.
Si, si pillo la idea, pero
Si, si pillo la idea, pero lo que digo es que si A quiere un grado alto de anonimato y B quiere 0 en total A no va a tener el grado que espera (se lo baja el grado de B), igual que la velocidad, como los paquetes viajan por los mismos nodos, aunque B quiera anonimato 0 y busque rapidez está supeditado al grado que ponga A. Por tanto tanto A como B deberían saber cual es el grado del otro para aceptar la comunicación.
Es como si tu quieres mandar mails cifrados pero en la mitad del camino el receptor lo descifra y viaja el resto del camino en claro, se pierde lo ganado con el cifrado (no se si es buen ejemplo...).
Pero que me parece bien tu idea siempre que los dos nodos sepan el grado del otro.
Un saludo,
Bnext.
"La única manera de ocultar tus secretos es no tenerlos"