Optimizar consultas MySQL utilizando índices

Introducción

En este artículo vamos a tratar de examinar como optimizar consultas MySQL utilizando índices.

Para ello vamos a tener un log activado en nuestro sistema que nos indicará aquellas consultas que tardan más de 3 segundos. Es lo que consideramos como consultas lentas.

Está claro que dependiendo de la consulta/registros podemos considerar lenta a partir de x segundos, pero eso lo dejaremos en manos del DBA.

También aclarar que a veces hay que reformular la consulta para ganar un mejor rendimiento.

Leer más

Función REPLACE de MySQL

Introducción

En este post vamos a usar la función REPLACE de MySQL la cual nos va a permitir cambiar valores que encontremos en nuestras tablas por unos nuevo.

Uno de los ejemplos donde comúnmente se suele usar es a la hora de cambiar el dominio a un blog WordPress, ya que hay que cambiar estos valores en la base de datos.

Usando la función REPLACE de MySQL

Vamos a analizar un ejemplo clásico:

UPDATE wp_posts SET post_content = REPLACE( post_content, 'a class="url" href="www.', 'a class="url" href="http://www.' );

En este ejemplo lo que nos encontramos es lo siguiente:

  • tabla: wp_posts
  • campo: post_content
  • sustituir: vamos a sustituir ‘a class=»url» href=»www.’, ‘a class=»url» href=»http://www.’.
    • Es decir que donde había un href=»www. ahora será href=»http://www. Hemos agregado la parte del http.

Con esto lo que conseguimos, en el caso de wordpress, es que funcionen las imágenes a la hora de cambiar el nombre del dominio.

Incompatibilidad de versiones MySQL

Introducción

Nos encontramos con un problema de incompatibilidad de versiones MySQL. Tenemos 2 servidores 1 con una versión de MySQL 5.0.x y otro con versión 5.5.x y teníamos que tener una conexión entre ambos.

En este caso la conexión se estaba realizando desde el servidor nuevo al viejo.

El error que nos daba era algo similar a esto:

Connect Error (2000) mysqlnd cannot connect to MySQL 4.1+ using old authentication

Lo cual indicaba un problema de compatibilidades entre versiones (evidentemente porque en el nuevo servidor usaba las librerías nuevas).

Solución Incompatibilidad de versiones MySQL

La solución que hemos tomado para solventar este problema fueron dos pasos:

1) En la configuración del MySQL viejo (/etc/my.cnf) tuvimos que quitar la compatibilidad de old-password. En nuestro caso tuvimos que comentar la siguiente línea:

#old_passwords=1

2) Lo siguiente fue revisar el usuario que estábamos usando para conectar si tenía un formato de contraseñas correcto. Para ello tuvimos que acceder a nuestra consola de MySQL y ejecutar la siguiente sentencia:

SELECT `User`, `Host`, Length(`Password`) FROM mysql.user;

Esto nos daba un listado de los usuarios que tienen contraseñas débiles y que deberíamos cambiar para mayor seguridad. Para ser exactos las contraseñas con tamaño 16 son las de contraseñas débiles.

Evidentemente entre ellas estaba el usuario que estábamos usando y tuvimos que ejecutar el siguiente comando para volver a reajustar la contraseña:

SET PASSWORD FOR 'usuariocambiar'@'host'=PASSWORD('mismacontraseña');

Con esto hemos vuelto a ejecutar de nuevo el comando y esta vez nos salía con un tamaño de 41 caracteres.

Con esto dejamos resuelto el problema del cliente.

Configuración de seguridad en certificados Apache

Introducción

En este post vamos a tratar acerca de la configuración de seguridad en certificados Apache, un problema común para mantener nuestros servidores seguros ante cualquier tipo de ataque SSL.

Siempre nos preguntamos cual es la configuración idónea para hoy en día para cuando instalamos certificados en nuestros servidores Linux/Windows sobre Apache. Pues bien hoy vamos a desvelar parte del misterio que solemos usar en nuestros servidores.

Configuración de seguridad en certificados Apache

La configuración es completa para el VirtualHost que queramos cifrar o para ponerlo en el de por defecto.

SSLEngine on
SSLProtocol -All +TLSv1 +TLSv1.1 +TLSv1.2

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:ECDHE-RSA-AES128-SHA:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:!DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4
SSLHonorCipherOrder on

SSLCertificateFile RutaWeb/certificado.crt
SSLCertificateKeyFile RutaWeb/certificado.key
SSLCACertificateFile RutaWeb/certificado.ca

Entramos un poco en la explicación:

  • Activamos el SSL para el dominio (SSLEngine on)
  • Solo habilitamos los protocolos TLSv1, TLSv1.1 y TLSv1.2 (Quizás os aparezca el problema de la vulnerabilidad beast, pero esto ya se parchea a nivel de navegador).
  • Un cifrado fuerte, actualmente hemos puesto muchas líneas que son recomendadas. Esto viene dado por el parámetro SSLCipherSuite.
  • SSLHonorCipherOrder on, No permite que el cliente elija el método de negociación sino que fuerza a la que tenemos en el servidor.

 

Configurando Chroot con SFTP

Introducción

Se nos presentó la problemática de que un cliente quería crear un SFTP (Secure File Transfer Protocol) para que un usuario solo pudiera acceder de esa manera. Es decir, que no quería que por FTP tuviera acceso. Aparte de ello quería enjaularlo en su propio directorio y que no pudiera navegar a ningún lugar.

Recordemos que SFTP utiliza el puerto del SSH para realizar la transferencia de ficheros proporcionando una capa de seguridad extra.

Recordamos también que existe otras maneras de hacerlo cifrado y seguro con ssl sobre ftp con VSFTP y ssl sobre ftp con PROFTPD.

Configurando Chroot con SFTP

Antes de empezar debemos crear el entorno cerrado, en nuestro caso vamos a usar el directorio «/var/www/sftpusuarios/».

Los pasos que vamos a seguir para configurar Chroot con SFTP son los siguientes:

# Creando el grupo de sftp
groupadd sftp_users

# Creamos el usuario
adduser -d /var/www/sftpusuarios/ -G sftp_users sftpuser1

# Configuramos el SSH
vim /etc/ssh/sshd_config

# Comentamos la siguiente línea, suele estar al final
Subsystem sftp /usr/libexec/openssh/sftp-server


#Añadimos las siguientes
Subsystem sftp internal-sftp
Match Group sftp_users
X11Forwarding no
AllowTcpForwarding no
ChrootDirectory /var/www/sftpusuarios
ForceCommand internal-sftp

Ahora mismo después de ejecutar dicha configuración tan solo tenemos que reiniciar y probar nuestro acceso por SFTP (recordad el mismo puerto del SSH).

Deshabilitar el usuario por FTP

Actualmente solo lo hemos probado por VSFTP, no sabemos si será igual para otros clientes FTP:

# Editamos el fichero siguiente
vim /etc/vsftpd/ftpusers

# Añadimos el usuario que no queremos que tenga FTP
sftpuser1

Guardamos el fichero y reiniciamos el servicio de VSFTP.

Cambiar el certificado autofirmado de PLESK

Introducción

Al parecer uno de nuestros clientes quería cambiar el certificado autofirmado de PLESK fuera válido, ya que había caducado al cabo de 1 año.

El proceso que vamos a seguir es el siguiente:

  1. Generar un autofirmado nuevo.
  2. Asociar a las IP que corresponda.
  3. Cambiar el certificado para el puerto 8443 (es distinto procedimiento al del 443)

Al principio pensaba que al hacer hasta el punto 2 el puerto 8443 funcionaría sin problemas, pero parece ser que no es así. Así que detallaremos la información según la documentación obtenida de PLESK.

Leer más

Bloqueando adjuntos con Postfix

Introducción

Bloqueando adjuntos con Postfix, Últimamente se está haciendo muy famoso el tema del cryptolocker debido a que llegan como adjuntos en los correos y los usuarios que no tienen mucho conocimiento suelen pulsar sobre ellos.

Existen varias maneras a la hora de poder gestionar estos correos:

  1. Ver las cabeceras de los distintos correos y buscar un patrón para bloquear:
    • Ya sean IP, Tipo de Mail, Asuntos, Etc
  2. Bloquear extensiones que no solamos trabajar con ello.

En nuestro caso vamos a usar el segundo punto para bloquear los adjuntos zip entre otras extensiones.

Bloqueando adjuntos con Postfix

Lo primero que haremos será modificar el fichero main.cf:

vim /etc/postfix/main.cf

Añadimos al final la siguiente línea:

mime_header_checks = regexp:/etc/postfix/mime_header_checks

Guardamos y creamos el nuevo fichero:

vim /etc/postfix/mime_header_checks

Añadimos las extensiones que queremos bloquear:

/name=[^>]*\.(bat|com|exe|dll|vbs|zip)/ REJECT

Guardamos y solo nos queda reiniciar el postfix

service postfix restart

Para comprobar que ha funcionado:

Sep 9 13:19:27 xxx-vdc postfix/cleanup[19683]: 79E3E754242: reject: header Content-Type: application/x-zip-compressed;? name=»@PD94118.ZIP» from 4.mo68.mail-out.ovh.net[46.105.59.63]; from=<xxxx@xxxx.es> to=<xxxx@xxxx.com> proto=ESMTP helo=<4.mo68.mail-out.ovh.net>: 5.7.1 message content rejected

Plesk Gzip Apache y Nginx

Introducción

Gzip Apache y Nginx, A menudo necesitamos en nuestra página web (sobre todo los que se dedican a marketing y SEO) que nuestra web vaya rápida y utilizando el servicio de page speed insight de google nos recomienda que habilitemos la compresión de nuestro site para que ocupe menos. Pues bien este manual se basa en como activar Gzip en Apache (Mod_Deflate) y en Nginx a nivel de sistema y en la configuración de nuestro PLESK.

Como esto no es necesario para todos los dominios esto lo habilitaremos por defecto a aquellos dominios que lo necesiten.

Los pasos que vamos a seguir en este manual son los siguientes:

  1. Comprobar que el módulo esté cargado.
  2. Configurar el módulo si es necesario.
  3. Habilitar las directivas a nivel de dominio en Plesk.
Leer más

Módulos de php personalizados en Plesk

plesk-panel

Introducción

A menudo existen clientes que solicitan la instalación de módulos de php personalizados en plesk que no vienen por defecto configurado. Para ello tenemos que buscar la manera de hacerlo a través de plesk.

Con la actualización de su panel a la versión 12.5.x han añadido numerosas ventajas incluyendo la elección entre versiones de PHP.

Como no viene de manera standard la forma más cómodo o recomendada por plesk es la de instalar los módulos a través de pecl.

En este manual vamos a enseñar como activar los módulos de memcache y memcached.

Leer más

Securizar el servidor web contra httpoxy

Introducción

En este artículo vamos aprender a securizar el servidor web contra httpoxy una vulnerabilidad que fue descubierta hace unos meses y que afecta a aplicaciones que corren bajo cgi. Esto quiere decir que servicios web como Apache, Nginx y PHP se ven afectadas. Pero esto no quiere decir que solo sea para esas sino que por ejemplo mod_php también esta siendo afectado.

Lo primero que diremos antes de avanzar es que las versiones que aún están siendo mantenidas han sacado actualizaciones de sus paquetes evitando el CVE-2016-5387, por lo tanto la primera recomendación de todas es actualizar los paquetes de apache/nginx.

Este documento lo centraremos más para aquellos sistemas que no tienen actualizaciones del sistema y aprovecharemos mecanismos del sistema para evitar estos problemas.

Leer más