698 - Autenticación sin contraseñas con Passkeys y Pocket ID

698 - Autenticación sin contraseñas con Passkeys y Pocket ID

Como acceder a tus servicios auto alojados sin #contraseñas utilizando #passkeys y un estupendo proveedor de identidad como es #pocketid

1:25
-3:15

Las contraseñas son una auténtica contrariedad. Probablemente es de los aspectos que mas fricción crean a la hora de utilizar cualquier servicio o aplicación que lo requieran. Todas las condiciones para hacer tus contraseñas robustas son puntos de fricción. Así, no puedes utilizar una contraseña facilita para recordarla con comodidad. Además es necesario que la contraseña sea cuanto mas larga mejor. Debería tener mayúsculas, minúsculas, caracteres extraños. Por supuesto, no puedes utilizar la misma contraseña para todos tus servicios. Y para rematar la faena, tienes que cambiar las contraseñas periódicamente. Toda una Yincana que en ocasiones se convierte en una auténtica pesadilla. Y a pesar de todo esto, tampoco estamos seguros y añadimos el segundo factor de autenticación. En fin, un auténtico infierno. ¿Como resolver todo esto? con las Passkeys. En este episodio te voy a hablar sobre Passkeys y PocketID.

Autenticación sin contraseñas con Passkeys y Pocket ID

Un paseo por el pasado

Uno de los servicios que mas utilizo actualmente es Homepage. Una herramienta que me permite tener centralizados todas mis aplicaciones y servicios autoalojados. Además me muestra información de todo lo que sucede con ellos. Una auténtica joya. Sin embargo, no tiene autenticación. Si lo tengo expuesto a internet, cualquiera que visite esa página puede ver todo ese contenido. En ese sentido necesitaba una solución para poder tener la ventaja de Homepage, pero que está fuera de la vista de terceros.

Pero no solo me sucede con Homepage, también sucede con otras muchas aplicaciones, donde su desarrollador no ha implementado autenticación. Y no ha implementado autenticación porque no ha tenido tiempo, porque considera que no es necesario o por la razón que sea.

Aquí es donde surge TinyAuth un servicio del que te hablé en el episodio 666 titulado Un login para tus aplicaciones auto alojadas. Pero además tiene la ventaja de que lo puedes ligar con un tercero, por ejemplo con GitHub, Gitea o incluso con Pocket ID.

Después de muchos intentos terminé por enlazarlo con GitHub. De esta manera me evitaba las contraseñas. Pero no me terminaba de convencer. Tener que utilizar un servicio de terceros para mis propios servicios auto alojados. En principio un sin sentido.

Y entonces llegó Pocket ID a solucionar mi problema. Un servicio y auto alojado que me va a permitir autenticar pero además utilizando Passkeys.

¿Qué son las Passkeys?

Como ya he comentado, las contraseñas son un auténtico quebradero de cabeza. Por eso, desde hace tiempo se está trabajando en una alternativa a las contraseñas. Una alternativa que no nos genere tanta fricción a los usuarios y que además sea segura. Y esa alternativa son las Passkeys.

Tal y como indican en la propia página de Passkeys,

Con más de 6.000 millones de nombres de usuario y contraseñas únicos disponibles en la Dark Web, y con la mayoría de los usuarios utilizando las mismas contraseñas en todas las plataformas, Passkeys ha surgido como una solución revolucionaria, ofreciendo un método más seguro y racionalizado para la autenticación.

Pues ni mas ni menos, Passkeys es una clave criptográfica diseñada para reemplazar a las antiguas contraseñas. Las Passkeys funcionan con autenticación por combinación de clave público y privada, al igual que podemos hacer con el acceso a nuestros servidores vía ssh.

Las Passkeys tienen una particularidad muy importante, y es que no se pueden compartir, recordar ni escribir. Por lo tanto, no se pueden robar, ni adivinar, ni olvidar.

Cuando creas una Passkey, en realidad se crean dos «llaves» digitales que trabajan juntas, como una cerradura y su llave:

  • La llave pública se guarda en el servidor del servicio (por ejemplo, una página web o app). No es secreta y no sirve para acceder a tu cuenta por sí sola. Es como una cerradura, cualquiera puede verla, pero sin la llave adecuada, no puede abrirla.
  • La llave privada se guarda en tu dispositivo (como tu móvil o tu ordenador). Esta sí es secreta y nunca se envía a ningún sitio. Está muy bien protegida y solo tú puedes usarla, normalmente con tu huella, tu cara o tu PIN. Es como tener la llave que abre esa cerradura, pero siempre en tu bolsillo y bajo llave.

Otra ventaja realmente interesante es que las Passkeys también funcionan entre dispositivos, de forma que las claves privadas se sincronizan entre todos los dispositivos de tu cuenta de Google, por ejemplo.

Por ejemplo, si creas una Passkey para GitHub, simplemente la próxima vez que quieras acceder a tu cuenta, utilizando esa Passkey podrías acceder.

¿Donde puedo guardar mis Passkeys?

En mi caso particular estoy utilizando Bitwarden para guardar esas Passkeys, que luego las podré utilizar en cualquier otro sitio. Simplemente, cuando entro en un servicio que me pida Passkey, directamente se abre Bitwarden y me ofrece las distintas Passkeys que estén configuradas para ese servicio, pulso sobre ella y listo.

No solo Bitwarden permite guardar Passkeys, también lo puedes hacer con otros gestores de contraseñas como 1Password o KeePassXC.

Pocket ID

Hasta aquí te he contado sobre el tema de quitarme las contraseñas de encima con las Passkeys, pero falta como puedo autenticarme en mis servicios utilizando esas Passkeys, y justo aquí es donde entra Pocket ID.

Pocket ID es una herramienta sencilla que te permite iniciar sesión en tus servicios usando passkeys, justo como te decía hasta el momento sin necesidad de contraseñas.

Su función es ser un proveedor de autenticación auto alojado, realmente sencillo de utilizar. Existen otras opciones más completas como Keycloak, pero con el inconveniente de que son mas complicadas si solo necesitas algo básico.

La gran ventaja de Pocket ID radica precisamente en ser un proveedor de autenticación. Es decir, se trata de un sistema que gestiona y verifica la identidad de los usuarios. Su función principal es autenticar a los usuarios y permitir acceder a otros servicios o sistemas.

Cuando un usuario intenta iniciar sesión en una aplicación, esta redirige la solicitud al proveedor de autenticación. El proveedor de autenticación se encarga de verificar la identidad del usuario y, si es correcta, devuelve un token de autenticación. Este token es lo que la aplicación utiliza para confiar en que el usuario ha sido autenticado correctamente.

Instalación de Pocket ID

Como ya te puedes imaginar la instalación de Pocket ID es tremendamente sencilla y corre de la mano de Docker. Tan solo tienes que utilizar el siguiente compose.yml,

services:
  pocket-id:
    image: ghcr.io/pocket-id/pocket-id
    container_name: pocket-id
    init: true
    restart: unless-stopped
    volumes:
      - data:/app/data
    environment:
      APP_URL: https://pocketid.tuservidor.es
      TRUST_PROXY: false
      MAXMIND_LICENSE_KEY: ""
      PUID: 1000
      PGID: 1000
    # Optional healthcheck
    healthcheck:
      test: curl -f http://localhost:1411/healthz
      interval: 1m30s
      timeout: 5s
      retries: 2
      start_period: 10s
    networks:
      - proxy
    labels:
      traefik.enable: true
      traefik.http.services.pocketid.loadbalancer.server.port: 1411
      traefik.http.routers.pocketid.entrypoints: https
      traefik.http.routers.pocketid.rule: Host(`pocketid.tuservidor.es`)
volumes:
  data: {}
networks:
  proxy:
    external: true

Pocket ID y TinyAuth

Como te conté en episodios anteriores, TinyAuth es un servicio que te permite autenticarte en tus aplicaciones auto alojadas. En este caso, Pocket ID se convierte en el proveedor de autenticación de TinyAuth.

Y así es como lo monté inicialmente. Así, cuando intento entrar en un servicio cuyo acceso está controlado por TinyAuth, Traefik, se encarga de redirigir la petición a TinyAuth y este de conceder el acceso.

Y así es como lo monté inicialmente… Pero en un momento determinado vi la luz, y me di cuenta que realmente no me hacía falta, que podía prescindir totalmente de TinyAuth, utilizando Traefik, directamente y eso es lo que hice. Utilicé un middleware y listo.

Para la configuración de Traefik es necesario tocar todas las partes. En la parte estática tienes que añadir el siguiente middleware,

traefik-oidc-auth:
  moduleName: "github.com/sevensolutions/traefik-oidc-auth"
  version: "v0.11.0"

En la parte dinámica tendrás que añadir

oidc-auth:
  plugin:
    traefik-oidc-auth:
      Secret: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      Provider:
        ClientId: XXXXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXXXXXXXXXXXX
        ClientSecret: XXXXXXXXXXXXXXXXXXXXXXXXXX
        Url: https://pocketid.tuservidor.es/
        TokenValidation: IdToken
      Scopes:
        - openid
        - profile
        - email

Los datos los tienes que obtener de Poket ID.

Y por último, y esto fue quizá lo que mas me costó, tienes que modificar el compose.yml de Traefik y añadir las siguientes etiquetas,

- traefik.http.routers.traefik.middlewares=oidc-auth@file,error-pages-middleware@docker
- traefik.http.routers.traefik-callback.entrypoints=https
- traefik.http.routers.traefik-callback.rule=HostRegexp(`.+`) && (PathPrefix(`/oidc/callback`) || PathPrefix(`/logout`))
- traefik.http.routers.traefik-callback.middlewares=oidc-auth@file
- traefik.http.routers.traefik-callback.service=noop@internal

Y para terminar, es necesario que a todos los servicios que quieras poner esa autenticación añadas la siguiente etiqueta,

- traefik.http.routers.homepage.middlewares=oidc-auth@file

Y con esto ya lo tienes solucionado. A partir de aquí puedes acceder a todos los servicios que quieras. Si te fijas, simplemente he reemplazado la misma etiqueta que tenía con TinyAuth, por esta etiqueta.

Además y como no podía ser de otra forma, he comenzado a utilizar Pocket ID para todos los servicios que tengo de forma que con un solo proveedor, puedo acceder a todos los servicios. En este sentido tienes en la página web de Pocket ID hasta 40 ejemplos de servicios que puedes utilizar con Pocket ID. Por ejemplo, Portainer, Synology, Pangolin, NextCloud, y mas…. De esta manera, una vez estás autenticado en Pocket ID, entrar en todos tus servicios es una auténtica delicia.


Más información,

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *