# Permisos de usuario
## Tipos de Usuario

En los SGBD en general pueden intervenir una gran cantidad de usuarios, cada uno con mayor o menor nivel de acceso y cualificación. Respecto a la seguridad de una base de datos, conviene recordar qué tipo de usuarios se distinguen:

### Administrador

El DBA (Database Administrator) es aquella persona o grupo de personas que sostiene la máxima responsabilidad en el mantenimiento de una SGDB. Sus funciones se pueden resumir en:
* Definir el esquema lógico de la base de datos.
* Definir el esquema físico.
* Definir los subesquemas (lo que conocemos como vistas o consultas).
* Llevar un mantenimiento de los mencionados esquemas.
* Concretar qué procedimientos seguir para mantener la seguridad, integridad y privacidad de los datos.

### Usuario especializado

Este tipo de usuario es el que desarrolla otros sistemas más complejos a partir del SGBD. También caen en esta categoría aquellos usuarios que utilizan el SGDB como fuente de información específica para su labor, volcando grandes cantidades de datos para su análisis en bloque.

### Usuario técnico

Son aquellos que elaboran aplicaciones del SGDB para ser utilizadas por los usuarios finales.

### Usuario final

Usuarios no especializados. Utilizan las aplicaciones diseñadas por los técnicos para manejar la base de datos. La información que tratan está restringida al marco de su actividad concreta por medio de los subesquemas (vistas) previamente definidos.

## Implementación de políticas de seguridad

El SGBD debe garantizar que la información esté accesible únicamente a aquellos usuarios que estén autorizados, impidiendo el acceso en caso contrario. En MySQL, esta función la realiza el sistema de privilegios, el cual establece quién puede conectar al servidor. También garantiza que cada usuario ejecute sólo aquellas operaciones para las que esté autorizado.
El servidor de MySQL trabaja con cuentas (nombre de host, usuario, contraseña y privilegios) organizadas en el diccionario de datos. Al acceder a él, primero se comprueba la identidad del usuario y a continuación los permisos para hacer operaciones sobre la base de datos. En ambas etapas se usan tablas user, db y host.

### Permisos

La segunda etapa del control de acceso consiste en una serie de operaciones que realiza el servidor para verificar que cada cliente tiene suficientes privilegios para realizar sus peticiones. En este proceso, se accede a las tablas:
* user: permisos de acceso global.
* host: permisos de acceso al servidor..
* db: permisos a nivel de base de datos.
* tables_priv: permisos a nivel de tabla.
* columns_priv: permisos a nivel de columna.
Los valores en estas tablas son tipo "sí" (Y) y "no" (N). Un permiso Y, autoriza a realizar la operación. Un permiso N, hará al sistema pasar a la siguiente tabla (desde db hasta todas las tables_priv y columns_priv) hasta dar con permisos positivos. Si ninguna tabla autoriza al usuario (todas con valor N), la operación será denegada.
Cada tabla de permisos tiene dos tipos de columnas:
* Columnas de alcance: Determinan el alcance de cada registro en las tablas, es decir, el contexto en que el registro se aplica.
* Columnas de privilegios: Indican qué privilegios se otorgan a una cuenta sobre ciertas bases de datos, tablas y/o columnas (y otros objetos del SGBD).
Al realizar una nueva conexión, el servidor realiza comprobaciones sobre las tablas de permisos:
* En la tabla user, las columnas de alcance determinan si se rechazan o se aceptan conexiones entrantes. Las columnas de privilegios otorgados en ella son de carácter global (aplicados a todas las BD alojadas en el servidor).
* En la tabla db, las columnas de alcance determinan qué usuarios pueden acceder a qué bases de datos desde qué equipo. Las columnas de privilegios determinan qué operaciones se permiten a estos usuarios sobre estas BD y sus tablas.
* La tabla host se usa junto a la tabla db para configurar registros que se apliquen a varios equipos.
Cuando un usuario intenta acceder a un servidor MySQL, éste procede a validar su identidad y su clave (en la tabla user, lee las columnas host, user y password). Una vez validado el acceso, entra en estado de espera de peticiones. El servidor sólo acepta la conexión si las columnas host y user de alguna de las user coinciden con el número de máquina (IP) y usuario del cliente, además de la clave de acceso.

### Protocolo Transport Layer Security

Como seguridad extra, se pueden utilizar protocolos de cifrado de datos a la conexión entre el cliente y el servidor de bases de datos. Destacamos como ejemplo principal el protocolo Transport Layer Security (TLS), sucesor de Security Socket Layer (SSL). Este protocolo incorpora cuatro elementos de seguridad en una conexión:
* Confidencialidad: Garantizar, mediante encriptación, que los datos sean enviados a los destinatarios válidos y que no se pueda acceder a ellos sin autorización.
* Integridad: Evitar, mediante firma digital, que los datos puedan ser modificados sin notificar al usuario. Este elemento está muy relacionado con la autenticación del usuario.
* Autenticación: Verificar la autoría del mensaje o modificación por parte del usuario.
* No repudio: Evitar que el emisor del mensaje o modificación niegue su autoría tras ser autentificado.
Para utilizar conexiones SSL entre el servidor y los programas cliente es necesario disponer de claves privadas y públicas y certificados. Para ello se puede utilizar el programa OpenSSL (en Linux o Windows)..
Para comprobar si nuestro servidor MySQL tiene soporte para OpenSSL, simplemente hay que ejecutar el siguiente comando:
Si se obtiene el valor YES, nuestro servidor soporta conexiones OpenSSL. En caso contrario, será necesario actualizarlo a una versión que lo soporte.