was successfully added to your cart.

Consejos de seguridad prestashop para reforzar la seguridad de nuestra tienda Prestashop

Para cerrarle las puertas al intruso es necesario saber cuales son las puertas que tenemos abiertas. Hagamos un repaso de los métodos de acceso que tenemos en nuestra tienda:

Acceso administrador al panel de control.

Con el acceso al panel de control el intruso puede controlar absolutamente toda la tienda. Base de datos, ficheros del FTP, clientes, pedidos…TODO.
Es esencial que hagamos una serie de modificaciones al usuario SuperAdmin:

  • La clave del usuario SuperAdmin de Prestashop debe ser una clave compuesta por MAYUSCULAS – MINUSCULAS – NUMEROS – SIMBOLOS (@, -, ^, $, %)  y tener 15 o mas de 15 caracteres.
  • Modificar el mail del SuperAdmin a un mail ficticio, que no exista.
  • Evitar que haya mas de un usuario SuperAdmin.
  • No enviar por mail el usuario y el password juntos, utilizar dos vías distintas, una para el envío del usuario y otra para el envío del password.
  • Cambiar el nombre de la carpeta de administrador, da igual cual sea el nombre, es posible que prestashop te haya puesto «admin130491jd3j9», cambialo por otro.

 

Función Reset de password de administrador.

El intruso intentará usar esta función de Prestashop para hacerse con una contraseña de administración. Es muy fácil desactivar esta característica de Prestashop y cortar por lo sano, además podemos poner un señuelo para que nos mande un mail cada vez que alguien intente usar esta característica. Para ello habrá que modificar el controlador «AdminLoginController.php» de Prestashop.

Lo correcto es sobreescribir el controlador aunque yo te indique únicamente las lineas a modificar.

Modificaremos la función processForgot() y la dejaremos tal y como os muestro a continuación modificando el email por el vuestro:

public function processForgot()
    {

        if (_PS_MODE_DEMO_) {
            $this->errors[] = Tools::displayError('This functionality has been disabled.');
        } elseif (!($email = trim(Tools::getValue('email_forgot')))) {
            $this->errors[] = Tools::displayError('Email is empty.');
        } elseif (!Validate::isEmail($email)) {
            $this->errors[] = Tools::displayError('Invalid email address.');
        } else {
            $employee = new Employee();
            if (!$employee->getByEmail($email) || !$employee) {
                $this->errors[] = Tools::displayError('This account does not exist.');
            } elseif ((strtotime($employee->last_passwd_gen.'+'.Configuration::get('PS_PASSWD_TIME_BACK').' minutes') - time()) > 0) {
                $this->errors[] = sprintf(
                    Tools::displayError('You can regenerate your password only every %d minute(s)'),
                    Configuration::get('PS_PASSWD_TIME_BACK')
                );
            }
        }

        if (!count($this->errors)) {
            $pwd = Tools::passwdGen(10, 'RANDOM');
            $employee->passwd = Tools::encrypt($pwd);
            $employee->last_passwd_gen = date('Y-m-d H:i:s', time());

            $params = array(
                '{email}' => $employee->email,
                '{lastname}' => $employee->lastname,
                '{firstname}' => $employee->firstname,
                '{passwd}' => $pwd
            );
	    //DAVID ESCUDERO Desactivamos opciÓn de reset, enviamos información de quien ha intentado hacer el reset.$employee->email
            if (Mail::Send($employee->id_lang, 'employee_password', Mail::l('Your new password', $employee->id_lang), $params, "contacto@davidescudero.com", $employee->firstname.' '.$employee->lastname)) {  
                $this->errors[] = Tools::displayError('This functionality has been disabled.');
                die(Tools::jsonEncode(array('hasErrors' => true, 'errors' => $this->errors)));
                return;

                // Update employee only if the mail can be sent
                Shop::setContext(Shop::CONTEXT_SHOP, (int)min($employee->getAssociatedShops()));

                $result = $employee->update();
                if (!$result) {
                    $this->errors[] = Tools::displayError('An error occurred while attempting to change your password.');
                } else {
                    die(Tools::jsonEncode(array(
                        'hasErrors' => false,
                        'confirm' => $this->l('Your password has been emailed to you.', 'AdminTab', false, false)
                    )));
                }
            } else {
                die(Tools::jsonEncode(array(
                    'hasErrors' => true,
                    'errors' => array(Tools::displayError('An error occurred while attempting to change your password.'))
                )));
            }
        } elseif (Tools::isSubmit('ajax')) {
            die(Tools::jsonEncode(array('hasErrors' => true, 'errors' => $this->errors)));
        }
    }

Así tendremos desactivada la opción de hacer un reset de password en nuestro panel de administración y a la vez nos avisará de si alguien esta intentando hacerlo y con que mail de nuestro panel de prestashop lo está intentando.

 

Acceso al correo electrónico vinculado a nuestra tienda.

Si tiene acceso a nuestro correo electrónico tendrá acceso a toda nuestra tienda prestashop(Panel de control, FTP, Base de datos…), haciendo las modificaciones anteriores haremos que nuestro correo electrónico no tenga ninguna relación con nuestra tienda. Pero si has sido atacado es porque posiblemente tenía acceso a tu mail, más adelante veremos cómo saber por donde han entrado.

Para evitar esto es tan simple como cambiar el password de acceso a nuestro email por un password compuesto por MAYUSCULAS – MINUSCULAS – NUMEROS – SIMBOLOS (@, -, ^, $, %)  y tener 15 o mas de 15 caracteres.
Si es posible añadir una doble verificación, SMS Móvil.

Y finalmente, tomadas esas medidas, tener en cuenta estas otras:

  • Eliminar cualquier relación existente de la cuenta de correo con la administración de la tienda. Solo tener la cuenta de correo para recibir mails de notificaciones de nuevos pedidos, productos sin stock…
  • Si tuviésemos en nuestro mail, cualquier email, ya sea antiguo o actual, de accesos a nuestra tienda, eliminarlos, eliminar cualquier email que contenga USUARIOS, URLS DE ACCESO, PASSWORDS a cualquier acceso de nuestra tienda.

 

Accesos FTP a Prestashop

Para la parte de desarrollo es esencial tener acceso por FTP, a no ser que tengamos una distribución GIT donde hagamos los despliegues. Pero aun así, seguro que existen accesos FTP a tu directorio.

Estas son algunas de las medidas de seguridad que puedes añadir a tu servidor para limitar los accesos por FTP, ya sea un Prestashop, un WordPress, un Magento…cualquier sitio web.

  • Limitar por IP el acceso al puerto 21 y 22 de tu servidor. Pregunta a tu agencia cual es la IP que utilizan en la oficina y limita el acceso al FTP por IP. Es muy engorroso tener que ir añadiendo IP’s y eliminando pero a la larga, pero si facturas 1000€ por hora en tu Prestashop, ahorrarás mucho dinero si un intruso utiliza esta opción para hacer daño, ya que en restaurar todo se puede tardar mucho tiempo en hacer una restauración integral de tu tienda.
  • Limita el acceso a los usuarios que necesiten acceder a solo una carpeta. Es decir, si le pasas un usuario a una empresa que va a subir por FTP unas imágenes a tu tienda, dale acceso solo a la carpeta donde vaya a subir las imagenes, /httpdocs/imagenesdesubida/
  • Me he encontrado con muchas empresas (TODAS las que me contratan) que necesitan ayuda y que directamente te proporcionan un acceso FTP para que eches un ojo y un acceso SuperAdmin al panel de control, MUCHO CUIDADO CON ESTO.
    • No proporcionéis accesos a cualquiera sin antes verificar la identidad de la persona que está al otro lado del mail.
    • Toma TODAS las medidas AQUÍ citadas siempre que proporcionéis accesos a alguien que os vaya a dar soporte. Pídele su IP y dale acceso solo a esa IP.
  • Todas nuestras cuentas de FTP deben tener passwords compuestas por MAYUSCULAS – MINUSCULAS – NUMEROS – SIMBOLOS (@, -, ^, $, %)  y tener 15 o mas de 15 caracteres.
  • Si necesitáis enviar accesos a alguien, no lo hagáis por mail. Utiliza dos vías distintas, una para mandar el usuario y otra para mandar el password. Por ejemplo: Por mail el usuario. Y pos SMS/Whatsapp el password.

 

Acceso SSH al servidor de nuestra tienda

Este es el acceso mas peligroso en un ataque, atacando este acceso podrían eliminar las copias de seguridad (Siempre y cuando solo tengáis las copias internamente), las bases de datos, configuraciones de servidor, crones…TODO.
Me he encontrado con clientes que en el segundo email de contacto me han dado acceso por SSH con permisos ROOT al servidor, lo veo perfecto, yo entiendo que tienes un problema y necesitas solucionarlo cuanto antes, porque estas perdiendo dinero. Tambien lo veo correcto que confíen en ti el futuro de su empresa. Pero pon limitaciones.

Este es un tema del que hablaré un poco mas adelante. Pero es esencial confiar tu empresa a una agencia, o un freelance que lleve estos servicios, no es tan sencillo como contratar un hosting a cualquier proveedor de servicios y vender en internet, una agencia puede proporcionarte todo este soporte de sistemas, administrar tus cuentas de acceso, hacer copias de seguridad de tu empresa ( tienda online prestashop) entre mil cosas mas que no tendrás si solo pagas tu cuota mensual al proveedor.

Medidas a tomar para limitar los accesos por SSH en nuestro Prestashop

  • El usuario ROOT no debemos dárselo a nadie. A no ser que la persona a la que le demos el acceso nos garantice su identidad, o sea tal vez la persona o agencia que vaya a administrar nuestro servidor, a la que confiemos la seguridad y garantía de nuestra tienda prestashop.
  • Limita siempre el acceso al puerto 22 de tu servidor por IP. No permitas el acceso por SSH a todas las IP’s, establece reglas de firewall para denegar el acceso a todas las IP’s que no sean las que tu accedes habitualmente.
  • Si alguien necesita acceso por SSH para administración de ficheros, dale un usuario SSH con acceso SOLO a la ruta del directorio donde tiene que hacer modificaciones. Esto es muy engorroso pero evitarás muchos problemas.
  • Nunca envíes passwords y usuarios de SSH por una única vía, utiliza vías distintas, por ejemplo, mail y whatsapp ó SMS.
  • Si no tienes necesidad de acceder con el usuario ROOT, hay posibilidad de desactivar este usuario. Aunque no es recomendable.
  • El proveedor de servicios siempre va a proporcionar el password de acceso al servidor VIA email, dado que los usuarios siempre son muy genéricos, podemos tomar la precaución de cambiar el usuario ‘root’ por otro nombre como por ejemplo ‘usu0195811905’.

 

Acceso a BBDD de nuestra tienda.

La BBDD es una de las vías de acceso más golosas, contiene mail de nuestros clientes, passwords (Aunque estén encriptadas) pedidos e información de todo tipo. Un acceso a BBDD le da permisos al intruso para poder manipular la información, robarla, venderla…
Podemos tomar algunas medidas para ponerselo dificil:

  • Limitar las conexiones a la BBDD para que solo puedan hacerse desde el servidor.
  • Cambiar usuario y password del acceso ROOT de la BBDD del servidor.
  • Utilizar passwords que cumplan con MAYUSCULAS – MINUSCULAS – NUMEROS – SIMBOLOS (@, -, ^, $, %)  y tener 15 o mas de 15 caracteres.
  • Limitar los permisos del usuario que utiliza Prestashop para conectar con la BBDD puede ser una barrera a que el atacante pueda borrar todo el contenido de la BBDD.

 

Acceso a Plesk ó panel de control de nuestro servidor.

Desde este acceso tiene control de todo el servidor, al igual que un acceso ROOT por SSH, podría borrar BBDD, backups internos, directorios, nos podría liar una buena.

Los pasos a seguir para limitar el acceso a nuestro panel de control pasa por los pasos anteriores:

  • Limitar el acceso al puerto 8443 solo a las IP’s que vayan a administrar el panel.
  • Cambiar el usuario por defecto del panel de administración.
  • Usar passwords muy fuertes que cumplan con MAYUSCULAS – MINUSCULAS – NUMEROS – SIMBOLOS (@, -, ^, $, %)  y tener 15 o mas de 15 caracteres.
  • No enviar nunca jamás este acceso junto por una sola vía, siempre utilizar dos vías distintas, una para el usuario y otra para el password.
  • Limitar a ROLES los accesos, no crear superAdministradores para alguien que vaya a administrar un dominio concreto.

 

Permisos y roles de administración en Prestashop.

Recientemente he tenido un cliente al que le accedieron con superAdmin al panel de control. El intruso instaló el modulo psCleaner y borró CLIENTES, PRODUCTOS, PEDIDOS, CATEGORIAS…todo. Mirando en los LOGS de acceso del APACHE, ví que tardó 2 minutos y medio en hacer toda esta tarea. En dos minutos se había ventilado toda la tienda.

Con un acceso superAdmin a nuestro panel LE damos acceso al intruso incluso al borrado de datos de la base de datos con la simple instalación de un modulo, o a modificar/eliminar ficheros de nuestro FTP. Por ello es necesario tener únicamente 1 superAdministrador en la tienda y limitar todos los usuarios a sus correspondientes funciones.

Es decir, si tenemos gente trabajando que no configura módulos, limitémosle el acceso a módulos.
Si hay gente que no puede administrar productos, eliminemos el acceso a la modificación de productos.

Estas son las limitaciones que podéis aplicar en vuestra tienda.

  • Eliminar todos los SuperAdmin, dejar solo uno, con un mail ficticio y una password lo suficientemente fuerte.
  • Crear un nuevo perfil llamado «admin», que tenga acceso a todo, excepto a instalar módulos, gestionar empleados…vea detenidamente el apartado de Roles de Empleado para ver que limitaciones puedes aplicar.
  • Que todos los usuarios tengan una cuenta de correo electrónico ficticia para acceder al panel.
  • Limitar el acceso al panel por IP de oficina. Esto en la documentación oficial de prestashop explican como hacerlo: AQUI o bien puede contratar a un desarrollador como yo o una agencia que pueda aplicar todas las mejoras posibles a confiar la seguridad de su tienda.

 

Especial Módulos peligrosos.

Estos son los módulos potencialmente peligrosos, que no puedes evitar su instalación si entra como superadmin, pero que estoy buscando una vía para poder hacerlo, dado que mirando en el código puedo ver si hace TRUNCATE a tablas, DELETE…podríamos inventar algo para esto, iré actualizando esta lista según vaya encontrándolos:

  •  fileeditorimax
  • pscleaner
  • imaxmodificabd

 

Otras medidas a tener en cuenta

Nada es suficiente en cuanto a seguridad se refiere, todo lo que se te ocurra que puedas hacer para ponerselo dificil al intruso será una barrera mas.

Entre otras cosas que puedes hacer están estas:

  • Borrar archivos que haya en la raiz que no uses.
    • Ficheros de documentación
    • Carpeta install
    • Fichero install_prestashop.html
  • Desactivar el webmail de tu servidor (Roundcube, psa-horde) ya que suelen tener bastantes brechas de seguridad que los intrusos utilizan para poder acceder a tu correo.
  • Actualizar todas las passwords habitualmente. Cada dos semanas o un mes.

Dado que una tienda online no es una tienda física, no dispone de un seguro que cubra tus perdidas, al menos por ahora…seguro que las grandes aseguradoras se pondrán al día y también intentarán ganar dinero por este lado, pero debes tener una agencia o freelance que se encargue de hacer este trabajo por ti:

  • Tener copias de seguridad en varios sitios distribuidas, servidores distintos al de producción.
  • Nunca tener las copias de seguridad en el mismo servidor donde tenemos nuestra tienda.
    • Para poneros un ejemplo, es como el que entra a robar a una tienda física y el dinero que hace diariamente lo guarda en caja. Al final el seguro le cubre X dinero de caja, si guarda ahí lo de todo un mes lo pierde.
  • Trabaja siempre con SSL, instala certificados en tus dominios, mejor si son certificados únicos por IP y dominio, nada de Let’s Encrypt.
  • Actualiza en la mayor medida de lo posible los módulos de tu tienda, esto siempre es mejor que lo haga el encargado de desarrollo de tu tienda, es él quien sabe mejor que nadie cual es el proceso para poder realizar esa actualización, habitualmente tocamos muchas funcionalidades de módulos dado que todos no funcionan como nosotros queremos.

Y por último dedicaré un post completo a afrontar un ataque. Es primordial saber cual es el origen del ataque, por donde ha entrado, que ha hecho, y revertir securizar todas las barreras que había abiertas, además analizar que puertas le hemos abierto gracias a esa entrada, normalmente una puerta abre otra puerta, en este caso tener un acceso FTP a nuestro directorio abre miles de puertas, acceso a bbdd, acceso a panel de administración….

 

Hay que prestar especial atención a este tema, dado que un ataque podría hacer perder a una empresa miles de euros en el tiempo que los administradores tardan en recuperar el estado de la web. Cualquier duda, o incluso algún aporte puedes escribir en comentarios o bien ponerte directamente en contacto conmigo.

Muchas gracias.