Secure cron PHP
En este tema se explica cómo proteger pub/cron.php
para evitar que se utilice en un ataque malintencionado. Si no protege cron, cualquier usuario podría ejecutar cron potencialmente para atacar su aplicación de Commerce.
El trabajo cron ejecuta varias tareas programadas y es una parte vital de la configuración de Commerce. Las tareas programadas incluyen, entre otras:
- Reindexación
- Generación de correos electrónicos
- Generando boletines
- Generando mapas del sitio
Puede ejecutar un trabajo cron de las siguientes maneras:
- Usar el comando
magento cron:run
desde la línea de comandos o en un crontab - Tener acceso a
pub/cron.php?[group=<name>]
en un explorador web
magento cron:run
para ejecutar cron porque utiliza un proceso diferente que ya es seguro.CRON seguro con Apache
En esta sección se explica cómo proteger cron mediante la autenticación HTTP Basic con Apache. Estas instrucciones se basan en Apache 2.2 con CentOS 6. Para obtener más información, consulte uno de los siguientes recursos:
Crear un archivo de contraseña
Por motivos de seguridad, puede localizar el archivo de contraseña en cualquier lugar excepto en el servidor web docroot. En este ejemplo, almacenamos el archivo de contraseña en un nuevo directorio.
Escriba los siguientes comandos como usuario con privilegios de root
:
mkdir -p /usr/local/apache/password
htpasswd -c /usr/local/apache/password/passwords <username>
Donde <username>
puede ser el usuario del servidor web u otro usuario. En este ejemplo, utilizamos el usuario del servidor web, pero la elección del usuario depende de usted.
Siga las indicaciones de la pantalla para crear una contraseña de usuario.
Para agregar otro usuario al archivo de contraseñas, escriba el siguiente comando como usuario con privilegios de root
:
htpasswd /usr/local/apache/password/passwords <username>
Agregar usuarios para crear un grupo cron autorizado (opcional)
Puede permitir que más de un usuario ejecute cron agregando estos usuarios a su archivo de contraseñas, incluido un archivo de grupo.
Para agregar otro usuario al archivo de contraseñas:
htpasswd /usr/local/apache/password/passwords <username>
Para crear un grupo autorizado, cree un archivo de grupo en cualquier lugar fuera del docroot del servidor web. El archivo de grupo especifica el nombre del grupo y los usuarios del grupo. En este ejemplo, el nombre de grupo es MagentoCronGroup
.
vim /usr/local/apache/password/group
Contenido del archivo:
MagentoCronGroup: <username1> ... <usernameN>
Proteger cron en .htaccess
Para proteger cron en el archivo .htaccess
:
-
Inicie sesión en el servidor de Commerce como propietario del sistema de archivos o cambie a.
-
Abra
<magento_root>/pub/.htaccess
en un editor de texto.(Dado que
cron.php
se encuentra en el directoriopub
, edite este(a).htaccess
solamente.) -
Acceso de Cron para uno o más usuarios. Reemplace la directiva
<Files cron.php>
existente con lo siguiente:code language-conf <Files cron.php> AuthType Basic AuthName "Cron Authentication" AuthUserFile /usr/local/apache/password/passwords Require valid-user </Files>
-
Acceso cron para un grupo. Reemplace la directiva
<Files cron.php>
existente con lo siguiente:code language-conf <Files cron.php> AuthType Basic AuthName "Cron Authentication" AuthUserFile /usr/local/apache/password/passwords AuthGroupFile <path to optional group file> Require group <name> </Files>
-
Guarde los cambios en
.htaccess
y salga del editor de texto. -
Continuar con Verificar que cron sea seguro.
CRON seguro con Nginx
En esta sección se explica cómo proteger cron mediante el servidor web Nginx. Debe realizar las siguientes tareas:
- Configuración de un archivo de contraseña cifrado para Nginx
- Modifique la configuración de nginx para hacer referencia al archivo de contraseña al acceder a
pub/cron.php
Crear un archivo de contraseña
Consulte uno de los siguientes recursos para crear un archivo de contraseña antes de continuar:
Proteger cron en nginx.conf.sample
Commerce proporciona un archivo de configuración nginx de muestra optimizado de forma predeterminada. Se recomienda modificarla para proteger cron.
-
Agregue lo siguiente a su archivo
nginx.conf.sample
:code language-conf #Securing cron location ~ cron\.php$ { auth_basic "Cron Authentication"; auth_basic_user_file /etc/nginx/.htpasswd; try_files $uri =404; fastcgi_pass fastcgi_backend; fastcgi_buffers 1024 4k; fastcgi_read_timeout 600s; fastcgi_connect_timeout 600s; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; }
1.Restart nginx:
systemctl restart nginx
- Continuar con Verificar que cron sea seguro.
Verifique que cron sea seguro
La forma más sencilla de comprobar que pub/cron.php
es seguro es comprobar que está creando filas en la tabla de base de datos cron_schedule
después de configurar la autenticación de contraseña. Este ejemplo utiliza comandos SQL para comprobar la base de datos, pero puede utilizar la herramienta que desee.
default
que está ejecutando en este ejemplo se ejecuta según la programación definida en crontab.xml
. Algunos trabajos de cron se ejecutan solo una vez al día. La primera vez que ejecute cron desde el explorador, se actualizará la tabla cron_schedule
, pero las pub/cron.php
solicitudes posteriores se ejecutarán según la programación configurada.Para comprobar que cron es seguro:
-
Inicie sesión en la base de datos como el usuario de la base de datos Commerce o como
root
.Por ejemplo,
code language-bash mysql -u magento -p
-
Utilice la base de datos de Commerce:
code language-shell use <database-name>;
Por ejemplo,
code language-shell use magento;
-
Eliminar todas las filas de la tabla de base de datos
cron_schedule
:code language-shell TRUNCATE TABLE cron_schedule;
-
Ejecute cron desde un explorador:
code language-shell http[s]://<Commerce hostname or ip>/cron.php?group=default
Por ejemplo:
code language-shell http://magento.example.com/cron.php?group=default
-
Cuando se le solicite, introduzca el nombre y la contraseña de un usuario autorizado. La siguiente figura muestra un ejemplo.
-
Compruebe que se han agregado filas a la tabla:
code language-shell SELECT * from cron_schedule; mysql> SELECT * from cron_schedule; +-------------+-----------------------------------------------+---------+----------+---------------------+---------------------+-------------+-------------+ | schedule_id | job_code | status | messages | created_at | scheduled_at | executed_at | finished_at | +-------------+-----------------------------------------------+---------+----------+---------------------+---------------------+-------------+-------------+ | 1 | catalog_product_outdated_price_values_cleanup | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 2 | sales_grid_order_async_insert | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 3 | sales_grid_order_invoice_async_insert | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 4 | sales_grid_order_shipment_async_insert | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 5 | sales_grid_order_creditmemo_async_insert | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 6 | sales_send_order_emails | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 7 | sales_send_order_invoice_emails | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 8 | sales_send_order_shipment_emails | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 9 | sales_send_order_creditmemo_emails | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 10 | newsletter_send_all | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:25:00 | NULL | NULL | | 11 | captcha_delete_old_attempts | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:30:00 | NULL | NULL | | 12 | captcha_delete_expired_images | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:30:00 | NULL | NULL | | 13 | outdated_authentication_failures_cleanup | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | | 14 | magento_newrelicreporting_cron | pending | NULL | 2017-09-27 14:24:17 | 2017-09-27 14:24:00 | NULL | NULL | +-------------+-----------------------------------------------+---------+----------+---------------------+---------------------+-------------+-------------+ 14 rows in set (0.00 sec)
Ejecute cron desde un explorador web
Puede ejecutar cron en cualquier momento, como durante el desarrollo, utilizando un explorador web.
Si está usando un servidor web Apache, debe eliminar la restricción del archivo .htaccess
para poder ejecutar cron en un explorador:
-
Inicie sesión en el servidor de Commerce como un usuario con permisos para escribir en el sistema de archivos de Commerce.
-
Abra cualquiera de las siguientes opciones en un editor de texto (según el punto de entrada al Magento):
code language-text <magento_root>/pub/.htaccess <magento_root>/.htaccess
-
Elimine o comente lo siguiente:
code language-conf ## Deny access to cron.php <Files cron.php> order allow,deny deny from all </Files>
Por ejemplo,
code language-conf ## Deny access to cron.php #<Files cron.php> # order allow,deny # deny from all #</Files>
-
Guarde los cambios y salga del editor de texto.
A continuación, puede ejecutar cron en un explorador web de la siguiente manera:
code language-text <your hostname or IP>/<Commerce root>/pub/cron.php[?group=<group name>]
Donde:
-
<your hostname or IP>
es el nombre de host o la dirección IP de su instalación de Commerce -
<Commerce root>
es el directorio relativo a docroot del servidor web en el que instaló el software de CommerceLa dirección URL exacta que utilice para ejecutar la aplicación Commerce depende de la configuración del servidor web y del host virtual.
-
<group name>
es cualquier nombre de grupo cron válido (opcional)
Por ejemplo,
https://magento.example.com/magento2/pub/cron.php?group=index