Subir a maven central una librería propia

Ahora que ya acabas de construir una librería interesante en Java, la has hecho pública (en github, por ejemplo) y quieres que todo el mundo la use… Queda una tarea pendiente, subirla a un repositorio maven para ponerla a disposición de los que utilicen este sistema (o gradle, que hoy en día ya son casi todos).

Vamos a verlo con un ejemplo que he subido esta mañana… Hay cosas que todavía no entiendo del todo, pero el resultado ha sido bueno, por lo que, al menos, podremos usar esta receta como guía para próximas veces.

El código que intento subir es una librería simple que tengo alojada en github con su pom.xml básico y que si te descargas el proyecto podrías compilar e instalar en tu maven con mvn install. La dirección es esta:

https://github.com/yoprogramo/nomorepass-java/

Ahora, para que todo el mundo pueda descargárselo como dependencia y no tenga que hacer el mvn install del proyecto, tenemos que subirlo a un repositorio público, podemos ver una guía en esta página: Guide to Public Maven Repositories. Tal como explican en la página, lo más sencillo para publicar en Maven Central es usar el repositorio Sonatype. Dicho y hecho… Lo intentamos por aquí.

Lo primero es crear una cuenta en el Jira de Sonatype aquí. Lo siguiente, y esto es un poco «tricky» es crear un ticket solicitando un nuevo id de grupo en esta dirección. No se puede pedir cualquier id de grupo (en mi caso quería pedir com.nomorepass) y generalmente se pedirá alguna prueba de que el dominio es tuyo. En mi caso este es el ticket que creé: https://issues.sonatype.org/browse/OSSRH-49426, para demostrar que el dominio era mío cambié el DNS e incluí una entrada TXT con el identificador del ticket:

Una vez autorizado (tarda un poco, es un proceso manual) hay que modificar nuestro código y prepararlo para la subida, pero, antes de eso, tenemos que generar nuestras claves gpg para poder firmar el código. eso se hace con este comando:

gpg --gen-key

Una vez generada podremos acceder a la lista de claves con el comando:

gpg --list-keys

Toma nota del id de la clave y recuerda la contraseña que usaste para generarla, porque tendrás que recordarla. Además, tendrás que publicarla en algún servidor de claves públicas para que pueda ser comprobada.

gpg --keyserver hkp://keys.gnupg.net --send-keys <el-id-de-la-clave>

Ahora empezamos a modificar el pom.xml para que cumpla con los requisitos para el repositorio Maven Central. En nuestro caso pusimos esto:

<groupId>com.nomorepass</groupId>
  <artifactId>nomorepass</artifactId>
  <version>1.0</version>
  <packaging>jar</packaging>

  <name>Nomorepass java library</name>
  <description>NoMorePass protocol 2 implemented on Java.</description>
  <url>https://nomorepass.com</url>

  <licenses>
    <license>
      <name>Apache License, Version 2.0</name>
      <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
      <distribution>repo</distribution>
    </license>
  </licenses>

  <developers>
    <developer>
      <name>Jose Antonio Espinosa</name>
      <email>espinosa@yoprogramo.com</email>
      <organization>Nomorepass</organization>
      <organizationUrl>https://nomorepass.com</organizationUrl>
    </developer>
  </developers>

  <scm>
    <connection>scm:git:git://github.com/yoprogramo/nomorepass-java.git</connection>
    <developerConnection>scm:git:ssh://github.com:yoprogramo/nomorepass-java.git</developerConnection>
    <url>https://github.com/yoprogramo/nomorepass-java/tree/master</url>
</scm>

Y, una vez informado de todo esto, hay que incluir los plugins que nos permitirán hacer el despliegue directamente. Yo añadí esto:

<distributionManagement>
    <snapshotRepository>
      <id>ossrh</id>
      <url>https://oss.sonatype.org/content/repositories/snapshots</url>
    </snapshotRepository>
    <repository>
      <id>ossrh</id>
      <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
</distributionManagement>

Y puse en mi directorio de maven settings.xml los datos de mi usuario

<settings>
  <servers>
    <server>
      <id>ossrh</id>
      <username>xxxxxxxxxx</username>
      <password>xxxxxxxxxx</password>
    </server>
  </servers>
</settings>

Por último, toda la sección de build (que no tenía) la sustituí por esto:

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-gpg-plugin</artifactId>
        <executions>
          <execution>
            <id>sign-artifacts</id>
            <phase>verify</phase>
            <goals>
              <goal>sign</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.sonatype.plugins</groupId>
        <artifactId>nexus-staging-maven-plugin</artifactId>
        <version>1.6.7</version>
        <extensions>true</extensions>
        <configuration>
          <serverId>ossrh</serverId>
          <nexusUrl>https://oss.sonatype.org/</nexusUrl>
          <autoReleaseAfterClose>true</autoReleaseAfterClose>
        </configuration>
      </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-source-plugin</artifactId>
          <version>2.2.1</version>
          <executions>
            <execution>
              <id>attach-sources</id>
              <goals>
                <goal>jar-no-fork</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-javadoc-plugin</artifactId>
          <version>2.9.1</version>
          <executions>
            <execution>
              <id>attach-javadocs</id>
              <goals>
                <goal>jar</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
    </plugins>
</build>

Y ya, finalmente, pude ejecutar el mágico:

mvn clean deploy

Si todo ha ido bien, el artefacto estará subido a un repositorio que tendremos que promocionar a «Release» para que se sincronice con el repositorio central… Pero al final ya lo tendremos disponible para todo el mundo…

Aquí podéis encontrar lo que acabo de subir: https://search.maven.org/artifact/com.nomorepass/nomorepass/1.0/jar

Olvidarse de las contraseñas DEFINITIVAMENTE en Android

Una de las preguntas más redundantes que nos han hecho en los múltiples eventos en los que hemos presentado NoMorePass es ¿Puedo usarlo para hacer login en el propio móvil? Nuestra respuesta, como siempre, era positiva, pero con restricciones, hasta el momento solo podíamos copiar-pegar la contraseña… Y digo hasta ahora porque Android 8 incluyó una novedad que nos venía al pelo: el Autofill Framework.

Este framework permite a algunas aplicaciones registrarse como servicio proveedor de credenciales de forma que, si el usuario selecciona esa aplicación, el sistema permite que la aplicación «recomiende» valores posibles para los campos a rellenar en las aplicaciones… Dicho y hecho, esto es lo que los usuarios de NoMorePass nos estaban pidiendo y esto es lo que hemos conseguido (dentro video:)

Autocompletar con NoMorePass

Como véis es algo sumamente sencillo, seleccionar NoMorePass como proveedor de autocompletar y a partir de ese momento todas las contraseñas estarán disponibles para autorellenado cuando las necesitemos.

La primera vez que usamos una contraseña para una app nos preguntará qué contraseña enviar (y usaremos el mismo método que con las webs) y, lo que es más, si metemos a mano una contraseña se nos preguntará si queremos registrar esa contraseña en NoMorePass y así no tener que volver a meterla nunca más… Así hacemos realidad nuestro lema: Olvida tus contraseñas.

¿Y qué pasa con iOS? bueno, apple nunca nos ha puesto las cosas fáciles, más teniendo en cuenta su empeño con quedarse con las credenciales de todo el mundo en su iCloud. Sin embargo, a partir de iOS 12, Apple ha abierto un poco la mano a esta posibilidad y ofrece Servicios de autenticación que, cómo no, vamos a integrar lo antes que podamos.

Mientras… Si tienes Android 8.0 o superior, puedes disfrutar de esta nueva funcionalidad descargádote la versión 1.11.1 o superior de la app.

Ellos ya conocen tu contraseña

Ultimamente estoy recibiendo este tipo de correo (tengo que revisar el spam porque Google sabiamente me los clasifica como correos peligrosos):

La cuestión es que sabían mi contraseña (no, no es la que aparece en el ejemplo que acabo de poner) y eso no es nada raro, ya que hay más de 1.400 millones de emails y contraseñas circulando por la red proveniente de filtraciones y hackeos varios. Si quieres saber si estás afectado (antes de que intenten chantajearte por email) puedes hacerlo en esta página:

Comprobar si tienen mi contraseña

Aquí puedes comprobar si ya tienen tu contraseña

El resto del correo electrónico es pura ingeniería social… Te amenazan con hacer público algo que a ti no te interesa y que, dado que conocen una de tus contraseñas, podrían haber capturado si no tenemos cuidado… Es totalmente falso, y si tuviesen algo que enseñar ya te lo habrían enseñado, así que, por favor, no pagues.

Para estar protegido (dentro de lo que cabe) intenta no repetir contraseñas en distintos sitios, usar contraseñas que no sean comunies o variaciones de datos propios (si, las variaciones tampoco aportan seguridad) y nunca hagas caso de correos que te manden desconocidos. Por mi parte yo aporto mi granito de arena con NoMorePass, para que no tengas que recordar ninguna contraseña y te mantengas a salvo de todas estas cosas. ¿Qué esperas para probarlo? Es el unico gestor de contraseñas que mantiene solo en tu teléfono todas tus contraseñas y te evita el tener que recordarlas o teclearlas. De hecho el enlace que os puse antes está patrocinado por un gestor de contraseñas de la competencia que ya ha sido comprometido más de una vez. Se bueno, mantente seguro y usa nomorepass…

Parando un ciberataque a tu wordpress

Este lunes, a eso de media tarde, detectamos en la web de uno de nuestros clientes que estaba recibiendo una cantidad inusualmente alta de intentos de login fallidos. Nuestro cliente, que usa wordpress, tiene un cierto nivel de visitas digamos, importante, lo que le hace un blanco para bots y escaneadores de redes habitualmente, por lo que siempre recibe cierta cantidad de estos intentos fallidos, pero al cabo de unos minutos nos dimos cuenta de que esta vez era distinto… Estabamos en medio de uno de los mayores ataques a sitios wordpress de la historia. Este es el volumen que mostraba wordfence (el plugin de seguiridad que usamos):

Como vemos se llegaron a los 10 millones de ataques y, como dicen en su blog se trataba de un ataque distribuido masivo de fuerza bruta muy importante. De hecho indicaban que:

  • El ataque había llegado a 14.1 millones de ataques por hora.
  • El número toral de IPs involucradas fueron más de 10,000.
  • Se estaban atacando más de 190.000 sitios WordPress por hora.
  • Esta es la campaña más agresiva que nunca hemos visto por volumen de ataques por hora.

La razón que proponían como posible fuente de este ataque fue el filtrado masivo de credienciales que salió a la luz el 5 de diciembre y que dejaba expuestos millones de contraseñas nuevas que poder utilizar en un ataque de este tipo.

Así que, en medio de toda esta vorágine y recibiendo un montón de alertas, teníamos que hacer algo para proteger nuestro sitio, manteniendo el servicio y evitando que los chicos malos se nos colasen hasta la cocina.

Además de tomar las medidas habituales, nosotros escogimos un camino que nadie más podía tomar, utilizar el nuevo plugin wordpress de nomorepass que acabábamos de desarrollar y que todavía no estaba distribuido (ahora ya lo está) y que contenía una nueva opción más que interesante: «Solo permitir el acceso mediante la app».

Con esta simple opción aunque los robots consiguieran un usuario y un password válido para el sitio no podrían entrar, porque solo se permitiría entrar a aquellos que usaron el código qr y la app para enviar sus credenciales. Esta simple medida, junto con el baneo de ips y otras medidas habituales consiguieron devolver la normalidad al sitio y, sobre todo, estar seguros de que no se podían haber colado.

Como ya os he contado muchas veces, la mejor contraseña es la que no conocemos, así evitaremos todos los ataques por ingeniería social y estaremos un poquito más seguro sin tener que cambiar – todavía – la infraestructura de acceso a nuestros sitios.

Por todo ello,  os recomiendo usar nomorepass.

El fin del hacking por ingeniería social

La mayor parte de los sistemas de acceso a las webs, correos o cualquier otro sistema informático son técnicamente lo suficientemente robustos para que utilizar métodos de fuerza bruta o criptográficos sea muy, muy complicado (hablo de webs que ya tengan ssl, ordenadores que no tengan keyloggers ni cosas de esas). De hecho los medios para romper una clave rsa que tuvo que poner la NSA (11.000 millones de dólares) no están al alcance de cualquier hacker y, desde luego, no de cualquier hacker que ande por ahí. Sin embargo, se siguen produciendo ataques, filtraciones e intrusiones en nuestras cuentas usando el método más barato de todos: la ingeniería social.

Mediante ingeniería social lo que un hacker hace es tratar de que tu mismo le entregues tus claves o, en el peor de los casos, utilizar alguna clave tuya conocida para derivar la que puede ser tu clave para ese sistema. En 2004 el New York Post publicaba un artículo en el que se describía un experimento por el que un desconocido ofrecía un dulce a cualquiera que le diese la contraseña de su correo… Y el resultado fue sorprendente, 7 de cada 10 personas entregaron la contraseña de su correo. De esta manera da igual que tengamos SSL, TLS, un sistema límpio, y todas las medidas que queramos que mediante ingeniería social cualquier atacante puede descubir nuestras contraseñas. Además, nuestro cerebro no es capaz de recordar secuencias de caracteres aleatorios, o al menos no muchas, por lo que al final solemos usar alguna heurística para tener una sola contraseña y derivar otras en base a esas. Un sistema que conduce, irremisiblemente a regalar nuestras contraseñas a cualquiera que esté interesado por ellas.

¿Cual es mi solución? Muy sencillo, que el usuario no sepa las contraseñas, no es necesario cambiar ningún sistema, ni recordar nada, ni preocuparse lo más mínimo, simplemente olvidate de las contraseñas. Para conseguir esto he creado el sistema nomorepass, que además de generarte contraseñas y almacenarlas de manera segura en tu dispositivo móvil (y solo en tu dispositivo, nada de copiarlo en la nube, ni en nuestros servidores, ni en los ordenadores) te permite enviarlas de manera segura a la web o el dispositivo que la necesita… Todo ello sin que tu tengas que saber cual es la contraseña y, por tanto, sin poder ser presa de la ingeniería social.

Llevando esto al extremo, he desarrollado un nuevo plugin para wordpress que permite hacer los registros de usuario de manera automática, sin tener que elegir un password y que lo almacena directamente y de forma segura en tu app nomorepass. Puedes hacer la prueba registrándote en este blog, simplemente pincha aquí, escribe tu nick y tu email, pincha en el icono de nomorepass y luego escanea el qr con la app usando el botón rojo. ¡voila! ya estás registrado y con tus credenciales en tu teléfono… ¡Y ni siquiera sabes qué contraseña has usado!!

Deja de usar sistemas obsoletos, de escribir las contraseñas en papeles, tener una sola contraseña (con variaciones) para todas tus cuentas o, simplemente, deja de acordarte de tus contraseñas… Usa nomorepass. Es gratis, pero si, además, quieres tener una seguridad extra puedes suscribirte, si dejas un comentario en esta entrada te enviaré un código para que puedas disfrutar de todas las funcionalidades premium durante un mes… ¿Qué esperas?