08 julio 2015

Congela tu web con SnapWeb y ¡disfruta del fin de semana!


Desde que la mayoría de las empresas piensan en un CMS a la hora de decidir cómo hacer su flamante nueva Web, debo reconocer que de forma casi directamente proporcional han aumentado mis dolores de cabeza: que si un módulo no actualizado había permitido “colar” un shell-remoto, que si habían modificado todos los .js del site, que si Google marca mi sitio como que contiene software malicioso, etc.

Estos nuevos “desafíos” hicieron que recordara una herramienta con la que tropecé hace ya algunos años y que me pareció genial. Dicha herramienta (Deep Freeze) permitía “congelar” todo el disco de tal forma que, cualquier cambio realizado en el equipo (instalación de software, infección de virus,  descargas, etc.), era eliminado automágicamente al reiniciar.  Con este antecedente, pensé en hacer algo parecido. Un sistema que fuera capaz de impedir cualquier cambio en cualquier archivo de mi Web, incluso impedir que se pudiera añadir/eliminar cualquier nuevo fichero/directorio, es decir, una especie de modo "Sólo lectura" para la Web que me permitiera pasar un fin de semana tranquilo y sin llamadas.

Una vez tenía clara la idea feliz, y el nombre: SnapWeb, pensé en realizar una copia del directorio web y, a través de una tarea cron, comprobar si se había realizado cualquier cambio y restaurarlo con la copia. Si bien este sistema funcionaba de forma correcta, tenía dos problemas fundamentales: 
  1. ¿Cada cuánto tiempo repito la tarea?
  2. El hecho de tener que comprobar TODO el sitio web cada vez; esto es un gran hándicap para los sites hechos con un CMS donde hay múltiples archivos y directorios. 
Con estas debilidades encontradas, recordé un proyecto que vi, allá por el 2010, que permitía analizar ficheros en tiempo real con clamAV + Inotify (También en SbD se han publicado varios post acerca de este asunto: Post 1 y Post 2). En este caso, la API inotify (disponible a partir de linux 2.6.13),  permitía iniciar el antivirus cuando se producía cualquier cambio en el sistema de archivos. 

Puesto que tenía claro que mi sistema iba a estar programado en BASH, busqué en alternativas que implementaran dicha API y que lanzaran mi script cuando se produjera algún evento sobre el directorio del site. 

De las distintas opciones que vi seleccioné incron. Éste programa es una mezcla de cron (programación de tareas) + inotify (detección de eventos en el sistema de archivos), lo que permite que se ejecuten tareas cada vez que se produce un evento sobre el directorio indicado. Una de los hándicaps que tiene incron es la NO recursividad, es decir, que en el fichero de configuración /etc/incron.conf debe contener cada uno de los directorios del site, además, cualquier nuevo directorio que se cree dentro del site debe ser dado de alta en el fichero de configuración.

Para solucionar el problema de la NO recursividad de incron, tenía claro que mi proyecto debía estar divido en dos scripts:
  1. snapweb.sh --> Encargado de, dado un directorio pasado como parámetro, dar de alta en el fichero de configuración de incron todos los subdirectorios (Así solucioné los problemas de recursividad). 
  2. jack.sh --> Será lanzado por incron cuando se produzca un evento. Dicho script recibirá el nombre del fichero afectado, su ruta y el evento en cuestión.
Pensé en hacer una especie de snapshot del directorio y monitorizar cualquier cambio posterior, denegando dichos cambios; después pensé que denegar siempre sería un poco radical, que lo ideal sería poder configurar varios tipos de bloqueo. Finalmente me decanté por esta segunda opción, con lo que en un fichero de configuración /etc/snapweb/snapweb.conf podremos decidir el tipo de bloqueo, existiendo un valor global que habilita el modo "freeze" del site: site_lock=1.

Está claro que esta solución no resuelve todas la vulnerabilidades que pueden explotarse en un CMS, pero sí permite cierta inmunidad a determinados exploits cuyo “modus operandi” está basado en la modificación de archivos (CryptoPHP), en la subida de Shells remotos o, incluso, en el uso de credenciales FTP robadas para distribuir malware. 

Actualmente una vez implementado correctamente ese “modo candado”, aquí os dejo un link a un vídeo con una prueba de concepto.



Estoy realizando varias mejoras:
  • Nuevos modos de "bloqueo":
    • Modo automático: Analiza en tiempo real cualquier cambio, categoriza dichos cambios y decide qué hacer.
      • Aceptar cambios y guardar réplica.
      • Denegar cambios y volver a réplica -> En este caso, para evitar los problemas que pudiera provocar un falso positivo, guardo copia del archivo en “cuarentena”
    • Modo semiautomático:
      • Si no se detectan indicios de malware, se acepta cambio, se actualiza réplica y se envía correo de notificación.
      • Si se detecta malware, por encima de un umbral, se rechazan los cambios y se notifica al administrador.
      • Si sólo hay indicios de malware pero no certeza, se envía correo al administrador para que éste decida qué hacer con dicha incidencia.
    • Modo candado: No permite ningún cambio en el site, descartando de forma automática cualquier cambio en el site (Nuevas carpetas/archivos, cambios en ficheros existentes, etc.)
  • Configuración del modo por site: Ahora los modos de bloqueo pueden indicarse por site, en vez de un único tipo de bloqueo para todos los sites albergados.
  • Exclusión de directorios a monitorizar.
  • Activación de modo "candado" por horario.
  • Administración y monitorización de snapweb vía App.
Espero acabar pronto con esta primera parte del proyecto, publicarlo en github y que esté disponible para todos aquellos que lo consideréis interesante.

Además aprovecho para indicaros que si tenéis cualquier duda, sugerencia o crítica,  estaré encantando de recibirlas... aunque con las críticas habilitaré el modo bloqueo  :P.

[+] Ruta GitHub para su descarga y prueba: https://github.com/wllop/snapweb


Artículo cortesía de Walter Llop -  wllop@esat.es - @wllop

23 comments :

Goreman dijo...

Brutal! Magnífica herramienta, mil gracias :)
Buen video de como reventar un WP :P

Óscar García Amor dijo...

A ver, aunque estés usando un CMS lo mas lógico es que uses GIT. Con eso no te van a colar nunca en ningún caso algo que tu no tengas registrado.


Otro consejo es que uses contenedores docker. Te montas el container con una versión de la web y lo lanzas, lo puedes poner inmutable o, si piensas que no te mola, pos lo destruyes y lo creas de nuevo.


Pero vamos, lo mejor es que uses GIT.

Sergio Arcos dijo...

Como te han comentado, un container te soluciona la vida... (y documentacion gratuita!)

Supermafete dijo...

Se me ocurren varias ideas sencillas en un momento: rsync cada cierto tiempo, clone de un repo git, chmod -R 444 al raíz de la web...

Ronny Vasquez dijo...

Yo tambien queria sugerir rsync, me parece una excelente opcion para evitar cualquier problema de recusividad, comparacion de ficheros, etc...

Ronny Vasquez dijo...

Excelente idea, mis mas sinceros aplausos y te insto ah que sigas con la herramienta, podrias publicarla para que otros usuarios que quieran apoyarte contribuyan a tu proyecto, felicitaciones!

Walter Llop Masiá dijo...

Muchas gracias!! De todas formas todavía le quedan mejoras y más horas de testing.

Walter Llop Masiá dijo...

Gracias! La verdad es que no controlo tanto de GIT como para poder implementar todo lo que tengo pensado que haga SnapWeb. Pero, desde luego, con GIT sería una muy buena opción....... pero y lo feliz que soy yo con BASH!! ;)

Walter Llop Masiá dijo...

Gracias!! Miraré más este tema ;)

Walter Llop Masiá dijo...

Gracias!! Sí, voy a continuar con las mejoras que indico al final del post y que alguna de ellas estoy terminando. De momento lo tengo publicado en GitHub y, desde luego, cualquiera que quiera ayudar será bienvenido :)

Maki dijo...

Solo me siento en peligro cuando veo esta línea(en snapweb.sh

) :S

wget -nv -T 15 http://desa.webnet.es/snapweb/jack.sh -O /usr/local/snapweb/jack.sh >/dev/null 2>/dev/null

Óscar García Amor dijo...

Bueno, he estado revisando tus scripts por encima, no tengo mucho tiempo para mirar todo el tema, pero te puedo dar unos consejos.

1. Veo que tienes una dependencia de incron, es lo primero que debes comprobar, incluso antes de comenzar a hacer cosas con variables. Si no tienes incron, no vas a funcionar, por lo que es tontería que te pongas a hacer nada.

Puedes hacer un par de funciónes:

installed () { type -p "$1" 2>&1 > /dev/null; }
fatal () { echo "fatal: $@" >&2 ; ${E:+exit $E}; }

De tal forma que luego haces:

installed incrond || E=1 fatal "Es necesario disponer del servicio incron en su sistema"

2. No intentes instalar con tu script incron, no es elegante y, ademas, no todo tiene apt-get.

3. Crea una funcion help:

help () {
echo "La sintaxis es:"
echo "snapweb.sh [-d] /ruta/web"
echo " -d --> Desactiva la monitorización del directorio pasado como parámetro."
}

De esta manera podras llamar siempre que necesites a la ayuda del comando

4. Usa getopts:

while getopts "hd:" option "$@"; do
case $option in
h) help && exit 0 ;;
d) deativated_directory="$OPTARG" ;;
esac
done ; shift $((OPTIND -1))

getopts maneja de forma muy potentente las opciones de los scripts, simplemente tienes que indicarle que opciones son válidas. Si detras de una opcion pones unos : (dos puntos) eso indica que esa opcion tiene un argumento y por tanto debe recogerlo. En el ejemplo anterior lo tienes adecuado para la opcion -d de tu script. Ah, y como hace shift de los parametros, lo que el usuario indique sin parametro es siempre $1. ;)

5. No abuses de if, cosas como:

if [ ! -d /usr/local/snapweb/snap_back ]; then
mkdir -p /usr/local/snapweb/snap_back
chmod 750 /usr/local/snapweb/snap_back
fi

Puedes ponerlas así:

[ ! -d /usr/local/snapweb/snap_back ] && mkdir -p -m 750 /usr/local/snapweb/snap_back

Si, con mkdir puedes darle permisos al directorio que creas, en caso de crear un arbol los permisos se asignan esos permisos al último directorio del arbol.

Tampoco queda elegante hacer cosas como el [ "$?" -eq 0 ], es preferible usar concatenación:

[ -d "/usr/local/snapweb/snap_back/$filesan" ] && rm -fr /etc/incron.d/$filesan* && rm -fr "/usr/local/snapweb/snap_back/$filesan*" && etc

6. Si quieres crear logs, usa el poder de la redirección

Si haces "exec > fichero" la salida estandar se te va al fichero. Lo mismo ocurre con el error estandar si haces "exec 2 > fichero". Si quieres metes los dos:

exec > fichero

exec 2>&1

Nota: esto te machaca el fichero de log en cada ejecución, si quieres concatenar, pues ya sabes, usas el doble mayor que >>.

7. No uses wget, usa mejor curl, hay distros que no tienen wget por defecto.

Bueno, con esto seguro que tienes para un rato de diversión ;)

Si tengo mas time le echo otro vistazo mas adelante :)

Dimas Ade Suharto dijo...

Hola,
Todo
el mundo estoy tan feliz dando un vistazo a mi gran testimonio de cómo
conseguí mi préstamo deseo del Sr. Franklin Osayande de Scott Loan
Company, quiero usar rápidamente esta oportunidad para dejar que todo el
mundo saber de esto, Am señora Ann Maxwell de EE.UU., que fue en
busca de un préstamo para iniciar mi propio negocio en apoyo de mi
marido con respecto a los gastos de los niños, así que fui en línea en
busca de préstamo cuando me encontré con algunos prestamistas que hacen
trampa y estafado a mi poco dinero en ese proceso del tiempo que me
dieron confundido i ni
siquiera saben lo que hacer más porque el poco dinero que tenía con mí
fue llevado por esos bastardos fraudulentos que se hacen llamar los
prestamistas de préstamos reales, Así que en un día fiel como yo estaba
navegando por Internet en busca de trabajo me encontré con algunos
testimonios comentados en el foro por uno Sr. Andrew Fred, y la señora
Mónica Luis en la forma en que reciben su préstamo del Sr. Franklin
Osayande de Scott Loan Company Email: franklinosayandescott@gmail.com
Así que me dije a mí mismo que tengo que dar a esto un juicio porque i Estaba
tan asustada respecto a lo que los otros prestamistas hicieron a mí,
así que seguí adelante tomé su dirección de correo electrónico personal
que se encontraba en esos comentarios del foro, así que contacté con él
para informarle de que yo estaba arbitrado a él por algunos clientes que
recibieron su préstamo de
su empresa, el Sr. Andrew Fred, y la señora Mónica Luis, Así que cuando
se enteró de que estaba muy feliz por eso, así que mí que estoy en la
compañía adecuada aseguró donde puedo recibir mi préstamo deseo, Me
dieron el préstamo del prestatario formulario
de solicitud para llenar y regresar, yo todo lo que, teniendo en cuenta
que toda mi información necesaria se trata de mí, así que me dieron los
términos y condiciones de su compañía todo transcurrió sin problemas y
sin ninguna demora, en no menos de 24 horas se me informó que mi
préstamo suma
válida de € 6.000.000 ha sido registrado y aprobado por su junta de
préstamo de fiduciario, Así que en ese proceso del tiempo yo estaba tan
feliz cuando me dijeron que debo enviarlos por la banca detalles, pero
estaba poco escéptico de hacer eso, así que dije: tengo
confianza y creo que para este prestamista llame Sr. Franklin Osayande
Scott, me los dio por cuenta bancaria de manera sorprendente que recibo y
alerta de mi banco que mi cuenta ha sido acreditado con la suma de €
6.000.000 por el Sr. Franklin Osayande Scott, WOW .. casi
me desmayo, así que le enviaremos un correo electrónico con urgencia
que tengo recibir mi préstamo con éxito, Así que mis queridos hermanos y
hermanas por ahí todavía en busca de compañía de préstamos genuina voy a
aconsejar que se comunique amablemente el señor Franklin Osayande de
Scott con esta misma FACEBOOK: Franklin Osayande de Scott ,
E-mail: franklinosayandescott@gmail.com y sé que también le ayudará con
la cantidad del préstamo deseo bien, Enviar hoy y usted será feliz de
haberlo hecho.

Dimas Ade Suharto dijo...

Todo
el mundo estoy tan feliz dando un vistazo a mi gran testimonio de cómo
conseguí mi préstamo deseo del Sr. Franklin Osayande de Scott Loan
Company, quiero usar rápidamente esta oportunidad para dejar que todo el
mundo saber de esto, Am señora Ann Maxwell de EE.UU., que fue en
busca de un préstamo para iniciar mi propio negocio en apoyo de mi
marido con respecto a los gastos de los niños, así que fui en línea en
busca de préstamo cuando me encontré con algunos prestamistas que hacen
trampa y estafado a mi poco dinero en ese proceso del tiempo que me
dieron confundido i ni
siquiera saben lo que hacer más porque el poco dinero que tenía con mí
fue llevado por esos bastardos fraudulentos que se hacen llamar los
prestamistas de préstamos reales, Así que en un día fiel como yo estaba
navegando por Internet en busca de trabajo me encontré con algunos
testimonios comentados en el foro por uno Sr. Andrew Fred, y la señora
Mónica Luis en la forma en que reciben su préstamo del Sr. Franklin
Osayande de Scott Loan Company Email: franklinosayandescott@gmail.com
Así que me dije a mí mismo que tengo que dar a esto un juicio porque i Estaba
tan asustada respecto a lo que los otros prestamistas hicieron a mí,
así que seguí adelante tomé su dirección de correo electrónico personal
que se encontraba en esos comentarios del foro, así que contacté con él
para informarle de que yo estaba arbitrado a él por algunos clientes que
recibieron su préstamo de
su empresa, el Sr. Andrew Fred, y la señora Mónica Luis, Así que cuando
se enteró de que estaba muy feliz por eso, así que mí que estoy en la
compañía adecuada aseguró donde puedo recibir mi préstamo deseo, Me
dieron el préstamo del prestatario formulario
de solicitud para llenar y regresar, yo todo lo que, teniendo en cuenta
que toda mi información necesaria se trata de mí, así que me dieron los
términos y condiciones de su compañía todo transcurrió sin problemas y
sin ninguna demora, en no menos de 24 horas se me informó que mi
préstamo suma
válida de € 6.000.000 ha sido registrado y aprobado por su junta de
préstamo de fiduciario, Así que en ese proceso del tiempo yo estaba tan
feliz cuando me dijeron que debo enviarlos por la banca detalles, pero
estaba poco escéptico de hacer eso, así que dije: tengo
confianza y creo que para este prestamista llame Sr. Franklin Osayande
Scott, me los dio por cuenta bancaria de manera sorprendente que recibo y
alerta de mi banco que mi cuenta ha sido acreditado con la suma de €
6.000.000 por el Sr. Franklin Osayande Scott, WOW .. casi
me desmayo, así que le enviaremos un correo electrónico con urgencia
que tengo recibir mi préstamo con éxito, Así que mis queridos hermanos y
hermanas por ahí todavía en busca de compañía de préstamos genuina voy a
aconsejar que se comunique amablemente el señor Franklin Osayande de
Scott con esta misma FACEBOOK: Franklin Osayande de Scott ,
E-mail: franklinosayandescott@gmail.com y sé que también le ayudará con
la cantidad del préstamo deseo bien, Enviar hoy y usted será feliz de
haberlo hecho.

Walter Llop Masiá dijo...

jajajajaja. Tienes razón he modificado esta línea y ahora te pregunto si, en el caso de que no exista, quieres que lo baje de Internet. ;)

Dimas Ade Suharto dijo...

oferta de préstamo se aplican ahora qué necesita un préstamo urgente? en caso afirmativo envíenos un correo electrónico ahora franklinosayandescott@gmail.com

Walter Llop Masiá dijo...

Muchas gracias Óscar!! Tomo nota de tus apreciaciones y las estoy aplicando ahora mismo!!! En cuanto las tenga listas las subo y, si no te importa, voy a nombrarte en agradecimientos del proyecto. De nuevo, muchísimas gracias!! ;)

Walter Llop Masiá dijo...

Finalmente he eliminado esta opción de descarga automática. ;)

Maurice Office dijo...

Hola,
En medio de las dificultades financieras? ¿Está usted en necesidad de un préstamo? o que han sido rechazadas por los bancos locales? ¿Necesita un préstamo por cualquier motivo? Su ayuda es finalmente aquí como Maurice Finance ofrece préstamos a todos tanto ocupados y desocupados, los individuos y las empresas, ofrecemos préstamos a bajo tipo de interés del 2%. Prestatarios interesados están en contacto con nosotros vía e-mail a mauricefinance@hotmail.com y obtener sus préstamos hoy. Nuestros servicios son rápidos y fiables, así que por favor póngase en contacto con nosotros al (mauricefinance@hotmail.com) y disfrutar de nuestros servicios financieros oferta.
Correo electrónico: mauricefinance@hotmail.com
Maurice Finanzas

Óscar García Amor dijo...

Nada meu!! No tengas problema en meter un agradecimiento que para eso estamos ;)

mrs clara dijo...

Buen Día !!

Yo soy el señor William Paul, una buena reputación, legítimo y un dinero acreditado
Prestamista. Quiero utilizar este medio para informarle de que i prestar asistencia fiable beneficiario como voy a estar encantados de ofrecerle un préstamo a una tasa de interés del 3% a individuos confiables. Puedes ponerte en contacto conmigo a través de e-mail:
williamfinance@hotmail.com

Servicios prestados incluyen:

* Mejoras Para El Hogar
* Préstamos Inventor
* Préstamos de coches
* Préstamo de Consolidación de Deuda
* Línea de crédito
* Segundo Préstamo
* Préstamos Comerciales
* Préstamos Personales
* Préstamos Internacional.

Por favor escriba de nuevo si está interesado.
Tras la respuesta, se le enviará por correo un formulario de solicitud de préstamo para llenar. (No hay seguridad social y sin verificación de crédito, 100% Garantizado!) Estoy deseando haberme permitido estar al servicio de usted. Puedes ponerte en contacto conmigo a través de e-mail:
williamfinance@hotmail.com
Atentamente,
Sr. William Paul (MD).

Sarah Benson dijo...

¿Necesita un préstamo urgente para iniciar un buen negocio o para pagar su deuda, candidatos interesados ​​deben ponerse en contacto con nosotros ahora en sarahbenson105@outlook.com para más información.

steven josh dijo...

Hola qué necesita un corto o préstamo a largo plazo? con sólo el 2% del tipo de interés por ciento ... Evite sido rechazado por el banco u otras empresas de préstamos. Solicitud de un préstamo de nosotros hoy en Steven Josh Préstamo Firma Aplique Ahora .. Todos los mails con tus datos y la cantidad que necesita se debe escribir a nuestro correo de la empresa: stevenjoshloanfirm@gmail.com

1) Nombre completo: ...........................
2) País: ...........................
3) Dirección: ...........................
4) Estado: ...........................
5) Sexo: ...........................
6) Estado Civil: ...........................
7) Ocupación: ...........................
8) Número de teléfono: ...........................
9) Posición Actualmente en el lugar de trabajo: .....................
10) Ingreso mensual: ...........................
11) Monto del préstamo necesario: ...........................
12) Duración del préstamo: ...........................
13) Propósito del préstamo: ...........................
14) ¿Ha aplicado antes de ..........

Gracias,