Información general:
Distribución: Ubuntu 18.04
Fail2Ban v0.10.2
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
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
% 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
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.
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.
Comentario más útil
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:
será interpolado por la lectura de configuración al único %-char.