Skip to content

Commit

Permalink
Added final conclusions
Browse files Browse the repository at this point in the history
  • Loading branch information
erseco committed Sep 15, 2019
1 parent a86b637 commit 7194674
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 15 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ Mediante algoritmos evolutivos trataremos de configurar diferentes servicios de

## Contenido

- Memoria: [doc](../../releases/download/1.0.0/project.pdf)
<!-- - Presentación: [https://gitpitch.com/erseco/moving_target_defense](https://gitpitch.com/erseco/moving_target_defense?t=night) -->
- Memoria: [pdf](../../releases/download/1.0.0/project.pdf)
- Presentación: [pdf](../../releases/download/1.0.0/slides.pdf)
- Código: [code](../../tree/master/code)

### Autor: Ernesto Serrano Collado
Expand Down
2 changes: 1 addition & 1 deletion doc/text/chapters/02_Objetivos.tex
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
\chapter{Objetivos}

Los objetivos de este proyecto son prevenir ataques informáticos utilizando la técnica del `objetivo móvil' y comprobar si utilizar una heurística de búsqueda, como pueden ser los algoritmos genéticos, puede servir para incrementar la seguridad de un sistema a la hora de generar configuraciones.
Los objetivos de este proyecto son prevenir ataques informáticos utilizando la técnica del `objetivo móvil', comprobar si utilizar una heurística de búsqueda, como pueden ser los algoritmos genéticos, puede servir para generar de forma automatizada las distintas configuraciones con la suficiente diversidad atendiendo también a la seguridad del sistema a la hora de generar dichas configuraciones.

\bigskip
Para poder acometer dichos objetivos se ha optado por el desarrollo una herramienta software que mediante el uso de algoritmos genéticos sea capaz de optimizar la configuración de un determinado servicio y que, aplicando dicha configuración de forma regular, la seguridad del servicio se vea incrementada al entorpecer la recopilación de información realizada por un posible atacante \cite{john_evolutionary_2014}.
Expand Down
14 changes: 7 additions & 7 deletions doc/text/chapters/04_Metodologia.tex
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ \section{Banco de pruebas}
Para empezar definimos un banco de pruebas para comprobar que la herramienta OWASP ZAP servía para nuestro propósito. Para ello se modificó el código de ejemplo que proporcionan para su API en Python para hacerla funcionar en un entorno de contenedores. El script (zap.py \ref{zap.py}) se conecta a una determinada URL y ejecuta una serie de comprobaciones para terminar devolviendo el número de vulnerabilidades encontradas. Dichas vulnerabilidades están basadas en la escala CVSS por lo que hay vulnerabilidades consideradas críticas y otras que son solo sugerencias.

\bigskip
A la hora de obtener una web para testear se estuvo barajando el uso de diferentes entornos web como pueden ser Galileo (Perl), WordPress (PHP), una simple web realizada en html\ref{lst:simple_html_web} e incluso una aplicación web premeditadamente vulnerable desarrollada por OWASP llamada `Juice-Shop' realizada con \textbf{Node.js} pero al final se optó por utilizar el mensaje de bienvenida de `NGINX' (ver \ref{lst:nginx_welcome_message}). La configuración estándar de NGINX con dicho mensaje nos mostraba 5 alertas \ref{lst:owas_zap_welcome_message_alerts} siendo mucho mas fácil de gestionar que las 71 que obteníamos con `Juice-Shop'.
A la hora de obtener una web para testear se estuvo barajando el uso de diferentes entornos web como pueden ser Galileo (Perl), WordPress (PHP), una simple web realizada en html\ref{lst:simple_html_web} e incluso una aplicación web premeditadamente vulnerable desarrollada por OWASP llamada \texttt{Juice-Shop} realizada con \textbf{Node.js} pero al final se optó por utilizar el mensaje de bienvenida de `NGINX' (ver \ref{lst:nginx_welcome_message}). La configuración estándar de NGINX con dicho mensaje nos mostraba 5 alertas \ref{lst:owas_zap_welcome_message_alerts} siendo mucho mas fácil de gestionar que las 71 que obteníamos con ``Juice-Shop''.

\bigskip
Una parte muy importante para el correcto funcionamiento de OWASP ZAP fue simular un dominio, en este caso utilizamos el conocido \textbf{example.com} que es un nombre reservado por la IANA (Internet Assigned Numbers Authority) en el RFC2606 \cite{eastlake_reserved_1999}. Para hacer uso del mismo se ha optado por darle ese nombre de \textbf{host} al contenedor que levanta NGINX.
Expand Down Expand Up @@ -127,7 +127,7 @@ \subsection{keepalive\_timeout}
\end{tabular}
\end{table}

Establece un tiempo de espera durante el cual una conexión cliente permanecerá abierta en el lado del servidor. El valor cero deshabilita las conexiones de cliente Keep-alive. La cabecera `Keep-Alive: timeout=time' está soportada por Firefox y Chrome. Internet Explorer cierra las conexiones abiertas por sí mismo en unos 60 segundos.
Establece un tiempo de espera durante el cual una conexión cliente permanecerá abierta en el lado del servidor. El valor cero deshabilita las conexiones de cliente Keep-alive. La cabecera ``Keep-Alive: timeout=time'' está soportada por Firefox y Chrome. Internet Explorer cierra las conexiones abiertas por sí mismo en unos 60 segundos.

\subsection{disable\_symlinks}

Expand Down Expand Up @@ -192,7 +192,7 @@ \subsection{client\_max\_body\_size}
\end{tabular}
\end{table}

Establece el tamaño máximo permitido del cuerpo de la solicitud del cliente, especificado en el campo `Content-Length' del encabezado de la solicitud. Si el tamaño de una solicitud excede el valor configurado, el error 413 (Request Entity Too Large) se devuelve al cliente. Tenga en cuenta que los navegadores no pueden mostrar correctamente este error. Configurar el tamaño a 0 desactiva la comprobación del tamaño del cuerpo de la solicitud del cliente.
Establece el tamaño máximo permitido del cuerpo de la solicitud del cliente, especificado en el campo ``Content-Length'' del encabezado de la solicitud. Si el tamaño de una solicitud excede el valor configurado, el error 413 (Request Entity Too Large) se devuelve al cliente. Tenga en cuenta que los navegadores no pueden mostrar correctamente este error. Configurar el tamaño a 0 desactiva la comprobación del tamaño del cuerpo de la solicitud del cliente.

\subsection{server\_tokens}

Expand All @@ -205,7 +205,7 @@ \subsection{server\_tokens}
\end{tabular}
\end{table}

Habilita o deshabilita la emisión de la versión NGINX en las páginas de error y en el campo `Server' del encabezado de respuesta.
Habilita o deshabilita la emisión de la versión NGINX en las páginas de error y en el campo ``Server'' del encabezado de respuesta.

\subsection{gzip}

Expand All @@ -230,7 +230,7 @@ \subsection{X-Frame-Options}
\end{tabular}
\end{table}

La cabecera `X-Frame-Options' puede ser usada para indicar si debería permitírsele a un navegador renderizar una página de forma embebida . Las páginas web pueden usarlo para evitar ataques de \textit{clickjacking}, asegurándose que su contenido no es embebido en otros sitios.
La cabecera ``X-Frame-Options'' puede ser usada para indicar si debería permitírsele a un navegador renderizar una página de forma embebida . Las páginas web pueden usarlo para evitar ataques de \textit{clickjacking}, asegurándose que su contenido no es embebido en otros sitios.

\subsection{X-Powered-By}

Expand All @@ -242,7 +242,7 @@ \subsection{X-Powered-By}
\end{tabular}
\end{table}

La cabecera `X-Powered-By' se usa para especificar con que software se ha generado la respuesta por parte del servidor.
La cabecera ``X-Powered-By'' se usa para especificar con que software se ha generado la respuesta por parte del servidor.

\bigskip
Se recomienda no dar información demasiado extensa en dicha cabecera ya que puede revelar detalles que pueden facilitar la tarea de encontrar y explotar fallos de seguridad.
Expand All @@ -258,7 +258,7 @@ \subsection{X-Content-Type-Options}
\end{tabular}
\end{table}

El encabezado HTTP de respuesta `X-Content-Type-Options' es un marcador utilizado por el servidor para indicar que los tipos \textit{MIME} anunciados en los encabezados `Content-Type' no se deben cambiar ni seguir. Esto permite desactivar el `MIME type sniffing'.
El encabezado HTTP de respuesta ``X-Content-Type-Options'' es un marcador utilizado por el servidor para indicar que los tipos \textit{MIME} anunciados en los encabezados ``Content-Type'' no se deben cambiar ni seguir. Esto permite desactivar el ``MIME type sniffing''.

\bigskip
Introducido por Microsoft en Internet Explorer 8 e implementado paulatinamente por el resto de navegadores, ayuda a los administradores puedan bloquear el rastreo de contenido, pudiendo transformar tipos MIME no ejecutables en tipos MIME ejecutables.
Expand Down
37 changes: 35 additions & 2 deletions doc/text/chapters/05_Resultados.tex
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,29 @@ \section{Análisis inicial del sistema}
\bigskip
Tras cada ejecución obtenemos una configuración de NGINX que podríamos aplicar en nuestro servidor.

\bigskip
Para facilitar la interpretación de los resultados en la siguiente tabla se adjunta una tabla con la correspondencia entre el identificador y su directiva NGINX asociada.

\begin{table}[H]
\begin{tabular}{|l|l|}
\hline
\textbf{Directiva NGINX} & \textbf{Identificador} \\ \hline
worker\_connections & 1 \\ \hline
keepalive\_timeout & 2 \\ \hline
disable\_symlinks & 3 \\ \hline
autoindex & 4 \\ \hline
send\_timeout & 5 \\ \hline
large\_client\_header\_buffers & 6 \\ \hline
client\_max\_body\_size & 7 \\ \hline
server\_tokens & 8 \\ \hline
gzip & 9 \\ \hline
X-Frame-Options & 10 \\ \hline
X-Powered-By & 11 \\ \hline
X-Content-Type-Options & 12 \\ \hline
server & 13 \\ \hline
\end{tabular}
\end{table}

\section{Cruzamiento en un único punto}

\subsection{Población de 10 individuos durante 2 generaciones}
Expand Down Expand Up @@ -289,7 +312,15 @@ \subsection{Población de 20 individuos durante 20 generaciones}

\section{Resultados para 30 ejecuciones del algoritmo}

Tras la ejecución y consid
Se han realizado 30 ejecuciones del algoritmo utilizando el script \texttt{run.sh}, como los resultados en bruto son demasiado extensos se adjuntan junto al código fuente en la carpeta resultados. De estos datos lo que hemos extraído una muestra de la moda para ver cuales son los parámetros que el algoritmo considera que son más seguros.

\begin{table}[H]
\begin{tabular}{|l|l|l|l|l|l|l|l|l|l|l|l|l|}
\hline
\textbf{1} & \textbf{2} & \textbf{3} & \textbf{4} & \textbf{5} & \textbf{6} & \textbf{7} & \textbf{8} & \textbf{9} & \textbf{10} & \textbf{11} & \textbf{12} & \textbf{13} \\ \hline
519 & 33 & 0 & 0 & 0 & 1632 & 1557 & 0 & 0 & 0 & 1 & 0 & 2 \\ \hline
\end{tabular}
\end{table}

\section{Comentarios sobre los resultados}

Expand All @@ -311,6 +342,8 @@ \section{Comentarios sobre los resultados}
Podemos afirmar que la funciona de cruzamiento en dos puntos proporciona un mejor resultado en menos generaciones, pero al aumentar el número de las mismas esta ventaja ya no se aprecia de forma tan evidente.

\bigskip
Por lo tanto, una vez decidido que la función de cruzamiento en dos puntos proporciona mejores resultaos que la que lo hace ne un único punto sólo deberíamos variar el número de generaciones dependiendo del grado de seguridad y/o diversidad que quisiéramos obtener, siendo a mas generaciones un resultado mas seguro pero menos diverso y siendo a menos generaciones un resultado mas diverso pero menos seguro.
Por lo tanto, una vez decidido que la función de cruzamiento en dos puntos proporciona mejores resultados que la que lo hace ne un único punto sólo deberíamos variar el número de generaciones dependiendo del grado de seguridad y/o diversidad que quisiéramos obtener, siendo a mas generaciones un resultado mas seguro pero menos diverso y siendo a menos generaciones un resultado mas diverso pero menos seguro.

\bigskip
Una vez hemos deducido que 5 generaciones con una función de cruzamiento en dos puntos es la que mejor resultado nos daba hemos realizado 30 ejecuciones del algoritmo. De dichas ejecuciones hemos podido comprobar que hay directivas que, dentro de un rango, no afectan a la seguridad pero si nos proporcionan mas diversidad, en cambio hay otras directivas en las el valor siempre va a ser fijo para no generar una configuración posiblemente insegura.

9 changes: 6 additions & 3 deletions doc/text/chapters/06_Conclusiones.tex
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
\chapter{Conclusiones}

El objetivo de este proyecto era mejorar las soluciones de seguridad mediante el uso de algoritmos genéticos modificando los parámetros de configuración de un servidor (en este caso NGINX). El algoritmo genético se aplicó con éxito, lo que permitió que las configuraciones evolucionaran de forma diversa y segura a lo largo del tiempo.
El objetivo de este proyecto era mejorar seguridad de un sistema mediante el uso de algoritmos genéticos modificando los parámetros de configuración de un servidor (en este caso NGINX). El algoritmo genético se aplicó con éxito, lo que permitió que las configuraciones evolucionaran de forma diversa y segura a lo largo del tiempo.

\bigskip
Algunas vulnerabilidades pueden ser causadas por una mala configuración o por una desafortunada combinación de configuraciones que es difícil que un administrador descubra manualmente debido a la gran cantidad de parámetros y a la gran cantidad de combinaciones posibles.
Expand All @@ -15,13 +15,16 @@ \chapter{Conclusiones}
Los resultados demuestran el rendimiento del enfoque evolutivo para la gestión de configuraciones que consiste en 13 parámetros del servidor NGINX. El ataque simulado de estas configuraciones se basó en la herramienta OWASP ZAP. El algoritmo genético descubrió mejores ajustes de parámetros para los parámetros atacados en cada generación.

\bigskip
En las primeras etapas, con solo dos generaciones, la solución empezó a dar buenos resultados aunque no se podía asegurar que dichas configuraciones fueran óptimas y/o seguras aunque si diversas ya que se habían inicializado de forma aleatoria. En las últimas etapas, la mejora en seguridad fue mucho mayor que en las primeras aunque se redujo un poco la diversidad.
En las primeras etapas, con solo dos generaciones, la solución empezó a dar buenos resultados aunque no se podía asegurar que dichas configuraciones fueran óptimas y/o seguras aunque si diversas ya que se habían inicializado de forma aleatoria. En las últimas etapas, la mejora en seguridad fue mucho mayor que en las primeras aunque fue reduciéndose la diversidad.

\bigskip
El experimento demostró que la diversidad dentro de la generación mantenía la capacidad de tener una configuración diversa de generación en generación. Cambiar la configuración de generación en generación creó un objetivo móvil que induce a error a un atacante que intenta reconocer determinados patrones en la configuración del servidor.

\bigskip
Quizá emplear un algoritmo genético para generar estas configuraciones usando un número tan pequeño de cromosomas no sea la opción más óptima, ya que este proyecto está más enfocado en la diversidad que en la seguridad, pero uno de los objetivos era comprobar si se podían utilizar los algoritmos genéticos para generar y evolucionar las configuraciones y efectivamente esto ha sido posible.

\section{Trabajos futuros}
Este proyecto se podría evolucionar añadiendo más parámetros así como variando el número de generaciones y el de la población. Debido al poco tiempo para realizar este proyecto y con el propósito de probar el concepto, este experimento incluyó tan solo 13 parámetros de los más de 700. También podría ser una mejora investigar la seguridad agregando aplicaciones web mas avanzadas o incluso con diferentes servidores HTTP como pueden ser \texttt{Apache} o \texttt{Caddy}.

\bigskip
Apache benchmark
Otro posible trabajo futuro sería mejorar la generación aleatoria evitando tener individuos erróneos en la población inicial, generando de esta forma una población más segura, y además utilizar algún programa de ``benchmark'' como puede ser ``Apache Benchmark'' en nuestro algoritmo de fitness para saber que ademas de segura, nuestra configuración es óptima.

0 comments on commit 7194674

Please sign in to comment.