Seguridad web 101

O uno de los problemas de contratar programadores baratos que no estén a distancia de coscorrón.

Antes que nada, si no sos una persona técnica leyendo esto te voy a dar una recomendación: un técnico/vendedor que te dice que el producto que te esta ofreciendo es inviolable te esta mintiendo. El único sistema seguro es una PC apagada, sin conexiones externas, encerrada en una caja fuerte y arrojada a las profundidades del océano. No importa que servicios contrates, uses un sistema operativo de renombre o una base de datos carisima SIEMPRE quedan errores y agujeros.
El testeo y las auditorias solamente comprueban que existen errores, no la falta de ellos.

 

Una vez dicho esto, la seguridad no es una compra de una vez sino que es un proceso constante de mejora e investigación.

Hace un par de años que en lo personal me aleje de la programación para escritorio y me dedique de lleno a la web. Una de las primeras cosas que me sorprendieron es que antes programaba para un publico de (con suerte) cientos de personas, pero al meterte en web programas para una cantidad indefinida de personas. Y no todas ellas tienen buenas intenciones.

La pregunta que queda (seas cliente o programador) es que tan valiosa es la información con la que contás, que tan privada es y cuanto estas dispuesto a invertir en asegurarla (en tiempo, dinero o recursos en gral). No existe seguridad absoluta, solamente menos o mas confiable.

Ahora que aclare todo lo que quería, un par de cosas que aprendí a los golpes y leyendo:

1 ) Los logs no están para llenar espacio en disco: usualmente si tenes aplicaciones sensibles de ser comprometidas (los datos son interesantes) dedicale un tiempo a esto. Un log no va a protegerte mas o menos, pero ante un problema puede ser tu único recurso. Por ejemplo una forma simple de crear logs es personalizandolos, y uno de mis favoritos es logear los problemas de conexiones que tenga a la db desde la aplicación. Se que hice las suficientes pruebas como para saber que la aplicación por si sola no debería tirar errores de SQL por lo cual tengo un log separado diario con los errores. Porque diario? Simple, porque si tengo un archivo de 1MB con errores cuando el log normal tiene 10KB con un simple vistazo puedo detectar problemas solo mirando si existen discrepancias obvias en los tamaños de los logs. Si algo resalta, probablemente este pasando algo que no querías que ocurra.

2 ) Guarda la mínima información posible y encriptala: usualmente necesitas un email y un password solamente para dar acceso a sistemas. El resto de la información es para estadística o usabilidad. Y ambos campos pueden ser encriptados sin problemas y aun así tener un sistema de logeo eficiente y funcional. Realmente necesitas el nro de cédula? La altura? Cualquier dato solo es inútil, pero en conjunto puede resultar mas que interesante. Mientras menos guardes, menos interesante sos y por ende menos vulnerable a ataques.

3 ) Si vas a encriptar, hacelo bien: esto da para un post aparte, pero tratare de resumirlo. Guardar passwords en texto plano es suicida, usa mínimo md5 con sal. Si trabajas en php usa bcrypt. Creer que nadie va a adivinar el tipo de seguridad que estas usando o que pasa por detrás de tu sistema es como creer que porque no mostrás tu celular en el colectivo ya no te van a robar. Bcryp tiene algo que me gusta y es que es lento, en contraste con md5 que es rapidisimo. Porque esto? que tarado quiere hacer su sistema mas lento? Simple, mientras mas se tarde en encriptar un password, mas va a tardar tambien un ataque por fuerza bruta. Digamos que un md5 tarda en crearse un milisegundo y que bcrypt con un factor de 12 tarda 0,3 seg. Esto significa que si alguien quiere realizar un ataque de fuerza bruta para intentar 100.000 passwords con md5 le va a llevar algo mas de minuto y medio mientras que para la misma cantidad de passwords con bcrypt le llevaría 8 minutos y pico. Tu sistema ahora tarda 0,3 seg mas en loguear pero sos 8 veces mas fuerte contra ataques de fuerza bruta. Si no vas a tomar esta ruta, usa un clasico md5 con sal. Porque con sal? que es sal? Simple, digamos que tenemos un password encriptado que es “827ccb0eea8a706c4c34a16891f84e7b“. Parece indescifrable no? Jamas te imaginarias que en realidad es “12345“. No uses solo md5 porque existe algo llamado raibown tables donde vas a encontrar varios password comunes ya convertidos a texto plano. Usa md5 con sal, donde la sal es una palabra aleatoria (golpea el teclado hasta que tengas una cadena larga y rara) MAS el password. Si usamos por ejemplo nuevamente este password “12345” agregándole “secretosecretisimo” obtenés “6421faf527942ad8eb72b4d11d5f1ca4” y ya levantaste la barrera para quien te ataque un poco mas.

4 ) La seguridad por oscuridad es para ciegos de mente: porque creer que tu sistema es seguro simplemente porque vos sos quien lo programo y nadie mas puede ver tu código es pensar que no existe personas tanto o mas inteligente que vos. Y siempre existe gente mas inteligente que uno. Una buena prueba de esto es porque tenes que usar encriptacion de código abierto contra uno cerrado. Uno cerrado es usualmente protección por oscuridad, donde crees que porque la gente no puede ver que pasa en tu código no pueden adivinarlo. Error, siempre va a haber gente mas inteligente, con mas tiempo, paciencia o solamente experiencia. Un sistema de encriptacion cerrada es solamente sentarte a esperar a que sea roto. Una encriptacion de código abierto se mantiene porque esta bien hecho. A pesar de que todo el mundo puede ver el código y entender como funciona no puede pasarlo. A pesar de que la gente intenta e intenta romperlo, este se mantiene. Aun cuando quienes quieren romperlo comprenden perfectamente como funciona y trabaja. NO A LA ENCRIPTACION DE CÓDIGO CERRADO.

5 ) Verifica que tu código este masticando los datos que debe masticar: si estas esperando un nro de un formulario, comprobá que te esta llegando un nro. Si esperas un nombre comprobá que no te llegan caracteres que no deban estar allí. Este es el primer paso básico y fundamental de toda seguridad. SIEMPRE VERIFICA que DATOS ESTÁN ENTRANDO A TU DB!

6 ) Todo sistema es seguro hasta que se rompe: que todo este funcionando bien no significa que siga así de manera indefinida. Lee, comprobá y lee un poco mas. Cuando encuentres algo nuevo, comprobalo contra tu seguridad a ver si resiste o cae.

7 ) Escribí una vez, usa con frecuencia, mejora a diario: digamos que manejas 15 sitios diferentes. Todos con sistema de seguridad distintos. Ahora tenes que comprobar 15 sistema diferentes. Unifica, busca una manera de asegurar las cosas como te guste y puedas usar en todos lados y mejoralo. Ahora en lugar de tener 15 códigos por probar cada vez que leas algo, solamente tenes uno. Y mientras mas lo mantengas, mejor seguridad vas a obtener.

8 ) La verdadera seguridad esta en la velocidad de respuesta: todo sistema es por default inseguro. Lo importante es que cuando rompan tu seguridad (no dije “si rompen tu seguridad”, dije “cuando lo hagan”) lo importante no es tirar culpas, ni patalear, ni plagearte. Lo importante es que tan rápido respondes a una amenaza. Si te toma 1 hora en verificar las cosas y cerrar un agujero es buena calidad. Si tardas semanas o meses es lo mismo que nada.

9 ) Se educado con gente que sabe mas que vos: SIEMPRE, SIEMPRE se educado con quien rompió tu seguridad. Es gente de la cual podes aprender algo y que conoce del tema. Si podes rastrear y comunicarte agradeceles que te mostraran un problema, que estas trabajando en solucionarlo y que si tienen sugerencias por favor te las comenten. Puede que no te respondan, o tal vez te respondan mal. Pero si te comunicas con ellos siendo amenazante y grosero es MAS que seguro que no vas a obtener mas información de ellos. Se amable y quizás puedas aprender una cosa o dos. Aparte realizan una tarea útil, mantener a tus usuarios seguros y a tu sistema libre de vulnerabilidades obvias.

Creo que me quedan una o dos cosas en el tintero pero tengo que seguir haciendo otras cosas.

Una ultima cosas que quiero aclarar: no soy un experto en seguridad y aun tengo mucho por aprender. Lo que digo no esta escrito en piedra y puede cambiar con el tiempo. Estoy escribiendo este post justamente porque se que gente mas inteligente que yo puede llegar a leerlo y comentar cosas útiles que debo aun conocer. Tomo este tema con mucha humildad porque soy consciente de que aun tengo un largo camino por recorrer, esto es parte de lo que aprendí hasta ahora.

Soy un programador viviendo en Paraguay y estudiando todo el tiempo. He dado charlas sobre desarrollo movil web en Caaguazu en ocasión del FLISOL, participe como parte del panel del Asunción Digital Week, di una charla en el Pecha Kucha, sobre Creative Commons y estuve de mentor en algún evento.

2 thoughts on “Seguridad web 101

  1. Muy buen post Pabli, es bueno dejar en claro que las vulnerabilidades del código solo se pueden descubrir durante su implementación, es imposible preveer absolutamente todo. =)

  2. “El único sistema seguro es una PC apagada..”, me gusto, esa es una de mis frases también, jaja..

    Y es cierto, creo que seguridad web (y seguridad en aplicaciones en general) es una asignatura pendiente para muchos programadores, y sin duda un tema en el cual debemos actualizarnos cada tanto.

Comments are closed.