Cuando se conecta a un servidor MySQL, debería utilizar una clave. La clave no se transmite en texto llano a través de la conexión. El tratamiento de las claves durante la conexión de un cliente ha sido mejorado en MySQL 4.1.1 para ser muy seguro. Si todavía está utilizando claves del tipo anterior a 4.1.1, el algoritmo de cifrado no es tan potente como el nuevo algoritmo; con un poco de esfuerzo un atacante inteligente que pueda interceptar el tráfico entre el cliente y el servidor podría romper la clave. (Consulte Sección 5.6.9, “Hashing de contraseñas en MySQL 4.1” para una explicación sobre los diferentes métodos de tratamiento de claves.) Si la conexión entre el cliente y el servidor pasa a través de una red no segura, debería utilizar un tunel SSH para cifrar la comunicación.
Toda la demás información se transmite como texto, y puede ser leida por cualquiera que pueda observar la conexión. Si esto le preocupa, utilice el protocolo comprimido para hacer que el tráfico sea mucho más difícil de descifrar. Para hacer la conexión aún más segura, debería utilizar SSH para conseguir una conexión TCP/IP cifrada entre el servidor MySQL y el cliente MySQL. Puede encontrar un cliente SSH Open Source en http://www.openssh.org/, y un cliente comercial en http://www.ssh.com/.
En MySQL 5.0, puede utilizar también el soporte interno de OpenSSL. Consulte Sección 5.7.7, “Usar conexiones seguras”.
Para convertir un sistema MySQL en seguro, debería considerar seriamente las siguientes sugerencias:
Utilice claves para todos los usuarios MySQL. Un programa
cliente no conoce necesariamente la identidad de la persona
utilizándolo. Es común en las aplicaciones
cliente/servidor que el usuario pueda especificar cualquier
nombre de usuario al programa cliente. Por ejemplo,
cualquiera puede utilizar el programa
mysql para conectarse como cualquier otra
persona, simplemente invocándolo de la siguiente manera:
mysql -u
cuando
otro_usuario
nombre_bd
otro_usuario
no tiene clave. Si
todos los usuarios tienen una clave, conectarse utilizando
la cuenta de otro usuario se vuelve mucho más difícil.
Para cambiar la clave de un usuario, utilice la sentencia
SET PASSWORD
. También es posible alterar
la tabla user
en la base de datos
mysql
directamente. Por ejemplo, para
cambiar la clave de todas las cuentas MySQL que tienen por
nombre de usuario root
, haga lo
siguiente:
shell> mysql -u root
mysql> UPDATE mysql.user SET
Password=PASSWORD('newpwd
')
-> WHERE User='root';
mysql> FLUSH PRIVILEGES;
Nunca ejecute el servidor MySQL con el usuario
root
de Unix. Esto es extremadamente
peligroso porque cualquier usuario con el privilegio
FILE
es capaz de crar ficheros como
root
(por ejemplo,
~root/.bashrc
). Para prevenir esto,
mysqld rechaza ejecutarse como
root
a menos que se utilice
explícitamente la opción --user=root
.
En vez de eso, mysqld puede (y debe) ser
ejecutado mediante un usuario normal sin privilegios. Puede
crear una cuenta de Unix específica llamada
mysql
para hacelo todo aún más seguro.
Utilice esta cuenta tan solo para administrar MySQL. Para
ejecutar mysqld mediante un usuario de
Unix diferente, añada la opción user
que especifica el nombre de usuario al grupo
[mysqld]
del fichero de opciones
/etc/my.cnf
o al fichero de opciones
my.cnf
en el directorio de datos del
servidor. Por ejemplo:
[mysqld] user=mysql
Esto provoca que el servidor se inicie mediante el usuario designado, lo ejecute usted manualmente o mediante mysqld_safe o mysql.server. Para más detalles, consulte Sección A.3.2, “Cómo ejecutar MySQL como usuario normal”.
Ejecutar mysqld como un usuario Unix
diferente de root
no significa que
necesite cambiar el usuario root
de la
tabla user
. Los usuarios de las cuentas
MySQL no tienen nada que ver con los usuarios de las cuentas
Unix.
No permita el uso de enlaces simbólicos a tablas. (Esto
puede desactivarse con la opción
--skip-symbolic-links
.) Esto es
especialmente importante si ejecuta
mysqld como root
,
porque cualquiera que tenga acceso de escritura al
directorio de datos del servidor ¡podría entonces borrar
cualquier fichero en el sistema!. Consulte
Sección 7.6.1.2, “Utilización de enlaces simbólicos para tablas en Unix”.
Asegúrese de que el único usuario Unix con permisos de lectura o escritura en los directorios de la base de datos es el usuario que ejecuta mysqld.
No otorgue los privilegios PROCESS
o
SUPER
a usuarios no-administrativos. La
salida del de mysqladmin processlist
muestra el texto de cualquier sentencia que se esté
ejecutando, así que cualquier usuario al que se permita
ejecutar ese comando puede ser capaz de ver si otro usuario
ejecuta una sentencia UPDATE user SET
password=PASSWORD('not_secure')
.
mysqld reserva una conexión extra para
usuarios que tengan el privlegio SUPER
,
así que un usuario root
puede conectarse
y comprobar la actividad del servidor aún cuando todas las
conexiones normales estén en uso.
El privilegio SUPER
puede utilizarse para
cerrar conexiones de cliente, cambiar el funcionamiento del
servidor modificando el valor de variables del sistema, y
controlar servidores de replicación.
No otorgue el privilegio FILE
a usuarios
no-administrativos. Cualquier usuario que posea este
privilegio puede escribir un archivo en cualquier de lugar
del sistema de ficheros con los privilegios del demonio
mysqld. Para hacer esto un poco más
seguro, los archivos generados con SELECT ... INTO
OUTFILE
no sobreescriben archivos existentes, y
pueden ser escritos por cualquiera.
El privilegio FILE
puede también ser
utilizado para leer cualquier archivos que sea legible por
cualquiera o accesible para el usuario Unix que ejecuta el
servidor. Con este privilegio, podría por ejemplo leer
cualquier fichero e insertarlo en una tabla de la base de
datos. Esto podría utilizarse, por ejemplo, utilizando
LOAD DATA
para cargar
/etc/passwd
en una tabla, que podría
ser mostrada después con un SELECT
.
Si no confía en sus DNS, podría utilizar números IP en vez de nombres en las tablas de permisos (tablas grant). En cualquier caso, debería ser muy cuidadoso en crear registros en las tablas de permiso utilizando nombres que contengan caracteres comodín.
Si quiere restringir el número de conexiones permitidas
para una misma cuenta, puede hacerlo estableciando la
variable max_user_connections
de
mysqld. La sentencia
GRANT
también soporta opciones de
control de recursos para limitar la extensión de uso de
servidor permitido a una cuenta. Consulte
Sección 13.5.1.3, “Sintaxis de GRANT
y REVOKE
”.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.