Fail2ban: La acción personalizada falló | Mala sustitución

Creado en 23 nov. 2020  ·  6Comentarios  ·  Fuente: fail2ban/fail2ban

Ambiente:

Información general:
Distribución: Ubuntu 18.04
Fail2Ban v0.10.2

  • Versión Fail2Ban (incluidos los posibles sufijos de distribución):
  • SO, incluido el nombre/versión de la versión:
  • [x] Fail2Ban instalado a través del sistema operativo/mecanismos de distribución
  • [ ] No ha aplicado ningún parche externo adicional al código base
  • [ ] Se realizaron algunas personalizaciones en la configuración (proporcione los detalles a continuación)

La cuestión:

Hola,

Ahora estoy usando un WAF para asegurar mi instancia de owncloud.
El Sophos UTM necesita 2 partes; primero creando el objeto host (atacante) y segundo actualizando el objeto de proxy inverso. La API RESTful funciona desde mi propia secuencia de comandos, pero no la activa mi archivo de acción personalizado. El primer paso, crear el objeto, funciona bien; la variable <ip> solo se necesita aquí.

Pero la segunda parte falla debido a mi bloque de definición de variable:

2020-11-23 16:15:12,158 fail2ban.actions        [28653]: NOTICE  [owncloud] Ban 80.187.101.140
2020-11-23 16:15:12,175 fail2ban.utils          [28653]: Level 39 7f612c005a90 -- exec: UTM2B=80.187.101.140;
UTM=${UTM2B//./};
REF="REF_NetHos";
REF_ID="${UTM:0:10}";
DN="$REF$REF_ID";
curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' \
--header 'Authorization: Basic access_token' -d '{"address":"80.187.101.140","address6":"","comment":"","duids":[],"hostnames":[],"interface":"","macs":[],"name":"80.187.101.140","resolved":false,"resolved6":false,"reverse_dns":false}' \
'https://host.domain/api/objects/network/host/' > /dev/null
curl -X PATCH --header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header 'X-Restd-Err-Ack: all' \
--header 'X-Restd-Lock-Override: yes' \
--header 'Authorization: Basic access_token' -d \
'{"access_control":"1","allowed_networks":["REF_NetworkAny"],"auth_profile":"","backend":["REF_RevBacWEBHost"],"be_path":"","comment":"","denied_networks":["'"$DN"'"],"hot_standby":false,"name":"ProxyN","path":"/subtree","status":true,"stickysession_id":"ROUTEID","stickysession_status":false,"websocket_passthrough":true}' \
'https://my.fw/api/objects/reverse_proxy/location/REF_RevLocProxyN'
2020-11-23 16:15:12,175 fail2ban.utils          [28653]: ERROR   7f612c005a90 -- stderr: '/bin/sh: 2: Bad substitution'
2020-11-23 16:15:12,175 fail2ban.utils          [28653]: ERROR   7f612c005a90 -- returned 2

pasos para reproducir

actionban = UTM2B=<ip>;
            UTM=${UTM2B//./};
            REF="REF_NetHos";
            REF_ID="${UTM:0:10}";
            DN="$REF$REF_ID";
            curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' \
            --header 'Authorization: Basic access_token' -d '{"address":"<ip>","address6":"","comment":"","duids":[],"hostnames":[],"interface":"","macs":[],"name":"<ip>","resolved":false,"resolved6":false,"reverse_dns":false}' \
            'https://my.fw/api/objects/network/host/' > /dev/null
            curl -X PATCH --header 'Content-Type: application/json' \
            --header 'Accept: application/json' \
            --header 'X-Restd-Err-Ack: all' \
            --header 'X-Restd-Lock-Override: yes' \
            --header 'Authorization: Basic access_token' -d \
            '{"access_control":"1","allowed_networks":["REF_NetworkAny"],"auth_profile":"","backend":["REF_RevBacWEBHost"],"be_path":"","comment":"","denied_networks":["'"$DN"'"],"hot_standby":false,"name":"ProxyN","path":"/subtree","status":true,"stickysession_id":"ROUTEID","stickysession_status":false,"websocket_passthrough":true}' \
            'https://my.fw/api/objects/reverse_proxy/location/REF_RevLocProxyN' > /dev/null

Comportamiento esperado

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   492  100   307  100   185    291    175  0:00:01  0:00:01 --:--:--   466
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   841  100   504  100   337   7411   4955 --:--:-- --:--:-- --:--:-- 12367
80.187.101.140
80187101140
REF_NetHos
8018710114
REF_NetHos8018710114

Cualquier información adicional

actionban dentro de add_host.sh
simplemente agregue echo $VAR al final para la depuración

¿Podría ayudarme y arrojar algo de luz sobre esto? ¿Cómo tengo que declarar variables? ¿Qué estoy haciendo mal?
Realmente aprecio cualquier ayuda que pueda proporcionar.

3rd party issue

Comentario más útil

Tal vez identifiques esto de inmediato...
Error durante la configuración: error en la definición de la acción 'UTM9': '%' debe ir seguido de '%' o...

Claro, como dice el mensaje de error (y la documentación), el % char en los archivos de configuración (python) es un carácter especial, por ejemplo, se usa para sustituir variables y parámetros, como %(var)s , etc.
Así que simplemente escape de esto (con un % adicional), como:

- VAR=${VAR1%?};
+ VAR=${VAR1%%?};

será interpolado por la lectura de configuración al único %-char.

Todos 6 comentarios

La API RESTful funciona desde mi propia secuencia de comandos, pero no la activa mi archivo de acción personalizado.

¿Supongo que usaste bash para tu script? (porque ${UTM2B//./} es un bashism).
Como puede ver, fail2ban usando sh (shell predeterminado para el usuario que ejecuta fail2ban en su sistema), por lo que no funcionaría según el diseño.
Prueba este ejemplo:

$ sh -c 'UTM2B=192.0.2.1; UTM=${UTM2B//./};'
sh: 1: Bad substitution

Debe reescribir la acción sin construcciones no admitidas en sh Shell, o escribirla en el script usando shebang para bash y luego llamar a su script desde la acción (para que el script se ejecute en bash en lugar de sh).

Gracias por sus comentarios rápidos.
¡Seguí tu sugerencia de reescribir en shell y funcionó!
¿Existe alguna posibilidad de obtener una variable con todas las direcciones IP prohibidas??

¿Existe alguna posibilidad de obtener una variable con todas las direcciones IP prohibidas??

Podría ser posible (pero en qué formato)...
Y también me pregunto para qué fines debería ser bueno.

También se puede usar fail2ban-client get <JAIL> banned (ver 54b2208690e3c2fff00fbd9b197984d880e29a02, publicado con la versión más reciente).

Bueno, estoy probando mi construcción :D No está nada mal, pero alguna tontería es que el WAF
solo puede manejar objetos de host para bloquear y no grupos de host. Entonces, cada vez que f2b detecta una nueva ip, ¡mi script debe enviar todo en la lista prohibida! Si no, ese es el caso en este momento, solo la ip más nueva está prohibida. :( Mi cliente está desactualizado pero podría trabajar con
fail2ban-client status owncloud |grep Banned

¡Hecho! Ahora se escribe un protocolo que conoce todas las direcciones IP bloqueadas,
En caso de que alguien más esté jugando, esto se agregará allí y el script usará todo esto para actualizar la lista de control de acceso desde el proxy con solo una llamada "parche de rizo".

Por cierto. Tal vez identifique esto de inmediato por qué no fue posible usarlo;
Solo para formatear el valor según mis necesidades:
Sin problemas en sh shell: sh -c 'VAR=${VAR1%?};'
pero en fail2ban: fail2ban-server[4540]: Failed during configuration: Error in action definition 'UTM9': '%' must be followed by '%' or '(', found: '%?};\ncurl -X POST --header \'Content-Type: application

¡Gracias por este software absolutamente brillante!

Tal vez identifiques esto de inmediato...
Error durante la configuración: error en la definición de la acción 'UTM9': '%' debe ir seguido de '%' o...

Claro, como dice el mensaje de error (y la documentación), el % char en los archivos de configuración (python) es un carácter especial, por ejemplo, se usa para sustituir variables y parámetros, como %(var)s , etc.
Así que simplemente escape de esto (con un % adicional), como:

- VAR=${VAR1%?};
+ VAR=${VAR1%%?};

será interpolado por la lectura de configuración al único %-char.

¿Fue útil esta página
0 / 5 - 0 calificaciones