Bases de datos‎ > ‎MySql‎ > ‎Introduccion MySQL‎ > ‎

MySQL Proxy

mysql-proxy es una ligera aplicación binaria entre uno o más clientes de MySQL y un servidor. Los clientes se conectan al proxy en lugar de conectar con el servidor. El proxy funciona como un intermediario entre el cliente y el servidor.

En su forma básica, el proxy es sólo una redirección. Se pone un cubo vacío desde el cliente (una consulta), lo lleva al servidor, llena el cubo con los datos, y se lo pasa al cliente.

Si eso fuese todo, el proxy como tal seria una herramienta inútil. Pero, dicha herramienta provee consigo una utilidad importante, el interprete LUA. Usando el lenguaje Lua, puede definir qué hacer con una consulta o un conjunto de resultados antes de retornar la respuesta consultada.

MySQL-Proxy overview


El Proxy puede modificar consultas SQL y sus resultados.

El poder del proxy es su flexibilidad, según lo permitido por el interprete de Lua.
Puede interceptar la consulta antes de su llegada al servidor, y hacer todo lo imaginable con esta:

    
* Pasar toda la data enviada sin modifcaciones o cambios
    
* Corregir errores de ortografía
    
* Filtro hacia fuera, es decir, eliminar por completo
    
* Reescribir la consulta de acuerdo con algunas políticas establecidas
    
* Agregar instrucciones olvidadas
    
* Entre muchas cosas mas....

De la misma manera, se puede interceptar el conjunto de resultados. Por lo que se puede:

1.- Hacer un Log de todas las consultas que recibe el Servidor
2.- Denegar consultas peligrosas que puedan dañar nuestra base de datos
3.- Generar Alias de comandos comunes por ejemplo SLE se podria convertir en SELECT
4.- Balancear la carga entre varios servidores de MySQL en un esquema de Master/Slave
5.- Dar prioridad a ciertas consultas para acelerar la respuesta del servidor

CONCEPTOS

MySQL Proxy se construye con una infraestructura orientada a objetos. La clase principal expone tres funciones de miembros  públicas. Puede reemplazar en un script LUA el comportamiento preestablecido en el Proxy.

    
* Connect_server (). Funcion que realiza la coneccion, usted puede trabajar dentro de esta función para cambiar los parámetros de conexión.
    
* Read_query (paquete). Esta función se llama antes de enviar la consulta al servidor. Usted puede intervenir para cambiar la sentencia original o para inyectar más a la cola. También puede decidir saltar el servidor back-end por completo y enviar de vuelta al cliente el resultado que desea. (Por ejemplo, dado un SELECT * FROM big_table usted podria establecer que se retorne una respuesta  tipo "big_table tiene 20 millones de discos. ¿Ha olvidado la cláusula WHERE?")
    
* Read_query_result (injection_packet). Esta función se llama antes de retornar el resultado para una consulta de inyección. Usted puede hacer algo aquí para decidir qué hacer con el conjunto de resultados (ignorar, modificar, enviar sin cambios).

Mediante la combinación de estas tres puertas de nuevo al servidor se puede lograr un alto grado de maniobrabilidad en el servidor.

INSTALACION

La instalación del proxy es bastante fácil. El paquete de distribución contiene un solo binario (ya partir de 0.5.1, también algunos ejemplos de scripts LUA). El paquete solo esta disponible para sistemas operativos tipos unix y unix, aunque se esta trabajando para liberar un binario para sistemas operativos Microsoft.

Luego de descomprimir el paquete, la instalacion es un proceso rapido::::

 
. / autogen.sh
 
. / configure & & make
 
sudo make install
 
# Copia el ejecutable a / usr / local / sbin



Inyecciones SQL

Como funcionan los ataques (inyecciones SQL) con el proxy MySQL: 

Query injection


En la imagen, el servidor recibe 3 consultas SQL, y porsupuesto retorna el resultado de estas 3 peticiones. Cuando ocurre una inyeccion SQL, la consulta es analizada y procesada por otra funcion del interprete del proxy (read)query_result) donde el programador puede asignar una excepcion a retornar de acuerdo al ID asignado a la respuesta retornada por el servidor.

I

processing the injected queries


Imagen que muestra el proceso realizado al recibir una inyeccion SQL.

El resultado retornado por la consulta realizada por un cliente es previamente analizada, todo este proceso es transparente para el cliente, pero todo los detalles realizados por el Proxy se muestran en la consola Proxy.

Veamos un ejemplo de un script en LUA que guardar todas nuestras consultas en un archivo llamado mysql.log

 assert(proxy.PROXY_VERSION >= 0x00600,
"you need at least mysql-proxy 0.6.0 to run this module")

local log_file = os.getenv("PROXY_LOG_FILE")
if (log_file == nil) then
log_file = "mysql.log"
end

local fh = io.open(log_file, "a+")
local query = "";

function read_query( packet )
if string.byte(packet) == proxy.COM_QUERY then
query = string.sub(packet, 2)
proxy.queries:append(1, packet )
return proxy.PROXY_SEND_QUERY
else
query = ""
end
end

function read_query_result (inj)
local row_count = 0
local res = assert(inj.resultset)
local num_cols = string.byte(res.raw, 1)
if num_cols > 0 and num_cols < 255 then
for row in inj.resultset.rows do
row_count = row_count + 1
end
end
local error_status =""
if res.query_status and (res.query_status < 0 ) then
error_status = "[ERR]"
end
if (res.affected_rows) then
row_count = res.affected_rows
end
--
-- write the query, adding the number of retrieved rows
--
fh:write( string.format("%s| %6d |--| %s| {%d} %s\n",
os.date('%Y-%m-%d %H:%M:%S'),
proxy.connection.server["thread_id"],
query,
row_count,
error_status))
fh:flush()
end

Este ejemplo lo tome de este articulo Getting started with MySQL-Proxy les recomiendo se den una vuelta por ahi para que vean la informacion que dan.


Comments