Foro QNAP en español

Versión completa: Docker gestor de 2FA
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Hola

Hoy voy a mostrar como tener nuestro propio gestor de 2FA para evitar dependencias de terceros.
Su función es como las de Authy o los autenticadores de Google, Microsoft o de Qnap 

Su uso es muy sencillo y permite añadirlos por cadena de texto, por cámara con código QR y por fotografía del QR.

Su entorno es web y es una lástima que no haya app para móvil. Pero vía web en el móvil funciona perfectamente.

Aquí me parece importante tener una carpeta persistente compartida para la bbdd de los códigos y poder tenerla  a buen recaudo y con opciones de copia de seguridad.

La ruta de la carpeta será por ejemplo "/share/DockerData/2fauth"
El docker usa al usuario 1000 y grupo 1000.
Es decir las carpetas persistentes ha de tener permisos similares para que el usuario de ese docker pueda usar la carpeta compartida de la nas.

La mejor forma de ver esos permisos ver las propiedades de los usuarios uno por uno desde QTS o mejor es lanzar el comando siguiente por consola:
Código:
cat /etc/passwd
Al hacerlo vemos todos los usurios y en cada línea veremos usuario, x, numero_de_id, número de grupo
Nos fijamos quien tiene 1000 (por ejemplo lo tiene asignado usuario_anterior )

Ahora para ver si tenemos un grupo con 1000, ejecutamos el siguiente comando:
Código:
cat /etc/group
Y veremos por línea:  nombre grupo, id_del_grupo , usuarios

Si tenemos el 1000 creado, tomamos nota del nombre usado. 
Si no lo ternemos lo creamos con la siguiente orden de consola:
Código:
addgroup -g 1000 dockers

En el comando de ejemplo anterior creo al grupo "dockers" con ID 1000

Ahora agregamos el "usuario_anterior" de ID 1000 al grupo "dockers" de ID 1000.
Podemos hacerlo desde los grupos de QTS o bien desde consola con
Código:
adduser usuario_anterior dockers


A esa carpeta hemos de asignar propietarios al "usuario_anterior" y grupo "docker" y dar permisos de tipo 700.
Lo hacemos con los comandos
Código:
chown 1000:1000 /share/DockerData/2fauth
chmod 700 /share/DockerData/2fauth


Ahora vamos con el comando de creación del contenedor, que será el siguiente:

Código:
docker run --name=2fauth -d -p 8500:8000/tcp -v /share/DockerData/2fauth:/2fauth -e AUTHENTICATION_GUARD=web-guard 2fauth/2fauth

Una vez iniciado, vamos a su web y veremos la pantalla habitual de usuario y clave (que aún no tenemos)
[attachment=3009]

Evidentemente, de inicio NO hay ninguno y hemos de crearnos.
[attachment=3010]

Tras dar nuestro nombre, dirección de correo y clave, nos da la opción de asociar una llave (Yubikey por ejemplo  Shy )
[attachment=3011]


El docker permite envío de correos para restablecer claves olvidadas, pero para ello hemos de haber asignado las siguientes variables a la hora de definir el contenedor:
  • -e MAIL_DRIVER=smtp
  • -e MAIL_HOST=direccion_servidor_smtp
  • -e MAIL_PORT=465
  • -e MAIL_ENCRYPTION=ssl  protocolo cifrado
  • -e MAIL_FROM_NAME="nombre del remitente"
  • -e MAIL_FROM_ADDRESS=direccion_remitente
  • -e MAIL_USERNAME=usuario_smtp
  • -e MAIL_PASSWORD=clave_correo

Es decir, nuestra cadena de creación sería algo similar a esto:
Código:
docker run --name=2fauth -d -p 8500:8000/tcp -v /share/DockerData/2fauth:/2fauth -e AUTHENTICATION_GUARD=web-guard -e MAIL_DRIVER=smtp -e MAIL_HOST=smtp.servidor.com -e MAIL_PORT=465 -e MAIL_ENCRYPTION=ssl -e MAIL_FROM_NAME="admin de 2fAuth" -e MAIL_FROM_ADDRESS=correo@remitente.com -e MAIL_USERNAME=correo@remitente.com -e MAIL_PASSWORD=clave_correo  2fauth/2fauth:5.0.2

Una vez empecemos a tener datos de autenticaciones, es muy importante tener y hacer copias del archivo "database.sqlite" que está en la ruta "/share/DockerData/2fauth".
Ahí se encuentran todos nuestros datos de usuarios y accesos.
Lo mejor para hacer copia es detener el contenedor, copiar la sqlite y de nuevo arrancar el contenedor.

Nota del 25/01/24

He visto que para usar llaves físicas hay que hacer que el docker publique por https. Se puede hacer mediante un proxy inverso.
Pero aún así da algún error usando la consola para crearlo.
En cambio he visto que por docker compose no da ese problema.
He usado la siguiente configuración:
Código:
version: "3"
services:
  2fauth:
    image: 2fauth/2fauth:5.0.2
    container_name: 2fauth
    volumes:
      - /share/DockerData/2fauth:/2fauth
    ports:
      - 8500:8000/tcp
    environment:
      - UID=1000
      - GID=1000
      - APP_NAME=2FAuth
      - APP_ENV=local
      - APP_DEBUG=false
      - SITE_OWNER=tumail@qnapclub.com
      - APP_KEY=una_cadena_de_texto_aletoria_de_32_caracteres
      - APP_URL=https://2fa.tu_dominio_web.com
      - IS_DEMO_APP=false
      - LOG_CHANNEL=daily
      - LOG_LEVEL=notice
      - DB_DATABASE="/srv/database/database.sqlite"
      - CACHE_DRIVER=file
      - SESSION_DRIVER=file
      - MAIL_DRIVER=log
      - MAIL_HOST=smtp.servidor_correo.com
      - MAIL_PORT=587
      - MAIL_USERNAME=usuario@correo.com
      - MAIL_PASSWORD=la_clave_del_correo
      - MAIL_ENCRYPTION=ssl
      - MAIL_FROM_NAME=usuario@correo.com
      - MAIL_FROM_ADDRESS=usuario@correo.com
      - MAIL_VERIFY_SSL_PEER=true
      - THROTTLE_API=60
      - LOGIN_THROTTLE=5
      - AUTHENTICATION_GUARD=web-guard
      - AUTH_PROXY_HEADER_FOR_USER=null
      - AUTH_PROXY_HEADER_FOR_EMAIL=null
      - PROXY_LOGOUT_URL=null
      - WEBAUTHN_NAME=2FAuth
      - WEBAUTHN_ID=null
      - WEBAUTHN_ICON=null
      - WEBAUTHN_USER_VERIFICATION=preferred
      - TRUSTED_PROXIES=null
      - PROXY_FOR_OUTGOING_REQUESTS=null
      - BROADCAST_DRIVER=log
      - QUEUE_DRIVER=sync
      - SESSION_LIFETIME=120
      - REDIS_HOST=127.0.0.1
      - REDIS_PASSWORD=null
      - REDIS_PORT=6379
      - PUSHER_APP_ID=
      - PUSHER_APP_KEY=
      - PUSHER_APP_SECRET=
      - PUSHER_APP_CLUSTER=mt1
      - VITE_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
      - VITE_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
      - MIX_ENV=local

Como se puede comprobar, aquí se definen bastantes mas variables. 

Haciendo pruebas he comprobado que se integra sin problemas en:
  • las validaciones faciales de los iPhone (doy por supuesto que también en el lector de huella)
  • llaves físicas Yubikey

En su momento usé el tag "latest" que era la versión 5.0.2 del docker, con el último tengo problemas de visón dela web, así que en las cadenas de creación he obligado a esa versión.