viernes, 4 de abril de 2014

Hacer que MySQL sea seguro contra ataques


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 enhttp://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 otro_usuarionombre_bd cuando 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 useren 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 mediantemysqld_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!. ConsulteSecció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 DATApara 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.

Fuente:enlace

No hay comentarios:

Publicar un comentario

Entradas populares