Asegurar aplicaciones Access – Impedir modificaciones
Siguiendo con la serie de artículos sobre Medidas de seguridad para aplicaciones Access, voy a intentar recopilar los pasos que suelo seguir para bloquear la aplicación que les acabo pasando a los usuarios (el FE, ver artículo sobre Dividir Aplicaciones Access).
Como supongo que ya sabréis, una de los mayores problemas que tienen las aplicaciones desarrolladas en Access (parte de los problemas también las tienen las desarrolladas en Visual Basic) es quitar el acceso a código, tablas y diseño a los usuarios. En realidad, quitarlo para usuarios medios no es nada complicado, el problema viene cuando nos encontramos con un usuario «malintencionado» con conocimientos medios/altos.
Quiero partir de la base de que no existen las aplicaciones infalibles, ni en Access, ni en Visual Basic, ni con servidores de bases de datos Sql-Server, ni con Oracle, ni con ninguna plataforma. Siempre acaba saliendo un 0 day que tumba nuestra seguridad o un fallo en la aplicación de acceso (FE), o alguien que decompila nuestro código y encuentra la forma de modificarlo para ganar privilegios en nuestro sistema.
Por eso, todo este artículo supone que este tipo de aplicaciones necesitan seguridad del lado del servidor para funcionar, es decir, que el BE se encuentre en una carpeta de acceso restringido. Con esto, es verdad que no llegamos a igualar la seguridad de Sql-Server, pero os aseguro que si alguien es capaz de romper la seguridad de nuestra aplicación, también lo será de romper la seguridad de una aplicación desarrolada en Visual Basic con BE Sql-Server. La cuestión es poner capas de seguridad, cuantas más, mejor.
Sigo con el artículo suponiendo que solo usuarios autorizados tienen acceso a nuestro BE. Esto supone un paso importante en nuestra seguridad. El usuario malintencionado con conocimientos altos de programación y de métodos de decompilación, debe de ser uno de nuestros usuarios autorizados. Nadie accederá a una base de datos a la que no deba acceder (o por lo menos no será problema de la aplicación), como mucho accederá a más datos de los debidos (intentaremos ponérselo difícil).
Hasta la versión 2007 de Acces, yo solía utilizar un módulo de Visual Basic que mostraba u ocultaba los componentes que me interesaban dependiendo de la aplicación, todo ello haciendo uso de las propiedades de la aplicación. Veamos ese módulo:
Public Function Comprobaciones_seguridad() '************************************************************************************ 'Comprobaciones para asegurarnos que no intentan romper la seguridad de la aplicación '************************************************************************************************************************************* 'Autor: Arkaitz Arteaga 'Más artículos: www.programadordepalo.com 'Mail de contacto: admin@programadordepalo.com 'Fecha: Enero 2014 ' '************************************************************************************************************************************* '************************************************************************************************************************************* 'Copyright: Por favor, no cuesta nada mantener un enlace a mi web en el código. 'Incluso pudes dejar los formularios tal cual, con un enlace a mi web. 'Si vas a utilizar este código con fines lucrativos (es decir, te van a pagar por ello) contacta conmigo por favor. '************************************************************************************************************************************* On Error GoTo mal '************************************************************** 'Desactivamos el Ribbon de Access, evitando accesos a menús restringidos. DoCmd.ShowToolbar "Ribbon", acToolbarNo 'Luego se crea el que tú quieras '*************************************************************** 'Desactivamos el acceso con la tecla SHIFT. Cuidado que una vez desactivado, 'no se puede volver a activar AlterarPropriedade "AllowBypassKey", dbBoolean, False 'Quitamos las ventana de base de datos, los menus, etc AlterarPropriedade "StartupShowDBWindow", dbBoolean, False AlterarPropriedade "StartupShowStatusBar", dbBoolean, False AlterarPropriedade "AllowBuiltinToolbars", dbBoolean, False AlterarPropriedade "AllowFullMenus", dbBoolean, False AlterarPropriedade "AllowBreakIntoCode", dbBoolean, False AlterarPropriedade "AllowSpecialKeys", dbBoolean, False Exit Function mal: MsgBox ("Error de seguridad de la base de datos, consulte con el administrador"), vbCritical, "Error" End Function Public Function AlterarPropriedade(strPropName As String, varPropType As Variant, varPropValue As Variant) As Integer Dim dbs As Database, prp As Property '****************************************************************** 'Activa/Desactiva por software el acceso privilegiado con la tecla SHIFT 'AlterarPropriedade "AllowBypassKey", dbBoolean, True --->>>>> Activa 'AlterarPropriedade "AllowBypassKey", dbBoolean, False --->>>>> Desactiva 'El resto de propiedades igual '************************************************************************* On Error GoTo mal: Const conPropNotFoundError = 3270 Set dbs = CurrentDb On Error GoTo Change_Err dbs.Properties(strPropName) = varPropValue AlterarPropriedade = True Change_Bye: Exit Function Change_Err: If Err = conPropNotFoundError Then ' Propiedad no ha sido localizada. Set prp = dbs.CreateProperty(strPropName, varPropType, varPropValue) dbs.Properties.Append prp Resume Next Else ' Error desconocido. AlterarPropriedade = False Resume Change_Bye End If Exit Function mal: MsgBox ("Ha habido un problema al abrir la base de datos, consulte con el administrador"), vbCritical, "Error" End Function
Además de esto, protegía el código de Visual Basic con contraseña y al final solo entregaba el archivo mde a los usuarios. Se supone que con esto el código deja de ser accesible, no se puede modificar el diseño quitamos teclas especiales (crtl + break, F11 para acceder al panel, etc) y quitamos el acceso privilegiado (lo típico que la gente cree que no se puede corregir) con la tecla SHIFT.
Pues bien, ahora con las nuevas versiones de archivos el proceso es bastante más sencillo y para mí, el resultado final es mucho mejor. Ahora sigo pasando el archivo inicial de base de datos (ahora accdb) a formato de solo ejecución (accde), impidiendo así el acceso de los usuarios al código y al diseño de la aplicación. Sacado de la web de Microsoft:
- ACCDB Extensión de archivo para el nuevo formato de archivo de Office Access 2007. Sustituye a la extensión de archivo MDB.
- ACCDE Extensión de archivo de los archivos de Office Access 2007 que se encuentran en modo de sólo ejecución. A todos los archivos ACCDE se les ha quitado el código fuente de Visual Basic para Aplicaciones (VBA). Los usuarios de archivos ACCDE sólo pueden ejecutar el código VBA, no modificarlo. ACCDE sustituye a la extensión de archivo MDE.
Pero después doy un paso nuevo, modifico la extensión del archivo accde por accdr, (modo tiempo de ejecución) que bloquea la aplicación sin hacer nada más, es decir, hace todo lo que hacía el módulo que utilizaba con versiones anteriores. Además, hace posible que veamos como quedará la aplicación aunque nuestros usuarios no tengan Access instalado y utilicen el Run-Time de Access (el Run-Time es gratuito y se puede descargar desde la web de Microsoft). En artículos posteriores veremos como crear un paquete que permita ejecutar aplicaciones desarrolladas en Access, sin tenerlo instalado.
Todo esto está muy bien, pero como habréis pensado más de uno, igual que yo modifico la extensión del archivo, un usuario malintencionado puede volver a modificarla. Veamos lo que dice Microsoft:
ACCDR es una nueva extensión de archivo que permite abrir una base de datos en modo de tiempo de ejecución. Cambiando simplemente la extensión de archivo de una base de datos de .accdb/e a .accdr, puede crear una versión «bloqueada» de la base de datos de Office Access 2007. Puede modificar la extensión de archivo de nuevo a .accdb/e para que recupere toda su funcionalidad .
Pues en efecto, simplemente modificando la extensión es posible volver al estado inicial. Por ello es importante seguir bien los pasos (primero crear accde y luego accdr) ya que si no, nuestro usuario malintencionado podría llegar a tener nuestra aplicación original accdb. Además de eso, compruebo por código que la aplicación se ejecute en modo Run-Time y si no la cierro.
If SysCmd(acSysCmdRuntime) = False Then MsgBox ("No intentes hacer trampas... Ejecuta el archivo original"), vbCritical, "Error" DoCmd.Quit End If
Y como no, como soy un programador desconfiado, sigo manteniendo el módulo que utilizaba en versiones anteriores, con pequeñas modificaciones. Así que vamos a hacer un pequeño resumen con los pasos:
- Diseñar nuestra aplicación en formato accdb. Siempre mantener una copia para producción.
- Proteger el código Vb con contraseña.
- Pasar nuestra aplicación a accde.
- Modificar la extensión a accdr.
- Verificar que se ejecuta en modo Run-Time
Y esto es para desconfiados como yo, supuestamente serían medidas redundantes, pero me gusta saber que están ahí:
Cargar el siguiente código siempre que se ejecute la aplicación :
Llamada a la función
Call Comprobaciones_seguridad
Módulo de Visual Basic
Public Function Comprobaciones_seguridad() '************************************************************************************ 'Comprobaciones para asegurarnos que no intentan romper la seguridad de la aplicación '************************************************************************************* '************************************************************************************************************************************* 'Autor: Arkaitz Arteaga 'Más artículos: www.programadordepalo.com 'Mail de contacto: admin@programadordepalo.com 'Fecha: Enero 2014 ' '************************************************************************************************************************************* '************************************************************************************************************************************* 'Copyright: Por favor, no cuesta nada mantener un enlace a mi web en el código. 'Incluso pudes dejar los formularios tal cual, con un enlace a mi web. 'Si vas a utilizar este código con fines lucrativos (es decir, te van a pagar por ello) contacta conmigo por favor. '************************************************************************************************************************************* '************************************************************************************************************************************* ' ACCDB Extensión de archivo para el nuevo formato de archivo de Office Access 2007. Sustituye a la extensión de archivo MDB. ' ACCDE Extensión de archivo de los archivos de Office Access 2007 que se encuentran en modo de sólo ejecución. A todos los archivos ACCDE se les ha quitado el código fuente de Visual Basic para Aplicaciones (VBA). Los usuarios de archivos ACCDE sólo pueden ejecutar el código VBA, no modificarlo. ACCDE sustituye a la extensión de archivo MDE. ' ACCDT Extensión de archivo de Plantillas de base de datos de Access. ' ACCDR ACCDR es una nueva extensión de archivo que permite abrir una base de datos en modo de tiempo de ejecución. Cambiando simplemente la extensión de archivo de una base de datos de .accdb a .accdr, puede crear una versión "bloqueada" de la base de datos de Office Access 2007. Puede modificar la extensión de archivo de nuevo a .accdb para que recupere toda su funcionalidad . ' 'Solo dejaremos que se ejecute un fichero con extensión ACCDR, para ello comprobamos que la ejecución sea en modo runtime, si no, cerramos la aplicación 'Con esto conseguimos que no se pueda modifcar ni manipular el código, ni las tablas, ni consultar datos no autorizados On Error GoTo mal If SysCmd(acSysCmdRuntime) = False Then MsgBox ("No intentes hacer trampas... Ejecuta el archivo original"), vbCritical, "Error" DoCmd.Quit End If '************************************************************** 'Desactivamos el Ribbon de Access, evitando accesos a menús restringidos. Como en nuestro caso utilizamos ACCDR, dejamos solo los menús necesarios DoCmd.ShowToolbar "Ribbon", acToolbarWhereApprop '*************************************************************** 'Desactivamos el acceso con la tecla SHIFT, aunque ya hemos combrobado que se ejecuta en modo RUNTIME, no está de más hacer la doble comprobación. Cuidado que una vez desactivado, 'no se puede volver a activar AlterarPropriedade "AllowBypassKey", dbBoolean, False 'Medidas de seguridad redundantes. Se supone que con el ACCDR no funcionan, pero por si acaso. 'Ocultar la ventana de base de datos AlterarPropriedade "StartupShowDBWindow", dbBoolean, False AlterarPropriedade "StartupShowStatusBar", dbBoolean, False AlterarPropriedade "AllowBuiltinToolbars", dbBoolean, False AlterarPropriedade "AllowFullMenus", dbBoolean, False AlterarPropriedade "AllowBreakIntoCode", dbBoolean, False AlterarPropriedade "AllowSpecialKeys", dbBoolean, False Exit Function mal: MsgBox ("Error de seguridad de la base de datos, consulte con el administrador"), vbCritical, "Error" End Function Public Function AlterarPropriedade(strPropName As String, varPropType As Variant, varPropValue As Variant) As Integer Dim dbs As Database, prp As Property '****************************************************************** 'Activa/Desactiva por software el acceso privilegiado con la tecla SHIFT 'AlterarPropriedade "AllowBypassKey", dbBoolean, True --->>>>> Activa 'AlterarPropriedade "AllowBypassKey", dbBoolean, False --->>>>> Desactiva 'Solo se puede modificar desde el formulario de control --- Triple seguridad --- Contraseña de admin, usuario windows de admin, usuario BD Admin '************************************************************************* On Error GoTo mal: Const conPropNotFoundError = 3270 Set dbs = CurrentDb On Error GoTo Change_Err dbs.Properties(strPropName) = varPropValue AlterarPropriedade = True Change_Bye: Exit Function Change_Err: If Err = conPropNotFoundError Then ' Propiedad no ha sido localizada. Set prp = dbs.CreateProperty(strPropName, varPropType, varPropValue) dbs.Properties.Append prp Resume Next Else ' Error desconocido. AlterarPropriedade = False Resume Change_Bye End If Exit Function mal: MsgBox ("Ha habido un problema al abrir la base de datos, consulte con el administrador"), vbCritical, "Error" End Function
Arkaitz Arteaga
Latest posts by Arkaitz Arteaga (see all)
- Access: Encriptar contraseñas con SHA-256 utilizando biblioteca de clases .NET con C# - 4 mayo, 2014
- Rendimiento de Access contra backend Access en servidor de archivos remoto. Cuarta parte. - 27 abril, 2014
- Rendimiento de Access contra backend Access en servidor de archivos remoto. Aclaración. - 21 abril, 2014
- Utilizar biblioteca de clases .NET en Access. Tercera aproximación a la Interoperabilidad COM - 14 abril, 2014
- Vincular tablas en Access con Visual Basic - 11 abril, 2014