Está en la página 1de 11

Unidad 1

Seguridad

[MySQL Avanzado]
De Intecap-TICS
[Seguridad, tipos de usuarios y privilegios son algunos de los aspectos ms importantes que le interesan al administrador de bases de datos; los Objetivos de la Unidad son adquirir las competencias de los siguientes contenidos.]

Unidad 1

MySQL Avanzado
Prologo del curso La seguridad de las bases de datos es uno de los temas que puede interesar al administrador de sistemas, administrador de bases de datos, al programador, o tal vez en un determinado momento al usuario, los cursos anteriores estaban relacionados a como gesti onar las bases de datos, de su creacin hasta su reutilizacin por medio de todo tipo de consultas SQL, este curso tiene como objetivo principal cubrir los aspectos de seguridad del servidor de bases de datos, la seguridad se puede llevar a cabo a todo nivel, desde dar privilegios a los usuarios del servidor, pro medio de los subsistemas de seguridad de MySQL que vienen implementados en el software, hasta la implementacin de protocolos de seguridad cambiando al configuracin del servidor, otro aspecto importante en la seguridad es la forma en la que se interacta con la base de datos, por lo que se ha incluido dos temas que son de mucha utilidad para realizar operaciones con las bases de datos, estos son: Backups, Stored Procedure y Trigger, que aparte de servir para optimizar casi cualquier consulta SQL, brindan seguridad y flexibilidad al sistema en general. Como comentario general los aspectos de seguridad se pueden implementar a todo nivel, y existen distintos mtodos de implementacin, que van desde los permisos en el lugar fsico en donde esta implementado su servidor de bases de datos, los cuales pueden ser, permisos de lectura, escritura y eliminacin de archivos del sistema, hasta, los permisos sobre los archivos que albergan las bases de datos, los temas en este cursos le da mayor prioridad a este ultimo punto, puesto que se considera que la informacin en las bases de datos es lo ms importante a resguardar. Convenciones del curso Como parte de la preparacin a los ejercicios y temas que se encontrara en este curso, se asume que el estudiante: + + Tiene instalado una versin MySQL 5.0.x, o mayor, si tiene una versin menor a la comentada, algunas de las sentencias SQL expuestas en este curso no funcionaran. Tiene las competencias de MySQL a un nivel bsicas e intermedio, por lo que no se especifica como instalar MySQL, ni como entrar o salir del servidor; y queda a libertad del usuario trabajar a modo de lnea de comandos o utilizar un ambiente grfico de MySQL (por ejemplo phpMyAdmin). Sigue la lnea de aprendizaje de los cursos anteriores y que todas las sentencias SQL expuestas en el curso se harn desde la lnea de comandos de MySQL, y se seguir trabajando sobre el sistema operativo Windows. Reconoce que las sentencias SQL que no son explicadas en este curso es porque fueron expuesta en cursos los cursos bsico e intermedio de MySQL. Sigue la metodologa de los cursos anteriores de MySQL; y a como se hizo el los cursos anteriores, se realizaran las explicaciones utilizando consultas-ejemplo, las cuales sern comentadas para hacer referencia a los puntos ms importantes sobre cada consulta, y que de esta manera el lector tenga una plena comprensin de cada tema.

+ +

MySQL es Software Libre

Antes de entrar en los temas de curso, iniciemos comprobando la versin de SGBM instalado en su computadora. Consulta-ejemplo 1.1: Compruebe que la versin MySQL que tiene instalada. mysql> SHOW VARIABLES LIKE 'version'; +---------------+--------+ | Variable_name | Value | +---------------+--------+ | version | 5.5.16 | +---------------+--------+
2

MySQL Avanzado
+--------------------------------------+ | Seguridad de las bases de datos | +--------------------------------------+
Usuarios y privilegios El usuario 'root', es el usuario administrador de MySQL, y que dispone de todos los privilegios disponibles en MySQL. De hecho la primera vez que instala MySQL el usuario que viene por defecto es root, y una cuenta invitado sin privilegios. Sin embargo, normalmente no ser una buena prctica dejar que todos los usuarios con acceso al servidor tengan todos los privilegios. Para conservar la integridad de los datos y de las estructuras ser conveniente que slo algunos usuarios puedan realizar determinadas tareas, y que otras, que requieren mayor conocimiento sobre las estructuras de bases de datos y tablas, slo puedan realizarse por un nmero limitado y controlado de usuarios. Por lo que ser necesario crear nuevos usuarios con ciertos privilegios sobre las bases de datos. Los conceptos de usuarios y privilegios estn ntimamente relacionados. No se pueden crear usuarios sin asignarle al mismo tiempo privilegios. De hecho, la necesidad de crear usuarios est ligada a la necesidad de limitar las acciones que tales usuarios pueden llevar a cabo. MySQL permite definir diferentes usuarios, y adems, asignar a cada uno determinados privilegios en distintos niveles o categoras de ellos. Niveles de privilegios En MySQL existen cinco niveles distintos de privilegios: Globales: se aplican al conjunto de todas las bases de datos en un servidor. Es el nivel ms alto de privilegio, en el sentido de que su mbito es el ms general. De base de datos: se refieren a bases de datos individuales, y por extensin, a todos los objetos que contiene cada base de datos. De tabla: se aplican a tablas individuales, y por lo tanto, a todas las columnas de esas tabla. De columna: se aplican a una columna en una tabla concreta. De rutina: se aplican a los procedimientos almacenados. An no hemos visto nada sobre este tema, pero en MySQL se pueden almacenar procedimientos consistentes en varias consultas SQL. Iniciemos ponindole contrasea (password) a root para acceder de forma ms segura a MySQL, pues como se dar cuenta la primera vez que instala MySQL el usuario administrador identificado como root no tiene una contrasea asignada. Password a root Para proteger con contrasea las cuentas, puede emplearse tanto SET PASSWORD como UPDATE o INSERT. En todos los casos, hay que asegurarse de cifrar el password utilizando la funcin PASSWORD(). Sintaxis: Utilizando set password mysql> SET PASSWORD FOR ''@'localhost' = PASSWORD(' nueva-contrasea'); En el caso, cuando root aun no tiene contrasea, entrar al servidor y ejecutar la siguiente consulta:
3

MySQL es Software Libre

MySQL Avanzado
Consulta-ejemplo 1.2: Ponerle la contrasea a root (la que usted quiera y que sea fcil de recordar) en esta consulta ejemplo utilizare unix01. shell> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('unix01'); Query OK, 0 rows affected (0.09 sec) Nota: La prxima vez que inicie MySQL tendr que recordar esta clave para ingresar. Si utiliza UPDATE o INSERT, se le debe indicar al servidor que relea las tablas de privilegios con: mysql> FLUSH PRIVILEGES; De otro modo, los cambios no tendrn efecto hasta que se reinicie el servidor; existe otro modo de asignar contrasea a un usuario y es en el momento cuando se crea al usuario con la sentencia GRANT, como veremos a continuacin. Nota: el uso de UPDATE o INSERT queda fuera de los objetivos de este curso. Ahora vamos a tratar el resto de usuarios generales en MySQL. Crear usuarios Aunque en la versin 5.0.2 de MySQL existe una sentencia para crear usuarios, CREATE USER, en versiones anteriores se usa exclusivamente la sentencia GRANT para crearlos. En general es preferible usar GRANT, ya que si se crea un usuario mediante CREATE USER, posteriormente hay que usar una sentencia GRANT para concederle privilegios (permisos dentro del sistema a las bases de datos). Pero en este curso iremos por pasos, primero crearemos usuarios y luego concederemos los privilegios. Usando GRANT podemos crear un usuario y al mismo tiempo concederle tambin los privilegios que tendr. La sintaxis simplificada que usaremos para GRANT, sin preocuparnos de temas de cifrados seguros que dejaremos ese tema para captulos avanzados, es: GRANT ON TO [WITH privilegio-1, privilegio-2, objeto autorizacin -1, autorizacin-2, GRANT OPTION];

MySQL es Software Libre

Describimos cada uno de los parmetros anteriores, dentro del contexto de privilegios de usuarios. Objeto: Estos pueden ser bases de datos o tablas, se pueden referencias otros objetos pero en este curso nos enfocamos en estos dos objetos. Privilegios: Listamos solo aquellos privilegios que pueden referenciarse a una tabla o vista dentro de una base de dato. SELECT INSERT UPDATE DELETE INDEX ALTER

MySQL Avanzado
La concesin de cualquiera de estos privilegios significa que se le otorga al usuario los permisos para realizar cualquiera de estas sentencias. Autorizacin: Es el identificador de usuario, es decir el sign-on (acceso) o nombre de usuario. WITH GRANT OPTION: Esta opcin permite que al usuario al que se le concedan los privilegios, tambin tiene la posibilidad de pasar sus privilegios a otros usuarios, pero si al usuario principal se le omite algn privilegio los dems usuarios a los que este concedi los permisos tambin los perdern, esto es un efecto en cascada. Tras la conexin al servidor como root, puede aadir nuevas cuentas (ya que solo el administrador tiene privilegios de crear usuarios). Los siguientes ejemplos utilizan el comando GRANT para inicializar nuevas cuentas: Ejemplo A mysql> GRANT ALL PRIVILEGES ON *.* TO 'user1'@'localhost' -> IDENTIFIED BY 'pass1' WITH GRANT OPTION; Ejemplo B mysql> GRANT ALL PRIVILEGES ON *.* TO 'user1'@'%' -> IDENTIFIED BY 'pass1' WITH GRANT OPTION; Ejemplo C mysql> GRANT RELOAD, PROCESS ON *.* TO 'admin'@'localhost'; Ejemplo D mysql> GRANT USAGE ON *.* TO 'dummy'@'localhost'; Las cuentas creadas con estos comandos GRANT tienen las siguientes propiedades: Los dos primeros ejemplos, las cuentas tienen un nombre de usuario de user1 y una contrasea de pass1. Ambas cuentas son cuentas de superusuario, ya que se a indicado con ALL PRIVILEGE (que tiene todos los privilegios) y con *.* (sobre las bases de datos del sistema), es decir tiene plenos permisos para hacer cualquier cosa. Una cuenta ('user1'@'localhost') puede usarse slo cuando se conecte desde el equipo local. La otra ('user1'@'%') puede usarse para conectarse desde cualquier otro equipo. Note que es necesario tener ambas cuentas para que user1 sea capaz de conectarse desde cualquier sitio como user1. Sin la cuenta localhost, la cuenta annima para localhost creada por mysql_install_db tendra precedencia cuando user1 conecte desde el equipo local. Como resultado, user1 se tratara como un usuario annimo. La razn para ello es que el usuario annimo tiene un valor ms especfico en la columna Host que la cuenta 'user1'@'%' y por lo tanto toma precedencia en la ordenacin de la tabla user (tabla del sistema donde se guardan todas las cuentas del sistema). La tercera cuenta tiene un nombre de usuario de admin y no tiene contrasea. Esta cuenta puede usarse slo desde el equipo local. Tiene los privilegios administrativos RELOAD y PROCESS. stos permiten al usuario admin ejecutar los comandos mysqladmin reload, mysqladmin refresh, y mysqladmin flush-xxx, as como mysqladmin processlist (estos servicios son tiles para aquellos usuarios BACKUP del que se hablo en el primer curso, es decir aquellos usuarios que hacer backups del sistema y no saben que bases de datos ni que tipo de informacin se guarda en el servidor). Note que NO se dan permisos para acceder a ninguna base de datos. Puede aadir tales privilegios posteriormente mediante un comando GRANT adicional, como veremos mas adel ante.

MySQL es Software Libre

MySQL Avanzado
La ltima cuenta tiene un nombre de usuario de dummy sin contrasea. Esta cuenta puede usarse slo desde el equipo local. No tiene ningn privilegio. El permiso USAGE en el comando GRANT permite crear una cuenta sin darle ningn privilegio. Se asume que se otorgarn privilegios especficos posteriormente. Ejercicio Tras conectarse al servidor MySQL como root, crear 4 bases de datos vacas con nombres DB1, DB2, DB3, DB4; y posteriormente crear tres usuarios root1, admin1, dummy1 con privilegios ALL PRIVILEGES, RELOAD-PROCESS; y USAGE respectivamente. Nota: todos los usuarios deben ser creados solo para trabajar sobre su servidor local. A continuacin salir del servidor y entrar uno a uno con cada usuario creado, y ejecutar para cada usuario: Myslq> show databases; El objetivo es que vea que dependiendo de los permisos otorgados, as ser el acceso a las bases de datos del sistema. Nota: Es obligatorio realizar estos ejercicios ya que sern utilizados para las tareas encontradas en este curso. Conceder privilegios Antes entrar en el tema de conceder privilegios, vamos a agregar a la base de datos DB1 creada anteriormente dos tablas y un registro en cada una de las tablas, que nos servir posteriormente para verificar los privilegios concedidos. Creando tablas y registros a DB1: Accediendo al servidor como usuario root. Primero nos cambiamos a DB1 mysql> USE DB1; Database changed

MySQL es Software Libre

mysql> CREATE TABLE T1 (C1 INT); Query OK, 0 rows affected (0.09 sec) mysql> INSERT INTO T1 VALUES (10); Query OK, 1 row affected (0.07 sec) mysql> CREATE TABLE T2 (C2 INT); Query OK, 0 rows affected (0.09 sec) mysql> INSERT INTO T2 VALUES (20); Query OK, 1 row affected (0.07 sec)

MySQL Avanzado
Verificando las tablas creadas tendr algo as: mysql> SELECT * FROM T1; +-------+ | C1 | +-------+ | 10 | +-------+ mysql> SELECT * FROM T2; +-------+ | C2 | +-------+ | 20 | +-------+ Para que un usuario pueda hacer algo ms que consultar algunas variables del sistema debe tener algn privilegio. Lo ms simple es conceder el privilegio para seleccionar datos de una tabla concreta. Esto se hara as: La misma sentencia GRANT se usa para aadir privilegios a un usuario existente. mysql> GRANT SELECT ON DB1.T1 TO admin1; Query OK, 0 rows affected (0.02 sec) Comentario Recuerde que en el anteriormente en el ejercicio el usuario admin1 no tiene permisos sobre las bases de datos, y es justamente lo que esta instruccin acaba de hacer, darle permisos sobre la base de datos DB1 y sobre la tabla T1. Esta sentencia concede al usuario 'admin1' el privilegio de ejecutar sentencias SELECT sobre la tabla 'T1' de la base de datos 'DB1'. Un usuario que abra una sesin y se identifique como 'admin1' podr ejecutar las siguientes sentencias:

MySQL es Software Libre

mysql> SHOW DATABASES; +----------+ | Database | +----------+ | DB1 | +----------+ mysql> USE DB1; Database changed mysql> SHOW TABLES; +------------------+ | Tables_in_DB1 | +------------------+ | T1 | +------------------+

MySQL Avanzado
mysql> SELECT * FROM T1; +------+ | C1 | +------+ | 10 | +------+ Comentarios Como se ve, para este usuario slo existe la base de datos con T1, y no se muestra T2. Si se quiere conceder permisos no solo sobre una tabla de DB1 sino sobre todas las tablas (T1, T2), la instruccin GRANT seria: mysql> GRANT SELECT ON DB1.* TO admin;

Comentario Donde se ha colocado un asterisco (*) que acompaa a DB1, que es equivalente a indicar que es sobre todos los objetos de DB1. Note que podr hacer consultas sobre esa tabla, pero no podr aadir ni modificar datos, ni por supuesto, crear o destruir tablas ni bases de datos. Para conceder privilegios globales se usa ON *.*, para indicar que los privilegios se conceden en todas las tablas de todas las bases de datos. O si se prefiere solo dar un par de privilegios a determinada base de datos deber listar los permisos separados por comas (,) por ejemplo: mysql> GRANT SELECT, INSERT ON DB1.* TO admin1; En general, usando ON nombre_db.nombre_tabla, concedemos privilegios de nivel de tabla para la tabla y base de datos especificada. Tambin se pueden conceder privilegios solo a determinadas columnas dentro de una tabla.

MySQL es Software Libre

En cuanto a los privilegios de columna, para concederlos se usa la sintaxis: por ejemplo: tipo_privilegio(lista_de_columnas)

mysql> GRANT SELECT, UPDATE(C1) ON DB1.T1 TO admin1; Comentario Vea que la columna (C1) es la que podr ser actualizada (UPDATE), y este privilegio es independiente del privilegio SELECT sobre toda la tabla, en resumen puede dar determinados privilegios para determinados objetos dentro de las tablas y otro privilegios para otros objetos dentro de la misma tabla. MySQL es muy flexible, para trabajar con las bases de datos como se ha dado cuenta hasta ahora.

MySQL Avanzado
Otros privilegios que se pueden conceder son: ALL: para conceder todos los privilegios. CREATE: permite crear nuevas tablas. DELETE: permite usar la sentencia DELETE. DROP: permite borrar tablas. INSERT: permite insertar datos en tablas. UPDATE: permite usar la sentencia UPDATE. Como se dio cuenta se pueden conceder varios privilegios en una nica sentencia, para dar los mismos privilegios sobre toda la tabla, indicando que el usuario no tiene contrasea, seria: mysql> GRANT SELECT, UPDATE ON DB1.T1 TO admin1 IDENTIFIED BY ''; Query OK, 0 rows affected (0.22 sec) Un detalle importante es que para crear usuarios se debe tener el privilegio GRANT OPTION, y que slo se pueden conceder privilegios que se posean, es decir root puede crear otros usuarios del tipo administrador a los cuales tambin se les puede restringir ciertos privilegios. Revocar privilegios Para revocar privilegios se usa la sentencia REVOKE. REVOKE privilegio ON objeto FROM usuario La sintaxis es similar a la de GRANT, por ejemplo, para revocar el privilegio SELECT de nuestro usuario 'admin1', usaremos la sentencia: mysql> REVOKE SELECT ON DB1.T1 FROM admin1; Query OK, 0 rows affected (0.05 sec) Comentarios

MySQL es Software Libre

Los privilegios revocados a un usuario tienen un efecto de cascada, es decir si el usuario a quien se le revoco algn privilegio, anteriormente este haba cedido sus privilegios a otros usuarios, a estos otros usuarios tambin se les revoca este privilegio. Es importante aclarar que el usuario sigue teniendo permisos para ver la base de datos pero ya no puede hacer consultas de las tablas, puesto que no se han revocado todos los privilegios sobre la base de datos DB1. Mostrar los privilegios de un usuario Podemos ver qu privilegios se han concedido a un usuario mediante la sentencia SHOW GRANTS. mysql> SHOW GRANTS FOR admin1; +--------------------------------------------+ | Grants for admin1@% | +--------------------------------------------+ | GRANT USAGE ON *.* TO 'admin1'@'%' | | GRANT UPDATE ON `db1`.`t1` TO 'admin1'@'%' | +--------------------------------------------+
9

MySQL Avanzado
Comentario La salida de esta sentencia es una lista de sentencias GRANT que se pueden ejecutar por el usuario. Nombres de usuarios y contraseas Como podemos ver por la salida de la sentencia SHOW GRANTS, el nombre de usuario no se limita a un nombre simple, sino que tiene dos partes. La primera consiste en un nombre de usuario, en nuestro ejemplo 'admin1'. La segunda parte, que aparece separada de la primera por el carcter '@' es un nombre de mquina (host). Este nombre puede ser bien el de una mquina, por ejemplo, 'localhost' para referirse al ordenador local, o cualquier otro nombre, o bien una ip, as como se comento a la hora de crear el usuario user1 en la opcin GRANT. La parte de la mquina es opcional, y si como en nuestro caso, no se pone, el usuario podr conectarse desde cualquier mquina. La salida de SHOW GRANTS lo indica usando el comodn '%' para el nombre de la mquina. Si creamos un usuario para una mquina o conjunto de mquinas determinado, ese usuario no podr conectar desde otras mquinas. Por ejemplo: mysql> GRANT USAGE ON DB1.* TO 'admin1'@'localhost' IDENTIFIED BY 'contrasea'; Query OK, 0 rows affected (0.00 sec) Nota: Pero en nuestro caso admin1 no tiene contrasea, por lo que el campo se queda '' (vacio). Un usuario que se identifique como 'admin1' slo podr entrar desde el mismo ordenador donde se est ejecutando el servidor. En este otro ejemplo: mysql> GRANT USAGE ON * TO admin@10.28.56.15 IDENTIFIED BY 'constrasea'; Query OK, 0 rows affected (0.00 sec)

MySQL es Software Libre

El usuario 'admin1' slo puede conectarse desde un ordenador cuyo IP sea '10.28.56.15'. Aunque asignar una contrasea es opcional, por motivos de seguridad es recomendable asignar siempre una. La contrasea se puede escribir entre comillas simples cuando se crea un usuario, o se puede usar la salida de la funcin PASSWORD() de forma literal, para evitar enviar la clave en texto legible. Si al aadir privilegios se usar una clave diferente en la clusula IDENTIFIED BY, sencillamente se sustituye la contrasea por la nueva. Para listar los usuarios del sistema Desde fuera de MySQL mysql> mysql u root p mysql myslq> SELECT user FROM user;

10

MySQL Avanzado
+--------+ | user | +--------+ | admin1 | | root | | dummy | +--------+ Comentario Para volver al modo por default de root, salir y volver a entrar como se ha enseado anteriormente. Borrar usuarios Para eliminar usuarios se usa la sentencia DROP USER. Algunas versiones de MySQL no permiten eliminar un usuario que tenga privilegios, aunque las ultimas versiones de MySQL ya lo permiten, por ejemplo, se podra presentar las siguientes opciones: mysql> DROP USER admin1; ERROR 1268 (HY000): Can't drop one or more of the requested users Comentario El mensaje que se muestra indica que no se pude borrar todas las dependencias del usuario. Para eliminar el usuario primero hay que revocar todos sus privilegios: mysql> REVOKE SELECT ON DB1.T1 FROM admin1; Query OK, 0 rows affected (0.00 sec) Comentario Considerando que el usuario solo tiene el privilegio SELECT asignado, se quita este privilegio, si tiene duda de que privilegios tiene el usuario utilice SHOW GRANTS como se indico anteriormente. Y ahora si puede eliminar la cuenta de usuario.

MySQL es Software Libre

mysql> DROP USER admin1; Query OK, 0 rows affected (0.00 sec) Nota: Las ltimas versiones de MySQL ya permiten eliminar la cuenta aun cuando el usuario tenga privilegios asignados. BIBLIOGRAFIAS 1. FUNDAMENTOS DE BASES DE DATOS. Abraham S. Henry F. Cuarta edicin. McGrawHill. Mxico. 2008. 2. Beginning Oracle SQL. Oracle Lex de Haan Et.Al Apress. USA. 2009. 3. http://dev.mysql.com/doc/refman/5.6/en/ MySQL 5.6 Reference Manual

11

También podría gustarte