Seguridad en acceso a datos

Tengo la siguiente situación. Para un cliente diseñé una base de datos Access 2007 con tablas vinculadas a un mySQL que tengo en un servidor. El cliente tiene la base de datos en local y accede en remoto a los datos vía ODBC.
La base de datos almacena registros de consumos, varios miles.
Ahora otro cliente me pide lo mismo y he pensado usar la misma base de datos en mySQL y en local en Access. He creado las tablas de empresa y formulario de acceso con password.
Bien. Mi problema es que no sé como ocultar eficazmente las tablas. Si no lo consigo, cualquier cliente puede acceder a las tablas directamente y ver los datos del otro, manipularlos o lo que sea.
No quiero crear 2 bases de datos en mySQL, que es la otra opción, y darle a cada cliente un ODBC distinto, porque si tengo un tercer, cuarto, ... Cliente al final es tener un montón de bases de datos y multiplicar por n las labores de mantenimiento.
Bueno, después de todo este rollo, me gustaría que me recomendaras un mecanismo para evitar con un 100% de seguridad que si uso una única base de datos mySQL cada usuario (cliente) sólo pueda acceder a sus datos, bien mediante la ocultación de tablas, o mediante el mecanismo que sea.
Cualquier ayuda en ese sentido es bienvenida.
Respuesta
1
Todos sabemos que las aplicaciones access tienen gran potencial, gran versatilidad y es un entorno de fácil diseño. Todas estas ventajas tienen un gran inconveniente, y es la seguridad de los datos.
No cabe duda que el hecho de haber creado las tablas en MySQL protege la cápsula que contiene los datos, pero al vincularlos a un fichero access están a expensas de posibles vandalismos.
Para proteger medianamente esos datos primero accederemos a Herramientas>Inicio
Y desactivaremos las opciones de:
Presentar la ventana Base de datos.
Permitir el uso de menús no restringidos.
Permitir el uso de menús contextuales predeterminados.
Permitir el uso de las barras de herramientas incorporadas.
Permitir cambios en barras de herramientas y menús.
En access 2007 y posteriores creo que está en Archivo>Opciones>Base de datos actual
En este mismo sitio me imagino que tienes indicado que al abrir el access se ejecute un formulario que es el que usas para dar entrada a los usuarios.
De esta manera al abrir el access, no nos da acceso a las tablas y abre en auto en el formulario indicado.
El hecho de deshabilitar los contextuales predeterminados es debido a que situándonos en las cabeceras de los formularios y pulsando el botón derecho, nos abriría un menú contextual con la opción de ver diseño del formulario, lo que podría ser una puerta abierta para alguien con malas intenciones. Por ello crearemos un menú contextual a la medida y lo pondremos como predeterminado.
Evidentemente todo esto tiene un pero, y es que para acceder a las tablas y diseño de los formularios solo tendríamos que abrir el access manteniendo pulsada la tecla SHIFT, por lo que explicaremos cómo deshabilitar esta propiedad.
En la pestaña de módulos creamos uno con el código siguiente:
Public Function AlterarPropriedade(strPropName As String, varPropType As Variant, varPropValue As Variant) As Integer 
Dim dbs As Database, prp As Property 
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 
End Function 
 
Le damos a guardar y lo guardamos con cualquier nombre.
En el formulario de arranque de la aplicación situaremos un botón con el código:
If InputBox("Clave?", "Bloqueo de BD") = "123456" Then
    AlterarPropriedade "AllowBypassKey", dbBoolean, True
Else
    AlterarPropriedade "AllowBypassKey", dbBoolean, False
End If

Al arrancar la aplicación pulsaremos el botón y no incorporamos clave alguna por lo que el código considera que no sabes la clave y bloquea el SHIFT. Cerramos la aplicación y comprobamos que la tecla SHIFT ya no funciona.
Evidentemente para volver a activarla pulsaremos el botón e incorporaremos la clave correcta (123456), cerramos la aplicación y abrimos pulsando SHIFT.
Si todo va bien se abrirá al access en vista diseño.
Antes de hacer nada, es IMPORTANTÍSIMO que hagas copia de seguridad de tu aplicación, no sea que tengas un error y se te bloquee.
También te aconsejo que protejas los códigos de Visual Basic con contraseña. Esto se consigue en vista VB menú Herramientas>Propiedades de compras>Protección.
Todas estas protecciones son esquivables por parte de un informático experimentado, pero en un entorno de trabajo habitual no te vas a encontrar con nadie que sepa abrirlas. Yo diseñando BD en el mismo entorno que tú y nunca he tenido problemas.
Después de este rollazo espero haberte sido de ayuda.
Una aperta.
Gracias. Me ha válido bastante. He hecho alguna modificación del código que has escrito para "presentarlo" de otra forma y funciona bien.
En realidad estaba buscando otro tipo de seguridad, aunque esta opción es mejor que nada, desde luego.
La opción que estoy mirando aunque no he dado con 100% con ella consiste en hacer vistas del modelo de las tablas en mysql. Como una vista al fin y al cabo sale de una query, siempre se puede filtrar para presentar los datos que quieres para ese cliente.
A cada usuario creado en mySQL le asigno permisos sobre las vistas a las que puede acceder (con lo que los datos ya están filtrados). El ODBC lo configuro con usuario y contraseña. De ese modo, aunque en Access tenga acceso a las tablas, sólo podría ver sus datos y no los de ningún otro cliente porque mySQL no se lo permitiría.
No he implementado esta solución, pero estoy en ello. No sé mucho de mySQL, pero creo que es bastante más robusta. Al fin y al cabo un informático un poco listo se carga lo del shift rápidamente. Yo mismo he probado con el código que has escrito a ejecutarlo de forma "controlada" una base de datos Access para cambiar el valor del AllowByPassKey y funciona sin más problema, esto es que con una pequeña utilidad así vas poniendo el valor a true de cualquier base de datos que te encuentres.
He añadido en la base de datos que manejo un log que se ejecuta con un timer cada 10 minutos y cuando se abre la base para saber cuándo se cambia el valor de la propiedad de modo que al menos uno sabe si alguien está "enredando".
En cualquier caso, como tú dices, los usuarios no saben esto en general, aunque con google a mano...
Muchas gracias.

1 respuesta más de otro experto

Respuesta
1
Puedes poner un campo el cual contenga el código de cliente y dependiendo de quien accede lo muestras los datos del código de cliente que está accediendo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas