Cómo configurar MySQL™

alexis_arte
  12 years ago
  -1

Introducción.

MySQL™ es actualmente el servidor de base de datos más popular para los desarrollos web. Es muy rápido y sólido, son muchos los administradores que lo instalan, y sin embargo no tantos los que lo configuran correctamente, o que siquera saben que hay que configurarlo.

Este manual es solo una referencia rápida para el procedimiento de instalación y configuración de un servidor MySQL™. La generación de tablas y el ingreso de datos dentro de los campos de éstas puede hacerse a través de mandatos SQL en el Shell de MySQL™, utilizando un fichero .sql (como en es caso de PHP NUKE y otras aplicaciones web) o bien utilizando clientes MySQL™, como son MySQLGUI, GtkSQL o Gmysql.

Procedimientos.

MySQL™ es incluido actualmente en la mayoría de las distribuciones de GNU/Linux de hoy en día, por lo que no habrá problema alguno en conseguir los binarios necesarios y propios de la distribución que se utilice. Bastará con instalar los incluidos en el CD de instalación o bien los disponibles entre los paquetes de actualización para la distribución que se utilice.

Pregunte al sistema si se encuentran instalados los paquetes que componen MySQL™:

rpm -q mysql mysql-server

De no estar instalados, o bien si hay paquetes más recientes entre las actualizaciones disponibles, cambie a súper usuario o bien ingrese como root al sistema. Si utiliza Red Hat™ Enterprise Linux, procederemos a instalar lo necesario del siguiente modo:

up2date -i mysql mysql-server

Si utiliza White Box Enterprise Linux o bien otros clones de Red Hat™ Enterprise Linux, se ejecutar lo siguiente:

yum -y install mysql mysql-server

Lo anterior descargará las más recientes actualizaciones de seguridad de MySQL™ para Fedora™ Core, junto con todo lo que haga falta para satisfacer todas las dependencias de biblotecas y otro software.

Si utiliza Red Hat™, CentOS o White Box Enterprise Linux 4.0, ejecute system-config-securitylevel (mod gráfico), vaya a la pestaña de SELinux y en la sección de SELinux Service Protection habilite la casilla que dice Disable SELInux protection for mysqld daemon. De otro modo MySQL no podrá siquiera iniciar.

Desactivar  protección de SELinux para mysqld.
Desactivar protección de SELinux para mysqld.

La manera más apropiada de iniciar el servicio mysqld será ejecutado el siguiente mandato:

/sbin/service mysqld start

Procederemos a agregar a MySQL™ al los niveles de corrida 3, 4 y 5, de modo que la siguiente vez que se tenga que iniciar el equipo, MySQL™ se encuentre habilitado.

/sbin/chkconfig --level 345 mysqld on

Después de iniciado MySQL™ por primera vez, como root ejecute el mandato mysql:

# mysql

Esto nos ingresará directamente y sin mayor preámbulo al Shell de MySQL™, donde lo primero será asignar una contraseña cifrada al usuario root, ya que no es conveniente, de manera alguna y sin pretexto, dejar MySQL™ de este modo.

Primero indicaremos que base de datos utilizar, en este caso será la principal y única existente, mysql:

> use mysql

Ahora haremos petición para que se muestren las tablas:

> show tables;

Procederemos hacer una petición para que se muestre el contenido de la tabla user:

> select * from user;

Esto hará que se vea, entre otras muchas cosas, lo siguiente:

+-------------------------+----------+------------------+--------------+
| Host                    | User     | Password         | Select_priv  |
+-------------------------+----------+------------------+--------------+
| localhost               | root     |                  | Y            |
+-------------------------+----------+------------------+--------------+

Como se podrá ver, el usuario root no tiene asignada una contraseña, por lo que cualquiera que se identifique como root tendrá acceso. Asignaremos una contraseña del siguiente modo (sea cuidadoso con lo que teclea como contraseña):

> update user set Password=PASSWORD('nuevo_password') where user='root';

Ejecute de nuevo el siguiente mandato:

> select * from user;

Notará que ahora hay un criptograma en el campo que corresponde a la contraseña de root.

+-------------------------+----------+------------------+--------------+
| Host                    | User     | Password         | Select_priv  |
+-------------------------+----------+------------------+--------------+
| localhost               | root     |4593274b8e0d68j852| Y            |
+-------------------------+----------+------------------+--------------+

Refresquemos los privilegios a fin de que tomen efecto los cambios.

> flush privileges

Salgamos ahora a fin de regresar y poder probar la nueva contraseña.

> quit

Ingrese de nuevo al Shell de MySQL™:

mysql

Notará que ya no se puede acceder como antes, y regresa un mensaje de error.

ERROR 1045: Access denied for user: 'root@localhost' (Using password: NO)

Ejecute ahora el mismo mandato, pero especificando un usuario (-u root) y solicitando se pregunte por una contraseña (-p):

mysql -u root -p

A continuación se le pedirá ingrese una contraseña, tras lo cual obtendrá de nuevo acceso al Shell de MySQL™

Creando y destruyendo bases de datos.

Para crear una nueva base de datos, puede utilizarse el mandato mysqladmin con el parámetro create:

mysqladmin -u root -p create dbejemplo

Si queremos eliminar dicha base de datos, utilizamos el parámetro drop en lugar de create.

mysqladmin -u root -p drop dbejemplo

Otorgando permisos a los usuarios.

En adelante el usuario root solo se utilizará para tareas administrativas y creación de nuevas bases de datos. Resultará conveniente delegar a los usuarios ordinarios el manejo de sus propias bases de datos.

Una vez generada una base de datos, debemos determinar con que usuario y desde que equipo en la red local, se podrá tener acceso, así como los privilegios para modificar esta. Lo más común, y seguro, es asignar el acceso solo desde el mismo servidor (localhost), a menos que el desarrollo web o aplicación se localice en otro equipo.

Genere un base de datos denominada directorio:

mysqladmin -u root -p create directorio

En seguida acceda al Shell de MySQL™ y ejecute lo siguiente, suponiendo que se desea asignar permisos sobre las tablas de la base de datos directorio al usuario jbarrios del equipo local:

GRANT select, insert, update, create, alter, delete, drop ON directorio.* TO jbarrios@localhost IDENTIFIED BY 'password_del_usuario_jbarrios';

Al concluir, usted tendrá una base de datos "jbarrios" que podrá ser utilizada y modificada por el usuario jbarrios desde el servidor donde se encuentra instalada la base de datos, es decir, localhost. Esto establecerá un nivel de seguridad apropiado, y garantizará que de ser descifrada una contraseña de un usuario, está no podrá ser utilizada desde un equipo remoto.

Si, por ejemplo, se requiere permitir el acceso a una base de datos jbarrios desde otro equipo en la red local con fines administrativos, podemos otorgar el acceso al usuario jperez del equipo que, según el DNS de la LAN, se denomina como maquina1.mi-red-local.org, es decir jperez@maquina1.mi-red-local.org.

GRANT
select, insert, update, create, alter, delete, drop
ON
directorio.*
TO
jperez@maquina1.mi-red-local.org
IDENTIFIED BY
'password_del_usuario_jperez';

El muro corta-fuegos.

MySQL™ escucha peticiones en el puerto 3306, tanto para TCP como para UDP. Puede implementar un Firewall o muro muro corta-fuegos que cierre dicho puerto, de modo tal que solo se puede acceder a MySQL™ desde la red local. Las siguientes líneas de ejemplo suponen que el servidor donde se encuentra instalado MySQL™ posee dos interfaces de red, eth0 y eth1, de las cuales la primera (eth0) corresponde a la interfaz de acceso hacia la red local y la segunda (eth1) corresponde a la interfaz de acceso hacia la red mundial.

# MySQL™
/sbin/iptables -t filter -A INPUT -p tcp -s 0/0 -d 0/0 --dport 3306 -i eht1 -j DROP
/sbin/iptables -t filter -A INPUT -p udp -s 0/0 -d 0/0 --dport 3306 -i eth1 -j DROP

Si se requiere acceder remotamente hacia MySQL™ desde fuera de la red local, con fines meramente de administración, como sería algunos casos particulares, se requerirá añadir las siguientes líneas en el guión de Firewall o muro muro corta-fuegos a fin de abrir los puertos correspondientes.

# MySQL™
/sbin/iptables -t filter -A INPUT -p tcp -s 0/0 -d 0/0 --dport 3306 -j ACCEPT
/sbin/iptables -t filter -A INPUT -p udp -s 0/0 -d 0/0 --dport 3306 -j ACCEPT