15

Click here to load reader

SEGURIDADA MYSQL

Embed Size (px)

Citation preview

Page 1: SEGURIDADA MYSQL

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.

Page 2: SEGURIDADA MYSQL

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 countREVOKE 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:

Page 3: SEGURIDADA MYSQL

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.

Page 4: SEGURIDADA MYSQL

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 TEMPORARY TABLES

Permite el uso de CREATE TEMPORARY TABLE

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 CLIENT

Permite al usuario preguntar dónde están los servidores maestro o esclavo

REPLICATION SLAVE

Necesario para los esclavos de replicación (para leer eventos del log binario desde el maestro)

SELECT Permite el uso de SELECT

Page 5: SEGURIDADA MYSQL

SHOW DATABASES

SHOW DATABASES muestra todas las bases de datos

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.

Page 6: SEGURIDADA MYSQL

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 protected]';

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

Page 7: SEGURIDADA MYSQL

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 protected]';

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 protected]' -> AND ISSUER '/C=FI/ST=Some-State/L=Helsinki/ O=MySQL Finland AB/CN=Tonu Samuel/[email protected]' -> 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,

Page 8: SEGURIDADA MYSQL

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 —

Page 9: SEGURIDADA MYSQL

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

Page 10: SEGURIDADA MYSQL

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

Page 11: SEGURIDADA MYSQL

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

Page 12: SEGURIDADA MYSQL

TAPACHULA CHIAPAS A 03 DE JUNIO DEL 2010