LAMP - MySQL

Instalación

Vamos a instalar el Sistema Gestor de Bases de Datos Relacionales MySQL. Tanto el servidor como el cliente. Peligro: la traducción es mía:

# urpmi mysql
Uno de los paquetes siguientes es necesario:
1- MySQL-4.1.12-3mdk.i586
2- MySQL-Max-4.1.12-3mdk.i586
3- MySQL-NDB-4.1.12-3mdk.i586
¿Qué elige? (1-3)1
Para satisfacer las dependencias, se instalarán los paquetes siguientes:
MySQL-4.1.12-3mdk.i586
MySQL-client-4.1.12-3mdk.i586
MySQL-common-4.1.12-3mdk.i586
libmysql14-4.1.12-3mdk.i586
perl-DBD-mysql-3.0002-1mdk.i586
perl-DBI-1.48-1mdk.i586
¿Está todo bien? (S/n) s
----------------------------------------------------------
Más información sobre el paquete MySQL-4.1.12-3mdk.i586:
Como medida de seguridad el trabajo en red del servidor mysql está deshabilitado por defecto.
Sólo aceptará conexiones locales.
El motivo de esto es que el usuario root de mysql viene sin contraseña en la instalación predeterminada.
Esto permite que el servidor MySQL quede abierto para ser cualquier usuario.
Para habilitar el trabajo en red debe editarse o borrarse el fichero
/etc/sysconfig/mysqld

Bueno, quedamos advertidos: el root de MySQL no tiene contraseña. Esto debe solucionarse inmediatamente: nuestra base de datos está vendida.

Arranque y puertos

Directamente:


# /etc/init.d/mysqld start
Starting MySQL: [ OK ]

Los puertos:

# cat /etc/services | grep mysql
mysql 3306/tcp # MySQL
mysql 3306/udp # MySQL

Primera conexión y contraseña a root

Algo que me costó entender en principio era: si yo he instalado un "servidor de bases de datos", ¿cuál es el cliente? Y es que al instalar los paquetes anteriores no sólo hemos instalado el servidor, que ya está a la escucha como un servicio, sino también un cliente, en la propia máquina, de modo que nos permitirá acceder al servidor desde una shell con el comando mysql. Y otra de las cosas fue comprender la diferencia entre las cuentas de usuario de MySQL y las de los usuarios de Linux, sobre todo cuando todo se ejecuta (cliente y servidor) en la misma máquina.

Todo el equívoco viene al ocurrir lo que veremos a continuación. Vamos a conectarnos al servidor de bases de datos:

# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4 to server version: 4.1.12
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> show databases;
+----------+
| Database |
+----------+
| mysql |
| test |
| tmp |
+----------+
3 rows in set (0.00 sec)
mysql> set password=password('clave_de_acceso');
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye

¿Qué hemos hecho? Pues que en una shell, conectados al sistema como root-Linux nos hemos conectado al Servidor como root-mysql. A continuación hemos pedido que se muestren las bases de datos que hay, que están en /var/lib/mysql, y después hemos establecido una clave de acceso a root-mysql para acceder al servidor, y finalmente hemos desconectado.

¿Quién le ha dicho a MySQL que éramos el root? Pues por fin me enteré de que si accedemos a MySQL desde una shell sin proporcionar ningún nombre, se intenta usar la cuenta de usuario Linux como cuenta de MySQL. AAAAhhhh.

Ahora para conectar al servidor como root debemos actuar así:

$ mysql -u root -p
Enter password: *****

Localizando

Brevísimamente: el fichero de configuración global es /etc/my.cnf y el de configuración específica del ususario ~/.my.cnf. Y la pregunta que uno se hace cuando comienza: ¿dónde están las bases de datos? Pues en /var/lib/mysql/. Por ejemplo: al crear la base de datos nuke, se creará la carpeta /var/lib/mysql/nuke y ahí estarán todos los archivos que la constituyen. Señalar que al instalar se ha creado una base de datos del propio sistema, que curiosamente se llama mysql; ahí se guardan las configuraciones, los usuarios del sistema, etc.

Tomemos nota de este directorio: olvidarlo al hacer nuestras copias de seguridad sería un gravísimo error.

Seguridad

Medidas elementales de seguridad:

  1. Cambiar el nombre del root de MySQL, llamandolo, por ejemplo, sqladmin o rootsql. A partir de ahora lo denominaremos rootsql.
  2. No usar usuarios del sistema como usuarios de MySQL. Por ejemplo, que usuario sea usuariosql.
  3. Aunque pasemos de los puntos anteriores: jamás, esto es fundamental, jamás usar para MySQL las mismas contraseñas que para el sistema. Tengamos en cuenta que nuestra base de datos estará expuesta en Internet a una inyección SQL, y si alguien consigue los nombres de los usuarios y las contraseñas, nuestro sistema estará en sus manos. Más aún, téngase en cuenta que MySQL guarda las contraseñas en formato hash MD5 en lugar de texto, lo que hace que se produzcan muchos ataques de diccionario con MD5 precalculado.
  4. Eliminar la base de datos test que trae MySQL para probar y eliminar usuarios fantasmas que pueden conectarse. Esto es un peligro potencial.
  5. Tener cuidado porque puede aparecer duplicado root: al colocarle la contraseña quizá sólo la haya tomado para conexiones desde localhost y puda seguir conectándose desde web.iesdelgadohernandez.es.

Clientes gráficos de administración

Bueno, administrar a pelo nuestras bases de datos requiere conocimientos avanzados del lenguaje SQL. Para ayudarnos tenemos herramientas que nos permiten su administración y el manejo de las bases en modo gráfico. Un ejemplo es mysqlcc, una plataforma gráfica independiente basada en el toolkilt Qt.

Y, por supuesto, tenemos a phpMyAdmin: un conjunto de scripts en php que nos permitirá gestionar nuestras bases de MySQL usando un navegador web. Esto nospermitirá una administración remota permitiendo sólo conexiones locales.

Su instalación es simple:

# urpmi phpMyAdmin
Para satisfacer las dependencias, se instalarán los 17 paquetes siguientes:
.........................
phpMyAdmin-2.6.4-2mdk.noarch
¿Está todo bien? (S/n) s

El archivo principal es/var/www/html/admin/phpMyAdmin/config.php. En principio sólo necesitaremos colocar una palabra cualquiera en

$cfg['blowfish_secret'] = 'una_palabra_cualquiera';

necesaria para

$cfg['Servers'][$i]['auth_type'] = 'cookie'; // Método de autenticación (config, http o cookie)

Ahora reiniciamos Apache para que lea todo lo instalado

# /etc/init.d/httpd restart
Shutting down httpd: [ OK ]
Starting httpd: [ OK ]

Y acedemos apuntando el navegador (en modo seguro para que el nombre de usuario y su clave no vayan desnudas) a https://localhost/admin/phpMyAdmin.

Creación y manejo de bases de datos.

A estudiar manuales, recetas y cómos ;-)

. : .