Seguridad

El tema de la seguridad dentro del mundo de la informática en general, es un tema muy delicado, y como tal, debe ser tratado desde varias perspectivas. Si esta seguridad se viera vulnerada en un sistema de gestión de bases de datos, como es MySQL, los problemas y las pérdidas de información serán muy significativos.

Imagine que dispone de una base de datos de clientes donde almacena sus direcciones, números de teléfono y números de tarjetas de crédito. ¿Qué sucedería si alguien consiguiese esos números de tarjetas de crédito?. Esto no es algo tan raro, de hecho, seguro que usted ya ha oído de algún caso de este tipo.

Así, resulta de importancia vital una buena política de seguridad dentro de un sistema de gestión de bases de datos. Para ello se orientará esta seguridad desde varios puntos de vista.

Aspectos a tener en cuenta

El primero es tratar la seguridad desde el punto de vista de las conexiones remotas que se realizan a nuestro servidor. MySQL está provisto de varios mecanismos que lo convierten en un sistema de gestión de bases de datos muy seguro.

De estos métodos, el primero es controlar los accesos a nuestras bases de datos. Sólo se permitirán los accesos de unos usuarios en concreto. Aquellos que se hayan dado de alta en el sistema. Si además la conexión se realiza mediante una conexión segura SSL, muchísimo mejor.

Otro mecanismo es el uso de permisos. Si usted es usuario de GNU/Linux o de sistemas Windows, como NT / 2000, estará familiarizado con este concepto.

Los permisos controlan las acciones que un usuario podrá realizar en el sistema. Estos permisos también permitirán el control de conexión al servidor.

Otro punto de vista a tratar para garantizar una mayor seguridad, es controlar el tipo de acciones que el usuario, una vez conectado, puede llevar a cabo dentro del servidor. Usted podría preguntarse que para eso ya tenemos los permisos, pero además, MySQL incorpora los privilegios.

Con ellos podrá controlar lo que los usuarios pueden hacer dentro del sistema, como por ejemplo, añadir datos a una tabla, crear tablas nuevas o incluso eliminar datos, tablas o bases de datos enteras.

Todos estos conceptos se ampliarán en los sucesivos capítulos. Si usted desea ampliar información al respecto recomendamos la lectura de la página de ayuda de MySQL, donde podrá encontrar el manual oficial de MySQL http://www.mysql.com/doc/en/.

En concreto, relacionado con este tema, tenemos el artículo: General Security Guidelines, que se podría traducir por Guías Generales de Seguridad. Y trata sobre lo que recomiendan los creadores de MySQL en materia de seguridad. http://www.mysql.com/doc/en/General_security.html

Gestión de Usuarios

La gestión de usuarios es una tarea administrativa sencilla. Al mismo tiempo es una tarea muy importante que debe ser realizada con muchísimo cuidado. El usuario administrador, root, será el encargado de dar de alta a los usuarios en el sistema, eliminarlos, realizar cambios en sus contraseñas y asignará los privilegios necesarios para que los usuarios puedan acceder al sistema y trabajar con la base de datos. Estos serán los conceptos que se vayan viendo a lo largo de estos capítulos.

La tarea de gestión de usuarios es muy sencilla, simplemente empleando los comandos INSERT INTO y DELETE FROM en una de las tablas concretas de MySQL, mysql.user, será más que suficiente para añadir o eliminar usuarios. Esta tabla será detallada más adelante.

Ejemplo 1:

Si desea dar de alta un nuevo usuario llamado 'pepe' y con contraseña 'usuariopepe' la instrucción que debe teclear es:

mysql> INSERT INTO user (host,user,password) VALUES ('localhost','pepe',PASSWORD('usuariopepe'));

Ejemplo 2:

Si ahora desea eliminarlo:

mysql> DELETE FROM mysql.user WHERE user='pepe' and host='localhost';

Gestión de Privilegios

proporciona dos potentes herramientas para realizar dicha gestión de privilegios GRANT y REVOKE.

Respecto el tema de privilegios, es decir, todas aquellas acciones que pueden realizar los usuarios en el sistema, el principio general es conceder única y exclusivamente sólo aquellos privilegios que el usuario necesite. Nunca se concederán más permisos de los debidos.

Por ejemplo, si un usuario solamente necesita consultar unos datos almacenados en una tabla de la base de datos, no concederemos privilegios para que el usuario inserte o modifique nada, únicamente se concederán privilegios SELECT para que únicamente realice consultas en dicha tabla.

Para que se familiarice con esto se muestra la sintaxis de las órdenes GRANT y REVOKE.

GRANT

GRANT permite conceder privilegios sobre una columna, tabla o base de datos, a un usuario en concreto.

Su sintaxis es la siguiente:

GRANT priv_type [(column_list)] [, priv_type [(column_list)] …]
ON {tbl_name | * | *.* | db_name.*}
TO user_name [IDENTIFIED BY [PASSWORD] 'password']
[, user_name [IDENTIFIED BY [PASSWORD] 'password'] …]
[REQUIRE
NONE |
[{SSL| X509}]
[CIPHER cipher [AND]]
[ISSUER issuer [AND]]
[SUBJECT subject]]
[WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR # |
MAX_UPDATES_PER_HOUR # |
MAX_CONNECTIONS_PER_HOUR #]]

Tabla de Privilegios

Viendo la sintaxis de dicha orden se pueden deducir la mayoría de las opciones. priv_type indica el tipo de privilegios que se asignarán, y que se detallan a continuación:

Privilegio Descripción
ALL [PRIVILEGIOS] Concede todos los privilegios excepto WITH GRANT OPTION
ALTER Permite el uso de la orden ALTER TABLE. Añadir contenido a una tabla.
CREATE Permite el uso de CREATE TABLE. Crear tablas dentro de la base de datos.
CREATE TEMPORARY TABLES Permite el uso de CREATE TEMPORARY TABLE. Crear una tabla temporal que sólo podrá ser utilizada mientras dure la conexión, al finalizar la misma será borrada automáticamente.
DELETE Permite el uso de DELETE. Borrar filas.
DROP Permite el uso de DROP TABLE. Eliminar tabla/s.
EXECUTE Permite la ejecución de procedimientos almacenados.
INDEX Permite el uso de CREATE INDEX y DROP INDEX. Creación y eliminación de índices sobre tablas.
FILE Permite el uso de SELECT … INTO OUTFILE y LOAD DATA INFILE.
INSERT Permite el uso de INSERT. Inserción de datos.
LOCK TABLES Permite el uso de LOCK TABLES sobre tablas que tengan habilitado el privilegio SELECT.
PROCESS Permite el uso de SHOW FULL PROCESSLIST.
REFERENCES Para ampliación en próximas versiones de MySQL.
RELOAD Permite el uso de FLUSH.
SELECT Permite el uso de SELECT. Para realizar consultas.
SHOW DATABASES SHOW DATABASES muestra todas las bases de datos.
SHUTDOWN Permite el uso de mysqladmin shutdown.
UPDATE Permite el uso de UPDATE. Actualizaciones en las tablas.
USAGE Sinónimo de "sin privilegios". Suele ser empleado para crear un usuario sin privilegios.
GRANT OPTION Sinónimo de WITH GRANT OPTION.

Ejemplo 3:

Añade un usuario normal al sistema de ventas:

mysql> GRANT SELECT ON ventas.* TO usuario_normal@localhost IDENTIFIED BY 'lgrt4fyu';

Ejemplo 4:

Concederá la mayoría de los privilegios seleccionar, insertar, modificar, borrar, crear y eliminar tablas al usuario "wmaster". Después se ejecuta el comando flush para asegurar que los demás servidores MySQL actualizan esta información:

mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON simple TO wmaster@localhost;
mysql> flush privileges;

REVOKE

REVOKE deshabilita los privilegios que se indiquen sobre los usuarios especificados.

Su sintaxis es la siguiente:

REVOKE priv_type [(column_list)] [, priv_type [(column_list)] …]
ON {tbl_name | * | *.* | db_name.*}
FROM user_name [, user_name …]

Las opciones de tipos de privilegios son las mismas que se han detallado para GRANT.

Ejemplo 5:

Eliminará todos los permisos aplicados sobre usuario_normal que anteriormente se aplicaron con GRANT:

mysql> REVOKE SELECT ON ventas.* FROM usuario_normal@localhost;

Ejemplo 6:

Eliminará los privilegios de SELECT e INSERT al usuario pepe sobre el sistema de detección de intrusos snort:

mysql> REVOKE INSERT,SELECT on snort.* to pepe@localhost;

Niveles de Privilegios

Tanto GRANT como REVOKE permiten, al usuario administrador, conceder y anular privilegios a los usuarios de MySQL desde cuatro niveles de privilegios distintos:

Nivel global

Los privilegios globales se aplican a todas las bases de datos del servidor. Estos privilegios se almacenan en la tabla mysql.user. GRANT ALL ON *.* y REVOKE ALL ON *.* conceden y anulan solamente los privilegios globales respectivamente.

Nivel de base de datos

Los privilegios a nivel de base de datos son aplicados a todas las tablas de la base de datos especificada. Estos privilegios son almacenados en las tablas mysql.db y mysql.host. GRANT ALL ON db.* y REVOKE ALL ON db.* concederán y anularán, respectivamente, los privilegios sólo a nivel de base de datos.

Nivel de Tabla

Los privilegios a nivel de tabla se aplican a todas las columnas de la tabla especificada. Estos privilegios son almacenados en la tabla mysql.tables_priv table. GRANT ALL ON db.table y REVOKE ALL ON db.table concederán y anularán solamente los privilegios a nivel de tabla.

Nivel de columna

Los privilegios de columna se aplican sobre una sola o varias columnas de una tabla especificada. Estos privilegios son almacenados en la tabla mysql.columns_priv. Cuando se utiliza REVOKE se deben especificar las mismas columnas sobre las que se han concedido anteriormente dichos privilegios.

La mejor forma de ver como gestionar sus privilegios es realizando unos sencillos ejemplos.

Ejemplo:

Imagine que desea conceder todos los privilegios sobre todas las bases de datos a este usuario, para ello deberá teclear:

mysql> GRANT ALL PRIVILEGES ON *.* TO pepe@localhost IDENTIFIED BY 'usuariopepe' WITH GRANT OPTION;

Tablas de permisos

Anteriormente, al hablar de GRANT y REVOKE, se han especificado cuatro niveles distintos de privilegios. Estos niveles de privilegios se almacenan en unas tablas de permisos que ya han sido citadas. Estas tablas son: db, host, user, tables_priv y columns_priv.

El sistema de privilegios de MySQL asegura que los usuarios podrán realizar únicamente aquellas tareas para las cuales poseen permisos. Esto, lo realiza de forma muy eficiente gracias a unas tablas internas que emplea para almacenar toda la información de usuarios, privilegios, etc…

MySQL controla el acceso en dos pasos, primero controla el acceso permitiendo la conexión o no. Y segundo, una vez que el usuario ha accedido al sistema, este controla cada petición que se realice y comprobará que se dispone de suficientes permisos para llevar a cabo la petición.

Table name user db host
Scope fields Host Host Host
User Db Db
Password User
Privilege fields Select_priv Select_priv Select_priv
Insert_priv Insert_priv Insert_priv
Update_priv Update_priv Update_priv
Delete_priv Delete_priv Delete_priv
Index_priv Index_priv Index_priv
Alter_priv Alter_priv Alter_priv
Create_priv Create_priv Create_priv
Drop_priv Drop_priv Drop_priv
Grant_priv Grant_priv Grant_priv
References_priv References_priv References_priv
Reload_priv
Shutdown_priv
Process_priv
File_priv
Show_db_priv
Super_priv
Create_tmp_table_priv Create_tmp_table_priv Create_tmp_table_priv
Lock_tables_priv Lock_tables_priv Lock_tables_priv
Execute_priv
Repl_slave_priv
Repl_client_priv
ssl_type
ssl_cypher
max_questions
max_updates
max_connections

Estas tablas son las utilizadas por el sistema para la realización de las comprobaciones de privilegios.

Table name tables_priv columns_priv
Scope fields Host Host
Db Db
User User
Table_name Table_name
Column_name
Privilege fields Table_priv Column_priv
Column_priv
Other fields Timestamp Timestamp
Grantor

« MySQL 4 | Administracion de MySQL

Si no se indica lo contrario, el contenido de esta página se ofrece bajo Creative Commons Attribution-ShareAlike 3.0 License