• 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Docker Authelia para proteger a nuestras web
#1
Hola

Voy a describir como instalar en docker y configurar a Authelia.

Este servicio permite agregar segundos factores (2FA)  de autenticación a webs de nuestra nas o red.

Tiene varios requisitos previos para su instalación y funcionamiento:
  • *Tenemos que tener un base de datos creada en MariaDB vía PhpMyAdmin. Por ejemplo podría ser de nombre "authelia" o "db_authelia"
  • *Tener un servidor LDAP funcionando en QNAP, aunque no es estrictamente necesario e incluso no tiene que estar en la nas.
  • *Tener el docker de Nginx Proxy Manager que puede estar usando MariaDB.
  • *Tener un dominio y una gestión de sus dns, para asociar las webs a ip o direcciones.
  • *Evidentemente,  tener activo Container Station para ejecutar dockers
  • *Tener una carpeta compartida para tener datos persistentes para el docker
  • *datos smtp de un cuenta de correo para el envío correos.

Recomendable tener el contenedor de Portainer para facilitarnos la gestión de los docker.

Los puntos que vamos a ver son los siguientes:
  1. 1-Descripción a grandes rasgos de la funcionalidad de Authelia.
  1. 2-instalación del docker redis
  1. 3-usuarios de LDAP
  1. 4-Creamos la base de datos vacía
  1. 5-archivo básico de configuración de Authelia 
  1. 6-Instalación del docker de Authelia
  1. 7-Comprobación de acceso a la web de authelia en Nginx Proxy Manager
  1. 8-Reconfiguración de parámetros en las webs de Nginx Proxy Manager
  1. 9-Activación por primera vez del 2FA

1-Descripción a grandes rasgos de la funcionalidad de Authelia.

Básicamente lo que hace Authelia es interceptar la llamada a un servicio web y presentarnos una pantalla de login con 2FA.

Los usuarios, claves y otros datos son los que tenemos ya definidos en nuestro LDAP.
Tras esta primera identificación se nos presenta la petición del segundo factor de autenticación. que puede ser un código de un sólo uso temporal (hay que tener en hora los dispositivos) o incluso el uso de una llave hardware tipo Yubikey.
Una vez pasada esta segunda barrera, se nos presentará la web destino y otras que estén protegidas por Authelia durante un periodo definido en la configuración de Authelia.

Es particularmente interesante ya que podemos añadir una capa de protección a webs que son susceptibles de tener vulnerabilidades y no son corregidas con celeridad por su creador o simplemente queremos estén ocultas a nivel público.


2-instalación del docker redis

Este contenedor nos puede proporciona accesos a una base de datos de vigencia limitada que queda ubicada en memoria, una caché distribuida de base de datos clave-valor, y hacer de servidor de caché de objetos persistentes. Aunque tiene mas funciones.

Seguramente Authelia lo usará para almacenar a los usuarios activos y que han pasado con éxito el segundo factor.
Tras el periodo de vigencia, se eliminarán y volverá a pedir esa credenciales.

Afortunadamente, para nosotros, su uso es transparente y no hay que hacer ninguna configuración, sólo hemos de tenerlo en funcionamiento.

Para generar el docker podemos ejecutar el siguiente comando de consola:
Code:
docker run -d --name redis --restart always -v /share/DockerData/redis:/data -p 6379:6379 redis:latest


O bien en formato YAML
Code:
version: "3.5"

services:
  redis:
    image: redis:latest
    network_mode: "bridge"
    container_name: redis
    volumes:
      - "/share/DockerData/redis:/data"
    ports:
      - "6379:6379"
    restart: always

Independientemente del sistema elegido, sólo hemos de dejar funcionando este docker.


3-usuarios de LDAP

En el servidor de LDAP debemos tener definidos los usuarios que queramos que vayan a usar Authelia.
Podremos incluso tenerlos diferenciado del resto creando un grupo em el LDAP y luego deberíamos hacer un filtrado de estos en el archivo de configuraciones de Authelia.
Por simplificar simplemente vamos a crear un par de usuarios en el grupo por defecto.
No tiene que ser obligatorio que la nas de QNAP sea el servidor de LDAP, podríamos tenerlo en otro equipo con FreeIPA por poner un ejemplo.

Para el caso de QNAP los filtros a tener en cuenta en su LDAP son:
  • base_dn: dc=mi_dominio,dc=es
  • additional_users_dn: ou=people
  • additional_groups_dn: ou=group
  • user: cn=admin,dc=mi_dominio,dc=es


Así de esta forma, para generar mas usuarios con permisos a las web, sólo hemos de crearlos en en LDAP de la nas y no hemos de hacer nava en Authelia.

Es cierto que hay una forma de no usar LDAP y tener los usuarios/sus claves en un archivo de configuración extra.
Lo contaré al final del post ya que es un sistema un poco mas complicadillo de hacer y sobre todo de generar y gestionar si lo comparamos con el LDAP integrado en la NAS.

4-Creamos la base de datos vacía


En nuestro caso la llamaremos "db_authelia", de usuario "usuario_authelia" y clave "clave_authelia". Evidentemente usaremos nombres y claves de nuestra elección.

Abrimos nuestro PhpMyAdmin y lo generamos tal como se muestra en este otro post.



5-Archivo básico de configuración de Authelia

La configuración de Authelia se crea y guarda en un archivo . yml
Este archivo lo vamos a dejar en un carpeta compartida que haremos persistente de cara al docker para que podamos editarlo externamente.

El archivo se llama "configuration.yml" y tendrá un contenido similar a esto
Code:
#                   Authelia configuration                    #
theme: dark
server:
    host: 0.0.0.0
    port: 9091
# Podemos evitar dejarla escrita aquí si definimos la variable AUTHELIA_JWT_SECRET_FILE
jwt_secret: '0123456789012345678901234567896DD68A91F3861160FD0198C21F12345678' 
# podemos obtener claves robustas de este tipo en https://www.grc.com/passwords.htm
default_redirection_url: https://authelia.mi_dominio.es
## Configuracion de la autenticacón de usuarios
## podemos usar `file` o `ldap`, pero son excluyentes entre si.
## usamos el LDAP de la QNAP
authentication_backend:
  ldap:
    implementation: custom
    url: ldap://www.xxx.yyy.zzz  # la ip local de nuesta nas
    start_tls: false
    base_dn: dc=mi_dominio,dc=es # valores del LDAP
    additional_users_dn: ou=people
    additional_groups_dn: ou=group
    users_filter: (&({username_attribute}={input})(objectClass=person))
    groups_filter: (&(uniquemember={dn})(objectclass=groupOfUniqueNames))
    user: cn=admin,dc=mi_dominio,dc=es # valores del LDAP
    password: ClaveSecreta # Clave del admin del LDAP de la QNAP
   
    
totp:
  issuer: authelia.mi_dominio.es
  period: 30
  skew: 1
 
access_control:
  default_policy: deny
  rules:
    # direcciones web que no piden 2FA
    - domain:
        - "www.mi_dominio.es"
        - "authelia.mi_dominio.es"
        - "pruebas.mi_dominio.es"
      policy: bypass
    # direcciones web que PIDEN 2FA
    - domain:
        - "galeria.mi_dominio.es"          #galeria de trabajos
        - "familia.mi_dominio.es"          #web de fotos familiares
        - "secretillos.mi_dominio.es"      #web de notas personales
      policy: two_factor
   
session:
  name: authelia_session
  # Podemos evitar dejarla escrita aquí si definimos la variable AUTHELIA_SESSION_SECRET_FILE
  secret: '0123456789012345678901234567896DD68A91F3861160FD0198C21F12345678'
  expiration: 3600 # 1 hora
  inactivity: 600 # 10 minutos
  domain: mi_dominio.es
  redis:
    host: www.xxx.yyy.zzz # la ip local de redis que será la de nuesta nas
    port: 6379
regulation:
  max_retries: 3
  find_time: 1200
  ban_time: 36000
storage:
  mysql:
    host: www.xxx.yyy.zzz # la ip local de MariaDB que será la de nuesta nas
    port: 3307 # puerto de nuestra mysql/MariaDB
    database: db_authelia # nombre de la base de datos. Poner la que que escribimos en el punto 4
    username: usuario_authelia # nombre del usuario que definimos en el punto 4
    password: clave_authelia # clave del usuario definimos en el punto 4
  encryption_key: 'superclave01234567890123456789superclave' #clave aleatoria definida por nosotros
 
notifier:
  smtp:
    username: ganekogorta@mi_correo.es
    # Podemos evitar dejarla escrita aquí si definimos la variable AUTHELIA_NOTIFIER_SMTP_PASSWORD_FILE
    password: 'clave de correo electronico'
    host: mail.mi_correo.es
    port: 587
    sender: ganekogorta@mi_correo.es

Tendremos que adaptar la anterior configuración a nuestros datos de ip de nas, usuarios, claves.

Se distinguen varias secciones, como la de acceso LDAP, redis, MariaDB/mysql y la de envío de correo SMTP.
esta última es importante a que cuando por primera vez un usuario de LDAP va a necesitar un segundo facto, le será enviado un correo con instrucciones para hacer esa primera configuración.

Una vez lo tengamos a nuestra necesidades, lo guardaremos en la carpeta compartida \share\DockerData\authelia

6-Instalación del docker de Authelia

Ahora teniendo ejecutando la MariaDB, redis y LDAP, lanzamos el docker por consola con el siguiente comando 
Code:
docker run -d --name authelia --restart always -v /share/DockerData/authelia:/config -p 9091:9091 authelia/authelia:4.38.4

o bien si queremos crearlo por formato YAML usaremos lo siguiente
Code:
version: "3.5"

services:
  authelia:
    image: authelia/authelia:4.38.4
    network_mode: "bridge"
    container_name: authelia
    ports:
      - "9091:9091"
    volumes:
      - "/share/DockerData/authelia/:/config/"
    restart: always

He optado por obligar a la versión 4.38.4 que a día de hoy es la última.
Lo he hecho así ya que he visto cambios en las últimas versiones y no quiero a arriesgarme a que saquen una versión posterior "latest" que tenga parámetros incompatibles con la 4.38.4

Si todo ha ido  bien, tras unos instantes tendremos a authelia ejecutando y publicando por el puerto 9091.
Comprobadlo ya que si no lo hace o tarde muuucho, hay que echar una ojeada al log del docker para ver que está pasando (Ldap detenido, errores de sintaxis,...)

7-Comprobación de acceso a la web de authelia en Nginx Proxy Manager

En nuestro proveedor de DNS, creamos una nueva de acceso a Authelia, por ejemplo authelia.mi_dominio.es

En nuestro Nginx Proxy Manager lo definimos con los siguientes parámetros tal como muestran las siguiente imágenes

   

   

Y en la última lengüeta 
   

escribiremos lo siguiente en Nginx Custom Configuration
Code:
     location / {
        set $upstream_authelia http://www.xxx.yyy.zzz:9091; # poner la ip de la nas
        proxy_pass $upstream_authelia;
        client_body_buffer_size 128k;

        #Timeout if the real server is dead
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;

        # Advanced Proxy Config
        send_timeout 5m;
        proxy_read_timeout 360;
        proxy_send_timeout 360;
        proxy_connect_timeout 360;

        # Basic Proxy Config
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header X-Forwarded-Uri $request_uri;
        proxy_set_header X-Forwarded-Ssl on;
        proxy_redirect  http://  $scheme://;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_cache_bypass $cookie_session;
        proxy_no_cache $cookie_session;
        proxy_buffers 64 256k;

        # Al estar tras un proxy inverso, reenviamos a las siguientes rangos de ips privadas
        set_real_ip_from 10.0.0.0/8;
        set_real_ip_from 172.0.0.0/8;
        set_real_ip_from 192.168.0.0/16;
        set_real_ip_from fc00::/7;
        real_ip_header X-Forwarded-For;
        real_ip_recursive on;
    }

Ahora vamos a comprobar que su accedemos a https://autehlia.mi_dominio.es se nos presenta la siguiente pantalla de login
   

8- Reconfiguración de parámetros en las webs de Nginx Proxy Manager

Ahora sólo nos queda añadir unos códigos para aquellas web que indicamos en el archivo de configuración que iban a tener acceso vía portal de Authelia 

Según el ejemplo eran "galeria.mi_dominio.es",  "familia.mi_dominio.es" y "secretillos.mi_dominio.es" 

Las editamos en Nginx Proxy Manager y en la última lengüeta escribiremos lo siguiente en el campo Nginx Custom Configuration

Code:
location /authelia {
    internal;
    set $upstream_authelia http://www.xxx.yyyy.zzzz:9091/api/verify; #cambiar por la ip de la nas
    proxy_pass_request_body off;
    proxy_pass $upstream_authelia;   
    proxy_set_header Content-Length "";

    # Timeout if the real server is dead
    proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
    client_body_buffer_size 128k;
    proxy_set_header Host $host;
    proxy_set_header X-Original-URL $scheme://$http_host$request_uri;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_set_header X-Forwarded-Uri $request_uri;
    proxy_set_header X-Forwarded-Ssl on;
    proxy_redirect  http://  $scheme://;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    proxy_cache_bypass $cookie_session;
    proxy_no_cache $cookie_session;
    proxy_buffers 4 32k;

    send_timeout 5m;
    proxy_read_timeout 240;
    proxy_send_timeout 240;
    proxy_connect_timeout 240;
}

    location / {
        set $upstream_NOMBRE1 http://www.xxx.yyy.zzzz:puerto del docker ;  #cambiar segun nuestra ip de authelia
        proxy_pass $upstream_NOMBRE1;  #cambiar nombre servicio, ha de ser unico por cada web o servicio

        auth_request /authelia;
        auth_request_set $target_url $scheme://$http_host$request_uri;
        auth_request_set $user $upstream_http_remote_user;
        auth_request_set $groups $upstream_http_remote_groups;
        proxy_set_header Remote-User $user;
        proxy_set_header Remote-Groups $groups;
        error_page 401 =302 https://authelia.mi_dominio.es/?rd=$target_url; #cambiar por la direccion de nuestro authelia

        client_body_buffer_size 128k;

        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;

        send_timeout 5m;
        proxy_read_timeout 360;
        proxy_send_timeout 360;
        proxy_connect_timeout 360;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header X-Forwarded-Uri $request_uri;
        proxy_set_header X-Forwarded-Ssl on;
        proxy_redirect  http://  $scheme://;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_cache_bypass $cookie_session;
        proxy_no_cache $cookie_session;
        proxy_buffers 64 256k;
        set_real_ip_from 192.168.0.0/16; #cambiar según el rango de la nas a 10.0.0.0/8 o incluso 172.16.0.0/16
        real_ip_header X-Forwarded-For;
        real_ip_recursive on;

    }

Hacemos los cambios adecuados a nuestra web y damos nombres únicos por variable $upstream_NOMBRE1. 
Por seguir con el ejemplo podemos usar $upstream_galeria, $upstream_secretillos y $upstream_familia

Si todo ha ido bien, cuando vayamos a las web galeria.mi_dominio.es, secretillos.mi_dominio.es y familia.mi_dominio.es, se nos presentará la web de authelia.

9-Activación por primera vez del 2FA

Cuando nos identifiquemos por primera vez en la web "authelia.mi_dominio.es com" con un usuario creado en el LDAP, se nos lanzará un proceso para elegir y definir el tipo de 2FA. 
Podemos activar mas de uno.
   

Y comienza el asistente, pulsamos sobre registrar dispositivo
   

y nos da dos opciones.
   

Si pulsamos sobre ADD de One-Time Password
   

nos enviará un código por correo electrónico con un contenido similar a la siguiente captura
   

Pulsamos sobre verificar tras escribir el código en la web
   

Y continuamos con el asistente para agregarlo a nuestro programa de autentificación (Authy, 2FAS Auth, Authenticator de QNAP,...)
   

Nos presenta en pantalla el código QR para añadirlo
   

Tras verificarlo, nos lleva a la web de control del usuario.
   


Si queremos usar una llave hardware en vez de pulsar One-time Password, pulsaremos sobre WebAuthn Credentials.

Ya podemos salir del asistente que ya lo tenemos configurado para ese usuario.

Y con esto hemos terminado y ya tenemos listo al "usuariopruebas" para acceder a las web protegidas con Authelia.


No usar LDAP y hacerlo mediante archivo

Si no queremos que Authelia use LDAP y queremos hacerlo mediante una lista de usuarios de un archivo hay que hacer un cambio en el fichero configuration.yml suprimiendo unas líneas y agregando otras

Las que hay que retirar o comentar poniendo delate un # son las referentes al LDAP.  

Según nuestro ejemplo son:
Code:
authentication_backend:
  ldap:
    implementation: custom
    url: ldap://www.xxx.yyy.zzz  # la ip local de nuesta nas
    start_tls: false
    base_dn: dc=mi_dominio,dc=es # valores del LDAP
    additional_users_dn: ou=people
    additional_groups_dn: ou=group
    users_filter: (&({username_attribute}={input})(objectClass=person))
    groups_filter: (&(uniquemember={dn})(objectclass=groupOfUniqueNames))
    user: cn=admin,dc=mi_dominio,dc=es # valores del LDAP
    password: ClaveSecreta # Clave del admin del LDAP de la QNAP

Estas líneas debemos cambiarlas por
Code:
authentication_backend:
  password_reset:
    disable: false
  refresh_interval: 5m
  file:
    path: /config/users_database.yml
    password:
      algorithm: argon2id
      iterations: 1
      key_length: 32
      salt_length: 16
      memory: 1024
      parallelism: 8


Ahora crearemos un archivo llamado "users_database.yml" en la carpeta de la nas "/share/DockerData/authelia".

Siguiendo con el ejemplo, para dos usuarios llamados "mequetrefe" y "mosquito" debería tener una estructura similar a la siguiente:
Code:
users:
  mequetrefe: #Cambia el nombre al que más te guste, este será el que usemos para el login
    displayname: "mequetrefe" #Cambia el nombre al que más te guste, introducelo entre las comillas
    password: "$argon2id$v=19$m=1024,t=1,p=8$ZnA1NTg4aDdxUjJteWJhRA$5ZedH1Cb70M7WY8m92goUCT27ZuWNR+bPVZF4hl28BA"
    #La creamos con https://argon2.online/
    #En plain text input, ponemos la contraseña que queremos para hacer el login en authelia
    #Seleccionamos el boton de argon2id
    #Pulsamos en la tuerca de salt y nos deben salir unas letras en ese recuadro
    #Configramos con los siguientes parametros parallelism Factor: 8 memory cost: 1024 iterations: 1 hash length: 32
    #Pulsamos en generate hash y nos debe dar algo asi en el campo outputin Encoded Form $argon2id$v=19$m=1024,t=1,p=8$NTEwNGFYVHNGNlo2OGxwOA$rPYzg2lYoNH7MQ5pv6m3isHCCcJYnf+1A/uIiMUrUhE
    email: correousuario1@icloud.com #tu correo electronico del usuario mequetrefe
    groups: #si quieres crear un grupo o grupos, cambia los nombres siguientes
      - admins
      - dev
mosquito: #Cambia el nombre al que más te guste, este será el que usemos para el login
    displayname: "mosquito" #Cambia el nombre al que más te guste, introducelo entre las comillas
    password: "$argon2id$v=19$m=1024,t=1,p=8$ZnA1NTg4aDdxUjJteWJhRA$5ZedH1Cb70M7WY8m92goUCT27ZuWNR+bPVZF4hl28BB"
    #La creamos con https://argon2.online/
    #En plain text input, ponemos la contraseña que queremos para hacer el login en authelia
    #Seleccionamos el boton de argon2id
    #Pulsamos en la tuerca de salt y nos deben salir unas letras en ese recuadro
    #Configramos con los siguientes parametros parallelism Factor: 8 memory cost: 1024 iterations: 1 hash length: 32
    #Pulsamos en generate hash y nos debe dar algo asi en el campo outputin Encoded Form $argon2id$v=19$m=1024,t=1,p=8$NTEwNGFYVHNGNlo2OGxwOA$rPYzg2lYoNH7MQ5pv6m3isHCCcJYnf+1A/uIiMUrUhE

    email: correousuario2@proton.me #correo electronico del usuario mosquito
    groups: #si quieres crear un grupo o grupos, cambia los nombres siguientes
      - admins
      - dev
   

Hay que cambiar las claves. Y para hacer una nuevas debemos hacerlo por la web https://argon2.online/

La pantalla de generación de las claves será como la de la siguiente captura

   

Con el botón de copiar de la web podemos luego pegarla en el archivo "users_database.yml"

No es algo que me guste mucho lo de depender de una web para obtener estas claves, pero si no vamos a tener mas que unos pocos usuarios, es una alternativa a usar un LDAP. Recomiendo crear alguna más y tenerlas apuntadas en nuestro gestor de claves.

Nota: Para este post me he apoyado en informaciones de varias fuentes como Authelia, de la web de HDS+ (muy recomendable por cierto),...
Un saludo

Agur eta ondo ibili

Ganekogorta (TS-469Pro, TVS-673e, QBoat Sunny, TS-453Be, TR-002 y QHora-301w) Ʀɐɯ0η
  Reply




Users browsing this thread: 1 Guest(s)