Algunos datos sobre el uso de ssh

En We scanned the Internet for port 22 un estudio sobre el puerto 22 y su utilización.

Yesterday (Sept. 12) we scanned the entire Internet for port 22 – the port reserved for “SSH”, the protocol used by sysadmins to remotely log into machines. Unlike our normal scans of port 80 or 443, this generated a lot more “abuse” complaints, so I thought I’d explain the scan.

De los resultados, se puede ver:

In other words, the top result of 1,730,887 systems on the Internet show an SSH banner of “SSH-2.0-OpenSSH_4.3”. (Note: this is actually only 60% of the Internet, I’ve got corruption in the files for 40% of the results that I need to fix).

También es interesante ver como hay quien se enfada por recibir este tipo de pruebas y quien anima a realizarlas.

Las claves muy largas también pueden ser problemáticas

Una pregunta frecuente cuando alguien empieza a preguntarse por los temas de seguridad es por qué no poner la contraseña, o lo que sea, más grande para estar un poco más seguros. Normalmente eso puede ser un problema porque mayor tamaño implica más necesidades de cálculo, de almacenamiento…

En Too long passwords can DoS some servers se refieren a un fallo en Django, donde no hay una restricción para el tamaño máximo de las claves y que podría poner a algunos servidores en problemas.

Hay más detalles en Security releases issued.

The default password hasher in Django is PBKDF2, which has the virtue of allowing the complexity of computing the hash to be effectively arbitrarily high, by repeated “rounds” of application before producing the final result. This increases the difficulty of attacks which use brute-force methods to compute the hashes of many possible plaintext values, in hopes of discovering which plaintext password corresponds to a given hashed value.

Unfortunately, this complexity can also be used as an attack vector. Django does not impose any maximum on the length of the plaintext password, meaning that an attacker can simply submit arbitrarily large – and guaranteed-to-fail – passwords, forcing a server running Django to perform the resulting expensive hash computation in an attempt to check the password. A password one megabyte in size, for example, will require roughly one minute of computation to check when using the PBKDF2 hasher.

Interesante.

Por cierto que sobre el tema del ‘hashing’ de contraseñas había un resumen interesante en About Secure Password Hashing.

Algunos enlaces interesantes sobre claves

Primero, un artículo periodístico-‘literario’ donde se intenta justificar las malas contraseñas y por qué la gente hace eso. The Secret Life of Passwords

Llaves

Llaves en Instagram

A continuación tres artículos que tienen bastantes puntos en común; discuten sobre algunas justificaciones que se dan de vez en cuando para imponer ciertas normas de seguridad sobre las claves.

Esencialmente se discuten algunas reglas habituales en la gestión de contraseñas que, según los autores, podrían no ser tan interesantes/útiles en muchos casos.

Traemos también un informe del SANS Institute, con información histórica: [PDF] Password Security– Thirty-Five Years Later.

Y, para terminar,

Ya habíamos hablado de contraseñas, en la versión anterior de este sitio por ejemplo en Claves y usabilidad, Sobre claves y control de acceso en sitios web, La autenticación y las aplicaciones y los espectaculares (desde mi punto de vista) artículos enlazados en Contraseñas, usabilidad y uso que están bastante alineados con los que poníamos al principio.

Publicar en Twitter las entradas de este sitio usando Python

No creo que el RSS esté muerto. Pero vemos que mucha gente prefiere recibir información a través de los sitios de redes sociales. Hasta publicaba lo que aparece en mis blogs utilizando servicios como IFTT y dlvr.it. Son bastante cómodos y funcionan muy bien. Sin embargo, uno siempre se pregunta si podría hacerse unos programas a medida que nos permitan gestionar esa parte de la publicación y aprender un poco de paso.

Empecé con la publicación en páginas de Facebook pero todavía no estoy satisfecho del resultado así que hablaremos primero de Twitter: al fin y al cabo sólo tenemos que publicar el título de la entrada y el enlace (y, tal vez, algún texto introductorio).

Encontré el proyecto twitter que ya tiene una parte importante del trabajo realizada. Podemos instalarla con pip:

fernand0@aqui:~$ sudo pip install twitter

Para su correcto funcionamiento necesita BeautifulSoup y tal vez algunos módulos más. Si no están instalados en nuestro sistema, recibiremos las ‘quejas’ correspondientes.

Después podemos ejecutarlo. Nos vendrá bien porque necesitamos autentificarnos en Twitter y el programita que he preparado no se ocupa de esta parte. Hace no tanto se podía leer y escribir tuits simplente con el usuario y la contraseña pero Twitter decidió pasarse a un sistema de autentificación más sofisticado basado en OAuth.

fernand0@aqui:~$ twitter

Cuando hacemos esto se lanza el navegador para que nos autentifiquemos y demos permiso a la aplicación para actuar en nuestro nombre. Esto genera los tokens adecuados de identificación/autenticación, que se almacenan en ~/.twitter_oauth (en un sistema de tipo Unix, se agradecerán comentarios sobre otros sistemas) que podremos reutilizar en nuestro programita.

El programa es muy sencillo, se puede descargar en rssToTwitter.py V.2014-12-07 (enlazo a la versión actual por si en el futuro hago algún cambio).

Empezamos leyendo la configuración:

config = ConfigParser.ConfigParser()

config.read([os.path.expanduser('~/.rssBlogs')])
rssFeed = config.get("Blog1", "rssFeed")
twitterAc = config.get("Blog1", "twitterAc")

Esta configuración debe contener una sección por blog (este programa sólo utiliza la configuración del primero) y para cada uno de ellos contendrá la fuente RSS, el nombre de la cuenta de Twitter y el nombre de la cuenta de Facebook. Para este sitio tendría el siguiente aspecto:

[Blog1]
rssFeed:http://fernand0.github.io/feed.xml
twitterAc:mbpfernand0
pageFB:fernand0.github.io

Este programa no utiliza la página de Facebook, claro. Por otro lado, también hay que leer la configuración para Twitter:

config.read([os.path.expanduser('~/.rssTwitter')])
CONSUMER_KEY = config.get("appKeys", "CONSUMER_KEY")
CONSUMER_SECRET = config.get("appKeys", "CONSUMER_SECRET")
TOKEN_KEY = config.get(twitterAc, "TOKEN_KEY")
TOKEN_SECRET = config.get(twitterAc, "TOKEN_SECRET")

Allí aparecen los datos de la aplicación (los podemos copiar directamente de la que nos hemos instalado; en mi sistema están en /usr/local/lib/python2.7/dist-packages/twitter/cmdline.py y los tokens estarán en el fichero ~/.twitter_oauth

El fichero de configuración tiene este aspecto en este caso:

[appKeys]
CONSUMER_KEY:xxxxxxxxxxxxxxxxxxxxxx
CONSUMER_SECRET:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
[mbpfernand0]
TOKEN_KEY:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TOKEN_SECRET:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Podría haber más cuentas de Twitter, si se desea. Nótese que el nombre de la segunda sección corresponde con el que se ha utilizado en el fichero de configuración anterior.

A continuación leemos la fuente RSS para extraer los datos que nos interesan:

feed = feedparser.parse(rssFeed)

i = 0 # It will publish the last added item

soup = BeautifulSoup(feed.entries[i].title)
theTitle = soup.get_text()
theLink = feed.entries[i].link

Lo primero de todo, utilizamos feedparser para decargar la fuente RSS y procesarla.

Elegimos la entrada que ocupa la primera posición (la 0), que será la última publicada. Para Twitter seleccionamos el título y el enlace. El título lo procesamos con BeautifulSoup para evitar las posibles etiquetas que pueda contener (de estilo, entidades HTML, …)

Finalmente, construimos el tuit:

statusTxt = "Publicado: "+theTitle+" "+theLink

Nos identificamos, autentificamos y publicamos:

t = Twitter(
	auth=OAuth(TOKEN_KEY, TOKEN_SECRET, CONSUMER_KEY, CONSUMER_SECRET))

t.statuses.update(status=statusTxt)

La abstracción detrás de un programa sencillo

Solemos olvidar (y muchos ni se imaginan) la complejidad que hay detrás de la ejecución de una simple línea de código. En [PDF] A study of code abstraction hacen un recorrido desde una sencilla línea de código en Perl hasta la invocación de los módulos del kernel implicados en la ejecución del trabajo.

Un poco denso en algunos momentos pero vale la pena echarle un vistazo.

Evitar los 10 fallos de diseño más graves para la seguridad

La IEEE lleva unos años fomentando la idea del desarrollo seguro. Una forma ha sido mediante la serie Building Security In (IEEE Security & Privacy, Series Editor: Gary McGraw), bastante relacionada con el podcast de Gary McGraw Silver Bullet.

Más recientemente han lanzado The IEEE Computer Society Center for Secure Design y una de sus primeras publicaciones ha sido Avoiding the Top 10 Security Flaws. Gary McGraw diferencia siempre que puede entre bugs (fallos de seguridad en el código, fundamentalmente) y fallos de diseño (flaws).

En esa línea viene la lista, que ha desarrollado junto con otros autores:

  • Gánala o concédela, pero nunca supongas la confianza.
  • Utiliza mencanismos de autentificación que no puedan ser modificados ni evitados.
  • Autorizar después de autentificar.
  • Separar de manera estricta los datos del control. Nunca procesar instrucciones de control recibidas de fuentes no confiables.
  • Definir una aproximación que asegure que todos los datos se validarán de manera explícita
  • Utilizar correctamente la criptografía.
  • Identificar los datos sensibles y cómo deberían manejarse.
  • Siempre tener en cuenta a los usuarios.
  • Comprender la forma en que cambia nuestra superficie de ataque la integración de componentes externas.
  • Ser flexible cuando se consideren los cambios futuros de objetos y actores.

Algunas frases que señalé:

various binary protection mechanisms can delay the leaking of sensitive material.

Sobre autorización:

Authorization should be conducted as an explicit check, and as necessary even after an initial authentication has been completed. Authorization depends not only on the privileges associated with an authenticated user, but also on the context of the request.

Validación de datos:

Liberal use of precondition checks in the entry points of software modules and components is highly recommended.

Seguro que ustedes encuentran las suyas.

Algunos enlaces que me han resultado útiles para comenzar este sitio

Tengo una mala costumbre cuando estoy instalando/actualizando/configurando cosas: empiezo a abrir pestañas en el navegador que se van acumulando sin mucho orden y que luego nunca termino de eliminar. Ahora que esta bitácora está medio funcionando, voy a poner aquí esos enlaces con dos objetivos: cerrar esas pestañas, y tener recopilada la información para el futuro, o por si le sirve a alguien más.

La primera inspiración vino de Bruce Eckel, en este post: New Programming Blog Site y luego su introducción Using Github Pages for Blogging de donde aprendí las primeras ideas.

La página de GitHub Pages y la explicación sobre cómo albergar un blog en Using Jekyll with Pages.

El artículo de Barry Clark que describe Build A Blog With Jekyll And GitHub Pages y que da algunas pistas y proporciona enlaces a algunos blogs donde buscar inspiración. Por ejemplo, este post Blogging Like a Hacker. El blog del propio Barry Clark, o el How I built my blog in one day de Eric Jones. Me queda pendiente resolver la gestión de categorías y etiquetas, y veo algunas pistas en Tags In Jekyll.

Información técnica sobre las plantillas en Jekyll templates.

No puedo imaginar una bitácora sin RSS. Para añadirlo miré Jekyll RSS Feed Templates. Interesante también la página sobre Plugins en Jekyll. Y sus limitaciones en Using Jekyll Plugins with GitHub Pages.

Finalmente, para integrar mejor el proceso de publicación con el editor (a mi me gusta vim), vim-jekyll.

Cuarta etapa

Repito aquí una historia ya contada unas cuantas veces, a la que le vamos añadiendo matices y novedades.

Copio de Tercera Etapa:

Esta bitácora nació allá por el 2001 en forma de MiBarrapunto: se trataba de un invento que hicieron los creadores de BarraPunto para permitir a los usuarios tener su propia sección con algunas ideas que ya me gustaría ver en alguna plataforma ahora, pero que no cuajaron por problemas de escalabilidad del programa y falta de recursos en aquel momento para mejorarlo (destacable, la promiscuidad absoluta: cualquiera podía tomar una entrada cualquiera del sitio -en particular, de otros usuarios- y reformarla o simplemente republicarla en su propia página).

Parte de esas ideas se han establecido en GitHub, donde el código puede copiarse, transformarse y reenviarse al autor original o a otros con herramientas bastante accesibles.

Con ese espíritu empecé a subir los contenidos de algunos de mis sitios a GitHub: Archivo bitácoras fernando para posteriormente descubrir que GitHub permitía publicar Páginas personales y para los proyectos y el sistema que las gestiona, Jekyll, que también permite gestionar un blog: nuestra página estaría albergada en el sistema con las mismas características de gestión del código fuente de los programas: fork permitido, copiar, pegar, modificar y reutilizar. Todavía no es tan fácil como era en la época de BarraPunto, pero aquí lo tenemos. Y aquí estamos.

No creo que la mayoría de la gente vaya a utilizar esto, y tampoco creo que nadie vaya a reutilizar estos contenidos. Pero siento que encaja bien con mi forma de trabajar y publicar (editar en local, subir al sitio y publicar) así que vamos a probar. Desde este momento, la bitácora anterior queda congelada y seguimos por aquí.

Bienvenidos a la cuarta etapa. Proximamente algo más de información sobre cómo gestionar un sitio aquí e ir resolviendo las carencia que aún tenemos (ya hay RSS, las categorías y las etiquetas no funcionan aún).