Bug VestaCP en Ubuntu 16 o MYSQL 5.7 + Parche

Recientemente se a encontrado un problema en vestacp que impide que funcione de forma adecuada en Ubuntu 16.xx o cualquier servidor que tenga MYSQL 5.7+

El problema radica en los cambios realizados en la versión 5.7 de mysql en la gestión de privilegios, usuarios y contraseñas.

Tal como explique en el foro de vestacp, el problema es que vestacp no guarda la contraseña en md5 en los archivos de configuración de vestacp referentes al usuario en el db.conf

Ejemplo:

cat /usr/local/vesta/data/users/YOURUSER/db.conf

DB='test2_3' DBUSER='test2_3' MD5='' HOST='localhost' TYPE='mysql' CHARSET='UTF8' U_DISK='1' SUSPENDED='no' TIME='22:26:16' DATE='2016-11-28'
DB='test2_d' DBUSER='test2_d' MD5='*CC2AADF4E7EC1C90E7136D2B3B9D14F3CD' HOST='localhost' TYPE='mysql' CHARSET='UTF8' U_DISK='1' SUSPENDED='no' TIME='22:26:16' DATE='2016-11-28'
DB='test2_t' DBUSER='test2_t' MD5='' HOST='localhost' TYPE='mysql' CHARSET='UTF8' U_DISK='1' SUSPENDED='no' TIME='22:26:16' DATE='2016-11-28'
DB='test2_test3' DBUSER='test2_43' MD5='' HOST='localhost' TYPE='mysql' CHARSET='UTF8' U_DISK='1' SUSPENDED='no' TIME='22:26:16' DATE='2016-11-28'
DB='test2_x' DBUSER='test2_x' MD5='*196BDEDE2AE4F84CA44C47D54D78478C7E2' HOST='localhost' TYPE='mysql' CHARSET='UTF8' U_DISK='1' SUSPENDED='no' TIME='22:26:16' DATE='2016-11-28'

Como ven el MD5 esta vacio en algunos campos

DB='test2_3' DBUSER='test2_3' MD5=''

En otros no por que estaba haciendo algunas pruebas para solucionar el problema.

Así que esto tiene consecuencias bastante negativas a largo plazo.

1- No guardas la contraseña por lo tanto si haces un backup de tu cuenta de vestacp y la restauras en otro servidor o en el mismo la contraseña no se restaurará y tendrás que resetear la clave de todas tus bases de datos manualmente si no no funcionarán tus páginas web ( las que usen bases de datos )

Esto es un problema del func/db.sh

Y el segundo problema es que hay algún código en el func/rebuild.sh que tampoco funciona y te genera el otro problema número 2

2- Al no estar preparado para mysql 5.7 no gestiona CREATE USER como debería y no es posible restaurar el backup que traigas desde otro servidor, no restaura las contraseñas, así que estamos en las mismas, tienes un backup de otro server on mysql 5.6 y todo funcionando y tu db.conf tiene el md5 bien pero lo restauras y sorpresa! no se restaura la contraseña.

Así que he hecho algunos cambios de forma no oficial en el db.conf ( en el mio ) para solucionar el problema a la hora de añadir contraseñas:

        query="SELECT VERSION()"
        msvcheck=$(mysql_query "$query" |tail -n1 |cut -d "." -f2 )
        if [ $msvcheck -ge "7" ];then
                query="SHOW CREATE USER \`$dbuser\`"
                md5=$(mysql_query "$query" 2>/dev/null)
                md5=$(echo "$md5" |grep password |cut -f8 -d \')
        echo "$md5" > /root/testt
        else
                query="SHOW GRANTS FOR \`$dbuser\`"
                md5=$(mysql_query "$query" 2>/dev/null)
                md5=$(echo "$md5" |grep 'PASSWORD' |tr ' ' '\n' |tail -n1 |cut -f 2 -d \')
        fi

Como ven la diferencia es que antes se podía sacar el hash_string dela contraseña de mysql con SHOW GRANTS FOR y ahora es necesario usar SHOW CREATE USER para ver esos datos.

Cambios menores pero esenciales.

El rebuild tiene un problema parecido a la inversa, no cuando saca los datos si no cuando los mete pero no voy a entrar en detalles ya que no tengo tiempo.

Así que vamos al grano, para aplicar el parche hay que hacer lo siguiente:

# Por ssh como root
cd /usr/local/vesta/func

mv db.sh db-bk.sk
mv rebuild.sh rebuild-bk.sh

# descargamos estos archivos
wget https://raw.githubusercontent.com/Skamasle/vesta/master/func/db.sh
wget https://raw.githubusercontent.com/Skamasle/vesta/master/func/rebuild.sh

#Fixeamos permisos

chmod +x db.sh rebuild.sh

Esto soluciona el problema de restauración y guardado de la contraseña, el tema es que no soluciona el problema si lo tienes o sea “si ya tienes el db.conf con el MD5= vacío” pero eso es un tema fácil de solucionar y esta noche si tengo tiempo haré un script para fixear esa parte también ya que será útil a más de uno que no esta informado y que aunque sepa que hay un parche importante que aplicar no lo aplica, pero que luego de unos meses cuando tenga problemas para restaurar una cuenta se tirará de los pelos.

Me hubiera gustado entrar en más detalles pero por falta de tiempo no es posible.

——————–
He hecho un pequeño script que recupera las contraseñas de mysql y las inserta en el db.conf por si ya se han creado bases de datos y se a perdido esa información

wget http://mirror.skamasle.com/vestacp/fix/fix-mysql57.sh
bash fix-mysql57.sh USER

USER se tiene que reemplazar por el usuario de vestacp en el qeu se han creado los usuarios y bases de datos, así recuperara todas, por ejemplo el usuario admin

bash fix-mysql57.sh admin

Un saludo