You are on page 1of 12

SEGURIDAD EN MySQL

Al tratar el tema de la seguridad, hacemos hincapié en la necesidad de proteger


totalmente la máquina completa (no únicamente el servidor MySQL) contra todos
los tipos de ataques posibles; intercepción pasiva de paquetes, alteración,
reproducción de comandos (playback), y denegación de servicio. Aquí no tratamos
todos los aspectos de disponibilidad y tolerancia a fallos. En MySQL, es
importante considerar la necesidad de proteger totalmente la máquina completa
contra todos los tipos de ataques posibles: intercepción pasiva de paquetes,
reproducción de comandos, y denegación de servicio.

Para todas las conexiones, consultas, y otras operaciones que los usuarios
pueden intentar realizar, MySQL utiliza seguridad basada en Listas de Control de
Acceso (ACLs). También hay algún soporte para conexiones cifradas mediante
SSL entre clientes y servidores MySQL. Muchos de los conceptos que aquí se
exponen no son específicos de MySQL; las mismas ideas generales se pueden
aplicar a cualquier aplicación.

Al ejecutar MySQL, siga siempre que sea posible estas recomendaciones:

• ¡No de nunca a nadie (excepto a la cuenta root de MySQL acceso a la


tabla user en la base de datos mysql! Esto es crítico. La clave cifrada
es la verdadera clave en MySQL. Cualquiera que sepa cual es la clave
que hay en la tabla user y tenga acceso a la máquina host de la cuenta
registrada puede acceder fácilmente como ese usuario.
• Estudie el sistema de privilegios de acceso de MySQL. Las sentencias
GRANT y REVOKE se utilizan para controlar el acceso a MySQL. No
otorgue más privilegios de los necesarios. Nunca otorgue privilegios a un
mismo usuario sin tener en cuenta el equipo desde el que se conecta.

Lista de comprobaciones:

 Pruebe el comando mysql -u root. Si es capaz de conectar al


servidor sin la necesidad de introducir una clave, tiene problemas.
¡Cualquiera puede conectar a su servidor MySQL como el usuario
root de MySQL con privilegios totales! Revise las instrucciones de
instalación de MySQL, prestando atención en concreto a la
información sobre establecer una clave para el usuario root.

 Utilice la sentencia SHOW GRANTS y compruebe quién tiene


acceso a qué. Después utilice la sentencia REVOKE para denegar
los privilegios que no son necesarios.
2 Sintaxis de GRANT y REVOKE

GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...


ON [object_type] {tbl_name | * | *.* | db_name.*}
TO user [IDENTIFIED BY [PASSWORD] 'password']
[, user [IDENTIFIED BY [PASSWORD] 'password']] ...
[REQUIRE
NONE |
[{SSL| X509}]
[CIPHER 'cipher' [AND]]
[ISSUER 'issuer' [AND]]
[SUBJECT 'subject']]
[WITH with_option [with_option] ...]

object_type =
TABLE
| FUNCTION
| PROCEDURE

with_option =
GRANT OPTION
| MAX_QUERIES_PER_HOUR count
| MAX_UPDATES_PER_HOUR count
| MAX_CONNECTIONS_PER_HOUR count
| MAX_USER_CONNECTIONS count
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] {tbl_name | * | *.* | db_name.*}
FROM user [, user] ...

REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...

Los comandos GRANT y REVOKE permiten a los adminitradores de sistemas


crear cuentas de usuario MySQL y darles permisos y quitarlos de las cuentas.

Si las tablas de permisos tienen registros de permisos que contienen nombres de


tablas o bases de datos con mayúsculas y minúsculas y la variable de sistema
lower_case_table_names está activa, REVOKE no puede usarse para quitar los
permisos. Es necesario manipular las tablas de permisos directamente. (GRANT
no creará estos registros cuando está activo lower_case_table_names , pero
tales registros pueden haberse creado préviamente a activar la variable.)

Los permisos pueden darse en varios niveles:


• Nivel global

Los permisos globales se aplican a todas las bases de datos de un servidor


dado. Estos permisos se almacenan en la tabla mysql.user. GRANT ALL
ON *.* y REVOKE ALL ON *.* otorgan y quitan sólo permisos globales.

• Nivel de base de datos

Los permisos de base de datos se aplican a todos los objetos en una base
de datos dada. Estos permisos se almacenan en las tablas mysql.db y
mysql.host . GRANT ALL ON db_name.* y REVOKE ALL ON db_name.*
otorgan y quitan sólo permisos de bases de datos.

• Nivel de tabla

Los permisos de tabla se aplican a todas las columnas en una tabla dada.
Estos permisos se almacenan en la tabla mysql.tables_priv . GRANT ALL
ON db_name.tbl_name y REVOKE ALL ON db_name.tbl_name otorgan y
quian permisos sólo de tabla.

• Nivel de columna

Los permisos de columna se aplican a columnas en una tabla dada. Estos


permisos se almacenan en la tabla mysql.columns_priv . Usando
REVOKE, debe especificar las mismas columnas que se otorgaron los
permisos.

• Nivel de rutina

Los permisos CREATE ROUTINE, ALTER ROUTINE, EXECUTE, y


GRANT se aplican a rutinas almacenadas. Pueden darse a niveles global y
de base de datos. Además, excepto para CREATE ROUTINE, estos
permisos pueden darse en nivel de rutinas para rutinas individuales y se
almacenan en la tabla mysql.procs_priv .

La cláusula object_type se añadió en MySQL 5.0.6. Debe especificarse como


TABLE, FUNCTION, o PROCEDURE cuando el siguiente objeto es una tabla, una
función almacenada, o un procedimiento almacenado. Para usar esta cláusula
cuando actualice de una versión anterior de MySQL a la 5.0.6, debe actualizar las
tablas de permisos. Consulte Sección 2.10.2, “Aumentar la versión de las tablas
de privilegios”.

Para usar GRANT o REVOKE, debe tener el permiso GRANT OPTION , y debe
tener los permisos que está dando o quitando.
Para hacer fácil de quitar todos los permisos, MySQL 5.0 tiene la siguiente
sintaxis, que borra todos los permisos globales, de nivel de base de datos y de
nivel de tabla para los usuarios nombrados:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...

Para usar esta sintaxis REVOKE , debe tener el permiso CREATE USER global o
el permiso UPDATE para la base de datos mysql .

Para los comandos GRANT y REVOKE , priv_type pueden especificarse como


cualquiera de los siguientes:
Permiso Significado
ALL [PRIVILEGES] Da todos los permisos simples excepto GRANT OPTION
ALTER Permite el uso de ALTER TABLE
ALTER ROUTINE Modifica o borra rutinas almacenadas
CREATE Permite el uso de CREATE TABLE
CREATE ROUTINE Crea rutinas almacenadas
CREATE Permite el uso de CREATE TEMPORARY TABLE
TEMPORARY
TABLES
CREATE USER Permite el uso de CREATE USER, DROP USER, RENAME
USER, y REVOKE ALL PRIVILEGES.
CREATE VIEW Permite el uso de CREATE VIEW
DELETE Permite el uso de DELETE
DROP Permite el uso de DROP TABLE
EXECUTE Permite al usuario ejecutar rutinas almacenadas
FILE Permite el uso de SELECT ... INTO OUTFILE y LOAD DATA
INFILE
INDEX Permite el uso de CREATE INDEX y DROP INDEX
INSERT Permite el uso de INSERT
LOCK TABLES Permite el uso de LOCK TABLES en tablas para las que
tenga el permiso SELECT
PROCESS Permite el uso de SHOW FULL PROCESSLIST
REFERENCES No implementado
RELOAD Permite el uso de FLUSH
REPLICATION Permite al usuario preguntar dónde están los servidores
CLIENT maestro o esclavo
REPLICATION Necesario para los esclavos de replicación (para leer eventos
SLAVE del log binario desde el maestro)
SELECT Permite el uso de SELECT

SHOW SHOW DATABASES muestra todas las bases de datos


DATABASES

SHOW VIEW Permite el uso de SHOW CREATE VIEW

SHUTDOWN Permite el uso de mysqladmin shutdown

SUPER Permite el uso de comandos CHANGE MASTER, KILL,


PURGE MASTER LOGS, and SET GLOBAL , el comando
mysqladmin debug le permite conectar (una vez) incluso si
se llega a max_connections

UPDATE Permite el uso de UPDATE

USAGE Sinónimo de “no privileges”

GRANT OPTION Permite dar permisos

USAGE puede especificarse cuando quiere crear un usuario sin


permisos.

Use SHOW GRANTS para determinar qué permisos tiene la cuenta.

Los permisos FILE, PROCESS, RELOAD, REPLICATION CLIENT,


REPLICATION SLAVE, SHOW DATABASES, SHUTDOWN, y SUPER
son permisos administrativos que sólo pueden darse globalmente
(usando sintaxis ON *.* ).

Otros permisos pueden darse globalmente o a niveles más específicos.

Los únicos valores priv_type que puede especificar para una tabla son
SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT
OPTION, INDEX, y ALTER.

Los únicos valores priv_type que puede especificar para una columna
(cuando usa la cláusula column_list ) son SELECT, INSERT, y UPDATE.
Los únicos valores priv_type que puede especificar a nivel de rutina son
ALTER ROUTINE, EXECUTE, y GRANT OPTION. CREATE ROUTINE no
es un permiso de nivel de rutina porque debe tener este permiso para
ser capaz de crear una rutina en primer lugar.

Para los niveles global, base de datos, tabla y rutina, GRANT ALL asigna
sólo los permisos que existen en el nivel que está otorgándolos. Por
ejemplo, si usa GRANT ALL ON db_name.*, este es un comando de
nivel de base de datos, así que ninguno de los permisos únicamente
globales tales como FILE se otorgan.

Hay distintas posibilidades para limitar tipos de conexión para una


cuenta:

• Si una cuenta no tiene requerimientos de SSL o X509, se permiten


conexiones sin encriptar si la contraseña y nombre de usuario son
válidos. Sin embargo, las conexiones no encriptadas pueden
usarse en las opciones de cliente, si el cliente tiene los ficheros
clave y de certificado apropiados.
• La opción REQUIRE SSL le dice al servidor que permita sólo
conexiones SSL encriptadas para la cuenta. Tenga en cuenta que
esta opción puede omitirse si hay algunos registros de control de
acceso que permitan conexiones no SSL.
• mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
• -> IDENTIFIED BY 'goodsecret' REQUIRE SSL;
• REQUIRE X509 significa que el cliente debe tener un certificado
válido pero que el certificador exacto y el asunto no importan. El
único requerimiento que debe ser posible de verificar es la firma
con uno de las AC certificadas.
• mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
• -> IDENTIFIED BY 'goodsecret' REQUIRE X509;
• REQUIRE ISSUER 'issuer' crea una restricción de intentos de
conexión en que el cliente debe presentar un certificado X509
válido presentado por la AC issuer. Si el cliente presenta un
certificado válido pero de otra AC, el servidor rehúsa la conexión.
El uso de certificados X509 siempre implica encripción, por lo que
la opción SSL no es necesaria.
• mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
• -> IDENTIFIED BY 'goodsecret'
• -> REQUIRE ISSUER '/C=FI/ST=Some-State/L=Helsinki/
• O=MySQL Finland AB/CN=Tonu
Samuel/Email=tonu@example.com';

Tenga en cuenta que el valor ISSUER debe entrarse como una


cadena única.
• REQUIRE SUBJECT 'subject' crea la restricción en los intentos de
conexión de que el cliente debe presentar un certificado X509
válido con el asunto subject. Si el cliente presenta un certificado
válido pero con un asunto distinto, el servidor rehúsa la conexión.
• mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
• -> IDENTIFIED BY 'goodsecret'
• -> REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/
• O=MySQL demo client certificate/
• CN=Tonu Samuel/Email=tonu@example.com';

Tenga en cuenta que el valor SUBJECT debe entrarse como una


única cadena.

• REQUIRE CIPHER 'cipher' se necesita para asegurar que se usan


cifradores suficientemente fuertes y longitudes de claves acordes.
SSL por sí mismo puede ser débil si se usan algoritmos antiguos
con claves de encriptación cortas. Con esta opción, puede
especificar el método de cifrado exacto para permitir una
conexión.
• mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
• -> IDENTIFIED BY 'goodsecret'
• -> REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';

Las opciones SUBJECT, ISSUER, y CIPHER pueden combinarse en la


cláusula REQUIRE así:
mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
-> IDENTIFIED BY 'goodsecret'
-> REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/
O=MySQL demo client certificate/
CN=Tonu Samuel/Email=tonu@example.com'
-> AND ISSUER '/C=FI/ST=Some-State/L=Helsinki/
O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com'
-> AND CIPHER 'EDH-RSA-DES-CBC3-SHA';

Tenga en cuenta que los valores SUBJECT y ISSUER deben entrarse


como una única cadena.

En MySQL 5.0, la palabra clave AND es opcional entre las opciones


REQUIRE .

El orden de las opciones no importa, pero no puede especificarse


ninguna opción dos veces.

Cuando mysqld arranca, todos los permisos se leen en memoria. Para


más detalles,
Tenga en cuenta que si usa permisos de tablas o de columnas para un
usuario, el servidor examina los permisos de tablas y usuarios para
todos los usuarios y esto ralentiza MySQL ligeramente. De forma similar,
si limita el número de consultas, actualizaciones o conexiones para
cualquier usuario, el servidor debe monitorizar estos valores.

Las mayores diferencias entre las versiones de GRANT de MySQL y SQL


estándar son:

• En MySQL, los permisos se asocian con una combinación de


nombre de usuario/equipo y no sólo con el usuario.
• SQL estándar no tienen permisos globales o a nivel de base de
datos, ni soporta todos los tipos de permisos que soporta MySQL .
• MySQL no soporta los permisos de SQL estándar TRIGGER o
UNDER.
• Los permisos de SQL estándar se estructuran de forma jerárquica.
Si borra un usuario, todos los permisos que tuviera el usuario se
eliminan. Esto es cierto a partir de MySQL 5.0.2 y si usa DROP
USER. Antes de 5.0.2, los permisos otorgados no se eliminaban
automáticamente; debía hacerlo a mano. Consulte
• En SQL estándar, cuando borra una tabla, todos los permisos para
la tabla se eliminan. Con SQL estándar, cuando quita un permiso,
todos los permisos otorgados basados en ese permiso también se
eliminaban. En MySQL, los permisos sólo pueden borrarse con
comandos REVOKE explícitos o manipulando las tablas de
permisos de MySQL.
• En MySQL, es posible tener el permiso INSERT sólo para algunas
de las columnas en la tabla. En este caso, todavía puede ejecutar
comandos INSERT en la tabla mientras omita esas columnas para
las que no tiene el permiso INSERT . Las columnas omitidas
obtienen su valor por defecto implícito si no está activado el modo
SQL estricto. En modo estricto, el comando se rehúsa si algunas de
las columnas omitidas no tienen valor por defecto. Sección 5.3.2,
“El modo SQL del servidor” discute acerca del modo estricto.
Sección 13.1.5, “Sintaxis de CREATE TABLE” disctue acerca de
los valores por defecto implícitos.

Las columnas para las que no tiene el permiso INSERT se ponen a


su valor por defecto. SQL estándar requiere que tenga el permiso
INSERT en todas las columnas.

En MySQL, si tiene el permiso INSERT sólo en alguna de las


columnas de la tabla, puede ejecutar comandos INSERT —
mientras omita las columnas para las que no tiene el permiso de
su comando INSERT; tales columnas obtendrán su valor por
defecto. En modo estricto (cuando sql_mode="traditional"), si
alguna de las columnas omitidas no tiene valor por defecto, el
comando INSERT se rehúsa.

SHOW PRIVILEGES

muestra la lista de privilegios del sistema que el servidor MySQL actual


soporta. Esta sentencia se implementa desde MySQL 4.1.0.
mysql> SHOW PRIVILEGES\G
*************************** 1. row ***************************
Privilege: Select
Context: Tables
Comment: To retrieve rows from table
*************************** 2. row ***************************
Privilege: Insert
Context: Tables
Comment: To insert data into tables
*************************** 3. row ***************************
Privilege: Update
Context: Tables
Comment: To update existing rows
*************************** 4. row ***************************
Privilege: Delete
Context: Tables
Comment: To delete existing rows
*************************** 5. row ***************************
Privilege: Index
Context: Tables
Comment: To create or drop indexes
*************************** 6. row ***************************
Privilege: Alter
Context: Tables
Comment: To alter the table
*************************** 7. row ***************************
Privilege: Create
Context: Databases,Tables,Indexes
Comment: To create new databases and tables
*************************** 8. row ***************************
Privilege: Drop
Context: Databases,Tables
Comment: To drop databases and tables
*************************** 9. row ***************************
Privilege: Grant
Context: Databases,Tables
Comment: To give to other users those privileges you possess
*************************** 10. row ***************************
Privilege: References
Context: Databases,Tables
Comment: To have references on tables
*************************** 11. row ***************************
Privilege: Reload
Context: Server Admin
Comment: To reload or refresh tables, logs and privileges
*************************** 12. row ***************************
Privilege: Shutdown
Context: Server Admin
Comment: To shutdown the server
*************************** 13. row ***************************
Privilege: Process
Context: Server Admin
Comment: To view the plain text of currently executing queries
*************************** 14. row ***************************
Privilege: File
Context: File access on server
Comment: To read and write files on the server

http://www.fbielma.org/conferencia/Jornadas-Regionales/MySQL-Security.pdf

http://dev.mysql.com/doc/refman/5.0/es/security-guidelines.html

http://dev.mysql.com/doc/refman/5.0/es/grant.html

http://www.itescam.edu.mx/principal/sylabus/rptSylabus.php?
tipo=PDF&id_asignatura=344&clave_asignatura=SCS-
0432&carrera=ISC0405001
INSTITUTO TECNOLOGICO DE TAPACHULA

ING. SISTEMAS COMPUTACIONALES

LIC. MARILIN DE LOEN MORGA

TALLER DE BASE DE DATOS

SEGURIDAD DE MYSQL

GERSON MERARI ROBLERO AGUILAR

5° SEMESTRE
TAPACHULA CHIAPAS A 03 DE JUNIO DEL 2010

You might also like