Instala tu propio servidor SSO (Single Sing-On)

Es posible que, como nosotros, ester harto de tantas contraseñas y tantas veces que tienes que autenticarte para acceder a tus aplicaciones. Nosotros ya inventamos nomorepass para no tener que andar recordando la contraseñas, pero eso no quita a que cada vez que instalamos un nuevo sistema en nuestro laboratorio personal nos toque volver a lidiar con las credenciales de acceso. Hay veces que intentamos centralizarlo en algún proveedor externo (como google o microsoft), pero esto no es del todo seguro y corremos el riesgo de tener que andar configurando nuestras aplicaciones con credenciales que, como las de Microsoft Hello caducan cada cierto tiempo.

Por eso os propongo algo mejor, ¿porqué no hospedar nosotros nuestro propio sistema de autenticación? En este post vamos a ver como instalar y configurar uno de los más populares y potentes sistemas SSO: Authentik. La instalación es bastante sencilla y está bien explicada en su documentación. Os resumo cómo quedaría la cosa. Necesitamos:

  • Servidor donde instalarlo (2VCPU / 2Gb memoria mínimo)
  • Docker y docker compose (v2 mejor)
  • wget y openssl instalado (necesarios solo para la instalación)

Una vez que tenemos el servidor con docker y docker compose instalado nos descargamos la plantilla:

wget https://goauthentik.io/docker-compose.yml

Y generamos los elementos de seguridad necesarios y los guardamos en el archivo .env

echo "PG_PASS=$(openssl rand -base64 36 | tr -d '\n')" >> .env
echo "AUTHENTIK_SECRET_KEY=$(openssl rand -base64 60 | tr -d '\n')" >> .env

Con esto ya podemos arrancar el servidor. Hay cosas que sería recomendable configurar, como la salida de email, bien con un servidor propio, o podéis utilizar cualquier servicio que os ofrezca smtp. También se puede cambiar el puerto por el que se accede, que generalmente está en el 9000/9443 para cambiarlos a los estándar 80/443. Como ejemplo os dejo mi docker-compose y mi .env (cambiando las cosas privadas, claro):

services:
  postgresql:
    image: docker.io/library/postgres:16-alpine
    restart: unless-stopped
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
      start_period: 20s
      interval: 30s
      retries: 5
      timeout: 5s
    volumes:
      - database:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: ${PG_PASS:?database password required}
      POSTGRES_USER: ${PG_USER:-authentik}
      POSTGRES_DB: ${PG_DB:-authentik}
    env_file:
      - .env
  redis:
    image: docker.io/library/redis:alpine
    command: --save 60 1 --loglevel warning
    restart: unless-stopped
    healthcheck:
      test: ["CMD-SHELL", "redis-cli ping | grep PONG"]
      start_period: 20s
      interval: 30s
      retries: 5
      timeout: 3s
    volumes:
      - redis:/data
  server:
    image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2025.2.4}
    restart: unless-stopped
    command: server
    environment:
      AUTHENTIK_REDIS__HOST: redis
      AUTHENTIK_POSTGRESQL__HOST: postgresql
      AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
      AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
      AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
    volumes:
      - ./media:/media
      - ./custom-templates:/templates
    env_file:
      - .env
    ports:
      - "${COMPOSE_PORT_HTTP:-9000}:9000"
      - "${COMPOSE_PORT_HTTPS:-9443}:9443"
    depends_on:
      postgresql:
        condition: service_healthy
      redis:
        condition: service_healthy
  worker:
    image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2025.2.3}
    restart: unless-stopped
    command: worker
    environment:
      AUTHENTIK_REDIS__HOST: redis
      AUTHENTIK_POSTGRESQL__HOST: postgresql
      AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
      AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
      AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
    user: root
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./media:/media
      - ./certs:/certs
      - ./custom-templates:/templates
    env_file:
      - .env
    depends_on:
      postgresql:
        condition: service_healthy
      redis:
        condition: service_healthy

volumes:
  database:
    driver: local
  redis:
    driver: local

.env:

PG_PASS=<esto-lo-tienes-que-generar>
AUTHENTIK_SECRET_KEY=<esto-lo-generas-tambien>
AUTHENTIK_ERROR_REPORTING__ENABLED=true
# SMTP Host Emails are sent to
AUTHENTIK_EMAIL__HOST=mail.biblioeteca.net
AUTHENTIK_EMAIL__PORT=587
[email protected]
AUTHENTIK_EMAIL__PASSWORD=<el que sea>
AUTHENTIK_EMAIL__USE_TLS=false
AUTHENTIK_EMAIL__USE_SSL=false
AUTHENTIK_EMAIL__TIMEOUT=10
[email protected]
AUTHENTIK_TAG=2025.6.2

Si todo hay ido bien ya puedes arrancarlo:

docker compose up -d

Y ya puedes empezar a configurar tu nuevo SSO navegando a la página:

http://<IP servidor>:9000/if/flow/initial-setup/

Con esto ya tenemos un sistema que nos permite hacer login con los usuarios que queramos… ¿Qué más podemos hacer con este sistema?… Pues un montón de cosas. Quedaos atentos y en los siguientes posts os enseñaré como hacer cosas interesantes como conectar con sistemas externos (como office365 o google) y hacer uso de esas credenciales.

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?