Asegurar aplicaciones Access – Impedir modificaciones

Asegurar Access

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
The following two tabs change content below.
Arkaitz Arteaga
Llevo más de 10 años programando, sobre todo en Visual Basic y con bases de datos Access. Para mí, VBA y Access siguen siendo herramientas muy potentes. He desarrollado varios proyectos con PHP y MySql. Si sumo las webs que he tenido, probablemente pasaría de 100. Ahora prefiero dedicar todo mi esfuerzo a este blog (aunque sigo manteniendo unas cuantas...). Trabajo en la administración pública (si, soy funcionario), pero he trabajado en pequeñas empresas e incluso en una "grande" de las telecomunicaciones. Ultimamente estoy bastante metido en abrirme nuevos horizontes con C# y .NET. Renovarse o morir!

Deja un comentario