Introduccion: MySQL es actualmente el sistema de administracion de bases de datos SQL mas popular en el Open Source, ya que es ampliamente utilizado en los desarrollos web gracias a su rapidez, estabilidad y a su integracion con otros lenguajes de scripting como por ejemplo PHP. te documento se pretende dar una introduccion basica a su instalacion y configuracion inicial en sistemas GNU/Linux, esto no quiere decir que es una guia avanzada para su configuracion, con el tiempo este documento se ira extendiendo en capitulos mas avanzados. Ya que MySQL es actualmente distribuido por la mayoria de distribuciones Linux podras instalarlo desde los paquetes binarios de tu distribucion preferida, en este documento se trabajara sobre la distribucion Slackware 9.1, para otras distribuciones ver el apendice que sera agregado proximamente, es recomendable utilizarla version mas actualizada de los paquetes para no estar vulnerables a bugs o otro tipo de fallas. *NOTA: En Slackware en programa servidor y el cliente vienen en el mismo paquete: mysql-4.0.15a-i486-1 Comprobacion: Lo primero sera comprobar si nuestro sistema ya tiene instalados los paquetes de MySQL, asi: #ls -l /var/log/packages/ | grep mysql -rw-r--r-- 1 root root 14233 May 7 16:40 mysql-4.0.15a-i486-1 Lo cual nos debio de mostrar algo asi si es que ya esta instalado: En este caso los paquetes ya estan instalados, si en tu caso no los tienes instalados es recomendable ver si existen paquetes mas nuevos en en algunos de los servidores de Slackware, si no es asi, deberas instalarlos desde tus CD's de instalacion, podria ser asi: #cd /mnt/cdrom/slackware/ap #installpkg mysql-4.0.15a-i486-1.tgz Si existieran nuevos paquetes y dispones de conexion a Internet podras hacer uso del paquete swaret para bajar estos paquetes e instalarlos, asi: #swaret update y despues: #swaret install mysql Si todo completo satisfactoriamente ya tendremos instalado MySQL en nuestro sistema. Inicializacion del Servidor (servicio) mysqld. Antes de poder iniciar el sercicio de mysql tendremos que tener una base de datos, para instalar una base de datos inicial, se debera de hacer esto como root: #su - mysql #mysql_install_db *NOTA: Lo que hicimos aqui fue convertirnos en el usuario "mysql", es muy importante hacer esto antes de hacer algun cambio a la base de datos, o el servicio mysqld no podra escribir en ella despues, (lo cual puede ser arreglado con: 'chown -R mysql.mysql /var/lib/mysql'). Este procedimiento es el que viene explicado en la guia de referencia oficial de MySQL, y viene explicado en el script /etc/rc.d/rc.mysqld. Esto es lo que sucede cuando se hace lo anterior: $mysql_install_db Preparing db table Preparing host table Preparing user table Preparing func table Preparing tables_priv table Preparing columns_priv table Installing all prepared tables 040607 23:45:13 /usr/libexec/mysqld: Shutdown Complete To start mysqld at boot time you have to copy support-files/mysql.server to the right place for your system PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER ! This is done with: /usr/bin/mysqladmin -u root password 'new-password' /usr/bin/mysqladmin -u root -h jmedina password 'new-password' See the manual for more instructions. You can start the MySQL daemon with: cd /usr ; /usr/bin/mysqld_safe & You can test the MySQL daemon with the benchmarks in the 'sql-bench' directory: cd sql-bench ; perl run-all-tests Please report any problems with the /usr/bin/mysqlbug script! The latest information about MySQL is available on the web at http://www.mysql.com Support MySQL by buying support/licenses at https://order.mysql.com $ ----------------------------------------------------------------------------- Bien ahora que ya tenemos instalado el paquete necesario y tenemos las bases de datos creadas entonces tendremos que iniciar el servidor para empezar a trabajar con el, para iniciarlo en Slackware es del siguiente modo: Dar permisos de ejecucion a /etc/rc.d/rc.mysqld asi: #chmod +x /etc/rc.d/rc.mysqld Ahora si podra ser iniciado el servicio mysqld asi: #./rc.mysqld start # Starting mysqld daemon with databases from /var/lib/mysql Comprobacion inicial. Primero que nada comprobaremos que el servicio esta corriendo en el sistema: $mysqladmin version mysqladmin Ver 8.40 Distrib 4.0.15a, for slackware-linux on i486 Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB This software comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to modify and redistribute it under the GPL license Server version 4.0.15a Protocol version 10 Connection Localhost via UNIX socket UNIX socket /var/run/mysql/mysql.sock Uptime: 1 min 47 sec Threads: 1 Questions: 1 Slow queries: 0 Opens: 6 Flush tables: 1 Open tables: 0 Queries per second avg: 0.009 jmedina@jmedina:~$ ----------------------------------------------------------------------- Tambien puedes hacer una comprobacion con el siguiente comando: $mysqladmin variables Ahora verificaremos que podemos apagar el servicio mysqld: $mysqladmin -u root shutdown Aunque esta no es la manera adecuada para apagar el servicio mysqld, deberemos de usar el script de Slackware para apagarlo, de esta manera: #/etc/rc.d/rc.mysqld stop Ahora tendremos que comprobar que podemos volver a iniciar el servicio mysqld: #/etc/rc.d/rc.mysqld start Ahora haremos otro test para verificar que el servicio esta trabajando usando el comando mysqlshow asi: $ mysqlshow +-----------+ | Databases | +-----------+ | test | +-----------+ El cual nos dice que tiene las bases de datos mysql y test. d# mysqlshow mysql Database: mysql +--------------+ | Tables | +--------------+ | columns_priv | | db | | func | | host | | tables_priv | | user | +--------------+ Este comando solo podra ser ejecutado como root (note el "#" en el prompt) y nos mostrara las tablas de la base de datos "mysql". Hasta ahora sabemos que tenemos correctamente instalado y trabajando nuestro servicio mysqld, lo que sigue es empezar con las configuraciones previas. Configuracion inicial de seguridad. Primero que nada eliminaremos la base de datos de ejemplo (test) y todas las cuentas excepto la cuenta local "root": Nos conectamos al servidor de bases de datos asi: #mysql -u root lo cual nos pondra en el prompt de mysql (este es el cliente): mysql> y ahora ejecutaremos: mysql>drop database test; mysql>use mysql; mysql>delete from db; Y refrescamos los privilegios: mysql>FLUSH PRIVILEGES; Y salimos del CLI de mysql asi: mysql>quit o mysql>\q Y seguimos con la configuraciono de seguridad. Por default mysql permite a cualquier usuario en el host local (localhost) entrar al CLI (Command Line Interface, por sus siglas en Ingles) y ejecutar consultas, claro no a la base de datos "mysql" ya que solo el usuario "root" de mysql puede hacer consultas a esa base de datos, lo que sigue es prevenir que cualquier usuario en el host local pueda entrar al CLI sin contrase~a. Un usuario normal puede entrar al CLI de la siguiente manera: $ mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 2 to server version: 4.0.15a Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> De esta manera podras acceder al CLI sin una contrase~a y estaras en el prompt de mysql. Para prevenir esto entraremos como usuario "root" al CLI asi: $ mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 to server version: 4.0.15a Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> Usaremos la base de datos "mysql" la cual es la que almacena los privilegios y configuracion de acceso con el siguiente comando: mysql>use mysql; # el signo ";" es opcional con el comando "use". Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> De esta manera podremos trabajar con la base de datos "mysql". Ahora haremos una consulta para ver los privilegios de acceso a mysqld: mysql> SELECT host,user,password FROM user; +-----------+------+----------+ | host | user | password | +-----------+------+----------+ | localhost | root | | | jmedina | root | | | localhost | | | | jmedina | | | +-----------+------+----------+ 4 rows in set (0.00 sec) mysql> Esto nos muestra que el usuario root puede acceder desde el localhost y jmedina (este es el nombre del host) sin contrase~a alguna, tambien nos muestra que cualquier usuario desde el localhost puede entrar al CLI sin contrase~a. Para prevenir esto usaremos este comando. mysql> DELETE FROM user WHERE NOT (host="localhost" AND user="root"); Query OK, 3 rows affected (0.06 sec) mysql> Ahora vemos nuevamente los privilegios: mysql> SELECT host,user,password FROM user; +-----------+------+----------+ | host | user | password | +-----------+------+----------+ | localhost | root | | +-----------+------+----------+ 1 row in set (0.00 sec) mysql> Con esto vemos que ahora solo el usuario root puede acceder desde el localhost sin contrase~a al CLI, lo cual tambien lo prevendremos mas adelante. Ahora refrescaremos los privilegios para mysqld: mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) mysql> Y salimos del CLI con cualquiera de los dos comandos: mysql>QUIT o mysql>\q Ahora comprobaremos que un usuario normal puede acceder al CLI sin contrase~a (claro solo desde el localhost): $ mysql ERROR 1045: Access denied for user: 'jmedina@localhost' (Using password: NO) jmedina@jmedina:~$ Hasta este momento ningun usuario normal podra acceder al CLI sin contrase~a, pero cualquier usuario normal podra acceder identificandose como usuario root ante mysqld asi: $ mysql -u root Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 6 to server version: 4.0.15a Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> Entonces tendremos que prevenir esto de la siguiente manera: Tendremos que asignar una contrase~a para el usuario "root" de "mysql" (no el usuario de sistema Linux), como recomendacion no uses una contrase~a igual que la del administrador del sistema, se cuidadoso con la contrase~a que asignes. Metodo 1 (No recomendado): $mysqladmin -u root password 'tu contrase~a' Metodo 2 (Recomendado): $mysql -u root mysql>SET PASSWORD FOR root@localhost=PASSWORD('tu contrase~a'); Ahora que asignamos una contrase~a al usuario root comprobaremos que ya no puede accesar sin la contrase~a: *NOTA: No es una buena practica cambiar la contrase~a desde la linea de comandos, por ejemplo, usando el comando "mysqladmin paasword". Esto es especialmente importante cuando trabajan otros usuarios en el servidor. En esos caso el password puede ser facilmente revelado, por ejemplo, usando "ps -aux" o viendo los archivos del historial (~/,history, ~/.bash_history etc). $ mysql -u root ERROR 1045: Access denied for user: 'root@localhost' (Using password: NO) Para poder acceder como usuario root al CLI haremos uso del parametro "-p" para usar validacion por contrase~a: $mysql -u root -p Enter password: De esta manera solo podras acceder como root con una contrase~a: Ahora comprobamos con esto: mysql> use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> mysql> SELECT host,user,password FROM user; +-----------+------+------------------+ | host | user | password | +-----------+------+------------------+ | localhost | root | sdle8373Uedjs2b0 | +-----------+------+------------------+ 1 row in set (0.00 sec) mysql> Como podemos ver ahora, el usuario root desde 'localhost' ahora necesita contrase~a (la cual se muestra cifrada) para acceder, lo cual es lo recomendable. Nuevamente refrescamos los privilegios asi: mysql>FLUSH PRIVILEGES; Y salimos: mysql>\q bye Ahora ya esta restringido el acceso desde el localhost a cualquier usuario que se autentifique sin contrase~a, lo que sigue es saber como cambiar (actualizar) el registro de la contrase~a de root u otro usuario, este es el procedimiento: -Desde el shell (No recomendado): $mysqladmin -u root -p password 'nuevo password' -Desde el CLI de mysql (Recomendado): mysql>use mysql; mysql>UPDATE user SET Password=PASSWORD('nuevo password') WHERE user='root'; mysql>FLUSH PRIVILEGES; mysql>quit Ahora mencionare una medida mas de seguridad la cual tambien es recomendable y consiste en cambiar el nombre por default de la cuanta administrador de mysql (root), a algun nombre diferente mas dificil de adivinar. Este cambio hara mas dificil utilizar un ataque de fuerza bruta o con diccionario a la cuenta de administrador. En este caso el intruso tendra que adivinar el passwor, pero primero el nombre de la cuenta de administrador, esto se hace asi: mysql>use mysql; mysql>update user set user="mydbadmin" where user="root"; mysql>flush privileges; mysql>quit Ahora como ultimo test apagaremos el servicio mysqld asi: #/etc/rc.d/rc.mysqld stop Y comprobaremos que lo podamos reiniciar con: #/etc/rc.d/rc.mysqld start Bien, ahora nuestro servidor MySQL ya esta correctamente instalado y configurado con las medidas de seguridad apropiadas. Finalmente debemos de eliminar el contenido del historial de MySQL (~/.mysql_history), en el cual todos los comandos SQL ejecutados han sido almacenados (especialmente passowrds, los cuales son almacenados en texto plano). #cat /dev/null > ~/.mysql_history *NOTA: este procedimiento debera de ser aplicado para todas las cuentas con las que se ha estado trabajando (si es que si hicieron las pruebas con un usuario normal y con el usuario root del sistema). NOTA ULTIMA: Para deshabilitar las conexiones externas al servidor de bases de datos (si no las necesitas, esto es recomendable para incrementar la seguridad) entonces hay que descomentar la linea: #SKIP="--skip-networking" en /etc/rc.d/rc.mysqld y reiniciar el servicio mysqld (/etc/rc.d/rc.mysql restart) de esta manera no abrira el socket TCP/IP y si se utiliza PHP solo trabajara con el socket unix lo cual es muy recomendable. RESUMEN. Siguiendo el metodo descrito en este documento podremos tener un servidor MySQL funcional y si se siguieron las medidas de seguridad se tendra un servidor relativamente seguro, ya que al no escuchar en el puerto 3306/tcp y al aplicar contrase~as seguras podremos redudir el intento de ataques a los cuales se es vulnerable en una instalaciono por defualt. Y aunque este metodo no es 100% seguro asi podemos tener un servidor seguro para los usuarios malintencionados. FIN. Autor: Jorge Armando Medina. email: jmedina@tuxjm.net Sitio Web: http://www.tuxjm.net Visita la pagina del Grupo de Usuarios Linux Tijuana en: http://www.linuxtj.org